angular.module("FICApp", ["ngSanitize", "ngAnimate"]); angular.module("FICApp") .filter("objectLength", function() { return function(input) { if (input !== undefined) return Object.keys(input).length; else return ""; } }); String.prototype.capitalize = function() { return this .toLowerCase() .replace( /(^|\s)([a-z])/g, function(m,p1,p2) { return p1+p2.toUpperCase(); } ); } angular.module("FICApp") .controller("TimeController", function($scope, $rootScope, $http, $timeout) { $rootScope.time = {}; $rootScope.recvTime = function(response) { sessionStorage.userService = angular.toJson({ "cu": Math.floor(response.headers("x-fic-time") * 1000), "he": (new Date()).getTime(), }); } function updTime() { $timeout.cancel($scope.cb); $scope.cb = $timeout(updTime, 1000); if (sessionStorage.userService && $rootScope.settings) { var time = angular.fromJson(sessionStorage.userService); var settings = $rootScope.settings; var srv_cur = new Date(Date.now() + (time.cu - time.he)); if (Math.floor(settings.start / 1000) == Math.floor(srv_cur / 1000)) { $rootScope.refresh(true); } var remain = 0; if (settings.start == 0) { $rootScope.time = {}; return } else if (settings.start > srv_cur) { $rootScope.startIn = Math.floor((settings.start - srv_cur) / 1000); remain = settings.end - settings.start; } else if (settings.end > srv_cur) { $rootScope.startIn = 0; remain = settings.end - srv_cur; } remain = remain / 1000; if (remain < 0) { remain = 0; $rootScope.time.end = true; $rootScope.time.expired = true; } else if (remain < 60) { $rootScope.time.end = false; $rootScope.time.expired = true; } else { $rootScope.time.end = false; $rootScope.time.expired = false; } $rootScope.time.remaining = remain; $rootScope.time.hours = Math.floor(remain / 3600); $rootScope.time.minutes = Math.floor((remain % 3600) / 60); $rootScope.time.seconds = Math.floor(remain % 60); } } updTime(); }) .controller("EventsController", function($scope, $http, $interval) { $scope.events = []; var refreshEvents = function() { // Update times var now = new Date().getTime(); $scope.events.forEach(function(ev) { ev.since = now - ev.time; }); $http.get("/events.json").then(function(response) { // Don't make anything if the page hasn't changed if ($scope.lasteventsetag != undefined && $scope.lasteventsetag == response.headers().etag) return; $scope.lasteventsetag = response.headers().etag; var events = response.data; var kEvents = {}; events.forEach(function(ev) { kEvents[ev.id] = ev; }); var kxEvents = {} $scope.events.forEach(function(ev) { kxEvents[ev.id] = ev; }); var oldEvents = $(Object.keys(kxEvents)).not(Object.keys(kEvents)).get(); var newEvents = $(Object.keys(kEvents)).not(Object.keys(kxEvents)).get(); $scope.events.filter(function(val) { return !oldEvents.inArray(val.id); }); newEvents.forEach(function(ev) { var event = kEvents[ev]; event.time = Date.parse(event.time); event.since = now - event.time; $scope.events.unshift(event); }); }); } refreshEvents() $interval(refreshEvents, 2100); }) .controller("CountdownController", function($scope, $interval) { $scope.duration = 0; $scope.init = function(end) { $scope.initT(Date.parse(end)/1000); } $scope.initT = function(end) { var time = angular.fromJson(sessionStorage.userService); var srv_cur = (Date.now() + (time.cu * 1000 - time.he)) / 1000; $scope.duration += Math.floor(end - srv_cur); } var stop = $interval(function() { $scope.duration -= 1; if ($scope.duration < -10) $interval.cancel(stop); }, 1000); }) .controller("DataController", function($scope, $http, $rootScope, $interval) { var pathname = window.location.pathname; if (pathname == "/") pathname = "/public0.html" var refreshScene = function() { $http.get(pathname.replace(".html", ".json")).then(function(response) { if ($scope.lastpublicetag != undefined && $scope.lastpublicetag == response.headers().etag) return; $scope.lastpublicetag = response.headers().etag; $scope.scene = response.data; }); } var refreshData = function() { $http.get("/my.json").then(function(response) { if ($scope.lastmyetag != undefined && $scope.lastmyetag == response.headers().etag) return; $scope.lastmyetag = response.headers().etag; $scope.my = response.data; }); $http.get("/stats.json").then(function(response) { $scope.stats = response.data; }); $http.get("/settings.json").then(function(response) { $rootScope.recvTime(response); response.data.start = new Date(response.data.start); response.data.end = new Date(response.data.end); response.data.generation = new Date(response.data.generation); $rootScope.settings = response.data; }); $http.get("/themes.json").then(function(response) { if ($scope.lastthemeetag != undefined && $scope.lastthemeetag == response.headers().etag) return; $scope.lastthemeetag = response.headers().etag; var themes = response.data; $scope.themes = themes; $scope.max_gain = 0; angular.forEach(themes, function(theme, key) { if (theme.exercices) this[key].exercice_count = Object.keys(theme.exercices).length; else this[key].exercice_count = 0; this[key].gain = 0; angular.forEach(theme.exercices, function(ex, k) { this.gain += ex.gain; }, theme); $scope.max_gain += theme.gain; }, themes); }); $http.get("/teams.json").then(function(response) { if ($scope.lastteametag != undefined && $scope.lastteametag == response.headers().etag) return; $scope.lastteametag = response.headers().etag; var teams = response.data; $scope.teams_count = Object.keys(teams).length $scope.teams = teams; $scope.rank = []; angular.forEach($scope.teams, function(team, tid) { team.id = tid; if (team.rank) { this.push(team); } }, $scope.rank); $scope.pagesrank = Array(Math.ceil($scope.rank.length / 7)).fill(0).map(function(v, i){ return i; }); }); } refreshData(); refreshScene(); $interval(refreshData, 4200); $interval(refreshScene, 900); }) .controller("TeamController", function($scope, $http, $interval) { $scope.mystats = null; $http.get("/api/teams/" + $scope.team.id + "/stats.json").then(function(response) { $scope.mystats = response.data; }); });