-
Notifications
You must be signed in to change notification settings - Fork 0
/
proso-apps-all.min.js.map
1 lines (1 loc) · 129 KB
/
proso-apps-all.min.js.map
1
{"version":3,"file":"proso-apps-all.min.js","sources":["proso-apps-all.js"],"names":["obj2get","obj","prefix","ignore_prefix_keys","str","key","hasOwnProperty","indexOf","encodeURIComponent","angular","module","value","window","gettext","x","filter","msgid","run","gettextCatalog","setStrings","Appropriate","Close","Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.","Don't know / Don't want to rate","E-mail","How difficult are the questions?","Password","Password again","Registration was successful. You can continue to use the application.","Save","Saving...","Send","Sign In","Sign Up","Something wrong has happened.","Thank you for the message. User feedback is very important for us.","Thank you for your rating.","Thank you for your response.","Too difficult","Too easy","Username","Write to us","Your answer helps us adjust difficulty of questions.","Your e-mail address (optional)","and get all the benefits of registered users.","via E-mail","via Facebook","via Google","configServiceLoaded","m","factory","$http","$window","$cookieStore","configService","self","this","config","getConfig","appName","defaultValue","variable","overridden","isDebug","console","log","error","path","split","i","length","debug","loadConfig","get","success","response","processConfig","data","copy","override","$","isNumeric","parseFloat","put","removeOverridden","resetOverridden","getOverridden","$httpProvider","interceptors","push","$injector","request","has","url","match","loggingServiceLoaded","loggingService","debugLog","debugLogListeners","getDebugLog","extendDebugLog","events","forEach","e","listener","addDebugLogListener","processing","message","info","warn","level","jsonEvent","undefined","eventKey","toJson","ajax","type","beforeSend","setRequestHeader","cookie","contentType","always","name","cookieValue","document","cookies","trim","substring","decodeURIComponent","$provide","decorator","serverLogger","$delegate","exception","cause","stack","map","line","Object","debug_log","controller","$scope","$cookies","$timeout","date","Date","opened","maximized","loggingOpened","abTestingOpened","flashcardsLimit","unshift","$watch","n","o","addToOverride","keys","k","openABTesting","abExperiment","params","filter_column","filter_value","stats","learning_curve_length","setups","setup","values","variables","id","variable_id","drawABTestingBar","getFlashcardFilterParams","limit","flashcardsCategories","categories","JSON","stringify","flashcardsContexts","contexts","flashcardsTypes","types","showFlashcardsPractice","flashcardsAnswers","getElementById","innerHTML","showFlashcardsAnswers","column","google","visualization","DataTable","addColumn","role","addRows","number_of_answers","confidence_interval","min","max","number_of_users","returning_chance","view","title","columns","DataView","setColumns","chart","ColumnChart","options","legend","position","vAxis","format","width","height","intervals","styel","pointSize","barWidth","lineWidth","chartArea","draw","drawABTestingLearning","all_users","learning_curve_accessor","Math","rows","row","LineChart","hAxis","style","fillOpacity","curveType","showAuditChart","auditLimit","auditUser","auditPrimary","auditSecondary","auditKey","reverse","record","time","formatter","NumberFormat","fractionDigits","pattern","recommendUser","recommendationRegisterMin","register_min","recommendationRegisterMax","register_max","recommendationAnswersMin","number_of_answers_min","recommendationAnswersMax","number_of_answers_max","recommendationSuccessMin","success_min","recommendationSuccessMax","success_max","recommendationVariableName","variable_name","recommendationVariableMin","variable_min","recommendationVariableMax","variable_max","recommendationOutput","directive","restrict","templateUrl","service","$q","concepts","conceptsPromise","userStats","userStatsPromise","_getConcepts","concept","tags_raw","tags","tag","_getUserStats","getConcepts","resolve","reject","getUserStats","getFromServer","getConceptsWithTags","then","filtered_concepts","isIn","msg","getConceptByParam","param","found_concept","getConceptByName","getConceptByIdentifier","identifier","getConceptByQuery","query","getUserStatsBulk","users","$modal","link","element","attrs","feedback","email","text","openFeedback","open","ModalFeedbackCtrl","size","$modalInstance","$location","alerts","send","page","absUrl","defaults","headers","post","csrftoken","getString","sending","closeAlert","index","splice","cancel","dismiss","bind","$rootScope","$on","event","args","vote","answer","queue","deferredQuestion","promiseResolvedTmp","currentQuestion","answerQueue","current","setId","summary","loadingQuestions","initSet","configName","flushAnswerQueue","set_length","question_queue_size_max","question_queue_size_min","save_answer_immediately","cache_context","setFilter","clearQueue","questions","answers","correct","count","extend","getCurrent","saveAnswer","forceSave","now","flashcard_id","flashcard_answered_id","time_gap","round","_getFilter","saveAnswerToCurrentQuestion","answeredId","responseTime","meta","extra","response_time","answer_class","payload","question_type","task_instance_id","client_meta","practice_meta","option_ids","getQuestion","defer","_resolvePromise","promise","preloadQuestions","_loadQuestions","getQuestionQueue","getAnswerQueue","getSummary","s","question","avoid","item_id","request_in_set","concat","_loadContexts","context_id","context","cache","shift","ignore","Array","without_contexts","filters","addGroup","language","addGroupParams","getToPracticeCounts","getStats","mastered","username","getStatsPost","clean","getGroups","status","logged","loading","user","update","sessionUpdated","init","signup","_resetError","_processUser","signupParams","pass","pass2","firstName","lastName","password","password_check","first_name","last_name","getUserProfile","loadUser","processUser","profile","send_emails","public","updateSession","login","logout","clearObj","prop","loadUserFromJS","scope","$apply","loadSession","session","locale","navigator","userLanguage","browserLanguage","display_height","innerHeight","display_width","innerWidth","time_zone","jstz","determine","err","updateProfile","loginGoogle","_openPopup","loginFacebook","loginEdookit","next","settings","updateClasses","classes","cls","owner","owner_of","createClass","code","joinClass","member_of","createStudent","members","loginStudent","student","signupModal","userService","$analytics","credentials","eventTrack","category","label","loginEmail","onError","openSignupModal","close","loginModal","getQuestions","getQuestionsToAsk","answer_dict","closed_answer","open_answer","userQuestionsService","eventName","answered_count","q","on_events","slice","saveUserQuesiton","saved","$templateCache","$$csp","find","prepend"],"mappings":"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","sourcesContent":["/*\n * proso-apps-js\n * Version: 1.0.0 - 2016-07-08\n * License: MIT\n */\nangular.module(\"proso.apps\", [\"proso.apps.tpls\", \"proso.apps.common-config\",\"proso.apps.common-logging\",\"proso.apps.common-toolbar\",\"proso.apps.concept-concept\",\"proso.apps.feedback-comment\",\"proso.apps.feedback-rating\",\"proso.apps.models-practice\",\"proso.apps.models-userStats\",\"proso.apps.user-user\",\"proso.apps.user-login\",\"proso.apps.user-questions\"]);\nangular.module(\"proso.apps.tpls\", [\"templates/common-toolbar/toolbar.html\",\"templates/feedback-comment/comment.html\",\"templates/feedback-rating/rating.html\",\"templates/user-login/login-modal.html\",\"templates/user-login/signup-modal.html\",\"templates/user-questions/user_questions_banner.html\"]);\nangular.module(\"proso.apps.gettext\", [])\n.value(\"gettext\", window.gettext || function(x){return x;})\n.filter(\"trans\", [\"gettext\", function(gettext) {\n return function(msgid) {\n return gettext(msgid);\n };\n}]);\nangular.module('gettext').run(['gettextCatalog', function (gettextCatalog) {\n/* jshint -W100 */\n gettextCatalog.setStrings('cs', {\"Appropriate\":\"Tak akorát\",\"Close\":\"Zavřít\",\"Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.\":\"Narazili jste na chybu v aplikaci? Máte nápad na vylepšení? Nebo jakýkoliv jiný postřeh či komentář? Zajímá nás všechno, co nám chcete sdělit.\",\"Don't know / Don't want to rate\":\"Nevím / Nechci hodnotit\",\"E-mail\":\"E-mail\",\"How difficult are the questions?\":\"Jak těžké se vám zdají otázky?\",\"Password\":\"Heslo\",\"Password again\":\"Heslo znovu\",\"Registration was successful. You can continue to use the application.\":\"Registrace proběhla úspěšně. Můžete pokračovat v používání aplikace.\",\"Save\":\"Uložit\",\"Saving...\":\"Ukládání...\",\"Send\":\"Odeslat\",\"Sign In\":\"Přihlásit se\",\"Sign Up\":\"Zaregistrovat se\",\"Something wrong has happened.\":\"V aplikaci nastala chyba.\",\"Thank you for the message. User feedback is very important for us.\":\"Děkujeme Vám za zaslané informace. Feedback od uživatelů je k nezaplacení.\",\"Thank you for your rating.\":\"Děkujeme za vaše hodnocení.\",\"Thank you for your response.\":\"Děkujeme za odpověď.\",\"Too difficult\":\"Příliš těžké\",\"Too easy\":\"Příliš lehké\",\"Username\":\"Uživatelské jméno\",\"Write to us\":\"Napište nám\",\"Your answer helps us adjust difficulty of questions.\":\"Svou odpovědí nám pomáháte přizpůsobovat obtížnost otázek.\",\"Your e-mail address (optional)\":\"Váš e-mail (nepovinné)\",\"and get all the benefits of registered users.\":\"a získejte všechny výhody registrovaných uživatelů.\",\"via E-mail\":\"přes E-mail\",\"via Facebook\":\"přes Facebook\",\"via Google\":\"přes Google\"});\n gettextCatalog.setStrings('de', {\"Appropriate\":\"genau richtig\",\"Close\":\"Schließen\",\"Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.\":\"Haben Sie einen Fehler in der App gefunden? Haben Sie eine Idee, wie man diese App besser machen könnte? Oder einen anderen Tipp oder Kommentar? Wir interessieren uns für alles, was Sie uns mitteilen wollen.\",\"Don't know / Don't want to rate\":\"ich weiß nicht/ ich will nicht antworten\",\"E-mail\":\"E-Mail\",\"How difficult are the questions?\":\"Wie schwierig sind die gestellten Fragen?\",\"Password\":\"Passwort\",\"Password again\":\"Passwort wiederholen\",\"Registration was successful. You can continue to use the application.\":\"Die Registrierung wurde erfolgreich durgeführt. Sie können fortfahren, um die App zu nutzen.\",\"Send\":\"Senden\",\"Sign In\":\"Anmelden\",\"Sign Up\":\"Registrieren\",\"Something wrong has happened.\":\"Leider ist ein Fehler aufgetreten\",\"Thank you for the message. User feedback is very important for us.\":\"Vielen Dank für Ihre gesendeten Informationen. Feedback der Benutzer ist für uns unbezahlbar.\",\"Thank you for your rating.\":\"Vielen Dank für Ihre Einschätzung.\",\"Too difficult\":\"zu schwierig\",\"Too easy\":\"zu einfach\",\"Username\":\"Benutzername\",\"Write to us\":\"Schreiben Sie uns\",\"Your answer helps us adjust difficulty of questions.\":\"Mit ihrer Antwort helfen sie uns die Schwierigkeit der Fragen anzupassen\",\"Your e-mail address (optional)\":\"Ihre E-Mail-Adresse\",\"and get all the benefits of registered users.\":\"und genießen Sie alle Vorteile der registrierten Benutzer.\",\"via E-mail\":\"per E-Mail\",\"via Facebook\":\"via Facebook\",\"via Google\":\"via Google\"});\n gettextCatalog.setStrings('en', {\"Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.\":\"Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.\",\"Don't know / Don't want to rate\":\"Don't know / Don't want to rate\",\"E-mail\":\"E-mail\",\"How difficult are the questions?\":\"How difficult are the questions?\",\"Password\":\"Password\",\"Password again\":\"Password again\",\"Registration was successful. You can continue to use the application.\":\"Registration was successful. You can continue to use the application.\",\"Send\":\"Send\",\"Sign In\":\"Sign In\",\"Sign Up\":\"Sign Up\",\"Something wrong has happened.\":\"Something wrong has happened.\",\"Thank you for the message. User feedback is very important for us.\":\"Thank you for the message. User feedback is very important for us.\",\"Thank you for your rating.\":\"Thank you for your rating.\",\"Too difficult\":\"Too difficult\",\"Too easy\":\"Too easy\",\"Username\":\"Username\",\"Write to us\":\"Write to us\",\"Your e-mail address (optional)\":\"Your e-mail address (optional)\",\"and get all the benefits of registered users.\":\"and get all the benefits of registered users.\",\"via E-mail\":\"via E-mail\",\"via Facebook\":\"via Facebook\",\"via Google\":\"via Google\"});\n gettextCatalog.setStrings('es', {\"Appropriate\":\"Adecuado\",\"Close\":\"Cerrar\",\"Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.\":\"¿Encontraste algún error en el programa? ¿Tienes alguna sugerencia sobre como podemos mejorar? ¿Quieres compartir tu opinión con nosotros? Nos gustaría escuchar lo que tengas que decir.\",\"Don't know / Don't want to rate\":\"No sé/No quiero calificar\",\"E-mail\":\"E-mail\",\"How difficult are the questions?\":\"¿Qué tan difíciles son estas preguntas?\",\"Password\":\"Contraseña\",\"Password again\":\"Contraseña de nuevo\",\"Registration was successful. You can continue to use the application.\":\"Registro exitoso. Puedes continuar usando la aplicación.\",\"Send\":\"Enviar\",\"Sign In\":\"Iniciar sesión\",\"Sign Up\":\"Registrarse\",\"Something wrong has happened.\":\"Algo malo ha ocurrido.\",\"Thank you for the message. User feedback is very important for us.\":\"Gracias por tu mensaje. Tu opinión es muy importante para nosotros.\",\"Thank you for your rating.\":\"Gracias por calificarnos.\",\"Too difficult\":\"Muy dificil\",\"Too easy\":\"Muy facil\",\"Username\":\"Nombre de usuario\",\"Write to us\":\"Sugerencias\",\"Your answer helps us adjust difficulty of questions.\":\"Tu respuesta ayuda a ajustar la dificultad de las preguntas.\",\"Your e-mail address (optional)\":\"Tu e-mail (opcional)\",\"and get all the benefits of registered users.\":\"y accede a todos los benecifios de un usuario registrado.\",\"via E-mail\":\"con E-mail\",\"via Facebook\":\"con Facebook\",\"via Google\":\"con Google\"});\n/* jshint +W100 */\n}]);\nvar configServiceLoaded;\nif (configServiceLoaded){\n throw \"ConfigService already loaded\";\n}\nconfigServiceLoaded = true;\n\nfunction obj2get(obj, prefix, ignore_prefix_keys){\n var str = \"\";\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (str !== \"\") {\n str += \"&\";\n }\n if (ignore_prefix_keys.indexOf(key) === -1){\n str += prefix;\n }\n str += key + \"=\" + encodeURIComponent(obj[key]);\n }\n }\n return str;\n}\n\nvar m = angular.module('proso.apps.common-config', ['ngCookies']);\n\nm.factory(\"configService\", [\"$http\", \"$window\", \"$cookieStore\", function($http, $window, $cookieStore){\n if (!!$window.configService){\n return $window.configService;\n }\n\n var self = this;\n var config = null;\n\n self.getConfig = function (appName, key, defaultValue) {\n var variable = null;\n if (typeof overridden[appName + \".\" + key] !== 'undefined') {\n variable = overridden[appName + \".\" + key];\n if (self.isDebug()) {\n console.log(appName + \".\" + key, \"overridden\", variable);\n }\n return variable;\n }\n\n if (config === null) {\n console.error(\"Config not loaded\");\n return;\n }\n\n variable = config[appName];\n var path = key.split(\".\");\n for (var i = 0; i < path.length; i++) {\n if (typeof variable === 'undefined') {\n if (self.isDebug()) {\n console.log(appName + \".\" + key, \"use default\", defaultValue);\n }\n return defaultValue;\n }\n variable = variable[path[i]];\n }\n if (typeof variable === 'undefined') {\n if (self.isDebug()) {\n console.log(appName + \".\" + key, \"use default\", defaultValue);\n }\n return defaultValue;\n }\n if (self.isDebug()) {\n console.log(appName + \".\" + key, \"from config\", variable);\n }\n return variable;\n };\n\n self.isDebug = function() {\n return overridden.debug === true;\n };\n\n self.loadConfig = function () {\n return $http.get(\"/common/config/\")\n .success(function (response) {\n self.processConfig(response.data);\n })\n .error(function () {\n console.error(\"Problem while loading config from server\");\n });\n };\n\n self.processConfig = function (data) {\n config = angular.copy(data);\n };\n\n self.override = function (key, value) {\n if (value === 'true') {\n value = true;\n } else if (value === 'false') {\n value = false;\n } else if ($.isNumeric(value)) {\n value = parseFloat(value);\n }\n overridden[key] = value;\n $cookieStore.put(\"configService:overridden\", overridden);\n };\n\n self.removeOverridden = function (key) {\n delete overridden[key];\n $cookieStore.put(\"configService:overridden\", overridden);\n };\n\n self.resetOverridden = function () {\n overridden = {};\n $cookieStore.put(\"configService:overridden\", overridden);\n };\n\n self.getOverridden = function () {\n return angular.copy(overridden);\n };\n\n var overridden = $cookieStore.get(\"configService:overridden\") || {};\n $window.configService = self;\n return self;\n}]);\n\nm.config(['$httpProvider', function($httpProvider) {\n var configService;\n $httpProvider.interceptors.push(function($injector){\n return {\n request: function(config){\n if (!$injector.has('configService')) {\n console.log('There is no configuration service available.');\n return config;\n }\n configService = configService || $injector.get(\"configService\");\n if (config.url.split(\"?\")[0].match(/\\.\\w+$/) !== null){\n return config;\n }\n var overridden = obj2get(configService.getOverridden(), \"config.\", [\"user\", \"time\", \"debug\"]);\n if (overridden === \"\"){\n return config;\n }\n config.url += config.url.indexOf(\"?\") === -1 ? \"?\" : \"&\";\n config.url += overridden;\n return config;\n }\n };\n });\n}]);\n\n\nvar loggingServiceLoaded;\nif (loggingServiceLoaded){\n throw \"LoggingService already loaded\";\n}\nloggingServiceLoaded = true;\n\nvar m = angular.module('proso.apps.common-logging', ['proso.apps.common-config']);\n\nm.factory(\"loggingService\", [\"$window\", function($window) {\n if (!!$window.loggingService){\n return $window.loggingService;\n }\n\n var self = this;\n var debugLog = [];\n var debugLogListeners = [];\n\n self.getDebugLog = function() {\n return debugLog;\n };\n\n self.extendDebugLog = function(url, events) {\n events.forEach(function(e) {\n e.url = url;\n debugLog.push(e);\n });\n debugLogListeners.forEach(function(listener) {\n listener(events);\n });\n };\n\n self.addDebugLogListener = function(listener) {\n debugLogListeners.push(listener);\n };\n\n $window.loggingService = self;\n return self;\n}]);\n\nm.factory(\"serverLogger\", [function() {\n\n var self = this;\n var processing = {};\n\n self.debug = function(message, data) {\n self.log(message, data, \"debug\");\n };\n\n self.info = function(message, data) {\n self.log(message, data, \"info\");\n };\n\n self.warn = function(message, data) {\n self.log(message, data, \"warn\");\n };\n\n self.error = function(message, data) {\n self.log(message, data, \"error\");\n };\n\n self.log = function(message, data, level) {\n var jsonEvent = {\n message: message,\n level: level\n };\n if (data !== undefined) {\n jsonEvent['data'] = data;\n }\n var eventKey = angular.toJson(jsonEvent);\n if (processing[eventKey]) {\n return;\n }\n processing[eventKey] = true;\n $.ajax({\n type: \"POST\",\n url: \"/common/log/\",\n beforeSend: function (request) {\n request.setRequestHeader(\"X-CSRFToken\", self.cookie('csrftoken'));\n },\n contentType: \"application/json\",\n data: angular.toJson(jsonEvent)\n }).always(function() {\n delete processing[eventKey];\n });\n };\n\n self.cookie = function(name) {\n var cookieValue = null;\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n for (var i = 0; i < cookies.length; i++) {\n var cookie = $.trim(cookies[i]);\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) === (name + '=')) {\n cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n break;\n }\n }\n }\n return cookieValue;\n };\n\n return self;\n}]);\n\nm.config([\"$provide\", function($provide) {\n var configService;\n $provide.decorator(\"$exceptionHandler\", [\"serverLogger\", \"$injector\", \"$delegate\", function(serverLogger, $injector, $delegate) {\n return function(exception, cause) {\n configService = configService || $injector.get(\"configService\");\n $delegate(exception, cause);\n if (configService.getConfig(\"proso_common\", \"logging.js_errors\", false)) {\n serverLogger.error(exception.message, {'stack': exception.stack.split('\\n').map(function (line) { return line.trim(); })});\n }\n };\n }]);\n}]);\n\nm.config(['$httpProvider', function($httpProvider) {\n var loggingService;\n $httpProvider.interceptors.push(function($injector) {\n return {\n response: function(response) {\n loggingService = loggingService || $injector.get(\"loggingService\");\n if (response.data instanceof Object && 'debug_log' in response.data) {\n loggingService.extendDebugLog(response.config.url, response.data.debug_log);\n }\n return response;\n }\n };\n });\n}]);\n\nvar m = angular.module('proso.apps.common-toolbar', ['ngCookies', 'proso.apps.common-config']);\n\nm.controller(\"ToolbarController\", ['$scope', '$cookies', 'configService', 'loggingService', '$timeout', '$http', function($scope, $cookies, configService, loggingService, $timeout, $http) {\n $scope.override = configService.override;\n $scope.removeOverridden = configService.removeOverridden;\n $scope.date = new Date();\n $scope.debugLog = [];\n $scope.opened = $cookies[\"toolbar:opened\"] === \"true\";\n $scope.maximized = $cookies[\"toolbar:maximized\"] === \"true\";\n $scope.loggingOpened = true;\n $scope.abTestingOpened = false;\n $scope.flashcardsLimit = 10;\n $scope.override('debug', true);\n $scope.overridden = configService.getOverridden();\n loggingService.addDebugLogListener(function(events) {\n $timeout(function(){\n events.forEach(function (e) {\n $scope.debugLog.unshift(e);\n });\n });\n });\n\n $scope.$watch(\"opened\", function(n, o){\n $cookies[\"toolbar:opened\"] = n;\n });\n\n $scope.$watch(\"maximized\", function(n, o){\n $cookies[\"toolbar:maximized\"] = n;\n });\n\n $scope.addToOverride = function(name) {\n if (!name) {\n return;\n }\n configService.override(name, '');\n };\n\n $scope.getOverridden = function() {\n var overridden = configService.getOverridden();\n Object.keys(overridden).filter(function(k) {\n return (k === 'user' || k === 'debug' || k === 'time');\n }).forEach(function (k) {\n delete overridden[k];\n });\n return overridden;\n };\n\n $scope.openABTesting = function() {\n $scope.abTestingOpened = ! $scope.abTestingOpened;\n if ($scope.abTestingOpened && !$scope.abExperiment) {\n $http.get('/configab/experiments', {params: {filter_column: 'is_enabled', filter_value: true, stats: true, learning_curve_length: 5}})\n .success(function(response) {\n var data = response.data;\n if (data.length === 0) {\n return;\n }\n $scope.abExperiment = data[0];\n $scope.abExperiment.setups.forEach(function(setup) {\n setup.values.forEach(function(value) {\n $scope.abExperiment.variables.forEach(function(variable) {\n if (variable.id = value.variable_id) {\n value.variable = variable;\n }\n });\n });\n });\n $scope.drawABTestingBar();\n });\n }\n $scope.drawABTestingBar();\n };\n \n var getFlashcardFilterParams = function(){\n var params = {\n limit: $scope.flashcardsLimit\n };\n if ($scope.flashcardsCategories) {\n params.categories = JSON.stringify(\n $scope.flashcardsCategories.split(',').map(function(x) { return x.trim(); })\n );\n }\n if ($scope.flashcardsContexts) {\n params.contexts = JSON.stringify(\n $scope.flashcardsContexts.split(',').map(function(x) { return x.trim(); })\n );\n }\n if ($scope.flashcardsTypes) {\n params.types = JSON.stringify(\n $scope.flashcardsTypes.split(',').map(function(x) { return x.trim(); })\n );\n }\n return params;\n };\n\n $scope.showFlashcardsPractice = function() {\n $scope.flashcardsAnswers = [];\n var params = getFlashcardFilterParams();\n\n $http.get('/flashcards/practice_image', {params: params}).success(function(response) {\n document.getElementById(\"flashcardsChart\").innerHTML = response;\n });\n };\n\n $scope.showFlashcardsAnswers = function() {\n var params = getFlashcardFilterParams();\n\n document.getElementById(\"flashcardsChart\").innerHTML = '';\n $http.get('/flashcards/answers', {params: params}).success(function(response) {\n $scope.flashcardsAnswers = response.data;\n });\n };\n\n $scope.drawABTestingBar = function(column) {\n if (!$scope.abExperiment) {\n return;\n }\n var data = new google.visualization.DataTable();\n data.addColumn('string', 'Experiment Setup');\n data.addColumn('number', 'Number of Answers');\n data.addColumn({type: 'number', role: 'interval'});\n data.addColumn({type: 'number', role: 'interval'});\n data.addColumn('number', 'Number of Users');\n data.addColumn('number', 'Returning Chance');\n data.addColumn({type: 'number', role: 'interval'});\n data.addColumn({type: 'number', role: 'interval'});\n data.addRows($scope.abExperiment.setups.map(function(setup) {\n return [\n 'Setup #' + setup.id,\n setup.stats.number_of_answers.value,\n setup.stats.number_of_answers.confidence_interval.min,\n setup.stats.number_of_answers.confidence_interval.max,\n setup.stats.number_of_users,\n setup.stats.returning_chance.value,\n setup.stats.returning_chance.confidence_interval.min,\n setup.stats.returning_chance.confidence_interval.max,\n ];\n }));\n var view = data;\n var title = 'All';\n if (column) {\n var columns = {\n number_of_answers: [0, 1, 2, 3],\n number_of_users: [0, 4],\n returning_chance: [0, 5, 6, 7],\n };\n title = column;\n view = new google.visualization.DataView(data);\n view.setColumns(columns[column]);\n }\n var chart = new google.visualization.ColumnChart(document.getElementById(\"abChart\"));\n var options = {\n title: title,\n legend: {\n position: 'none'\n },\n vAxis: {\n format: '#.###'\n },\n width: 480,\n height: 300,\n intervals: {\n styel: 'bars',\n pointSize: 10,\n barWidth: 0,\n lineWidth: 4,\n },\n chartArea: {'width': '80%', 'height': '80%'}\n };\n chart.draw(view, options);\n };\n\n $scope.drawABTestingLearning = function(all_users) {\n if (!$scope.abExperiment) {\n return;\n }\n var learning_curve_accessor = 'learning_curve';\n if (all_users) {\n learning_curve_accessor = 'learning_curve_all_users';\n }\n var data = new google.visualization.DataTable();\n data.addColumn({type: 'number', role: 'domain'});\n var length = 0;\n $scope.abExperiment.setups.forEach(function(setup) {\n data.addColumn('number', 'Setup #' + setup.id);\n data.addColumn({type: 'number', role: 'interval'});\n data.addColumn({type: 'number', role: 'interval'});\n length = Math.max(setup.stats[learning_curve_accessor].success.length);\n });\n var rows = [];\n for (var i = 0; i < length; i++) {\n var row = [i];\n /*jshint -W083 */\n $scope.abExperiment.setups.forEach(function(setup) {\n row.push(setup.stats[learning_curve_accessor].success[i].value);\n row.push(setup.stats[learning_curve_accessor].success[i].confidence_interval.min);\n row.push(setup.stats[learning_curve_accessor].success[i].confidence_interval.max);\n });\n rows.push(row);\n }\n data.addRows(rows);\n var chart = new google.visualization.LineChart(document.getElementById(\"abChart\"));\n var options = {\n title: 'Learning',\n legend: {\n position: 'none'\n },\n vAxis: {\n format: '#.###'\n },\n hAxis: {\n title: 'Attempt',\n position: 'center'\n },\n intervals: {\n style: 'area',\n fillOpacity: 0.2\n },\n lineWidth: 4,\n pointSize: 10,\n curveType: 'function',\n width: 480,\n height: 300,\n 'chartArea': {'width': '80%', 'height': '80%'}\n };\n chart.draw(data, options);\n };\n\n $scope.showAuditChart = function() {\n var params = {};\n if ($scope.auditLimit) {\n params['limit'] = $scope.auditLimit;\n }\n if ($scope.auditUser) {\n params['user'] = $scope.auditUser;\n }\n if ($scope.auditPrimary) {\n params['item'] = $scope.auditPrimary;\n }\n if ($scope.auditSecondary) {\n params['item_secondary'] = $scope.auditSecondary;\n }\n $http.get(\"/models/audit/\" + $scope.auditKey, {params: params})\n .success(function(response) {\n var data = new google.visualization.DataTable();\n data.addColumn('number', 'Update');\n data.addColumn('number', 'Value');\n data.addColumn({type: 'datetime', role: 'tooltip'});\n response.data.reverse();\n var rows = [];\n for (var i = 0; i < response.data.length; i++) {\n var record = response.data[i];\n rows.push([i, record.value, new Date(record.time)]);\n }\n data.addRows(rows);\n var options = {\n title: $scope.auditKey,\n legend: {\n position: 'none'\n },\n vAxis: {\n format: '#.###'\n },\n hAxis: {\n title: 'Update',\n position: 'center'\n },\n width: 480,\n height: 300,\n 'chartArea': {'width': '80%', 'height': '80%'}\n };\n var formatter = new google.visualization.NumberFormat({\n fractionDigits: 3, pattern: '#.###'\n });\n formatter.format(data, 1);\n var chart = new google.visualization.LineChart(document.getElementById('auditChart'));\n chart.draw(data, options);\n });\n };\n\n $scope.recommendUser = function() {\n var filter = {};\n if ($scope.recommendationRegisterMin) {\n filter.register_min = $scope.recommendationRegisterMin;\n }\n if ($scope.recommendationRegisterMax) {\n filter.register_max = $scope.recommendationRegisterMax;\n }\n if ($scope.recommendationAnswersMin) {\n filter.number_of_answers_min = $scope.recommendationAnswersMin;\n }\n if ($scope.recommendationAnswersMax) {\n filter.number_of_answers_max = $scope.recommendationAnswersMax;\n }\n if ($scope.recommendationSuccessMin) {\n filter.success_min = $scope.recommendationSuccessMin;\n }\n if ($scope.recommendationSuccessMax) {\n filter.success_max = $scope.recommendationSuccessMax;\n }\n if ($scope.recommendationVariableName) {\n filter.variable_name = $scope.recommendationVariableName;\n }\n if ($scope.recommendationVariableMin) {\n filter.variable_min = $scope.recommendationVariableMin;\n }\n if ($scope.recommendationVariableMax) {\n filter.variable_max = $scope.recommendationVariableMax;\n }\n $scope.recommendationOutput = 'Loading...';\n $http.get('/models/recommend_users', {params: filter})\n .success(function (response) {\n if (response.data.length > 0) {\n $scope.recommendationOutput = response.data[0];\n } else {\n $scope.recommendationOutput = 'Not Found';\n }\n });\n };\n\n}]);\n\nm.directive('toolbar', [function () {\n return {\n restrict: 'E',\n controller: 'ToolbarController',\n templateUrl: 'templates/common-toolbar/toolbar.html'\n };\n}]);\n\nvar m = angular.module('proso.apps.concept-concept', []);\nm.service(\"conceptService\", [\"$http\", \"$q\", function($http, $q) {\n var self = this;\n var concepts = null;\n var conceptsPromise = null;\n var userStats = null;\n var userStatsPromise = null;\n\n var _getConcepts = function () {\n if (conceptsPromise){\n return conceptsPromise;\n }\n conceptsPromise = $http.get(\"/concepts/concepts?all=True\")\n .success(function(response){\n concepts = response.data;\n angular.forEach(concepts, function (concept) {\n concept.tags_raw = [];\n angular.forEach(concept.tags, function (tag) {\n concept.tags_raw.push(tag.type + ':' + tag.value);\n });\n });\n }).error(function(){\n console.error(\"Error while loading concepts from backend\");\n });\n return conceptsPromise;\n };\n\n var _getUserStats = function () {\n if (userStatsPromise){\n return userStatsPromise;\n }\n userStatsPromise = $http.get(\"/concepts/user_stats\")\n .success(function(response){\n userStats = response.data;\n }).error(function(){\n console.error(\"Error while loading user stats from backend\");\n });\n return userStatsPromise;\n };\n\n // get all concepts\n self.getConcepts = function () {\n return $q(function(resolve, reject) {\n if (concepts !== null) {\n resolve(angular.copy(concepts));\n } else {\n _getConcepts()\n .success(function(){\n resolve(angular.copy(concepts));\n }).error(function(){\n reject(\"Error while loading concepts from backend\");\n });\n }\n });\n };\n\n self.getUserStats = function (getFromServer) {\n return $q(function(resolve, reject) {\n if (userStats !== null && !getFromServer ) {\n resolve(angular.copy(userStats));\n } else {\n userStatsPromise = null;\n _getUserStats()\n .success(function(){\n resolve(angular.copy(userStats));\n }).error(function(){\n reject(\"Error while loading userStats from backend\");\n });\n }\n });\n };\n\n // get all concepts containing all provided tags (form 'type:value')\n self.getConceptsWithTags = function (tags) {\n if (typeof tags !== 'object'){\n tags = tags ? [tags] : [];\n }\n return $q(function(resolve, reject) {\n self.getConcepts().then(\n function (concepts) {\n var filtered_concepts = [];\n angular.forEach(concepts, function (concept) {\n var isIn = true;\n angular.forEach(tags, function (tag) {\n if (concept.tags_raw.indexOf(tag) === -1){\n isIn = false;\n }\n });\n if (isIn){\n filtered_concepts.push(concept);\n }\n });\n resolve(filtered_concepts);\n }, function (msg) {\n reject(msg);\n });\n });\n };\n\n var getConceptByParam = function (param, value) {\n return $q(function(resolve, reject) {\n self.getConcepts().then(\n function (concepts) {\n var found_concept = {};\n angular.forEach(concepts, function (concept) {\n if (concept[param] === value){\n found_concept = concept;\n }\n });\n resolve(found_concept);\n }, function (msg) {\n reject(msg);\n });\n });\n };\n\n self.getConceptByName = function (name) {\n return getConceptByParam('name', name);\n };\n\n self.getConceptByIdentifier = function (identifier) {\n return getConceptByParam('identifier', identifier);\n };\n\n self.getConceptByQuery = function (query) {\n return getConceptByParam('identifier', query);\n };\n\n self.getUserStatsBulk = function (users) {\n return $http.get(\"/concepts/user_stats_bulk\", {params: {users: JSON.stringify(users)}});\n };\n}]);\nvar m = angular.module('proso.apps.feedback-comment', ['ui.bootstrap', 'gettext']);\n\nm.directive('feedbackComment', ['$modal', '$window', 'gettextCatalog', function ($modal, $window, gettextCatalog) {\n return {\n restrict: 'A',\n link: function ($scope, element, attrs) {\n $scope.feedback = {\n email: '@',\n text: '',\n };\n\n $scope.openFeedback = function () {\n if (attrs.email) {\n $scope.feedback.email = attrs.email;\n }\n if (attrs.text) {\n $scope.feedback.text = attrs.text;\n }\n\n $modal.open({\n templateUrl: 'templates/feedback-comment/comment.html',\n controller: ModalFeedbackCtrl,\n size: 'lg',\n resolve: {\n feedback: function () {\n return $scope.feedback;\n }\n }\n });\n };\n\n var ModalFeedbackCtrl = ['$scope', '$modalInstance', '$http', '$cookies', '$location', 'feedback', 'gettextCatalog',\n function ($scope, $modalInstance, $http, $cookies, $location, feedback, gettextCatalog) {\n\n $scope.feedback = feedback;\n $scope.alerts = [];\n\n $scope.send = function() {\n feedback.page = $location.absUrl();\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n $http.post('/feedback/feedback/', feedback).success(function(data){\n $scope.alerts.push({\n type : 'success',\n msg : gettextCatalog.getString('Thank you for the message. User feedback is very important for us.'),\n });\n $scope.sending = false;\n feedback.text = '';\n }).error(function(){\n $scope.alerts.push({\n type : 'danger',\n msg : gettextCatalog.getString(\"Something wrong has happened.\"),\n });\n $scope.sending = false;\n });\n $scope.sending = true;\n };\n\n $scope.closeAlert = function(index) {\n $scope.alerts.splice(index, 1);\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n }];\n\n element.bind('click', $scope.openFeedback);\n }\n };\n}]);\n\nvar m = angular.module('proso.apps.feedback-rating', ['ui.bootstrap', 'gettext']);\n\nm.controller('RatingModalController', ['$scope', '$rootScope', '$modal', function ($scope, $rootScope, $modal) {\n\n $scope.open = function() {\n if ($scope.email) {\n $scope.feedback.email = $scope.email;\n }\n\n $modal.open({\n templateUrl: 'templates/feedback-rating/rating.html',\n controller: 'RatingModalInstanceController',\n size: 'lg',\n resolve: {\n feedback: function () {\n return $scope.feedback;\n }\n }\n });\n };\n\n $rootScope.$on('openRatingModal', function(event, args) {\n $scope.open();\n });\n}]);\n\nm.controller('RatingModalInstanceController', ['$scope', '$modalInstance', '$http', '$cookies', 'gettextCatalog', function($scope, $modalInstance, $http, $cookies, gettextCatalog) {\n\n $scope.alerts = [];\n\n $scope.vote = function(answer) {\n $scope.answer = answer;\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n $http.post('/feedback/rating/', {'value': answer}).success(function(data){\n $scope.alerts.push({\n type : 'success',\n msg : gettextCatalog.getString('Thank you for your rating.'),\n });\n $scope.sending = false;\n }).error(function(){\n $scope.alerts.push({\n type : 'danger',\n msg : gettextCatalog.getString(\"Something wrong has happened.\"),\n });\n $scope.sending = false;\n });\n $scope.sending = true;\n };\n\n $scope.closeAlert = function(index) {\n $scope.alerts.splice(index, 1);\n $modalInstance.dismiss('cancel');\n };\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n}]);\n\nm.directive('ratingModal', ['$window', function ($window) {\n return {\n restrict: 'E',\n controller: 'RatingModalController',\n };\n}]);\n\n\nvar m = angular.module('proso.apps.models-practice', ['ngCookies', 'proso.apps.common-config']);\nm.service(\"practiceService\", [\"$http\", \"$q\", \"configService\", \"$cookies\", function($http, $q, configService, $cookies){\n var self = this;\n\n var queue = [];\n var deferredQuestion = null;\n var promiseResolvedTmp = false;\n var currentQuestion = null;\n var answerQueue = [];\n\n var config = {};\n var current = 0;\n var setId = 0;\n var summary = {};\n\n var contexts = {};\n\n var loadingQuestions = false;\n\n // called on create and set reset\n self.initSet = function(configName){\n self.flushAnswerQueue();\n var key = \"practice.\" + configName + \".\";\n config.set_length = configService.getConfig(\"proso_models\", key + \"set_length\", 10);\n config.question_queue_size_max = configService.getConfig(\"proso_models\", key + \"question_queue_size_max\", 1);\n config.question_queue_size_min = configService.getConfig(\"proso_models\", key + \"question_queue_size_min\", 1);\n config.save_answer_immediately = configService.getConfig(\"proso_models\", key + \"save_answer_immediately\", false);\n config.cache_context = configService.getConfig(\"proso_models\", key + \"cache_context\", false);\n\n self.setFilter({});\n current = 0;\n currentQuestion = null;\n self.clearQueue();\n deferredQuestion = null;\n setId++;\n summary = {\n questions: [],\n answers: [],\n correct: 0,\n count: 0\n };\n };\n\n self.setFilter = function(filter){\n config.filter = {\n filter: [],\n };\n angular.extend(config.filter, filter);\n };\n\n self.getCurrent = function(){\n return current;\n };\n\n self.getConfig = function(){\n return angular.copy(config);\n };\n\n // add answer to queue and upload queued answers if necessary\n self.saveAnswer = function(answer, forceSave){\n if (answer) {\n answer.time = Date.now();\n answerQueue.push(answer);\n summary.answers.push(answer);\n summary.count++;\n if (answer.flashcard_id === answer.flashcard_answered_id) {\n summary.correct++;\n }\n }\n\n if (config.save_answer_immediately || forceSave || current >= config.set_length) {\n if (answerQueue.length > 0) {\n answerQueue.forEach(function(answer){\n answer.time_gap = Math.round((Date.now() - answer.time) / 1000);\n delete answer.time;\n });\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n $http.post(\"/models/answer/\", {answers: answerQueue}, {params: _getFilter(['avoid', 'limit'])})\n .error(function (response) {\n console.error(\"Problem while uploading answer\", response);\n });\n answerQueue = [];\n }\n }\n };\n\n self.flushAnswerQueue = function(){\n self.saveAnswer(null, true);\n };\n\n // build answer from current question and save\n self.saveAnswerToCurrentQuestion = function(answeredId, responseTime, meta, extra){\n if (!currentQuestion) {\n console.error(\"There is no current flashcard\");\n return;\n }\n var answer = {\n response_time: responseTime,\n answer_class: currentQuestion.answer_class\n };\n if (currentQuestion.answer_class === \"flashcard_answer\"){\n answer.flashcard_id = currentQuestion.payload.id;\n answer.flashcard_answered_id = answeredId;\n answer.question_type = currentQuestion.question_type;\n }\n if (currentQuestion.answer_class === \"task_answer\"){\n answer.task_instance_id = currentQuestion.payload.id;\n answer.correct = answeredId === currentQuestion.payload.id;\n }\n if (meta) {\n answer.meta = {client_meta: meta};\n }\n if (currentQuestion.practice_meta) {\n if (answer.meta) {\n answer.meta = angular.extend(answer.meta, currentQuestion.practice_meta);\n } else {\n answer.meta = currentQuestion.practice_meta;\n }\n }\n if (currentQuestion.payload.options && currentQuestion.payload.options.length){\n answer.option_ids = [];\n currentQuestion.payload.options.forEach(function(o){\n if (o.id !== currentQuestion.payload.id) {\n answer.option_ids.push(o.id);\n }\n });\n }\n if (extra){\n answer = angular.extend(answer, extra);\n }\n self.saveAnswer(answer);\n };\n\n // return promise of question\n self.getQuestion = function(){\n if(deferredQuestion){\n return $q(function(resolve, reject){\n reject(\"Already one question promised\");\n });\n }\n deferredQuestion = $q.defer();\n promiseResolvedTmp = false;\n _resolvePromise();\n deferredQuestion.promise.then(function(){ deferredQuestion = null;}, function(){ deferredQuestion = null;});\n return deferredQuestion.promise;\n };\n\n self.clearQueue = function(){\n queue = [];\n };\n\n // preload questions\n self.preloadQuestions = function(){\n _loadQuestions();\n };\n\n self.getQuestionQueue = function(){\n return queue;\n };\n\n self.getAnswerQueue = function(){\n return answerQueue;\n };\n\n self.getSummary = function(){\n var s = angular.copy(summary);\n for (var i = 0; i < Math.min(s.questions.length, s.answers.length); i++){\n var answer = s.answers[i];\n var question = s.questions[i];\n if (question.id === answer.flashcard_id){\n question.answer = answer;\n }\n answer.correct = answer.flashcard_id === answer.flashcard_answered_id;\n }\n return s;\n };\n\n\n var _loadQuestions = function(){\n if (loadingQuestions){\n return; // loading request is already running\n }\n\n if (queue.length >= config.question_queue_size_min) { return; } // if there are some questions queued\n config.filter.limit = config.question_queue_size_max - queue.length;\n if (deferredQuestion && !promiseResolvedTmp) { config.filter.limit ++; } // if we promised one question\n config.filter.limit = Math.min(config.filter.limit, config.set_length - current - queue.length); // check size of set\n if (config.filter.limit === 0) {return;} // nothing to do\n config.filter.avoid = currentQuestion && currentQuestion.payload ? [currentQuestion.payload.item_id] : []; // avoid current question\n queue.forEach(function(question){\n config.filter.avoid.push(question.payload.item_id);\n });\n\n var filter = _getFilter();\n var request;\n if (answerQueue.length === 0) {\n request = $http.get(\"/models/practice/\", {params: filter});\n }else{\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n request = $http.post(\"/models/practice/\", {answers: answerQueue}, {params: filter});\n answerQueue = [];\n }\n var request_in_set = setId;\n loadingQuestions = true;\n request\n .success(function(response){\n loadingQuestions = false;\n if (request_in_set !== setId) {\n return;\n }\n queue = queue.concat(response.data);\n _loadContexts();\n if (queue.length > 0) {\n _resolvePromise();\n }\n else{\n console.error(\"No Questions to practice\");\n }\n })\n .error(function (response) {\n loadingQuestions = false;\n if (deferredQuestion !== null){\n deferredQuestion.reject(\"Something went wrong while loading questions from backend.\");\n }\n console.error(\"Something went wrong while loading questions from backend.\");\n });\n };\n\n var _loadContexts = function(){\n if (config.cache_context){\n queue.forEach(function(question){\n if (question.payload.context_id in contexts){\n if (contexts[question.payload.context_id] !== \"loading\"){\n question.payload.context = contexts[question.payload.context_id];\n }\n }else{\n contexts[question.payload.context_id] = \"loading\";\n $http.get(\"/flashcards/context/\" + question.payload.context_id, {cache: true})\n .success(function(response){\n contexts[question.payload.context_id] = response.data;\n _resolvePromise();\n }).error(function(){\n delete contexts[question.payload.context_id];\n console.error(\"Error while loading context from backend\");\n });\n }\n });\n }\n };\n\n var _resolvePromise = function(){\n if (deferredQuestion === null){\n return;\n }\n if (config.set_length === current){\n deferredQuestion.reject(\"Set was completed\");\n return;\n }\n if (queue.length > 0) {\n if (config.cache_context){\n if (typeof contexts[queue[0].payload.context_id] === 'object'){\n queue[0].payload.context = contexts[queue[0].payload.context_id];\n }else{\n return;\n }\n }\n currentQuestion = queue.shift();\n current++;\n promiseResolvedTmp = true;\n summary.questions.push(currentQuestion);\n deferredQuestion.resolve(currentQuestion);\n }\n _loadQuestions();\n };\n\n var _getFilter = function(ignore) {\n if (!ignore) {\n ignore = [];\n }\n var filter = {};\n for (var key in config.filter){\n if (ignore.indexOf(key) !== -1) {\n continue;\n }\n if (config.filter[key] instanceof Array) {\n filter[key] = JSON.stringify(config.filter[key]);\n }else{\n filter[key] = config.filter[key];\n }\n }\n if (config.cache_context){\n filter.without_contexts = 1;\n }\n return filter;\n };\n}]);\n\nvar m = angular.module('proso.apps.models-userStats', ['ngCookies']);\nm.service(\"userStatsService\", [\"$http\", \"$cookies\", function($http, $cookies){\n var self = this;\n\n var filters = {\n filters: {},\n };\n\n self.addGroup = function (id, data) {\n if (!data.language){\n delete data.language;\n }\n filters.filters[id] = data;\n };\n\n self.addGroupParams = function (id, filter, language) {\n filters.filters[id] = filter;\n if (typeof language !== \"undefined\"){\n filters.language = language;\n }\n };\n\n self.getToPracticeCounts = function(){\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n return $http.post(\"/models/to_practice_counts/\", filters, {cache: true});\n };\n\n self.getStats = function(mastered, username){\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n var params = {filters: JSON.stringify(filters.filters)};\n if (mastered){\n params.mastered = true;\n }\n if (username){\n params.username = username;\n }\n return $http.get(\"/models/user_stats/\", {params: params});\n };\n\n self.getStatsPost = function(mastered, username){\n $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;\n var params = \"?\";\n params += mastered ? \"&mastered=true\" : \"\";\n params += username ? \"&username=\"+username : \"\";\n return $http.post(\"/models/user_stats/\" + params, filters);\n };\n\n self.clean = function(){\n filters = {\n filters: {},\n };\n };\n\n self.getGroups = function (){\n return angular.copy(filters);\n };\n\n}]);\n\nvar m = angular.module('proso.apps.user-user', ['ngCookies']);\nm.service(\"userService\", [\"$http\", function($http){\n var self = this;\n self.status = {\n \"logged\": false,\n \"loading\": false\n };\n self.user = {};\n var update = this.update = {};\n var sessionUpdated = false;\n self.error = {};\n\n // called on create\n self.init = function (){\n };\n\n self.signup = function(data){\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/signup/\", data);\n promise.success(function(response){\n _processUser(response.data);\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.signupParams = function(name, email, pass, pass2, firstName, lastName){\n return self.signup({\n \"username\": name,\n \"email\": email,\n \"password\": pass,\n \"password_check\": pass2,\n \"first_name\": firstName,\n \"last_name\": lastName\n });\n };\n\n // get public user profile from backend\n self.getUserProfile = function(username, stats){\n var params = {username: username};\n if (stats){\n params.stats = true;\n }\n return $http.get(\"/user/profile/\", {params: params});\n };\n\n // get user profile from backend\n self.loadUser = function(stats){\n self.status.loading = true;\n var params = {};\n if (stats){\n params.stats = true;\n }\n return $http.get(\"/user/profile/\", {params: params})\n .success(function(response){\n _processUser(response.data);\n })\n .finally(function(response){\n self.status.loading = false;\n });\n };\n\n self.processUser = function(data){\n _processUser(angular.copy(data));\n };\n\n // process user data\n var _processUser = function(data){\n if (!data) {\n self.status.logged = false;\n return;\n }\n self.status.logged = data.user && data.user.email !== undefined;\n self.user.profile = data;\n angular.extend(self.user, data.user);\n angular.extend(update, {\n user: {\n first_name: self.user.first_name,\n last_name: self.user.last_name\n },\n send_emails: self.user.profile.send_emails,\n public: self.user.profile.public\n });\n delete self.user.profile.user;\n if (!sessionUpdated){\n self.updateSession();\n sessionUpdated = true;\n }\n };\n\n self.login = function(username, pass){\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/login/\", {\n username: username,\n password: pass\n });\n promise.success(function(response){\n _processUser(response.data);\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.logout = function(){\n self.status.loading = true;\n $http.get(\"/user/logout/\")\n .success(function(response){\n clearObj(self.user);\n self.status.logged = false;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n };\n\n\n var _resetError = function(){\n clearObj(self.error);\n };\n\n var clearObj = function(obj){\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)){ delete obj[prop]; }\n }\n };\n\n\n self.loadUserFromJS = function (scope, stats) {\n scope.$apply(self.loadUser(stats));\n };\n\n self.loadSession = function(){\n self.status.loading = true;\n $http.get(\"/user/session/\")\n .success(function(response){\n self.user.session = response.data;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n };\n\n self.updateSession = function(){\n var data = {\n locale: window.navigator.language || window.navigator.userLanguage || window.navigator.browserLanguage,\n display_height: window.innerHeight,\n display_width: window.innerWidth\n };\n try{\n data.time_zone = jstz.determine().name();\n }catch (err){ console.log(\"JSTimeZone lib not loaded\");}\n $http.post(\"/user/session/\", data).error(function(){\n console.error(\"Error while updating session\");\n });\n };\n\n self.updateProfile = function(user){\n var data = {\n user: {},\n };\n if (user.profile) {\n angular.extend(data, user.profile);\n }\n angular.extend(data.user, user);\n delete data.user.profile;\n delete data.user.username;\n\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/profile/\", data);\n promise.success(function(response){\n _processUser(response.data);\n })\n .error(function(response){\n self.error = response;\n }).finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.loginGoogle = function() {\n _openPopup('/login/google-oauth2/', '/user/close_popup/');\n };\n\n self.loginFacebook = function() {\n _openPopup('/login/facebook/', '/user/close_popup/');\n };\n\n self.loginEdookit = function() {\n _openPopup('/login/edookit/', '/user/close_popup/');\n };\n\n var _openPopup = function(url, next){\n var settings = 'height=700,width=700,left=100,top=100,resizable=yes,scrollbars=yes,toolbar=no,menubar=no,location=yes,directories=no,status=yes';\n url += \"?next=\" + next;\n window.open(url, \"popup\", settings);\n };\n\n self.init();\n\n self.updateClasses = function(){\n self.status.loading = true;\n _resetError();\n var promise = $http.get(\"/user/classes/\");\n promise.success(function(response){\n var classes = response.data;\n angular.forEach(classes, function (cls) {\n delete cls.owner;\n });\n self.user.profile.owner_of = classes;\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.createClass = function(name, code){\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/create_class/\", {\n name: name,\n code: code\n });\n promise.success(function(response){\n var cls = response.data;\n delete cls.owner;\n self.user.profile.owner_of.push(cls);\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.joinClass = function (code) {\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/join_class/\", {\n code: code\n });\n promise.success(function(response){\n self.user.profile.member_of.push(response.data);\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.createStudent = function(data){\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/create_student/\", data);\n promise.success(function(response){\n angular.forEach(self.user.profile.owner_of, function (cls) {\n if (cls.id === data.class){\n cls.members.push(response.data);\n }\n });\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n self.loginStudent = function (id) {\n self.status.loading = true;\n _resetError();\n var promise = $http.post(\"/user/login_student/\", {\n student: id\n });\n promise.success(function(response){\n _processUser(response.data);\n })\n .error(function(response){\n self.error = response;\n })\n .finally(function(response){\n self.status.loading = false;\n });\n return promise;\n };\n\n}]);\n\nvar m = angular.module('proso.apps.user-login', ['ui.bootstrap', 'gettext', 'proso.apps.user-user', 'angulartics', 'angulartics.google.analytics']);\n\nm.controller('LoginController', ['$scope', '$modalInstance', 'signupModal', 'userService', 'gettextCatalog', '$analytics',\n function ($scope, $modalInstance, signupModal, userService, gettextCatalog, $analytics) {\n\n $scope.credentials = {};\n $scope.alerts = [];\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.loginGoogle = function() {\n $analytics.eventTrack('click', {\n category: 'login',\n label: '/login/google',\n });\n userService.loginGoogle();\n };\n\n $scope.loginFacebook = function() {\n $analytics.eventTrack('click', {\n category: 'login',\n label: '/login/facebook',\n });\n userService.loginFacebook();\n };\n\n $scope.loginEmail = function() {\n $analytics.eventTrack('click', {\n category: 'login',\n label: '/login/email',\n });\n userService\n .login($scope.credentials.username, $scope.credentials.password)\n .error($scope.onError)\n .success(function() {\n $scope.cancel();\n });\n };\n\n $scope.openSignupModal = function() {\n $scope.cancel();\n signupModal.open();\n };\n\n $scope.signup = function() {\n $analytics.eventTrack('click', {\n category: 'signup',\n label: '/signup/email',\n });\n userService\n .signupParams(\n $scope.credentials.username,\n $scope.credentials.email,\n $scope.credentials.password,\n $scope.credentials.password_check,\n $scope.credentials.first_name,\n $scope.credentials.last_name\n )\n .error($scope.onError)\n .success(function() {\n $modalInstance.close();\n });\n };\n\n $scope.onError = function(error) {\n $analytics.eventTrack('error', {\n category: 'login',\n label: 'error/login'\n });\n $scope.alerts.push({\n type: error.type || 'danger',\n msg: error.error || gettextCatalog.getString('Something wrong has happened.')\n });\n };\n\n $scope.closeAlert = function(index) {\n $scope.alerts.splice(index, 1);\n };\n}]);\n\nm.factory('signupModal', ['$modal', function($modal) {\n return {\n open: function() {\n $modal.open({\n templateUrl: 'templates/user-login/signup-modal.html',\n controller: 'LoginController',\n });\n }\n };\n}]);\n\nm.factory('loginModal', [\"$modal\", function($modal) {\n return {\n open: function() {\n $modal.open({\n templateUrl: 'templates/user-login/login-modal.html',\n controller: 'LoginController',\n });\n }\n };\n}]);\n\nm.directive('loginButton', ['loginModal', function(loginModal) {\n return {\n restrict: 'A',\n link: function (scope, element) {\n element.bind('click', function(){\n loginModal.open();\n });\n }\n };\n}]);\n\nvar m = angular.module('proso.apps.user-questions', []);\nm.factory('userQuestionsService', [\"$http\", function($http) {\n return {\n getQuestions: function() {\n return $http.get('/user/questions/?all=true');\n },\n getQuestionsToAsk: function() {\n return $http.get('/user/questions_to_ask/');\n },\n saveAnswer: function(question, answer) {\n var answer_dict = {\n question : question.id,\n };\n if (answer && answer.id) {\n answer_dict.closed_answer = answer.id;\n } else if (answer) {\n answer_dict.open_answer = answer;\n }\n var data = {\n answers : [answer_dict],\n };\n return $http.post('/user/answer_question/', data);\n }\n };\n}]);\n\nm.directive('userQuestionsBanner', ['userQuestionsService', '$rootScope', 'userService',\n function(userQuestionsService, $rootScope, userService) {\n return {\n restrict: 'A',\n templateUrl : 'templates/user-questions/user_questions_banner.html',\n link: function ($scope) {\n var eventName = 'questionSetFinished';\n $rootScope.$on(eventName, function() {\n var answered_count = userService.user.profile.number_of_answers;\n userQuestionsService.getQuestionsToAsk().success(function(data) {\n $scope.questions = data.data.filter(function(q) {\n return q.on_events && q.on_events[0] &&\n q.on_events[0].type === eventName &&\n q.on_events[0].value <= answered_count &&\n answered_count < q.on_events[0].value + 10;\n });\n $scope.questions = $scope.questions.slice(0, 1);\n });\n });\n\n $scope.saveUserQuesiton = function(question, answer) {\n if (answer) {\n question.answer = answer;\n }\n question.processing = true;\n userQuestionsService.saveAnswer(\n question, question.answer).success(function(data) {\n question.processing = false;\n question.saved = true;\n }).error(function(data) {\n question.processing = false;\n question.error = true;\n });\n };\n }\n };\n}]);\n\n\nangular.module(\"templates/common-toolbar/toolbar.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"templates/common-toolbar/toolbar.html\",\n \"<div id=\\\"proso-toolbar\\\">\\n\" +\n \" <div id=\\\"config-bar-show-button\\\" ng-click=\\\"opened = !opened\\\" ng-hide=\\\"opened\\\"> proso bar </div>\\n\" +\n \"\\n\" +\n \" <div id=\\\"config-bar\\\" ng-cloak ng-show=\\\"opened\\\" ng-class=\\\"{'maximized' : maximized}\\\">\\n\" +\n \" <div id=\\\"config-bar-header\\\">\\n\" +\n \" <span id=\\\"config-bar-maximize\\\" ng-click=\\\"maximized = !maximized\\\">Maximize</span>\\n\" +\n \" <span id=\\\"config-bar-hide\\\" ng-click=\\\"opened = !opened\\\">Close</span>\\n\" +\n \" </div>\\n\" +\n \" <ul id=\\\"config-bar-content\\\">\\n\" +\n \" <li>\\n\" +\n \" <span ng-click=\\\"addToOverride(propertyToOverride)\\\" class=\\\"add-to-override\\\">+</span>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"propertyToOverride\\\" id=\\\"config-bar-property-name\\\" placeholder=\\\"Property Name\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <span ng-click=\\\"removeOverridden('user'); overridden.user = null;\\\" class=\\\"reset\\\">X</span>\\n\" +\n \" <input type=\\\"number\\\" ng-model=\\\"overridden.user\\\" placeholder=\\\"User\\\" ng-change=\\\"override('user', overridden.user)\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li style=\\\"display: none\\\">\\n\" +\n \" <span ng-click=\\\"removeOverridden('time'); overridden.time= null;\\\" class=\\\"reset\\\">X</span>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"overridden.time\\\" placeholder=\\\"Time\\\" ng-change=\\\"override('time', overridden.time)\\\" />\\n\" +\n \" <i>{{date | date:'yyyy-MM-dd_HH:mm:ss'}}</i>\\n\" +\n \" </li>\\n\" +\n \" <li ng-repeat=\\\"(name, value) in getOverridden() track by name\\\">\\n\" +\n \" <span class=\\\"reset\\\" ng-click=\\\"removeOverridden(name)\\\">X</span>\\n\" +\n \" <input type=\\\"text\\\" disabled class=\\\"property-name\\\" ng-model=\\\"name\\\" />\\n\" +\n \" <input type=\\\"text\\\" class=\\\"property-value\\\" placeholder=\\\"Value\\\" ng-model=\\\"value\\\" ng-change=\\\"override(name, value)\\\" />\\n\" +\n \" </li>\\n\" +\n \" <div class='section' ng-click=\\\"openABTesting()\\\">AB Testing <span id=\\\"abExperimentName\\\">{{abExperiment.identifier }}</span></div>\\n\" +\n \" <ul id=\\\"config-bar-ab\\\" ng-cloak ng-show=\\\"abTestingOpened\\\">\\n\" +\n \" <li>\\n\" +\n \" <ul id=\\\"abSetupInfo\\\">\\n\" +\n \" <li ng-repeat=\\\"setup in abExperiment.setups\\\">\\n\" +\n \" <strong class=\\\"setup-id\\\">#{{ setup.id }}</strong>\\n\" +\n \" <ul>\\n\" +\n \" <li ng-repeat=\\\"value in setup.values\\\">\\n\" +\n \" <span class=\\\"variable-name\\\" title=\\\"{{ value.variable.app_name }}.{{ value.variable.name }} \\\">\\n\" +\n \" {{ value.variable.name.split('.').slice(-1)[0] | limitTo: 12 }}{{ value.variable.name.split('.').slice(-1)[0].length > 12 ? '...' : '' }}\\n\" +\n \" </span>\\n\" +\n \" <span class=\\\"variable-value\\\" title=\\\"{{ value.value }}\\\">{{ value.value.split('.').slice(-1)[0] | limitTo: 12 }} {{ value.value.split('.').slice(-1)[0].length > 12 ? '...' : '' }}</span>\\n\" +\n \" <span class=\\\"comma\\\" ng-if=\\\"!$last\\\">,</a>\\n\" +\n \" </li>\\n\" +\n \" </ul>\\n\" +\n \" </li>\\n\" +\n \" </ul>\\n\" +\n \" <li>\\n\" +\n \" <div id=\\\"abChart\\\"></div>\\n\" +\n \" <li>\\n\" +\n \" <button ng-click=\\\"drawABTestingBar()\\\" class=\\\"ab-experiment-chart-button\\\">All</button>\\n\" +\n \" <button ng-click=\\\"drawABTestingBar('number_of_users')\\\" class=\\\"ab-experiment-chart-button\\\">Users</button>\\n\" +\n \" <button ng-click=\\\"drawABTestingBar('number_of_answers')\\\" class=\\\"ab-experiment-chart-button\\\">Answers</button>\\n\" +\n \" <button ng-click=\\\"drawABTestingBar('returning_chance')\\\" class=\\\"ab-experiment-chart-button\\\">Return</button>\\n\" +\n \" <button ng-click=\\\"drawABTestingLearning(false)\\\" class=\\\"ab-experiment-chart-button\\\" title=\\\"Learning curve containing only users with at least the given number of testing answers\\\">Learn</button>\\n\" +\n \" <button ng-click=\\\"drawABTestingLearning(true)\\\" class=\\\"ab-experiment-chart-button\\\" title=\\\"Learning curve containing all users with at least one testing answer\\\">Learn (A)</button>\\n\" +\n \" </li>\\n\" +\n \" </ul>\\n\" +\n \" <div class='section' ng-click=\\\"flashcardsOpened = !flashcardsOpened\\\">Flashcards</div>\\n\" +\n \" <ul id=\\\"config-bar-flashcards\\\" ng-cloak ng-show=\\\"flashcardsOpened\\\">\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"flashcardsCategories\\\" placeholder=\\\"Categories\\\" />\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"flashcardsContexts\\\" placeholder=\\\"Contexts\\\" />\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"flashcardsTypes\\\" placeholder=\\\"Types\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"flashcardsLimit\\\" placeholder=\\\"Limit\\\" />\\n\" +\n \" <button ng-click=\\\"showFlashcardsPractice()\\\">Show Practice</button>\\n\" +\n \" <button ng-click=\\\"showFlashcardsAnswers()\\\">Show Answers</button>\\n\" +\n \" </li>\\n\" +\n \" <div style=\\\"overflow: auto; width: 100%; height: 300px;\\\">\\n\" +\n \" <table ng-show=\\\"flashcardsAnswers.length > 0\\\" id=\\\"flashcardsAnswers\\\">\\n\" +\n \" <thead>\\n\" +\n \" <tr>\\n\" +\n \" <th>#</th>\\n\" +\n \" <th>User</th>\\n\" +\n \" <th>Item</th>\\n\" +\n \" <th>Asked</th>\\n\" +\n \" <th>Answered</th>\\n\" +\n \" <th>Opt.</th>\\n\" +\n \" </tr>\\n\" +\n \" </thead>\\n\" +\n \" <tbody>\\n\" +\n \" <tr ng-repeat=\\\"answer in flashcardsAnswers\\\">\\n\" +\n \" <td>\\n\" +\n \" <a href=\\\"/flashcards/answer/{{ answer.id }}?html\\\" title=\\\"{{answer.time | date:'yyyy-MM-dd_HH:mm:ss'}}, direction: {{ answer.direction }}\\\">\\n\" +\n \" {{ answer.id }}\\n\" +\n \" </a>\\n\" +\n \" </td>\\n\" +\n \" <td>{{ answer.user_id }}</td>\\n\" +\n \" <td>{{ answer.item_asked_id }}</td>\\n\" +\n \" <td>{{ answer.flashcard_asked.identifier | limitTo:12 }} {{ answer.flashcard_answered.identifier.length > 12 ? '...' : '' }}</td>\\n\" +\n \" <td ng-class=\\\"{true: 'correct', false: 'wrong'}[answer.item_asked_id == answer.item_answered_id]\\\">\\n\" +\n \" {{ answer.flashcard_answered.identifier | limitTo:12 }}{{ answer.flashcard_answered.identifier.length > 12 ? '...' : '' }}\\n\" +\n \" </td>\\n\" +\n \" <td class=\\\"direction-{{ answer.direction }}\\\">{{ answer.options.length }}</td>\\n\" +\n \" </tr>\\n\" +\n \" </tbody>\\n\" +\n \" </table>\\n\" +\n \" <div id=\\\"flashcardsChart\\\"></div>\\n\" +\n \" </div>\\n\" +\n \" </ul>\\n\" +\n \" <div class='section' ng-click=\\\"auditOpened = !auditOpened\\\">Models Audit</div>\\n\" +\n \" <ul id=\\\"config-bar-audit\\\" ng-cloak ng-show=\\\"auditOpened\\\">\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"auditLimit\\\" placeholder=\\\"Limit\\\" />\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"auditKey\\\" placeholder=\\\"Key\\\" id=\\\"config-bar-audit-key\\\" />\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"auditUser\\\" placeholder=\\\"User\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"auditPrimary\\\" placeholder=\\\"Item Primary\\\" />\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"auditSecondary\\\" placeholder=\\\"Item Secondary\\\" />\\n\" +\n \" <button ng-click=\\\"showAuditChart()\\\">Show Chart</button>\\n\" +\n \" </li>\\n\" +\n \" <div id=\\\"auditChart\\\"></div>\\n\" +\n \" </ul>\\n\" +\n \" <div class='section' ng-click=\\\"recommendationOpened = !recommendationOpened\\\">Recommend User</div>\\n\" +\n \" <ul id=\\\"config-bar-recommendation\\\" ng-cloak ng-show=\\\"recommendationOpened\\\">\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Register Time\\\" disabled/>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Min\\\" ng-model=\\\"recommendationRegisterMin\\\" />\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Max\\\" ng-model=\\\"recommendationRegisterMax\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Number of Answers\\\" disabled/>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Min\\\" ng-model=\\\"recommendationAnswersMin\\\" />\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Max\\\" ng-model=\\\"recommendationAnswersMax\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Success\\\" disabled/>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Min\\\" ng-model=\\\"recommendationSuccessMin\\\" />\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Max\\\" ng-model=\\\"recommendationSuccessMax\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Variable Name\\\" ng-model=\\\"recommendationVariableName\\\" />\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Min\\\" ng-model=\\\"recommendationVariableMin\\\" />\\n\" +\n \" <input type=\\\"text\\\" placeholder=\\\"Max\\\" ng-model=\\\"recommendationVariableMax\\\" />\\n\" +\n \" </li>\\n\" +\n \" <li>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"recommendationOutput\\\" disabled />\\n\" +\n \" <button ng-click=\\\"recommendUser()\\\">Recommend</button>\\n\" +\n \" </li>\\n\" +\n \" </ul>\\n\" +\n \" <div class='section' ng-click=\\\"loggingOpened = !loggingOpened\\\">Logging</div>\\n\" +\n \" <ul id=\\\"config-bar-logging\\\" ng-cloak ng-show=\\\"loggingOpened\\\">\\n\" +\n \" <li ng-repeat=\\\"event in debugLog|limitTo:100\\\" class=\\\"logging-event\\\">\\n\" +\n \" <span class=\\\"level\\\">{{ event.level }}</span>\\n\" +\n \" <span class=\\\"url\\\">{{ event.url }}</span>\\n\" +\n \" <span class=\\\"filename\\\">{{ event.filename }}:{{ event.line_number }}</span>\\n\" +\n \" <span class=\\\"message\\\">{{ event.message }}</span>\\n\" +\n \" </li>\\n\" +\n \" </ul>\\n\" +\n \" </ul>\\n\" +\n \" </div>\\n\" +\n \"</div>\\n\" +\n \"\");\n}]);\n\nangular.module(\"templates/feedback-comment/comment.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"templates/feedback-comment/comment.html\",\n \"<div class=\\\"modal-header\\\">\\n\" +\n \" <h3 class=\\\"modal-title\\\">{{ \\\"Write to us\\\" | translate }}</h3>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-body\\\">\\n\" +\n \" <label>\\n\" +\n \" {{ \\\"Did you find a bug in the app? Do you have an improvement idea? Or any other comment? We are eager to hear anything you'd like to tell us.\\\" | translate }}\\n\" +\n \" </label>\\n\" +\n \" <textarea ng-model=\\\"feedback.text\\\" class=\\\"form-control\\\" rows=\\\"8\\\" ></textarea>\\n\" +\n \" <label>\\n\" +\n \" {{ \\\"Your e-mail address (optional)\\\" | translate }}\\n\" +\n \" </label>\\n\" +\n \" <input type=\\\"text\\\" ng-model=\\\"feedback.email\\\" class=\\\"form-control\\\"/>\\n\" +\n \" <br>\\n\" +\n \" <alert ng-repeat=\\\"alert in alerts\\\" type=\\\"{{alert.type}}\\\" close=\\\"closeAlert($index)\\\">{{alert.msg}}</alert>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-footer\\\">\\n\" +\n \" <button ng-disabled=\\\"sending\\\" class=\\\"btn btn-primary\\\" ng-click=\\\"send()\\\">\\n\" +\n \" {{ \\\"Send\\\" | translate }}\\n\" +\n \" </button>\\n\" +\n \" <button class=\\\"btn btn-danger\\\" ng-click=\\\"cancel()\\\">\\n\" +\n \" {{ \\\"Close\\\" | translate }}\\n\" +\n \" </button>\\n\" +\n \"</div>\\n\" +\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"templates/feedback-rating/rating.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"templates/feedback-rating/rating.html\",\n \"<div class=\\\"modal-header text-center\\\">\\n\" +\n \" <h3 class=\\\"modal-title\\\">{{ \\\"How difficult are the questions?\\\" | translate }}</h3>\\n\" +\n \" {{ \\\"Your answer helps us adjust difficulty of questions.\\\" | translate }}\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"rating modal-body\\\">\\n\" +\n \" <div class=\\\" text-center\\\" ng-hide=\\\"answer\\\">\\n\" +\n \" <a class=\\\"btn btn-lg btn-success\\\" ng-click=\\\"vote(1)\\\">\\n\" +\n \" {{\\\"Too easy\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <a class=\\\"btn btn-lg btn-primary\\\" ng-click=\\\"vote(2)\\\">\\n\" +\n \" {{ \\\"Appropriate\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <a class=\\\"btn btn-lg btn-danger\\\" ng-click=\\\"vote(3)\\\">\\n\" +\n \" {{ \\\"Too difficult\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <div class=\\\"clearfix\\\"></div>\\n\" +\n \" <a class=\\\"pull-right dont-know\\\" href=\\\"\\\" ng-click=\\\"cancel()\\\">\\n\" +\n \" {{ \\\"Don't know / Don't want to rate\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <div class=\\\"clearfix\\\"></div>\\n\" +\n \" </div>\\n\" +\n \" <alert ng-repeat=\\\"alert in alerts\\\" type=\\\"{{alert.type}}\\\" close=\\\"closeAlert($index)\\\">{{alert.msg}}</alert>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-footer\\\" ng-show=\\\"answer\\\">\\n\" +\n \" <button class=\\\"btn btn-danger\\\" ng-click=\\\"cancel()\\\">\\n\" +\n \" {{ \\\"Close\\\" | translate }}\\n\" +\n \" </button>\\n\" +\n \"</div>\\n\" +\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"templates/user-login/login-modal.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"templates/user-login/login-modal.html\",\n \"<div class=\\\"modal-header text-center\\\">\\n\" +\n \" <button type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"cancel()\\\">\\n\" +\n \" <span aria-hidden=\\\"true\\\">×</span>\\n\" +\n \" </button>\\n\" +\n \" <h3 class=\\\"modal-title\\\"> {{ \\\"Sign In\\\" | translate }} </h3>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-body\\\">\\n\" +\n \" <a class=\\\"btn btn-danger btn-lg btn-block\\\"\\n\" +\n \" track-click=\\\"login\\\"\\n\" +\n \" href=\\\"/login/google-oauth2/\\\">\\n\" +\n \" <i class=\\\"social-google\\\"></i> {{ \\\"via Google\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <br>\\n\" +\n \" <a class=\\\"btn btn-primary btn-lg btn-block\\\"\\n\" +\n \" track-click=\\\"login\\\"\\n\" +\n \" href=\\\"/login/facebook/\\\">\\n\" +\n \" <i class=\\\"social-facebook\\\"></i>{{ \\\"via Facebook\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \"\\n\" +\n \" <br>\\n\" +\n \" <hr>\\n\" +\n \" <br>\\n\" +\n \"\\n\" +\n \" <form role=\\\"form\\\" ng-submit=\\\"loginEmail()\\\">\\n\" +\n \" <div class=\\\"form-group\\\">\\n\" +\n \" <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"credentials.username\\\"\\n\" +\n \" name=\\\"username\\\" placeholder=\\\"{{ 'Username' | translate }}\\\">\\n\" +\n \" </div>\\n\" +\n \" <div class=\\\"form-group\\\">\\n\" +\n \" <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"credentials.password\\\"\\n\" +\n \" name=\\\"password\\\" placeholder=\\\"{{ 'Password' | translate }}\\\">\\n\" +\n \" </div>\\n\" +\n \" <alert ng-repeat=\\\"alert in alerts\\\" type=\\\"{{alert.type}}\\\"\\n\" +\n \" close=\\\"closeAlert($index)\\\">{{alert.msg}}</alert>\\n\" +\n \" <button ng-disabled=\\\"userService.status.loading\\\" type=\\\"submit\\\"\\n\" +\n \" class=\\\"btn btn-primary btn-block btn-lg\\\">\\n\" +\n \" {{ 'Sign In' | translate }}\\n\" +\n \" </button>\\n\" +\n \"\\n\" +\n \" </form>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-footer\\\" >\\n\" +\n \" <a class=\\\"btn btn-link\\\" ng-click=\\\"openSignupModal()\\\">\\n\" +\n \" {{ 'Sign Up' | translate }}\\n\" +\n \" </a>\\n\" +\n \"\\n\" +\n \"</div>\\n\" +\n \"\");\n}]);\n\nangular.module(\"templates/user-login/signup-modal.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"templates/user-login/signup-modal.html\",\n \"<div class=\\\"modal-header text-center\\\">\\n\" +\n \" <button type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"cancel()\\\">\\n\" +\n \" <span aria-hidden=\\\"true\\\">×</span>\\n\" +\n \" </button>\\n\" +\n \" <h3 class=\\\"modal-title\\\"> {{ \\\"Sign Up\\\" | translate }} </h3>\\n\" +\n \" <div ng-hide=\\\"success\\\">\\n\" +\n \" {{\\\"and get all the benefits of registered users.\\\" | translate }}\\n\" +\n \" </div>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-body\\\" ng-hide=\\\"success\\\">\\n\" +\n \" <div ng-hide=\\\"activateEmail\\\">\\n\" +\n \" <a class=\\\"btn btn-danger btn-lg btn-block\\\"\\n\" +\n \" track-click=\\\"login\\\"\\n\" +\n \" href=\\\"/login/google-oauth2/\\\">\\n\" +\n \" <i class=\\\"social-google\\\"></i> {{ \\\"via Google\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <br>\\n\" +\n \" <a class=\\\"btn btn-primary btn-lg btn-block\\\"\\n\" +\n \" track-click=\\\"login\\\"\\n\" +\n \" href=\\\"/login/facebook/\\\">\\n\" +\n \" <i class=\\\"social-facebook\\\"></i>{{ \\\"via Facebook\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" <br>\\n\" +\n \" <a class=\\\"btn btn-info btn-lg btn-block\\\"\\n\" +\n \" ng-click=\\\"activateEmail=true\\\"\\n\" +\n \" href=\\\"\\\">\\n\" +\n \" <i class=\\\"glyphicon glyphicon-envelope\\\"></i> {{ \\\"via E-mail\\\" | translate }}\\n\" +\n \" </a>\\n\" +\n \" </div>\\n\" +\n \"\\n\" +\n \" <form role=\\\"form\\\" ng-show=\\\"activateEmail\\\" ng-submit=\\\"signup()\\\">\\n\" +\n \" <div class=\\\"form-group\\\">\\n\" +\n \" <input type=\\\"email\\\" class=\\\"form-control\\\" ng-model=\\\"credentials.email\\\"\\n\" +\n \" placeholder=\\\"{{ 'E-mail' | translate }}\\\" required>\\n\" +\n \" </div>\\n\" +\n \" <div class=\\\"form-group\\\">\\n\" +\n \" <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"credentials.username\\\"\\n\" +\n \" name=\\\"username\\\" placeholder=\\\"{{ 'Username' | translate }}\\\" required>\\n\" +\n \" </div>\\n\" +\n \" <div class=\\\"form-group\\\">\\n\" +\n \" <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"credentials.password\\\"\\n\" +\n \" name=\\\"password\\\" placeholder=\\\"{{ 'Password' | translate }}\\\" required>\\n\" +\n \" </div>\\n\" +\n \" <div class=\\\"form-group\\\">\\n\" +\n \" <input type=\\\"password\\\" class=\\\"form-control\\\"\\n\" +\n \" ng-model=\\\"credentials.password_check\\\"\\n\" +\n \" placeholder=\\\"{{ 'Password again' | translate }}\\\" required>\\n\" +\n \" </div>\\n\" +\n \" <alert ng-repeat=\\\"alert in alerts\\\" type=\\\"{{alert.type}}\\\"\\n\" +\n \" close=\\\"closeAlert($index)\\\">{{alert.msg}}</alert>\\n\" +\n \" <button ng-disabled=\\\"userService.status.loading\\\" type=\\\"submit\\\" class=\\\"btn btn-primary btn-block btn-lg\\\">\\n\" +\n \" {{ 'Sign Up' | translate }}\\n\" +\n \" </button>\\n\" +\n \" </form>\\n\" +\n \"</div>\\n\" +\n \"<div class=\\\"modal-body\\\" ng-show=\\\"success\\\" >\\n\" +\n \" <alert type=\\\"success\\\">\\n\" +\n \" {{ 'Registration was successful. You can continue to use the application.' | translate }}\\n\" +\n \" </alert>\\n\" +\n \"</div>\\n\" +\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"templates/user-questions/user_questions_banner.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"templates/user-questions/user_questions_banner.html\",\n \"<div class=\\\"bottom-alert text-center alert alert-{{question.saved ? 'success' : 'info'}} form-inline\\\"\\n\" +\n \" ng-repeat=\\\"question in questions\\\"\\n\" +\n \" ng-if=\\\"!userService.status.loading && userService.user.profile.number_of_answers >= 2\\\">\\n\" +\n \" <button type=\\\"button\\\" class=\\\"close\\\" data-dismiss=\\\"alert\\\" aria-label=\\\"Close\\\"\\n\" +\n \" track-click=\\\"close user question banner\\\">\\n\" +\n \" <span aria-hidden=\\\"true\\\">×</span>\\n\" +\n \" <span class=\\\"sr-only\\\" translate>Close</span>\\n\" +\n \" </button>\\n\" +\n \" <div ng-if=\\\"!question.saved\\\">\\n\" +\n \" <span>\\n\" +\n \" {{question.content}}\\n\" +\n \" </span>\\n\" +\n \" <input ng-model=\\\"question.answer\\\"\\n\" +\n \" ng-if=\\\"question.answer_type != 'c'\\\"\\n\" +\n \" class=\\\"form-control\\\"\\n\" +\n \" typeahead-min-length=\\\"0\\\"\\n\" +\n \" typeahead=\\\"option as option.content for option in question.possible_answers |\\n\" +\n \" filter:{content: $viewValue} |\\n\" +\n \" limitTo:($viewValue.length ? $viewValue.length * 2 : 2)\\\">\\n\" +\n \" </input>\\n\" +\n \" <span ng-model=\\\"question.answer\\\"\\n\" +\n \" ng-repeat=\\\"option in question.possible_answers\\\"\\n\" +\n \" ng-if=\\\"question.answer_type == 'c'\\\"\\n\" +\n \" ng-bind=\\\"option.content\\\"\\n\" +\n \" ng-click=\\\"saveUserQuesiton(question, option)\\\"\\n\" +\n \" class=\\\"btn btn-default\\\">\\n\" +\n \" </span>\\n\" +\n \" <a href=\\\"\\\"\\n\" +\n \" class=\\\"btn btn-primary\\\"\\n\" +\n \" ng-if=\\\"question.answer_type != 'c'\\\"\\n\" +\n \" track-click=\\\"user question banner\\\"\\n\" +\n \" ng-click=\\\"saveUserQuesiton(question)\\\"\\n\" +\n \" ng-disabled=\\\"question.processing || !question.answer\\\"\\n\" +\n \" >\\n\" +\n \" <span translate ng-if=\\\"question.processing\\\">Saving...</span>\\n\" +\n \" <span translate ng-if=\\\"!question.processing\\\">Save</span>\\n\" +\n \" </a>\\n\" +\n \" <div ng-if=\\\"question.answer_type == 'm'\\\">\\n\" +\n \" <br> <br> <br> <br>\\n\" +\n \" </div>\\n\" +\n \" </div>\\n\" +\n \" <div ng-if=\\\"question.saved\\\" translate>\\n\" +\n \" Thank you for your response.\\n\" +\n \" </div>\\n\" +\n \"</div>\\n\" +\n \"\\n\" +\n \"\");\n}]);\n!angular.$$csp() && angular.element(document).find('head').prepend('<style type=\"text/css\">#config-bar-show-button{position:fixed;right:-40px;top:250px;width:100px;transform:rotate(-90deg);-webkit-transform:rotate(-90deg);border:solid #808080 1px;margin:0;padding:10px;text-transform:capitalize;font-weight:bold;background-color:rgba(255,255,255,0.8);transition:all 0.2s;cursor:pointer;text-align:center;z-index:1000;}#config-bar-show-button:hover{background-color:#1f8dd6;color:white;}#config-bar{position:fixed;right:0;top:0;bottom:0;width:500px;border-left:solid #808080 1px;background-color:rgba(255,255,255,0.8);z-index:1000;}#config-bar.maximized{width:100%;}#config-bar-header{background-color:rgba(31,141,214,0.8);margin:0;padding:5px 10px;text-align:right;color:white;}#config-bar-content .section{background-color:rgba(31,141,214,0.8);margin:5px 0;padding:5px 10px;color:white;text-transform:uppercase;cursor:pointer;}#config-bar-maximize{text-align:right;cursor:pointer;margin-right:20px;}#config-bar-hide{text-align:right;width:100%;cursor:pointer;}#config-bar-content{margin:0;list-style:none;padding:0;}#config-bar-content > li{border-bottom:1px dashed #E9F4FB;padding:5px 10px;margin:0;}#config-bar-content > li:hover{background:#E9F4FB;}#config-bar-content .reset,#config-bar-content .add-to-override{cursor:pointer;font-weight:bolder;}#config-bar-content input{padding:5px 10px;}#config-bar-content label{margin-left:10px;cursor:pointer;}#config-bar-content .link{text-transform:uppercase;cursor:pointer;font-weight:bold;}#config-bar-logging{list-style:none;margin:0;padding:0;max-height:500px;overflow-y:scroll;font-size:12px;}#config-bar-logging > li{margin:0;padding:5px 10px;border-bottom:1px solid #E9F4FB;}#config-bar-logging > li:hover{background-color:#E9F4FB;}#config-bar-logging .level{display:block;float:left;width:10%;font-weight:bold;}#config-bar-logging .url{font-weight:bold;margin-left:10px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50%;float:left;}#config-bar-logging .filename{display:block;float:right;text-align:right;width:30%;font-weight:bold;}#config-bar-logging .message{display:block;clear:both;margin-top:20px;margin-bottom:5px;}#config-bar-content .property-name{width:70%;}#config-bar-content .property-value{width:10%;text-align:center;}#config-bar-property-name{width:70%;}#config-bar-audit,#config-bar-ab,#config-bar-flashcards,#config-bar-recommendation{padding-left:5px;}#config-bar-audit li,#config-bar-ab li,#config-bar-flashcards li,#config-bar-recommendation li{padding-left:0;margin-left:0;list-style:none;margin-bottom:5px;}#config-bar-ab ul{padding-left:0;margin-left:0;}.ab-experiment-chart-button{font-size:13px;width:15%;}#config-bar-audit input,#config-bar-flashcards input,#config-bar-recommendation input{width:27%;}#config-bar-audit button,#config-bar-flashcards button,#config-bar-recommendation button{width:27%;}#auditChart{margin:10px auto;width:480px;}#abChart{margin:0 auto;width:480px;}#flashcardsChart{margin:0 auto;width:100%;height:1000px;}#abExperimentName{margin-left:20px;font-weight:bold;}#abSetupInfo > li > ul,#abSetupInfo > li > ul > li{display:inline;}#flashcardsAnswers{width:100%;}#flashcardsAnswers thead{color:#fff;background-color:rgba(31,141,214,0.8);}#flashcardsAnswers th,#flashcardsAnswers td{text-align:center;}#flashcardsAnswers tbody tr:nth-child(even){background-color:#E9F4FB;}#flashcardsAnswers tbody tr:nth-child(odd){background-color:#fff;}#flashcardsAnswers td.correct{background-color:#009933;color:white;}#flashcardsAnswers td.wrong{background-color:#cc0000;color:white;}#flashcardsAnswers td.direction-t2d{background-color:#ff9900;color:white;}#flashcardsAnswers td.direction-d2t{background-color:#ffff00;}</style>');\n!angular.$$csp() && angular.element(document).find('head').prepend('<style type=\"text/css\">.rating .btn{margin:20px;}</style>');"]}