var alertNbLines = true; function treatFlagKey(flag) { if (flag.values !== undefined) { if (flag.separator) { for (var i = flag.values.length - 1; i >= 0; i--) { if (flag.nb_lines && (flag.values[i] == undefined || !flag.values[i].length)) { if (alertNbLines) { alertNbLines = false; if (!confirm("Lorsque plusieurs flags sont attendus pour une même question, ceux-ci ne sont pas validés un par un. Ils ne sont validés qu'une fois tous les champs remplis correctement. (Sauf mention contraire, l'ordre n'importe pas)")) console.log(flag.values[9999].length); // Launch exception here to avoid form validation } } else if (!flag.values[i].length) { flag.values.splice(i, 1); } } if (flag.ignore_order) flag.value = flag.values.slice().sort().join(flag.separator) + flag.separator; else flag.value = flag.values.join(flag.separator) + flag.separator; if (flag.values.length == 0) flag.values = [""]; } else flag.value = flag.values[0]; } if (flag.found == null && flag.soluce !== undefined) { if (flag.value && flag.soluce) { if (flag.ignore_case) flag.value = flag.value.toLowerCase(); if (flag.validator_regexp) { var re = new RegExp(flag.validator_regexp, flag.ignore_case?'ui':'u'); var match = re.exec(flag.value); match.shift(); flag.value = match.join("+"); } if (flag.soluce == b2sum(flag.value)) flag.found = new Date(); } } return flag.found !== undefined && flag.found !== false; } String.prototype.capitalize = function() { return this .toLowerCase() .replace( /(^|\s|-)([a-z])/g, function(m,p1,p2) { return p1+p2.toUpperCase(); } ); } Array.prototype.inArray = function(v) { return this.reduce(function(presence, current) { return presence || current == v; }, false); } angular.module("FICApp") .directive('autofocus', ['$timeout', function($timeout) { return { restrict: 'A', link : function($scope, $element) { $timeout(function() { $element[0].focus(); }); } } }]) .directive('autocarousel', ['$timeout', function($timeout) { return { restrict: 'A', link : function($scope, $element) { $timeout(function() { $($element[0]).carousel(); }); } } }]); angular.module("FICApp") .filter("stripHTML", function() { return function(input) { if (!input) return input; return input.replace( /(<([^>]+)>)/ig, "" ); } }) .filter("capitalize", function() { return function(input) { return input.capitalize(); } }) .filter("rankTitle", function() { var itms = { "rank": "Rang", "name": "Équipe", "score": "Score", }; return function(input) { if (itms[input] != undefined) { return itms[input]; } else { return input; } } }) .filter("time", function() { return function(input) { input = Math.floor(input); if (input == undefined) { return "--"; } else if (input >= 10) { return input; } else { return "0" + input; } } }) .filter("timer", function() { return function(input) { input = Math.floor(input / 1000); var res = "" if (input >= 3600) { res += Math.floor(input / 3600) + ":"; input = input % 3600; } if (input >= 60) { res += Math.floor(input / 60) + "'"; input = input % 60; } return res + (input>9?input:"0"+input) + '"'; } }) .filter("since", function() { return function(passed) { if (passed < 120000) { return "Il y a " + Math.floor(passed/1000) + " secondes"; } else { return "Il y a " + Math.floor(passed/60000) + " minutes"; } } }) .filter("size", function() { var units = [ "o", "kio", "Mio", "Gio", "Tio", "Pio", "Eio", "Zio", "Yio", ] return function(input) { var res = input; var unit = 0; while (res > 1024) { unit += 1; res = res / 1024; } return (Math.round(res * 100) / 100) + " " + units[unit]; } }) .filter("coeff", function() { return function(input) { if (input > 1) { return "+" + Math.floor((input - 1) * 100) + " %" } else if (input < 1) { return "-" + Math.floor((1 - input) * 100) + " %" } else { return ""; } } }) .filter("objectLength", function() { return function(input) { if (input !== undefined) return Object.keys(input).length; else return ""; } }); angular.module("FICApp") .component('flagKey', { bindings: { kid: '=', key: '=', settings: '=', wantchoices: '=', }, controller: function() { this.additem = function(key) { this.key.values.push(""); }; }, template: `
` }); angular.module("FICApp") .controller("CountdownController", function($scope, $rootScope, $interval) { var time; if (sessionStorage.time) time = angular.fromJson(sessionStorage.time); $scope.time = {}; $rootScope.getSrvTime = function() { if (time && time.cu && time.he) return new Date(Date.now() + (time.cu - time.he)); else return undefined; } $rootScope.recvTime = function(response) { time = { "cu": Math.floor(response.headers("x-fic-time") * 1000), "he": (new Date()).getTime(), }; sessionStorage.time = angular.toJson(time); return time; } function updTime() { if (time && $rootScope.settings) { var srv_cur = new Date(Date.now() + (time.cu - time.he)); // Refresh on start/activate time reached if (Math.floor($rootScope.settings.start / 1000) == Math.floor(srv_cur / 1000) ||Math.floor($rootScope.settings.activateTime / 1000) == Math.floor(srv_cur / 1000)) $rootScope.refresh(true, true); var remain = 0; if ($rootScope.settings.start === undefined || $rootScope.settings.start == 0) { $scope.time = {}; return } else if ($rootScope.settings.start > srv_cur) { $scope.startIn = Math.floor(($rootScope.settings.start - srv_cur) / 1000); remain = $rootScope.settings.end - $rootScope.settings.start; } else if ($rootScope.settings.end > srv_cur) { $scope.startIn = 0; remain = $rootScope.settings.end - srv_cur; } $rootScope.timeProgression = 1 - remain / ($rootScope.settings.end - $rootScope.settings.start); $rootScope.timeRemaining = remain; if ($rootScope.settings.activateTime) { var now = new Date(); var actTime = new Date($rootScope.settings.activateTime); if (actTime > now) $rootScope.activateTimeCountDown = actTime - now; else $rootScope.activateTimeCountDown = null; } else { $rootScope.activateTimeCountDown = null; } remain = remain / 1000; if (remain < 0) { remain = 0; $scope.time.end = true; $scope.time.expired = true; } else if (remain < 60) { $scope.time.end = false; $scope.time.expired = true; } else { $scope.time.end = false; $scope.time.expired = false; } $scope.time.remaining = remain; $scope.time.hours = Math.floor(remain / 3600); $scope.time.minutes = Math.floor((remain % 3600) / 60); $scope.time.seconds = Math.floor(remain % 60); } } updTime(); $interval(updTime, 1000); })