{"version":3,"sources":["scripts/app.js"],"names":["angular","module","articleEditMain","$log","articleService","$state","authorizationService","controller","$scope","onChange","showHint","vm","articleExpanded","fetchArticleList","getArticleList","then","articleList","maxLen","forEach","article","label","article_id","headline","length","substr","fetchArticleInfo","id","getArticle","isNewArticle","selectImage","fileObject","photo_url","URL","createObjectURL","photoFileObject","revertArticle","selectedArticleId","$","scrollTop","cleanArticle","copy","saveArticle","uploading","putArticle","log","pk","articleHasChanged","response","status","go","addArticle","getBlankArticle","undefined","verifyAuthorized","this","curProgress","maxProgress","progressPips","i","push","simClasses","simClass","$watch","toJson","newJson","$inject","restrict","controllerAs","bindToController","templateUrl","cleanEol","link","scope","elm","attrs","on","value","replace","directive","statisticsPage","dataTracking","gameSettings","$document","$window","filesaver","$http","fetchGameSettingsForPk","getSettings","allGameArticles","roundInfo","round","concat","articleIds","startDate","Date","modified_date","endDate","refreshStatistics","setArticleStats","newVal","enableArticleStatistics","downloadCsv","urlFrag","url","toISOString","location","downloadDatabase","isFetching","get","redirUrl","data","saveCSV","csvText","csvName","blob","Blob","type","saveAs","saveGamesCsv","stats","gamePlayStats","csvRows","join","row","outcome_status","num_plays","avg_time","avg_score","avg_pct_score","avg_correct","avg_pct_correct","avg_completed","avg_pct_completed","saveArticlesCsv","articleStats","articleFilter","num_correct","num_hints","sd","ed","filterByDate","calculatingArticles","getArticleStatistics","stat","calculatingGames","getGamePlayStatistics","selectedGame","game_name","needsUpdate","currentGameOnly","gameNameList","gamePk","gameName","getGameList","gameList","item","filterValue","indexOf","view","navigator","test","userAgent","doc","document","get_URL","webkitURL","save_link","createElementNS","can_use_save_link","click","node","event","MouseEvent","dispatchEvent","webkit_req_fs","webkitRequestFileSystem","req_fs","requestFileSystem","mozRequestFileSystem","throw_outside","ex","setImmediate","setTimeout","force_saveable_type","fs_min_size","arbitrary_revoke_timeout","revoke","file","revoker","isString","revokeObjectURL","remove","chrome","dispatch","event_types","listener","isFunction","call","auto_bom","FileSaver","name","no_auto_bom","object_url","target_view","slice","blob_changed","dispatch_all","split","fs_error","href","new_tab","open","safari","readyState","DONE","abortable","func","apply","arguments","create_if_not_found","create","exclusive","INIT","download","webkitSlice","size","TEMPORARY","fs","root","getDirectory","dir","save","getFile","createWriter","writer","onwriteend","toURL","onerror","error","code","ABORT_ERR","write","abort","WRITING","NOT_FOUND_ERR","FS_proto","prototype","msSaveOrOpenBlob","onwritestart","onprogress","onwrite","onabort","self","window","content","service","popupDoc","$timeout","delayTimer","delayAffordance","cancel","addClass","removeClass","$on","manageHome","loginPage","tryToLogin","authorize","username","password","outcome","hadLoginError","signOut","gameSettingsEditor","fetchSettingsForPk","selectedGamePk","cleanSettings","updateSettingsCalculations","settingsHaveChanged","equals","revertSettings","saveSettings","is_enabled","postSettings","enableGame","confirm","disableGame","articleDict","a","utcStrToLocalDate","str","d","moment","format","filter","maximum_articles_played","maximum_score","isUndefined","shouldRandomize","roundLength","reward","serviceUrl","settings","extend","request","method","headers","Content-type","setAuthHeader","reward_with_hint","articleIdList","provisional","listAsString","map","trim","model","onBlur","valid","template","campaignContentPage","campaignContentService","contentChange","hasChanged","saveContent","postContent","fetchContent","epDialog","$cookies","authToken","authCookie","isAuthorized","isDefined","expireTime","add","cookieTtlHours","toDate","put","expires","authUrl","post","token","loadImageFile","e","target","files","$apply","wedge","timerArc","updateArc","angle","Math","PI","curTime","maxTime","radius","endX","sin","endY","cos","arcX","teacherPage","$element","submitComments","wants_notifications","wantsNotifications","email","comments","showGoodbye","width","isSmall","main","bindToCcontroller","trackSwipe","swiperService","audioService","trackDown","shouldSwipe","state","playACSound","anchorX","getPageX","trackMove","trackUp","inSwipeLeft","inSwipeRight","swipeLeft","dragX","swipeRight","find","css","releaseListeners","dx","triggerThreshold","abs","swipeThreshold","sgn","off","evt","pageX","changedTouches","originalEvent","canTouch","debugStr","debounce","pointer-events","$q","swipeCard","direction","deferred","defer","animate","myprop","step","now","tween","complete","expanded","resolve","promise","startupSequence","playerService","publicName","gameState","flags","userInfo","age","gender","education","news_media_savvy","has_completed_survey","foo","userEmail","tryLogin","isPublicName","tryUnmakeUsername","trySignIn","exists","setupForLaunch","cancelLogin","cancelCreate","getUserInfo","cancelGetInfo","usernameValid","canBePublicName","userEmailValid","res","infoValid","createUser","noUsername","tempName","random","createNewPlayer","couldAdoptGame","adoptPlayedGame","game_record","playerInfo","user_public_name","makeUserName","savePlayerInfo","cancelCreateUser","discardTemporaryUser","startOver","anotherUserName","acceptUserName","gameScore","totalScore","highScoreTest","saveUserDemographics","cancelUserDemographics","saveUserEmail","cancelSaveUserEmail","f2RadioBlock","clicked","transclude","simpleModalPopup","title","hideNapkin","capFirst","s","toUpperCase","toLowerCase","salt","wantsRandom","floor","n","saltMultiplier","allCount","ci","cn","ai","an","ni","nn","si","sn","salti","un","colors","adjectives","nouns","console","unmakeUserName","textParts","reduce","parts","c","di","parseInt","ns","findInList","list","color","adjective","noun","lun","match","reconstructedName","canResume","isAnonymous","current_game","is_completed","was_cancelled","game_state","roundNumber","articleNumber","hasPlayedGame","game_plays","some","g","is_first_play","campaignScore","cs","total_score","gn","gs","player","campaign","refreshPlayerInfo","createAnonPlayer","anonName","is_anonymous","isSignedIn","fact2Username","params","hasSeenAdditionalInstructions","usingPublicName","httpPromise","highScores","getHighScores","beginNewGame","userPk","removeEmptyRounds","game_settings","articlesCorrect","articlesIncorrect","articleBonus","articlePenalty","hintBonus","readingBonus","timeBonus","timePenalty","info","shuffle","saveGame","gameRecord","restoreGame","articleId","array","temporaryValue","randomIndex","currentIndex","startArticle","articlePk","startTime","endArticle","correct","hadHint","dt","min","diff","total_time_seconds","total_articles_played","total_articles_correct","article_pk","player_pk","was_correct","showed_hint","options","start_date","end_date","rawStats","key","fromJson","deprecatedDBase","cleanUpDeprecatedArticle","wordCount","body","keys","formData","FormData","append","Content-Type","getArticleImageForPreview","r","FileReader","onloadend","result","readAsDataURL","putArticleImage","Authorization","Object","stripEolNonsense","textBodyKeys","textKey","isNotBlank","articleType","article_type","chunkKey","sourceHint","source","payoffSourceUrl","source_URL","payoffSourceLabel","payoffContent","references","refLines","roundPayoff","numCorrect","pip","percentCorrect","privacyPolicy","dismissIt","container","enabled","showdown","Error","ngShowdown","SDObject","converter","Converter","config","makeHtml","markdown","stripHtml","text","String","extensions","setOption","getOption","hasOwnProperty","loadExtension","extensionName","$get","markdownToHtmlDirective","$showdown","$sce","element","newValue","val","showdownHTML","trustAsHtml","html","stripHtmlFilter","provider","launchPage","fullStart","instructPanel","highScoresPage","selectWeek","weekNum","titleText","selectScoreType","st","scoreType","selectScoringMode","sm","scoringMode","validWeeks","myScores","gp","score","gamePayoff","dismissPopup","hsp_showPopup","constructUri","obj","uri","queries","encodeURIComponent","totCorrect","totArticles","gameUrl","twitterMessage","original_referer","ref_src","netTimeBonus","gameBonus","totalBonuses","gamePenalties","totalPenalties","twitterUrl","twitterApiURI","facebookApiURI","confettiItem","$interval","confID","speedClass","left","top","expeditionPage","onDestroy","pageKiller","getGameStates","pickedFidget","showAdditionalPopup","clearCampaign","campaignItems","canPlay","wasPlayed","ix","shouldFidget","targetClicked","targetIx","pickedCampaign","showPopup","startCampaignGame","epPopup","is_anonymopus","burgerPane","muteUnmute","toggleAudio","muted","unmuteAll","muteAll","xtemplate","loadSound","soundName","soundPath","audioPath","responseType","audioContext","decodeAudioData","buffer","soundBuffers","soundEffect","AudioContext","webkitAudioContext","createBufferSource","connect","destination","start","stopSoundEffect","pause","playSoundEffect","fname","Audio","src","play","articlePayoff","payoffType","addHttp","numPoints","pts","roundProgress","pencilProgress","progressIndicator","isNaN","bigHeader","articleHeader","articleFooter","disableButtons","inSwipe","slideInArticle","showRoundBanner","articleDisplay","ctlr","trackScroll","scrollPosition","abody","midPct","h","acontent","height","endPct","trackArticleScroll","w","outerWidth","outerHeight","scroll","articleInfo","MainController","$stateParams","buttonSound","goTeachers","resetFact3Scoring","fact3Scoring","scrolledPast50","scrolledToEnd","showHighScores","goExpeditionPage","showBurger","checkingForUser","showPregameInstructions","userIsAnonymous","userCanResume","dismissAdditionalInstructions","startNamedGame","startGame","allowResume","gameLauncher","numberOfRounds","useLightbulb","articleAverageSeconds","wordsPerMinute","gameTitle","preGameBanners","slideInGameBanner","slideInBanner","articleStart","getSimClass","isPreview","resumeGame","quickStartGame","showInstruct","showInstructions","scoreSwipe","fromLightbulb","showHintDialog","showAddlInfo","addlInfoExpanded","swipeDir","articleScore","isCorrect","correctAnswerBonus","incorrectAnswerPenalty","deltaSeconds","articleSeconds","maxTimeBonus","timeBonusPerSecond","maxTimePenalty","timePenaltyPerSecond","scrollingHalfwayBonus","scrollingToEndBonus","k","nextQuestion","nextRound","showStartGameBanner","toggleBurger","goSignIn","isIphone","isSafari","publisher","userPublicName","runBlock","debug","run","routerConfig","$stateProvider","$urlRouterProvider","otherwise","constant","malarkey","$logProvider","debugEnabled","$templateCache"],"mappings":"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","file":"scripts/app-7afbcc7025.js","sourcesContent":["(function() {\n 'use strict';\n\n angular\n .module('fact2', ['ngAnimate', 'ngCookies', 'ngSanitize', 'ui.router', 'ngMaterial', 'ng-showdown']);\n\n})();\n\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('articleEditMain', articleEditMain)\n\t\t.directive('textarea', cleanEol);\n\n\t/** @ngInject */\n\tfunction articleEditMain($log, articleService, $state, authorizationService) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'main',\n\t\t\tbindToController: true,\n\t\t\ttemplateUrl: 'app/components/managementPages/articleEdit/articleEditMain/articleEditMain.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tif (!authorizationService.verifyAuthorized()) {\n\t\t\t\t$state.go('manageLogin');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar vm = this;\n\n\t\t\tvar cleanArticle;\n\n\t\t\tvm.articleList = [];\n\t\t\tvm.selectedArticleId = '';\n\n\t\t\tvm.articleExpanded = true; // always show source area\n\t\t\tvm.article = {};\n\t\t\tvm.curProgress = 0;\n\t\t\tvm.maxProgress = 10;\n\t\t\tvm.progressPips = [];\n\t\t\tfor (var i=0; i=0);\n\t\t\t\treturn filterValue;\n\t\t\t}\n\n\t\t\tfunction downloadCsv(urlFrag) {\n\t\t\t\tvar url = '/api/gameplay2/'+urlFrag+'/?start_date='+$scope.startDate.toISOString()+'&end_date='+$scope.endDate.toISOString();\n\t\t\t\t$window.location = url;\n\t\t\t}\n\n\t\t\tfunction downloadDatabase() {\n\t\t\t\tvm.isFetching = true;\n\t\t\t\tvar url = '/api/gameplay2/download_database/';\n\t\t\t\t$http.get(url)\n\t\t\t\t\t.then(function(response) {\n\t\t\t\t\t\tvar redirUrl = response.data;\n\t\t\t\t\t\t$log.log(redirUrl);\n\t\t\t\t\t\tvm.isFetching = false;\n\t\t\t\t\t\t$window.location = redirUrl;\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction saveCSV(csvText, csvName) {\n\t\t\t\tvar blob = new Blob([csvText], {type: \"text/plain;charset=utf-8\"});\n\t\t\t\tfilesaver.saveAs(blob, csvName);\n\t\t\t}\n\n\t\t\tfunction saveGamesCsv() {\n\t\t\t\tvar stats = $scope.gamePlayStats;\n\t\t\t\tvar csvRows = [['outcome', 'num_plays', 'avg_time', 'avg_score', 'avg_score_pct', 'avg_correct', 'avg_correct_pct', 'avg_played', 'avg_played_pct'].join('\\t')]\n\t\t\t\tstats.forEach(function(row) { \n\t\t\t\t\tcsvRows.push(\n\t\t\t\t\t\t[\trow.outcome_status, row.num_plays, row.avg_time,row.avg_score,row.avg_pct_score*100,row.avg_correct,row.avg_pct_correct*100,\n\t\t\t\t\t\t\trow.avg_completed, row.avg_pct_completed*100].join('\\t')\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tsaveCSV(csvRows.join('\\n'), 'gamePlayAgg.csv');\n\t\t\t}\n\n\t\t\tfunction saveArticlesCsv() {\n\t\t\t\tvar stats = $scope.articleStats;\n\t\t\t\tvar csvRows = [['id', 'headline', 'num_plays', 'avg_time', 'num_correct', 'num_hints'].join('\\t')]\n\t\t\t\tstats.forEach(function(row) { \n\t\t\t\t\tif ($scope.articleFilter(row)) {\n\t\t\t\t\t\tcsvRows.push(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\trow.article_id, '\"'+row.headline+'\"', row.num_plays, row.avg_time, row.num_correct, row.num_hints\n\t\t\t\t\t\t\t\t].join('\\t')\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsaveCSV(csvRows.join('\\n'), 'articlePlayAgg.csv');\n\t\t\t}\n\n\t\t\tfunction refreshStatistics() {\n\t\t\t\tvar sd, ed;\n\n\t\t\t\tif ($scope.filterByDate) {\n\t\t\t\t\tsd = $scope.startDate;\n\t\t\t\t\ted = $scope.endDate;\n\t\t\t\t}\n\n\t\t\t\tif ($scope.enableArticleStatistics) {\n\t\t\t\t\t$scope.calculatingArticles = true;\n\t\t\t\t\tdataTracking.getArticleStatistics(sd, ed)\n\t\t\t\t\t\t.then(function(stats) {\n\t\t\t\t\t\t\t$scope.articleStats = stats;\n\t\t\t\t\t\t\tstats.forEach(function(stat) {\n\t\t\t\t\t\t\t\tif (stat.headline.length>30) {\n\t\t\t\t\t\t\t\t\tstat.headline = stat.headline.substr(0,40)+'...';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.finally(function() {\n\t\t\t\t\t\t\t$scope.calculatingArticles = false;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t$scope.calculatingGames = true;\n\t\t\t\tdataTracking.getGamePlayStatistics(sd, ed, $scope.selectedGame.game_name)\n\t\t\t\t\t.then(function(stats) {\n\t\t\t\t\t\t$scope.gamePlayStats = stats;\n\t\t\t\t\t})\n\t\t\t\t\t.finally(function() {\n\t\t\t\t\t\t$scope.calculatingGames = false;\n\t\t\t\t\t});\n\n\n\t\t\t\t$scope.needsUpdate = false;\n\t\t\t}\n\n\t\t}\n\t}\n})();\n/* FileSaver.js\n * A saveAs() FileSaver implementation.\n * 1.1.20150716\n *\n * By Eli Grey, http://eligrey.com\n * License: X11/MIT\n * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md\n */\n\n/*global self */\n/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */\n\n/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */\n\n(function() {\n\n\t'use strict';\n\n\tvar saveAs = saveAs || (function(view) {\n\t\t\"use strict\";\n\t\t// IE <10 is explicitly unsupported\n\t\tif (typeof navigator !== \"undefined\" && /MSIE [1-9]\\./.test(navigator.userAgent)) {\n\t\t\treturn;\n\t\t}\n\t\tvar\n\t\t\tdoc = view.document\n\t\t\t// only get URL when necessary in case Blob.js hasn't overridden it yet\n\t\t\t, get_URL = function() {\n\t\t\t\treturn view.URL || view.webkitURL || view;\n\t\t\t}\n\t\t\t, save_link = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"a\")\n\t\t\t, can_use_save_link = \"download\" in save_link\n\t\t\t, click = function(node) {\n\t\t\t\tvar event = new MouseEvent(\"click\");\n\t\t\t\tnode.dispatchEvent(event);\n\t\t\t}\n\t\t\t, webkit_req_fs = view.webkitRequestFileSystem\n\t\t\t, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem\n\t\t\t, throw_outside = function(ex) {\n\t\t\t\t(view.setImmediate || view.setTimeout)(function() {\n\t\t\t\t\tthrow ex;\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t\t, force_saveable_type = \"application/octet-stream\"\n\t\t\t, fs_min_size = 0\n\t\t\t// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and\n\t\t\t// https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047\n\t\t\t// for the reasoning behind the timeout and revocation flow\n\t\t\t, arbitrary_revoke_timeout = 500 // in ms\n\t\t\t, revoke = function(file) {\n\t\t\t\tvar revoker = function() {\n\t\t\t\t\tif (angular.isString(file)) { // file is an object URL\n\t\t\t\t\t\tget_URL().revokeObjectURL(file);\n\t\t\t\t\t} else { // file is a File\n\t\t\t\t\t\tfile.remove();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (view.chrome) {\n\t\t\t\t\trevoker();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(revoker, arbitrary_revoke_timeout);\n\t\t\t\t}\n\t\t\t}\n\t\t\t, dispatch = function(filesaver, event_types, event) {\n\t\t\t\tevent_types = [].concat(event_types);\n\t\t\t\tvar i = event_types.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tvar listener = filesaver[\"on\" + event_types[i]];\n\t\t\t\t\tif (angular.isFunction(listener)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlistener.call(filesaver, event || filesaver);\n\t\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\t\tthrow_outside(ex);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t, auto_bom = function(blob) {\n\t\t\t\t// prepend BOM for UTF-8 XML and text/* types (including HTML)\n\t\t\t\tif (/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n\t\t\t\t\treturn new Blob([\"\\ufeff\", blob], {type: blob.type});\n\t\t\t\t}\n\t\t\t\treturn blob;\n\t\t\t}\n\t\t\t, FileSaver = function(blob, name, no_auto_bom) {\n\t\t\t\tif (!no_auto_bom) {\n\t\t\t\t\tblob = auto_bom(blob);\n\t\t\t\t}\n\t\t\t\t// First try a.download, then web filesystem, then object URLs\n\t\t\t\tvar\n\t\t\t\t\tfilesaver = this\n\t\t\t\t\t, type = blob.type\n\t\t\t\t\t, blob_changed = false\n\t\t\t\t\t, object_url\n\t\t\t\t\t, target_view\n\t\t\t\t\t, dispatch_all = function() {\n\t\t\t\t\t\tdispatch(filesaver, \"writestart progress write writeend\".split(\" \"));\n\t\t\t\t\t}\n\t\t\t\t\t// on any filesys errors revert to saving with object URLs\n\t\t\t\t\t, fs_error = function() {\n\t\t\t\t\t\t// don't create more object URLs than needed\n\t\t\t\t\t\tif (blob_changed || !object_url) {\n\t\t\t\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (target_view) {\n\t\t\t\t\t\t\ttarget_view.location.href = object_url;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar new_tab = view.open(object_url, \"_blank\");\n\t\t\t\t\t\t\tif (new_tab === undefined && typeof safari !== \"undefined\") {\n\t\t\t\t\t\t\t\t//Apple do not allow window.open, see http://bit.ly/1kZffRI\n\t\t\t\t\t\t\t\tview.location.href = object_url;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\tdispatch_all();\n\t\t\t\t\t\trevoke(object_url);\n\t\t\t\t\t}\n\t\t\t\t\t, abortable = function(func) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tif (filesaver.readyState !== filesaver.DONE) {\n\t\t\t\t\t\t\t\treturn func.apply(this, arguments);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t, create_if_not_found = {create: true, exclusive: false}\n\t\t\t\t\t, slice\n\t\t\t\t;\n\t\t\t\tfilesaver.readyState = filesaver.INIT;\n\t\t\t\tif (!name) {\n\t\t\t\t\tname = \"download\";\n\t\t\t\t}\n\t\t\t\tif (can_use_save_link) {\n\t\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t\tsave_link.href = object_url;\n\t\t\t\t\tsave_link.download = name;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tclick(save_link);\n\t\t\t\t\t\tdispatch_all();\n\t\t\t\t\t\trevoke(object_url);\n\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Object and web filesystem URLs have a problem saving in Google Chrome when\n\t\t\t\t// viewed in a tab, so I force save with application/octet-stream\n\t\t\t\t// http://code.google.com/p/chromium/issues/detail?id=91158\n\t\t\t\t// Update: Google errantly closed 91158, I submitted it again:\n\t\t\t\t// https://code.google.com/p/chromium/issues/detail?id=389642\n\t\t\t\tif (view.chrome && type && type !== force_saveable_type) {\n\t\t\t\t\tslice = blob.slice || blob.webkitSlice;\n\t\t\t\t\tblob = slice.call(blob, 0, blob.size, force_saveable_type);\n\t\t\t\t\tblob_changed = true;\n\t\t\t\t}\n\t\t\t\t// Since I can't be sure that the guessed media type will trigger a download\n\t\t\t\t// in WebKit, I append .download to the filename.\n\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=65440\n\t\t\t\tif (webkit_req_fs && name !== \"download\") {\n\t\t\t\t\tname += \".download\";\n\t\t\t\t}\n\t\t\t\tif (type === force_saveable_type || webkit_req_fs) {\n\t\t\t\t\ttarget_view = view;\n\t\t\t\t}\n\t\t\t\tif (!req_fs) {\n\t\t\t\t\tfs_error();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfs_min_size += blob.size;\n\t\t\t\treq_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {\n\t\t\t\t\tfs.root.getDirectory(\"saved\", create_if_not_found, abortable(function(dir) {\n\t\t\t\t\t\tvar save = function() {\n\t\t\t\t\t\t\tdir.getFile(name, create_if_not_found, abortable(function(file) {\n\t\t\t\t\t\t\t\tfile.createWriter(abortable(function(writer) {\n\t\t\t\t\t\t\t\t\twriter.onwriteend = function(event) {\n\t\t\t\t\t\t\t\t\t\ttarget_view.location.href = file.toURL();\n\t\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\t\t\t\tdispatch(filesaver, \"writeend\", event);\n\t\t\t\t\t\t\t\t\t\trevoke(file);\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\twriter.onerror = function() {\n\t\t\t\t\t\t\t\t\t\tvar error = writer.error;\n\t\t\t\t\t\t\t\t\t\tif (error.code !== error.ABORT_ERR) {\n\t\t\t\t\t\t\t\t\t\t\tfs_error();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\"writestart progress write abort\".split(\" \").forEach(function(event) {\n\t\t\t\t\t\t\t\t\t\twriter[\"on\" + event] = filesaver[\"on\" + event];\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\twriter.write(blob);\n\t\t\t\t\t\t\t\t\tfilesaver.abort = function() {\n\t\t\t\t\t\t\t\t\t\twriter.abort();\n\t\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.WRITING;\n\t\t\t\t\t\t\t\t}), fs_error);\n\t\t\t\t\t\t\t}), fs_error);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdir.getFile(name, {create: false}, abortable(function(file) {\n\t\t\t\t\t\t\t// delete file if it already exists\n\t\t\t\t\t\t\tfile.remove();\n\t\t\t\t\t\t\tsave();\n\t\t\t\t\t\t}), abortable(function(ex) {\n\t\t\t\t\t\t\tif (ex.code === ex.NOT_FOUND_ERR) {\n\t\t\t\t\t\t\t\tsave();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfs_error();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\t\t\t\t\t}), fs_error);\n\t\t\t\t}), fs_error);\n\t\t\t}\n\t\t\t, FS_proto = FileSaver.prototype\n\t\t\t, saveAs = function(blob, name, no_auto_bom) {\n\t\t\t\treturn new FileSaver(blob, name, no_auto_bom);\n\t\t\t}\n\t\t;\n\t\t// IE 10+ (native saveAs)\n\t\tif (typeof navigator !== \"undefined\" && navigator.msSaveOrOpenBlob) {\n\t\t\treturn function(blob, name, no_auto_bom) {\n\t\t\t\tif (!no_auto_bom) {\n\t\t\t\t\tblob = auto_bom(blob);\n\t\t\t\t}\n\t\t\t\treturn navigator.msSaveOrOpenBlob(blob, name || \"download\");\n\t\t\t};\n\t\t}\n\n\t\tFS_proto.abort = function() {\n\t\t\tvar filesaver = this;\n\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\tdispatch(filesaver, \"abort\");\n\t\t};\n\t\tFS_proto.readyState = FS_proto.INIT = 0;\n\t\tFS_proto.WRITING = 1;\n\t\tFS_proto.DONE = 2;\n\n\t\tFS_proto.error =\n\t\tFS_proto.onwritestart =\n\t\tFS_proto.onprogress =\n\t\tFS_proto.onwrite =\n\t\tFS_proto.onabort =\n\t\tFS_proto.onerror =\n\t\tFS_proto.onwriteend =\n\t\t\tnull;\n\n\t\treturn saveAs;\n\t}(\n\t\t\ttypeof self !== \"undefined\" && self\n\t\t|| typeof window !== \"undefined\" && window\n\t\t|| this.content\n\t));\n\n\tangular.module('fact2')\n\t\t.service('filesaver', ['$log', function($log) {\n\t\t\tvar service = {\n\t\t\t\tsaveAs: saveAs\n\t\t\t};\n\n\t\t\treturn service;\n\t\t}]);\n\n\n})();\n\n/*\n// `self` is undefined in Firefox for Android content script context\n// while `this` is nsIContentFrameMessageManager\n// with an attribute `content` that corresponds to the window\n\nif (typeof module !== \"undefined\" && module.exports) {\n module.exports.saveAs = saveAs;\n} else if ((typeof define !== \"undefined\" && define !== null) && (define.amd != null)) {\n define([], function() {\n return saveAs;\n });\n}\n*/\n(function () {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('popupDoc', popupDoc);\n\n\t/** @ngInject */\n\tfunction popupDoc($log, $timeout) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tlink: link\n\t\t};\n\n\t\tfunction link(scope, elm) {\n\t\t\tvar delayTimer;\n\t\t\tvar delayAffordance = 500;\n\n\t\t\telm.on('mouseover', function() {\n\t\t\t\t$timeout.cancel(delayTimer);\n\t\t\t\tdelayTimer = $timeout(function() {\n\t\t\t\t\telm.addClass('show-popup');\n\t\t\t\t}, delayAffordance);\n\t\t\t});\n\n\t\t\telm.on('mouseout', function() {\n\t\t\t\t$timeout.cancel(delayTimer);\n\t\t\t\tdelayTimer = $timeout(function() {\n\t\t\t\t\telm.removeClass('show-popup');\n\t\t\t\t}, delayAffordance);\n\t\t\t});\n\n\t\t\tscope.$on('$destroy', function() {\n\t\t\t\t$timeout.cancel(delayTimer);\n\t\t\t});\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('manageHome', manageHome);\n\n\t/** @ngInject */\n\tfunction manageHome($log, $state, authorizationService) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/managementPages/manageHome/manageHome.html',\n\t\t\tcontroller: controller\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tif (!authorizationService.verifyAuthorized()) {\n\t\t\t\t$state.go('manageLogin');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('loginPage', loginPage);\n\n\t/** @ngInject */\n\tfunction loginPage($log, $state, authorizationService) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\ttemplateUrl: 'app/components/managementPages/login/login.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\t$scope.tryToLogin = tryToLogin;\n\n\t\t\tauthorizationService.signOut();\n\n\t\t\t$scope.$watch(function() {return $scope.username+'|'+$scope.password; }, function() {\n\t\t\t\t// $log.log($scope.username+'|'+$scope.password);\n\t\t\t});\n\n\t\t\tfunction tryToLogin() {\n\t\t\t\tauthorizationService.authorize($scope.username, $scope.password)\n\t\t\t\t\t.then(function(outcome) {\n\t\t\t\t\t\t$log.log('outcome: '+outcome);\n\t\t\t\t\t\t$scope.hadLoginError = !outcome;\n\n\t\t\t\t\t\tif (outcome) {\n\t\t\t\t\t\t\t$state.go('manageHome');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('gameSettingsEditor', gameSettingsEditor)\n\t\t.filter('utcStrToLocalDate', utcStrToLocalDate);\n\n\t/** @ngInject */\n\tfunction gameSettingsEditor($log, $window, gameSettings, articleService, $state, authorizationService) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\ttemplateUrl: 'app/components/managementPages/gameSettings/gameSettingsEditor.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\n\t\t\tif (!authorizationService.verifyAuthorized()) {\n\t\t\t\t$state.go('manageLogin');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar cleanSettings;\n\t\t\t$scope.articleDict = {}\n\n\t\t\t$scope.revertSettings = revertSettings;\n\t\t\t$scope.saveSettings = saveSettings;\n\t\t\t$scope.enableGame = enableGame;\n\t\t\t$scope.disableGame = disableGame;\n\n\t\t\tarticleService.getArticleList()\n\t\t\t\t.then(function(articleList) {\n\t\t\t\t\tarticleList.forEach(function(a) {\n\t\t\t\t\t\t$scope.articleDict[a.pk] = a;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t$scope.gameNameList = [\n\t\t\t\t{gamePk: 1, gameName:\"default\"} \n\t\t\t];\n\n\t\t\tgameSettings.getGameList().then(function(gameList) {\n\t\t\t\t$log.log(gameList);\n\t\t\t\t$scope.gameNameList = gameList;\n\t\t\t\t$scope.selectedGame = gameList[0];\n\t\t\t\t$scope.$watch(function(){return $scope.selectedGame;}, function() {\n\t\t\t\t\t$log.log('game changed');\n\t\t\t\t\t$log.log($scope.selectedGame);\n\t\t\t\t\tfetchSettingsForPk($scope.selectedGame.pk);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tfunction fetchSettingsForPk(pk) {\n\t\t\t\treturn gameSettings.getSettings(pk)\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t$scope.gameSettings = gameSettings;\n\t\t\t\t\t\t$scope.selectedGamePk = gameSettings.pk;\n\t\t\t\t\t\tcleanSettings = angular.copy(gameSettings);\n\t\t\t\t\t\t$scope.$watch(function() {return angular.toJson(gameSettings);}, function() {\n\t\t\t\t\t\t\tgameSettings.updateSettingsCalculations();\n\t\t\t\t\t\t\t$scope.settingsHaveChanged = !angular.equals(cleanSettings, $scope.gameSettings);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tfunction revertSettings() {\n\t\t\t\tgameSettings.getSettings()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tcleanSettings = angular.copy(gameSettings);\n\t\t\t\t\t\t$scope.settingsHaveChanged = false;\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction saveSettings() {\n\t\t\t\t$log.log('saving...');\n\t\t\t\t$log.log('enabled '+gameSettings.is_enabled);\n\t\t\t\tgameSettings.postSettings()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tcleanSettings = angular.copy(gameSettings);\n\t\t\t\t\t\t$scope.settingsHaveChanged = false;\n\t\t\t\t\t},\n\t\t\t\t\tfunction(response, status) {\n\t\t\t\t\t\t$log.log('There was an error');\n\t\t\t\t\t\t$log.log(response);\n\t\t\t\t\t\tif (response.status===401) {\n\t\t\t\t\t\t\t$state.go('manageLogin');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction enableGame() {\n\t\t\t\tif ($window.confirm('Please confirm that you want to enable this game (it will then become clickable on the expedition screen)')) {\n\t\t\t\t\t$scope.gameSettings.is_enabled = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction disableGame() {\n\t\t\t\tif ($window.confirm('Please confirm that you want to disable this game (it no longer be clickable on the expedition screen)')) {\n\t\t\t\t\t$scope.gameSettings.is_enabled = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @ngInject */\n\tfunction utcStrToLocalDate() {\n\t\treturn function(str) {\n\t\t\tvar d = moment(str);\n\t\t\treturn d.format('h:mm a ddd MMM DD YYYY');\n\t\t};\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.service('gameSettings', gameSettings);\n\n\t/** @ngInject */\n\tfunction gameSettings($log, $http, authorizationService) {\n\t\tvar serviceUrl = \"/api/gameplay2/game_settings/\";\n\n\t\tvar service = {\n\n\t\t\troundInfo:[\n\t\t\t\t{\n\t\t\t\t\tarticleIds: [128, 129, 125],\n\t\t\t\t\treward: 10,\n\t\t\t\t\treward_with_hint: 5\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tarticleIds: [123, 122, 121],\n\t\t\t\t\treward: 10,\n\t\t\t\t\treward_with_hint: 5\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tarticleIds: [117, 118, 119, 120],\n\t\t\t\t\treward: 10,\n\t\t\t\t\treward_with_hint: 5\n\t\t\t\t}\n\t\t\t],\n\n\t\t\tgetSettings: getSettings,\n\t\t\tpostSettings: postSettings,\n\t\t\tupdateSettingsCalculations: updateSettingsCalculations,\n\t\t\tgetGameList: getGameList\n\n\t\t};\n\n\t\treturn service;\n\n\t\tfunction updateSettingsCalculations() {\n\t\t\t// set up so that the gamePlay record will have the appropriate values...\n\t\t\tservice.maximum_articles_played = 0;\n\t\t\tservice.maximum_score = 0;\n\t\t\tservice.roundInfo.forEach(function(round) {\n\t\t\t\tif (angular.isUndefined(round.shouldRandomize)) {\n\t\t\t\t\tround.shouldRandomize = false;\n\t\t\t\t}\n\t\t\t\tif (!round.shouldRandomize || angular.isUndefined(round.roundLength)) {\n\t\t\t\t\tround.roundLength = round.articleIds.length;\n\t\t\t\t}\n\t\t\t\tservice.maximum_articles_played += round.roundLength; // round.articleIds.length;\n\t\t\t\tservice.maximum_score += round.roundLength*round.reward; // round.articleIds.length * round.reward;\n\t\t\t});\n\t\t}\n\n\t\tfunction getSettings(pk) {\n\t\t\tvar url = serviceUrl + (pk ? pk+'/' : '');\n\t\t\treturn $http.get(url)\n\t\t\t\t.then(function(response) {\n\t\t\t\t\t// $log.log('success');\n\t\t\t\t\t// $log.log(response);\n\t\t\t\t\tvar settings = response.data;\n\t\t\t\t\t$log.log(settings);\n\t\t\t\t\tangular.extend(service, settings);\n\t\t\t\t\tupdateSettingsCalculations();\n\t\t\t\t});\n\t\t}\n\n\t\tfunction postSettings() {\n\n\t\t\tvar request = {\n\t\t\t\tmethod: 'POST',\n\t\t\t\turl: serviceUrl,\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tdata: service\n\t\t\t};\n\n\t\t\tauthorizationService.setAuthHeader(request.headers);\n\n\t\t\tupdateSettingsCalculations();\n\t\t\t// return $http.post(serviceUrl, service, {headers: headers})\n\t\t\treturn $http(request)\n\t\t\t\t.then(function(response) {\n\t\t\t\t\t// $log.log('success');\n\t\t\t\t\t// $log.log(response);\n\t\t\t\t\tvar settings = response.data;\n\t\t\t\t\tangular.extend(service, settings);\n\t\t\t\t});\n\t\t}\n\n\t\tfunction getGameList() {\n\t\t\treturn $http.get('/api/gameplay2/game_list')\n\t\t\t\t.then(function(response) {\n\t\t\t\t\treturn response.data;\n\t\t\t\t});\n\t\t}\n\n\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('articleIdList', articleIdList);\n\n\t/** @ngInject */\n\tfunction articleIdList($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tscope: {\n\t\t\t\tmodel: '=',\n\t\t\t\tvalid: '='\n\t\t\t},\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'vm',\n\t\t\tbindToController: true,\n\t\t\ttemplate: ''\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar vm = this;\n\n\t\t\tvm.listAsString = vm.model.join(', ');\n\n\t\t\tvm.onChange = onChange;\n\t\t\tvm.onBlur = onBlur;\n\n\t\t\tfunction onChange() {\n\t\t\t\t// $log.log('changed: '+vm.listAsString);\n\t\t\t\tvar provisional = vm.listAsString.split(/\\D+/).map(function(item) {return 1*item.trim()}).filter(function(item) {return item>0});\n\t\t\t\t// $log.log(provisional);\n\t\t\t\tvm.model = provisional;\n\t\t\t}\n\n\t\t\tfunction onBlur() {\n\t\t\t\t// $log.log('blur');\n\t\t\t\tvm.listAsString = vm.model.join(', ');\n\t\t\t}\n\t\t}\n\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('campaignContentPage', campaignContentPage);\n\n\t/** ngInject */\n\tfunction campaignContentPage($log, authorizationService, campaignContentService, $state) {\n\t\treturn {\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'ccp',\n\t\t\tbindToController: true,\n\t\t\ttemplateUrl: 'app/components/managementPages/campaignContent/campaignContentPage.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tif (!authorizationService.verifyAuthorized()) {\n\t\t\t\t$state.go('manageLogin');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar vm = this;\n\n\t\t\tvm.hasChanged = false;\n\n\t\t\tvm.saveContent = saveContent;\n\t\t\tvm.contentChange = contentChange;\n\n\t\t\tcampaignContentService.fetchContent()\n\t\t\t\t.then(function() {\n\t\t\t\t\tvm.epDialog = campaignContentService.epDialog;\n\t\t\t\t});\n\n\t\t\tfunction contentChange() {\n\t\t\t\tvm.hasChanged = true;\n\t\t\t}\n\n\t\t\tfunction saveContent() {\n\t\t\t\tcampaignContentService.postContent()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t$log.log('content-saved');\n\t\t\t\t\t\tvm.hasChanged = false;\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.service('authorizationService', authorizationService);\n\n\tvar authCookie = \"authToken\";\n\n\t/** @ngInject */\n\tfunction authorizationService($log, $http, $cookies) {\n\t\tvar authToken;\n\t\tvar cookieTtlHours = 4.0;\t// 4 hours\n\n\t\tvar service = {\n\t\t\tauthorize: authorize,\n\t\t\tsignOut: signOut,\n\t\t\tverifyAuthorized: verifyAuthorized,\n\t\t\tsetAuthHeader: setAuthHeader,\n\n\t\t\tisAuthorized: false\n\t\t};\n\n\t\tverifyAuthorized();\n\n\t\treturn service;\n\n\t\tfunction verifyAuthorized() {\n\t\t\tauthToken = $cookies.get(authCookie);\n\t\t\tservice.isAuthorized = angular.isDefined(authToken) && authToken!=='';\n\t\t\tif (service.isAuthorized) {\n\t\t\t\tvar expireTime = moment().add(cookieTtlHours, 'hours').toDate();\n\t\t\t\t$cookies.put(authCookie, authToken, {expires: expireTime});\n\t\t\t}\n\t\t\treturn service.isAuthorized;\n\t\t}\n\n\t\tfunction authorize(username, password) {\n\t\t\tvar authUrl = '/api/f2auth/api-token-auth/';\n\n\t\t\tsignOut();\n\n\t\t\treturn $http.post(authUrl, {username: username, password: password})\n\t\t\t\t.then(function(response) {\n\t\t\t\t\tauthToken = response.data.token;\n\t\t\t\t\tservice.isAuthorized = true;\n\t\t\t\t\t/*\n\t\t\t\t\tvar expireTime = new Date();\n\t\t\t\t\t$log.log(expireTime.setDate(expireTime.getDate()+cookieTTL));\n\t\t\t\t\t*/\n\n\t\t\t\t\tvar expireTime = moment().add(cookieTtlHours, 'hours').toDate();\n\t\t\t\t\t$cookies.put(authCookie, authToken, {expires: expireTime});\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tfunction(response) {\n\t\t\t\t\t$log.log('it failed');\n\t\t\t\t\t$log.log(response);\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t}\n\n\t\tfunction setAuthHeader(headers) {\n\t\t\theaders = headers || {};\n\t\t\tif (authToken) {\n\t\t\t\theaders['Authorization'] = 'Token '+authToken;\n\t\t\t}\n\t\t\treturn headers;\n\t\t}\n\n\t\tfunction signOut() {\n\t\t\tauthToken = '';\n\t\t\tservice.isAuthorized = false;\n\t\t\t$cookies.remove(authCookie);\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('loadImageFile', loadImageFile);\n\n\t/** @ngInject */\n\tfunction loadImageFile($log) {\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\tscope: {\n\t\t\t\tloadImageFile: '&'\n\t\t\t},\n\t\t\tlink: link\n\t\t};\n\n\t\tfunction link(scope, elm, attrs) {\n\n\t\t\telm.on('click', function() {\n\t\t\t\t$(elm)[0].value = null; // so that we get a change event...\n\t\t\t});\n\n\t\t\telm.on('change', function(e) {\n\n\t\t\t\tif (e.target.files && e.target.files.length==1) {\n\t\t\t\t\tscope.loadImageFile({'fileObject':e.target.files[0]});\n\t\t\t\t}\n\n\t\t\t\tscope.$apply();\n\t\t\t\t\n\t\t\t});\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('wedge', wedge);\n\n\t/** @ngInject */\n\tfunction wedge() {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplate: [\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t''\n\t\t\t\t].join('\\n')\n\t\t};\n\t}\n\n})();\n\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('timerArc', timerArc);\n\n\t/** @ngInject */\n\tfunction timerArc($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tscope: {\n\t\t\t\tmaxTime: '=',\n\t\t\t\tcurTime: '='\n\t\t\t},\n\t\t\ttemplate: [\n\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t''\n\t\t\t].join('')\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar radius = 20;\n\t\t\t\n\t\t\t$scope.$watch(function(){return $scope.curTime;}, updateArc);\n\n\t\t\tfunction updateArc() {\n\n\t\t\t\tvar angle = 2*Math.PI*($scope.curTime/$scope.maxTime+0.499);\n\n\t\t\t\t$scope.radius = radius;\n\t\t\t\t$scope.endX = Math.sin(angle)*radius + radius + 20;\n\t\t\t\t$scope.endY = Math.cos(angle)*radius + radius + 20;\n\n\t\t\t\t$scope.arcX = (Math.sin(angle)>=0 ? 1 : 0);\n\n\t\t\t}\n\t\t}\n\t}\n})();\n(function() {\n\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('teacherPage',teacherPage);\n\n\t/** @ngInject */\n\tfunction teacherPage($log, $http,$window) {\n\t\treturn {\n\t\t\tcontroller: controller,\n\t\t\tlink: link,\n\t\t\tscope: {\n\t\t\t\tmain: '='\n\t\t\t},\n\t\t\tcontrollerAs: 'tp',\n\t\t\tbindToCcontroller: true,\n\t\t\ttemplateUrl: 'app/components/teacherPage/teacherPage.html'\n\t\t};\n\n\t\tfunction controller($scope, $element) {\n\t\t\tvar vm = this;\n\n\t\t\tvm.wantsNotifications = true;\n\t\t\tvm.email = '';\n\t\t\tvm.comments = '';\n\n\t\t\tvm.submitComments = submitComments;\n\n\t\t\t$log.log('width ', $element.width())\n\t\t\tif ($element.width()<370) {\n\t\t\t\t$scope.isSmall = true;\n\t\t\t}\n\n\t\t\tfunction submitComments() {\n\t\t\t\tvar data = {\n\t\t\t\t\twants_notifications: vm.wantsNotifications,\n\t\t\t\t\temail: vm.email,\n\t\t\t\t\tcomments: vm.comments\n\t\t\t\t};\n\n\t\t\t\t$http.post('/api/gameplay2/teacher_comments/', data)\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t$log.log('success!!');\n\t\t\t\t\t\tvm.showGoodbye = true;\n\t\t\t\t\t},\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\t$log.log('failure!!');\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfunction link() {\n\n\t\t}\n\n\t}\n\n})();\n\n(function() {\n\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('trackSwipe', trackSwipe)\n\t\t.directive('debounce', debounce);\n\n\t/** @ngInject */\n\tfunction trackSwipe($log, $timeout, $window, swiperService, audioService) {\n\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\tlink: link\n\t\t};\n\n\t\tfunction link(scope, elm) {\n\n\t\t\t$log.log('trackSwipe constructed');\n\t\t\tvar anchorX, dragX;\n\n\t\t\tvar triggerThreshold = 20;\n\t\t\tvar swipeThreshold = 100;\n\t\t\tvar shouldSwipe = false;\n\n\t\t\tvar canTouch = 'ontouchstart' in $window;\n\n\t\t\tscope.main.debugStr +=' canTouch '+canTouch;\n\n\t\t\tif (!canTouch) {\n\t\t\t\telm.on('mousedown', trackDown);\n\t\t\t} else {\n\t\t\t\telm.on('touchstart', trackDown);\n\t\t\t}\n\n\t\t\tfunction trackDown(e) {\n\n\t\t\t\tif (scope.main.shouldSwipe || scope.main.state !== 'showArticle') {\n\t\t\t\t\t// debounce...\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taudioService.playACSound('silent'); // ARRRGGGGGGHHH! Why is this required for Safari?\n\t\t\t\tanchorX = getPageX(e);\n\n\t\t\t\telm.on('mousemove', trackMove);\n\t\t\t\telm.on('touchmove', trackMove);\n\t\t\t\telm.on('mouseleave', trackUp);\n\t\t\t\telm.on('mouseup', trackUp);\n\t\t\t\telm.on('touchend', trackUp);\n\n\t\t\t\t// scope.main.debugStr = \"didTrackDownEnd\";\n\t\t\t}\n\n\t\t\tfunction trackUp(e) {\n\t\t\t\t$log.log('trackSwipe trackUp '+e.type);\n\n\t\t\t\tif ((scope.main.inSwipeLeft || scope.main.inSwipeRight) && scope.main.shouldSwipe) {\n\t\t\t\t\tif (scope.main.inSwipeLeft) {\n\t\t\t\t\t\tscope.main.swipeLeft(dragX);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscope.main.swipeRight(dragX);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\telm.find('.article-card').css('transform', '');\n\t\t\t\t\tscope.main.inSwipeLeft = scope.main.inSwipeRight = false;\n\t\t\t\t\tscope.main.shouldSwipe = shouldSwipe = false;\n\t\t\t\t}\n\t\t\t\treleaseListeners();\n\t\t\t\tscope.$apply();\n\t\t\t\t// $log.log('got touchend '+e.type);\n\t\t\t}\n\n\t\t\tfunction trackMove(e) {\n\t\t\t\tvar dx = getPageX(e) - anchorX;\n\t\t\t\tscope.main.inSwipeLeft = (dx < -triggerThreshold);\n\t\t\t\tscope.main.inSwipeRight = (dx > triggerThreshold);\n\t\t\t\tshouldSwipe = Math.abs(dx)>swipeThreshold;\n\t\t\t\tscope.main.shouldSwipe = shouldSwipe;\n\t\t\t\tif (scope.main.inSwipeLeft || scope.main.inSwipeRight) {\n\t\t\t\t\tvar sgn = (scope.main.inSwipeLeft ? -1 : 1);\n\t\t\t\t\tdragX = 0.5*(dx - sgn*triggerThreshold);\n\t\t\t\t\telm.find('.article-card').css('transform', 'translateX('+dragX+'px)');\n\t\t\t\t} else {\n\t\t\t\t\telm.find('.article-card').css('transform', 'translateX(0px)');\n\t\t\t\t}\n\t\t\t\tscope.$apply();\n\t\t\t}\n\n\t\t\tfunction releaseListeners() {\n\t\t\t\telm.off('mousemove', trackMove);\n\t\t\t\telm.off('touchmove', trackMove);\n\t\t\t\telm.off('mouseleave', trackUp);\n\t\t\t\telm.off('mouseup', trackUp);\n\t\t\t\telm.off('touchend', trackUp);\n\t\t\t}\n\n\t\t\tfunction getPageX(evt) {\n\t\t\t\tif (evt.type.indexOf('mouse')>=0) {\n\t\t\t\t\treturn evt.pageX;\n\t\t\t\t} else if (evt.changedTouches) {\n\t\t\t\t\treturn evt.changedTouches[0].pageX;\n\t\t\t\t} else if (evt.originalEvent.changedTouches) {\n\t\t\t\t\treturn evt.originalEvent.changedTouches[0].pageX;\n\t\t\t\t} else {\n\t\t\t\t\treturn event.changedTouches[0].pageX;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\t// this is to fix some angular material bug where buttons end up getting focus after a swipe... grrr!\n\t/** @ngInject */\n\tfunction debounce($log, $timeout) {\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\tlink: link\n\t\t};\n\n\t\tfunction link(scope, elm) {\n\t\t\telm.css({'pointer-events': 'none'});\n\n\t\t\t$timeout(function() {\n\t\t\t\telm.css({'pointer-events': 'initial'});\n\t\t\t}, 200);\n\t\t}\n\t}\n\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.service('swiperService', swiperService);\n\n\t/** @ngInject */\n\tfunction swiperService($log, $q, $timeout, audioService) {\n\t\tvar service = {\n\t\t\tswipeCard: swipeCard\n\t\t};\n\n\t\treturn service;\n\n\t\tfunction swipeCard(scope, elm, direction, dragX) {\n\t\t\t$log.log('swipeCard start');\n\t\t\tdragX = dragX || 0;\n\t\t\tvar deferred = $q.defer();\n\t\t\tvar sgn = (direction==='left' ? -1 : 1);\n\n\t\t\telm.css('myprop', '0');\n\n\t\t\t$(elm).animate({\n\t\t\t\tmyprop: 1\n\t\t\t}, {\n\t\t\t\tstep: function(now, tween){\n\t\t\t\t\telm.css('transform', 'translateX('+(dragX+sgn*now*600)+'px)')\n\t\t\t\t},\n\t\t\t\tcomplete: function() {\n\t\t\t\t\t$log.log('swipeCard ended')\n\t\t\t\t\t$timeout(function() {\n\t\t\t\t\t\telm.css('transform', '');\n\t\t\t\t\t}, 100);\n\t\t\t\t\tscope.main.inSwipeLeft = scope.main.inSwipeRight = scope.main.article.expanded = false;\n\t\t\t\t\tscope.main.shouldSwipe = false;\n\t\t\t\t\t$(elm).scrollTop(1);\n\t\t\t\t\tdeferred.resolve();\n\t\t\t\t\t// scope.$apply();\n\t\t\t\t}\n\t\t\t}, 500);\n\n\t\t\t// audioService.playSoundEffect('moreSlideIn_whoosh.m4a');\n\n\n\t\t\treturn deferred.promise;\n\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('startupSequence', startupSequence)\n\t\t.directive('f2RadioBlock', f2RadioBlock);\n\n\t/** @ngInject */\n\tfunction startupSequence($log, playerService, audioService, publicName, gameState) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tscope: {\n\t\t\t\tmain: '='\n\t\t\t},\n\t\t\tcontroller: controller,\n\t\t\ttemplateUrl: 'app/components/startup/startupSequence.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\t$scope.flags = {};\n\n\t\t\t$scope.userInfo = {\n\t\t\t\tage: 16,\n\t\t\t\tgender: '',\n\t\t\t\teducation: '',\n\t\t\t\tnews_media_savvy: 0,\n\t\t\t\tusername: '',\n\t\t\t\thas_completed_survey: true\n\t\t\t};\n\n\t\t\t$scope.foo = {userEmail: ''};\n\n\t\t\t$scope.state = \"signIn\";\n\t\t\t// $scope.state = \"getInfo\";\n\t\t\t// $scope.state = \"getEmail\";\n\n\t\t\t$scope.tryLogin = function() {\n\t\t\t\tvar isPublicName = publicName.tryUnmakeUsername($scope.userInfo.username);\n\t\t\t\taudioService.playACSound('btn');\t\t\t\t\n\t\t\t\t$log.log('try logging in as '+$scope.userInfo.username);\n\t\t\t\tplayerService.trySignIn($scope.userInfo.username, isPublicName)\n\t\t\t\t\t.then(function(exists) {\n\t\t\t\t\t\tif (exists) {\n\t\t\t\t\t\t\t$scope.main.setupForLaunch();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$scope.state = 'userNotFound';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t$scope.cancelLogin = function() {\n\t\t\t\taudioService.playACSound('btn');\t\t\t\t\n\t\t\t\t$scope.main.setupForLaunch();\n\t\t\t}\n\n\t\t\t$scope.cancelCreate = function() {\n\t\t\t\taudioService.playACSound('btn');\t\t\t\t\n\t\t\t\t$scope.state = 'signIn';\n\t\t\t}\n\n\t\t\t$scope.getUserInfo = function() {\n\t\t\t\taudioService.playACSound('btn');\t\t\t\t\n\t\t\t\t$scope.state = 'getInfo';\n\t\t\t}\n\n\t\t\t$scope.cancelGetInfo = function() {\n\t\t\t\taudioService.playACSound('btn');\t\t\t\t\n\t\t\t\t$scope.state = 'signIn';\n\t\t\t}\n\n\t\t\t$scope.usernameValid = function(canBePublicName) {\n\t\t\t\tif (canBePublicName && publicName.tryUnmakeUsername($scope.userInfo.username)) return true;\n\t\t\t\t\n\t\t\t\treturn (/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/.test($scope.userInfo.username)); \n\t\t\t}\n\n\t\t\t$scope.userEmailValid = function() {\n\t\t\t\tvar res = (/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/.test($scope.foo.userEmail)); \n\t\t\t\treturn res;\n\t\t\t}\n\n\t\t\t$scope.infoValid = function() {\n\t\t\t\treturn $scope.userInfo.gender && $scope.userInfo.education && $scope.userInfo.news_media_savvy;\n\t\t\t}\n\n\t\t\t$scope.createUser = function(noUsername) {\n\t\t\t\t// playerService.createNewPlayer($scope.userInfo)\n\t\t\t\tif (noUsername) {\n\t\t\t\t\tvar tempName = 'temp'+(Math.random()+'').replace('.', '');\n\t\t\t\t\t$scope.userInfo.username = tempName;\n\t\t\t\t}\n\t\t\t\tplayerService.createNewPlayer({username:$scope.userInfo.username})\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t$log.log('user created');\n\t\t\t\t\t\tif (playerService.couldAdoptGame) {\n\t\t\t\t\t\t\tplayerService.adoptPlayedGame(gameState.game_record.pk);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$scope.state = 'selectUsername';\n\t\t\t\t\t\tplayerService.playerInfo.user_public_name = $scope.user_public_name = publicName.makeUserName(playerService.playerInfo.pk);\n\t\t\t\t\t\tplayerService.savePlayerInfo();\n\t\t\t\t\t\t// $scope.main.startOver();\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t$scope.cancelCreateUser = function() {\n\t\t\t\tplayerService.discardTemporaryUser();\t\t\t\t\n\t\t\t\t$scope.main.startOver();\n\t\t\t}\n\n\t\t\t$scope.anotherUserName = function() {\n\t\t\t\t$scope.user_public_name = publicName.makeUserName(playerService.playerInfo.pk);\n\t\t\t}\n\n\t\t\t$scope.acceptUserName = function() {\n\t\t\t\tplayerService.playerInfo.user_public_name = $scope.user_public_name;\t\n\t\t\t\tplayerService.savePlayerInfo()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tif (playerService.couldAdoptGame) {\n\t\t\t\t\t\t\t$log.log('highScoreTest from startupSequence');\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar gameScore = gameState.state.totalScore;\n\t\t\t\t\t\t\tplayerService.highScoreTest(playerService.playerInfo.pk, gameScore, gameState.game_record.game_name, gameScore)\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t$scope.state = 'getInfo';\n\t\t\t\t\t\t\t\t\t// $scope.main.startOver();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$scope.state = 'getInfo';\n\t\t\t\t\t\t\t// $scope.main.startOver();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t$scope.saveUserDemographics = function() {\n\t\t\t\t$log.log(angular.copy(playerService.playerInfo));\n\t\t\t\tangular.extend(playerService.playerInfo, $scope.userInfo);\n\t\t\t\tplayerService.savePlayerInfo()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tif (playerService.playerInfo.username.indexOf('temp')===0) {\n\t\t\t\t\t\t\t$scope.foo.userEmail = '';\n\t\t\t\t\t\t\t$scope.state = 'getEmail';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$scope.main.startOver();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t$scope.cancelUserDemographics = function() {\n\t\t\t\t$scope.main.startOver();\n\t\t\t}\n\n\t\t\t$scope.saveUserEmail = function() {\n\t\t\t\tplayerService.playerInfo.username = $scope.foo.userEmail;\n\t\t\t\tplayerService.savePlayerInfo()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t$scope.main.startOver();\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t$scope.cancelSaveUserEmail = function() {\n\t\t\t\t$scope.main.startOver();\n\t\t\t}\n\n\t\t}\n\t}\n\n\t/** @ngInject */\n\tfunction f2RadioBlock($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tscope: {\n\t\t\t\tmodel: '=',\n\t\t\t\tvalue: '@'\n\t\t\t},\n\t\t\ttransclude: true,\n\t\t\ttemplate: [\n\t\t\t\t\t'
',\n\t\t\t\t\t'
'\n\t\t\t\t].join(''),\n\t\t\tcontroller: controller,\n\t\t\tlink: link\n\t\t};\n\n\t\tfunction controller($scope, $element) {\n\t\t\t$scope.clicked = function() {\n\t\t\t\t$scope.model = $scope.value;\n\t\t\t}\n\t\t}\n\n\t\tfunction link(scope, elm) {\n\n\t\t\t$(elm).click(function() {\n\t\t\t\tscope.clicked();\n\t\t\t\tscope.$apply();\n\t\t\t});\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('simpleModalPopup', simpleModalPopup);\n\n\t/** @ngInject */\n\tfunction simpleModalPopup($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/simpleModalPopup/simpleModalPopup.html',\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'smp',\n\t\t\tbindToController: true,\n\t\t\tscope: {\n\t\t\t\ttitle: '=dlogTitle',\n\t\t\t\thideNapkin: '=hideNapkin'\n\t\t\t},\n\t\t\ttransclude: true\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar vm = this;\n\t\t\t$scope.$watch(function(){return vm.title;}, function() {\n\t\t\t\t$log.log('titleChanged \"'+vm.title+'\"');\n\t\t\t})\n\t\t}\n\t}\n\t\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.service('publicName', publicName);\n\n\n\tvar adjectives = [\n\t\t'tiny', 'sad', 'alive', 'broad', 'acidic', 'attractive', 'small', 'happy', 'better', 'chubby', 'bitter', \n\t\t'beautiful', 'meager', 'ambitious', 'careful', 'crooked', 'cool', 'chubby', 'medium', 'brave', 'clever', \n\t\t'curved', 'creamy', 'clean', 'large', 'calm', 'dead', 'deep', 'fresh', 'dazzling', 'huge', 'angry', 'easy', \n\t\t'flat', 'greasy', 'drab', 'massive', 'eager', 'famous', 'high', 'juicy', 'elegant', 'little', 'faithful', \n\t\t'gifted', 'hollow', 'moldy', 'fancy', 'minute', 'gentle', 'helpful', 'low', 'nutty', 'fit', 'big', 'happy', \n\t\t'mushy', 'narrow', 'putrid', 'flabby', 'bulky', 'jolly', 'odd', 'refined', 'rancid', 'glamorous', 'great', \n\t\t'kind', 'poor', 'round', 'ripe', 'gorgeous', 'petite', 'lively', 'powerful', 'shallow', 'rotten', 'handsome', \n\t\t'scrawny', 'nice', 'rich', 'skinny', 'salty', 'long', 'short', 'feisty', 'shy', 'square', 'savory', 'muscular', \n\t\t'tall', 'polite', 'tender', 'steep', 'sour', 'plain', 'proud', 'vast', 'straight', 'spicy', 'plump', 'silly', \n\t\t'wrong', 'wide', 'spoiled', 'quaint', 'thankful', 'stale', 'scruffy', 'witty', 'sweet', 'shapely', 'zealous', \n\t\t'tangy', 'short', 'grumpy', 'tart', 'skinny', 'lazy', 'tasty', 'stocky', 'scary', 'yummy', 'worried', 'clumsy'];\n\n\tvar colors = [\n\t\t'ashy', 'black', 'blue', 'gray', 'green', 'beige', 'mango', 'orange', 'purple', 'red', 'salmon', \n\t\t'white', 'yellow', 'brown', 'amber', 'aqua', 'lime', 'auburn', 'azure', 'blond', 'pink', 'copper', \n\t\t'gold', 'silver', 'indigo', 'ivory', 'lilac', 'magenta', 'ochre', 'olive', 'plum', 'tan', 'teal', 'violet'];\n\n\n\tvar nouns = [\n\t\t'ant', 'almond', 'daisy', 'car', 'artist', 'ape', 'apple', 'rose', 'truck', 'animator', 'alpaca', 'bamboo', \n\t\t'tulip', 'bullbozer', 'baker', 'baboon', 'banana', 'orchid', 'crane', 'dancer', 'bat', 'blueberry', 'lily', \n\t\t'boat', 'designer', 'bear', 'strawberry', 'buttercup', 'ship', 'coder', 'bettle', 'raspberry', 'poppy', 'dumptruck', \n\t\t'illustrator', 'butterfly', 'corn', 'carnation', 'bus', 'musician', 'camel', 'pumpkin', 'daffodil', 'tanker', \n\t\t'singer', 'cat', 'cherry', 'hyacinth', 'airplane', 'drummer', 'cheetah', 'coconut', 'iris', 'helicopter', 'guitarist', \n\t\t'coyote', 'pineapple', 'lavendar', 'glider', 'writer', 'crab', 'melon', 'marigold', 'bicycle', 'sculptor', 'cricket', \n\t\t'cantaloupe', 'petunia', 'motorcycle', 'programmer', 'crow', 'onion', 'zinnia', 'scooter', 'developer', 'deer', 'potato', \n\t\t'skateboard', 'engineer', 'dog', 'grapefruit', 'tank', 'scientist', 'duck', 'grape', 'jet', 'doctor', 'eel', 'lemon', \n\t\t'spaceship', 'dentist', 'elk', 'lime', 'surgeon', 'ferret', 'lettuce', 'nurse', 'fish', 'cashew', 'author', 'fly', \n\t\t'peanut', 'novelist', 'fox', 'pecan', 'screenwriter', 'frog', 'walnut', 'journalist', 'giraffe', 'firefighter', 'goat', \n\t\t'poet', 'gorilla', 'clerk', 'master', 'cashier', 'horse', 'waiter', 'hyena', 'salesperson', 'koala', 'teacher', 'leopard', \n\t\t'athlete', 'lion', 'manager', 'lizard', 'plumber', 'manatee', 'carpenter', 'monkey', 'lawyer', 'moose', 'guard', 'mouse', \n\t\t'driver', 'mule', 'muskrat', 'oyster', 'panda', 'pig', 'rabbit', 'raccoon', 'rhino', 'scorpion', 'shark', 'sheep', 'snail', \n\t\t'snake', 'swan', 'tiger', 'walrus', 'weasel', 'whale', 'wolf', 'wombat', 'yak', 'zebra'];\n\n\t/// GREEK VERSIONS ///\n\n\tadjectives = [\n\t\t'όξινο', 'ζωντανός', 'φιλόδοξος', 'θυμωμένος', 'ελκυστικός', 'πανεμορφη', 'καλύτερα', 'μεγάλο', 'πικρός', \n\t\t'γενναίος', 'ευρύς', 'ογκώδης', 'ηρεμία', 'προσεκτικός', 'παχουλός', 'παχουλός', 'καθαρη', 'έξυπνος', 'αδέξιος', 'δροσερός', \n\t\t'αφρογαλακτώδης', 'ανέντιμος', 'κυρτός', 'εκθαμβωτικός', 'νεκρός', 'βαθύς', 'παλιογυναίκα', 'πρόθυμος', 'ανετος', 'κομψός', \n\t\t'πιστός', 'διάσημος', 'φαντασία', 'σούσουρο', 'κατάλληλος', 'πλαδαρός', 'επίπεδο', 'φρέσκο', 'ευγενής', 'προικισμένος', \n\t\t'γοητευτικός', 'υπέροχος', 'λιπαρός', 'μεγάλος', 'γκρινιάρης', 'όμορφος', 'χαρούμενος', 'χαρούμενος', 'βοηθητικός', 'υψηλός', \n\t\t'κοίλος', 'τεράστιος', 'χαρούμενος', 'χυμώδης', 'είδος', 'μεγάλο', 'τεμπέλης', 'λίγο', 'ζωηρός', 'μακρύς', 'χαμηλός', 'ογκώδης', \n\t\t'γλίσχρος', 'μεσαίο', 'λεπτό', 'μουχλιασμένος', 'μυώδης', 'ευαίσθητος', 'στενός', 'όμορφη', 'παλαβός', 'περιττός', 'μικροκαμωμένη', \n\t\t'πεδιάδα', 'παχουλός', 'ευγενικός', 'φτωχός', 'ισχυρός', 'υπερήφανος', 'σάπιος', 'αλλόκοτος', 'ταγγός', 'εξευγενισμένος', 'πλούσιος', \n\t\t'ώριμος', 'σάπιος', 'γύρος', 'λυπημένος', 'αλμυρός', 'αλμυρά', 'τρομακτικός', 'λιπόσαρκος', 'βρώμικος', 'αβαθής', 'καλοφτιαγμένος', \n\t\t'μικρός', 'μικρός', 'ντροπαλός', 'ανόητος', 'κοκαλιάρης', 'κοκαλιάρης', 'μικρό', 'θυμώνω', 'αρωματώδης', 'κακομαθημένος', 'τετράγωνο', \n\t\t'μπαγιάτικος', 'απότομος', 'στιβαρός', 'ευθεία', 'γλυκός', 'ψηλός', 'ασαφής', 'τάρτα', 'γευστικός', 'προσφορά', 'ευγνώμων', \n\t\t'μικροσκοπικός', 'απέραντος', 'πλατύς', 'πνευματώδης', 'ανήσυχος', 'λανθασμένος', 'λαχταριστό', 'ενθουσιώδης'\n\t];\n\n\tcolors = [\n\t\t'στακτερός', 'μαύρος', 'μπλε', 'γκρί', 'πράσινος', 'μπεζ', 'μάνγκο', 'πορτοκάλι', 'μωβ', 'το κόκκινο', 'σολομός', 'λευκό', \n\t\t'κίτρινος', 'καφέ', 'κεχριμπάρι', 'aqua', 'άσβεστος', 'πυρόξανθος', 'γαλανός', 'ξανθός', 'ροζ', 'χαλκός', 'χρυσός', 'ασήμι', \n\t\t'ινδικό', 'ελεφαντόδοντο', 'πασχαλιά', 'πορφύρα βαφή', 'ώχρα', 'ελιά', 'δαμάσκηνο', 'ηλιοκαμένος', 'βάσκας', 'βιολέτα'\n\t];\n\n\tnouns = [\n\t\t'μυρμήγκι', 'αμύγδαλο', 'μαργαρίτα', 'αυτοκίνητο', 'καλλιτέχνης', 'πίθηκος', 'μήλο', 'τριαντάφυλλο', 'φορτηγό', 'εμψυχωτής', \n\t\t'αιγοκάμηλος', 'μπαμπού', 'τουλίπα', 'μπουλντόζα', 'αρτοποιός', 'βαβουίνος', 'μπανάνα', 'ορχιδέα', 'γερανός', 'χορεύτρια', \n\t\t'νυχτερίδα', 'μυρτιλός', 'κρίνος', 'σκάφος', 'σχεδιαστής', 'αρκούδα', 'φράουλα', 'βατράχιο', 'πλοίο', 'κωδικοποιητής', 'τσουρέκι', \n\t\t'βατόμουρο', 'παπαρούνα', 'εικονογράφος', 'πεταλούδα', 'καλαμπόκι', 'γαρύφαλλο', 'λεωφορείο', 'μουσικός', 'καμήλα', 'κολοκύθι', \n\t\t'ασφόδελος', 'δεξαμενόπλοιο', 'τραγουδιστής', 'γάτα', 'κεράσι', 'υάκινθος', 'αεροπλάνο', 'τυμπανιστής', 'γατόπαρδος', 'καρύδα', \n\t\t'ίρις', 'ελικόπτερο', 'κιθαρίστας', 'ανανάς', 'λεβάντα', 'ανεμοπλάνο', 'συγγραφέας', 'κάβουρας', 'πεπόνι', 'κατιφές', 'ποδήλατο', \n\t\t'γλύπτης', 'κρίκετ', 'πεπονάκι', 'πετούνια', 'μοτοσυκλέτα', 'προγραμματιστής', 'κοράκι', 'κρεμμύδι', 'ζίννια', 'σκούτερ', \n\t\t'προγραμματιστής', 'ελάφι', 'πατάτα', 'πατίνι', 'μηχανικός', 'σκύλος', 'φράπα', 'δεξαμενή', 'επιστήμονας', 'πάπια', 'σταφύλι', \n\t\t'πίδακας', 'γιατρός', 'χέλι', 'λεμόνι', 'διαστημοπλοιο', 'οδοντίατρος', 'μεγάλη έλαφος', 'άσβεστος', 'χειρουργός', 'κουνάβι', \n\t\t'μαρούλι', 'νοσοκόμα', 'ψάρι', 'κάσιους', 'συντάκτης', 'πετώ', 'αράπικο φιστίκι', 'μυθιστοριογράφος', 'αλεπού', 'πέκαν', 'σεναριογράφος', \n\t\t'βάτραχος', 'καρυδιά', 'δημοσιογράφος', 'καμηλοπάρδαλη', 'πυροσβέστης', 'γίδα', 'ποιητής', 'γορίλλας', 'υπάλληλος', 'κύριος', \n\t\t'ταμίας', 'άλογο', 'σερβιτόρος', 'ύαινα', 'πωλητής', 'δάσκαλος', 'λεοπάρδαλη', 'αθλητής', 'λιοντάρι', 'διευθυντής', 'σαύρα', \n\t\t'υδραυλικός', 'μανατέ', 'ξυλουργός', 'πίθηκος', 'δικηγόρος', 'φρουρά', 'ποντίκι', 'οδηγός', 'μουλάρι', 'μοσχοπόντικος', 'στρείδι', \n\t\t'χοίρος', 'κουνέλι', 'ρακούν', 'ρινόκερος', 'σκορπιός', 'καρχαρίας', 'πρόβατο', 'σαλιγκάρι', 'φίδι', 'κύκνος', 'τίγρη', 'νυφίτσα', \n\t\t'φάλαινα', 'λύκος', 'φασκωλόμυς', 'ζέβρα'\n\t];\n\n\tvar cn = colors.length, \n\t\tan = adjectives.length, \n\t\tnn = nouns.length, \n\t\tsn = 10;\n\n\tvar allCount = cn*an*nn*sn;\n\n\tvar saltMultiplier = 4321*99;\n\n\t/** @ngInject **/\n\tfunction publicName($log) {\n\t\tvar service = {\n\t\t\t\n\t\t\tadjectives: adjectives,\n\t\t\tcolors: colors,\n\t\t\tnouns: nouns,\n\n\t\t\tmakeUserName: makeUserName,\n\t\t\tunmakeUserName: unmakeUserName,\n\t\t\ttryUnmakeUsername: tryUnmakeUsername\n\n\t\t};\n\n\t\treturn service;\n\n\t\tfunction capFirst(s) {\n\t\t\treturn s[0].toUpperCase()+s.substr(1).toLowerCase();\n\t\t}\n\n\t\tfunction makeUserName(pk, salt) {\n\t\t\tvar wantsRandom;\n\t\t\tif (salt==undefined) {\n\t\t\t\twantsRandom = true;\n\t\t\t\tsalt = Math.floor(Math.random()*100);\n\t\t\t}\n\n\t\t\tvar n = (pk + salt*saltMultiplier) % allCount;\n\n\t\t\tvar ci = n % cn;\n\t\t\tn = (n - ci)/cn;\n\t\t\tvar ai = n % an;\n\t\t\tn = (n-ai)/an;\n\t\t\tvar ni = n % nn;\n\t\t\tn = (n-ni) / nn;\n\t\t\tvar si = n % sn;\n\t\t\t$log.log(ci,ai,ni,si);\n\n\t\t\tvar salti = '00'+salt;\n\t\t\tsalti = salti.substr(salti.length-2);\n\n\t\t\tvar un = colors[ci]+capFirst(adjectives[ai])+capFirst(nouns[ni])+si+salti;\n\n\t\t\tconsole.log(un, pk, unmakeUserName(un))\n\n\t\t\tif (wantsRandom) {\n\t\t\t\tif (un.length>19) {\n\t\t\t\t\treturn makeUserName(pk);\n\t\t\t\t} else {\n\t\t\t\t\treturn un;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn un;\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unmakeUserName(un) {\n\t\t\t// var textParts = (un[0].toUpperCase()+un.substr(1)).match(/[A-Z][a-z]+/g).map(function(n){return n.toLowerCase();});\n\n\t\t\tvar textParts = un.split('').reduce(function(parts, c) {\n\t\t\t\tif (c==c.toUpperCase() && parts[0]!=='') {\n\t\t\t\t\treturn parts.concat([c]);\n\t\t\t\t} else {\n\t\t\t\t\tparts[parts.length-1] += c;\n\t\t\t\t\treturn parts;\n\t\t\t\t}\n\t\t\t}, [''])\n\n\t\t\tvar di = parseInt(un[un.length-3]);\n\t\t\tvar salt = parseInt(un.substr(un.length-2));\n\n\t\t\t// $log.log(textParts,di,salt, allCount);\n\n\t\t\tvar ci = colors.indexOf(textParts[0]);\n\t\t\tvar ai = adjectives.indexOf(textParts[1]);\n\t\t\tvar ni = nouns.indexOf(textParts[2]);\n\n\t\t\tvar ns = ci + cn*(ai + an*(ni + nn*di))\n\n\t\t\tvar pk = (allCount + (ns - salt*saltMultiplier) % allCount) % allCount;\n\n\t\t\treturn pk;\n\n\t\t}\n\n\t\tfunction findInList(s, list) {\n\t\t\tvar i;\n\t\t\ts = s.toLowerCase();\n\t\t\tfor (var i=0; i0;\n\t\t\t});\n\t\t\t$log.log('num rounds post: '+game_settings.roundInfo.length);\n\t\t}\n\n\t\t/* for development use only... */\n\t\tfunction resetGame() {\n\t\t\tvar decentArticles = [124, 123, 122, 121, 117, 118, 119, 120, 106, 107, 108, 109, 110, 111, 112, 113, 114, \n\t\t\t\t\t\t\t\t\t115, 116, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 94, 88, 79, 83, 75, 76, \n\t\t\t\t\t\t\t\t\t70, 71, 67, 56, 41, 44, 2, 3, 4, 9, 10, 15, 28];\n\n\t\t\tshuffle(decentArticles);\n\t\t\tvar roundLength = 10;\n\t\t\tservice.roundInfo[0].articleIds = decentArticles.slice(0,roundLength);\n\t\t\tservice.roundInfo[1].articleIds = decentArticles.slice(roundLength,2*roundLength);\n\t\t\tservice.roundInfo[2].articleIds = decentArticles.slice(2*roundLength,3*roundLength);\n\n\t\t\tservice.roundInfo.forEach(function(info) {\n\t\t\t\tinfo.progressPips.splice(0);\n\t\t\t\tfor (var i=0; i=0) {\n\t\t\t\t\trefLines = refLines.slice(1);\n\t\t\t\t\tarticle.payoffSourceLabel = payoffSourceLabel.replace('Source:', '').trim();\n\t\t\t\t\tarticle.payoffSourceUrl = article.source_URL.split('\\n')[0];\n\t\t\t\t\tif (article.payoffSourceUrl) {\n\t\t\t\t\t\tarticle.payoffSourceUrl = article.payoffSourceUrl.replace(/\"/g, '');\n\t\t\t\t\t\tif (article.payoffSourceUrl.indexOf('http')!==0) {\n\t\t\t\t\t\t\tarticle.payoffSourceUrl = 'http://'+article.payoffSourceUrl;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tarticle.payoffContent = refLines.filter(isNotBlank)\n\t\t\t\t\t\t\t\t\t.join('\\n\\n').trim();\n\n\t\t\t}\n\n\t\t\tstripEolNonsense(article);\n\n\t\t\tfunction isNotBlank(item) {\n\t\t\t\treturn item.trim().length>0;\n\t\t\t}\n\n\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('roundPayoff', roundPayoff);\n\n\t/** @ngInject */\n\tfunction roundPayoff($log, gameState) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/roundPayoff/roundPayoff.html',\n\t\t\tcontroller: controller,\n\t\t\treplace: true\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\t$scope.gameState = gameState;\n\t\t\tvar roundInfo = gameState.state.roundInfo[gameState.state.roundNumber];\n\t\t\tvar numCorrect = 0;\n\t\t\troundInfo.progressPips.forEach(function(pip) {\n\t\t\t\tif (pip==='win') {\n\t\t\t\t\tnumCorrect += 1;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t$scope.percentCorrect = Math.round(100*numCorrect/roundInfo.progressPips.length);\n\n\t\t}\n\t}\n\t\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('privacyPolicy', privacyPolicy);\n\n\t/** @ngInject */\n\tfunction privacyPolicy($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'pp',\n\t\t\tbindToController: true,\n\t\t\ttemplateUrl: 'app/components/privacyPolicy/privacyPolicy.html',\n\t\t\tscope: {\n\t\t\t\tcontainer: '='\n\t\t\t}\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar vm = this;\n\n\t\t\tvm.dismissIt = dismissIt;\n\n\t\t\tfunction dismissIt() {\n\t\t\t\tvm.container.enabled = false;\n\t\t\t\t$log.log('privPage.enabled ',vm.container.enabled);\n\n\t\t\t}\n\t\t}\n\t}\n})();\n(function (angular, showdown) {\n\n 'use strict';\n\n /*\n // Conditional load for NodeJS\n if (typeof require !== 'undefined') {\n angular = require('angular');\n showdown = require('showdown');\n }\n */\n\n //Check if AngularJs and Showdown is defined and only load ng-Showdown if both are present\n if (typeof angular !== 'undefined' && typeof showdown !== 'undefined') {\n (function (module, showdown) {\n\n module.provider('$showdown', ngShowdown)\n .directive('sdModelToHtml', markdownToHtmlDirective) //<-- DEPRECATED: will be removed in the next major version release\n .directive('markdownToHtml', markdownToHtmlDirective)\n .filter('sdStripHtml', stripHtmlFilter) //<-- DEPRECATED: will be removed in the next major version release\n .filter('stripHtml', stripHtmlFilter);\n\n /**\n * Angular Provider\n * Enables configuration of showdown via angular.config and Dependency Injection into controllers, views\n * directives, etc... This assures the directives and filters provided by the library itself stay consistent\n * with the user configurations.\n * If the user wants to use a different configuration in a determined context, he can use the \"classic\" Showdown\n * object instead.\n */\n function ngShowdown() {\n\n // Configuration parameters for Showdown\n var config = {\n extensions: []\n };\n\n /**\n * Sets a configuration option\n *\n * @param {string} key Config parameter key\n * @param {string} value Config parameter value\n */\n /* jshint validthis: true */\n this.setOption = function (key, value) {\n config[key] = value;\n return this;\n };\n\n /**\n * Gets the value of the configuration parameter specified by key\n *\n * @param {string} key The config parameter key\n * @returns {string|null} Returns the value of the config parameter. (or null if the config parameter is not set)\n */\n this.getOption = function (key) {\n if (config.hasOwnProperty(key)) {\n return config[key];\n } else {\n return undefined;\n }\n };\n\n /**\n * Loads a Showdown Extension\n *\n * @param {string} extensionName The name of the extension to load\n */\n this.loadExtension = function (extensionName) {\n config.extensions.push(extensionName);\n\n return this;\n };\n\n function SDObject() {\n var converter = new showdown.Converter(config);\n\n /**\n * Converts a markdown text into HTML\n *\n * @param {string} markdown The markdown string to be converted to HTML\n * @returns {string} The converted HTML\n */\n this.makeHtml = function (markdown) {\n return converter.makeHtml(markdown);\n };\n\n /**\n * Strips a text of it's HTML tags. See http://stackoverflow.com/questions/17289448/angularjs-to-output-plain-text-instead-of-html\n *\n * @param {string} text\n * @returns {string}\n */\n this.stripHtml = function (text) {\n return String(text).replace(/<[^>]+>/gm, '');\n };\n }\n\n // The object returned by service provider\n this.$get = function () {\n return new SDObject();\n };\n }\n\n /**\n * AngularJS Directive to Md to HTML transformation\n *\n * Usage example:\n *
\n *\n * @param {showdown.Converter} $showdown\n * @param {$sce} $sce\n * @returns {*}\n */\n /** @ngInject */\n function markdownToHtmlDirective($showdown, $sce) {\n return {\n restrict: 'A',\n link: link,\n scope: {\n model: '=sdModelToHtml'\n }\n };\n\n function link(scope, element) {\n scope.$watch('model', function (newValue) {\n var val;\n var showdownHTML;\n // if (typeof newValue === 'string') {\n if (angular.isString(newValue)) {\n showdownHTML = $showdown.makeHtml(newValue);\n val = $sce.trustAsHtml(showdownHTML);\n } else {\n val = typeof newValue;\n }\n element.html(showdownHTML);\n });\n }\n }\n\n /**\n * AngularJS Filter to Strip HTML tags from text\n *\n * @returns {Function}\n */\n /** @ngInject */\n function stripHtmlFilter($showdown) {\n return function (text) {\n return $showdown.stripHtml(text);\n };\n }\n\n })(angular.module('ng-showdown', ['ngSanitize']), showdown);\n\n } else {\n throw new Error('ng-showdown was not loaded because one of its dependencies (AngularJS or Showdown) was not met');\n }\n\n})(angular, showdown);\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('launchPage', launchPage);\n\n\t/** @ngInject */\n\tfunction launchPage($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/launchPage/launchPage.html',\n\t\t\treplace: true,\n\t\t\tcontroller: controller\n\t\t};\n\n\t\tfunction controller($scope, audioService) {\n\t\t\t$scope.fullStart = function() {\n\t\t\t\taudioService.playACSound('btn');\n\t\t\t\t$scope.main.state = 'startupSequence';\n\t\t\t}\n\t\t}\n\t}\n})();\n\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('instructPanel', instructPanel);\n\n\t/** @ngInject */\n\tfunction instructPanel($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/instructPanel/instructPanel.html',\n\t\t\tcontroller: controller\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('highScoresPage', highScoresPage);\n\n\t/** ngInject */\n\tfunction highScoresPage($log, playerService, highScores, audioService, gameSettings) {\n\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'hsp',\n\t\t\tbindToController: true,\n\t\t\ttemplateUrl: 'app/components/highScores/highScoresPage.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar vm = this;\n\n\t\t\tvm.scoringMode = 'highScores';\n\t\t\tvm.weekNum = 1;\n\t\t\tvm.scoreType = 'campaign';\n\t\t\tselectScoringMode(vm.scoringMode);\n\n\t\t\tvm.validWeeks = {};\n\t\t\tvm.myScores = [];\n\t\t\tvm.campaignScore = 0;\n\t\t\tvm.isAnonymous = playerService.playerInfo.is_anonymous;\n\n\t\t\tgameSettings.getGameList().then(function(gameList) {\n\t\t\t\t\tgameList.forEach(function(gs) {\n\t\t\t\t\t\tvar gn = parseInt(gs.game_name.replace('campaign_week',''));\n\t\t\t\t\t\tif (gn>0) { \n\t\t\t\t\t\t\tvm.validWeeks[gn] = gs.is_enabled;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (playerService.playerInfo.game_plays) {\n\t\t\t\t\t\tplayerService.playerInfo.game_plays.forEach(function(gp) {\n\t\t\t\t\t\t\tif (gp.is_first_play) {\n\t\t\t\t\t\t\t\tvar gn = parseInt(gp.game_name.replace('campaign_week',''));\n\t\t\t\t\t\t\t\tif (gn>0) {\n\t\t\t\t\t\t\t\t\tvm.myScores[gn] = {score: gp.total_score};\n\t\t\t\t\t\t\t\t\tvm.campaignScore += gp.total_score;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$log.log('My Scores');\n\t\t\t\t\t$log.log(vm.myScores);\n\t\t\t\t\t$log.log(vm.campaignScore);\n\t\t\t\t});\n\n\t\t\thighScores.getHighScores('campaign')\n\t\t\t\t.then(function() {\n\t\t\t\t\tvm.highScores = highScores.highScores['campaign'];\n\t\t\t\t\t$log.log('got scores',vm.highScores);\n\t\t\t\t});\n\n\t\t\tvm.selectScoringMode = selectScoringMode;\n\t\t\tvm.selectWeek = selectWeek;\n\t\t\tvm.selectScoreType = selectScoreType;\n\n\t\t\tfunction selectWeek(weekNum) {\n\t\t\t\tvm.weekNum = weekNum;\n\t\t\t\t// vm.titleText = 'high scores - ' + ['easy 1', 'easy 2', 'medium 1', 'medium 2', 'hard 1', 'hard 2'][weekNum-1];\n\t\t\t\tvm.titleText = 'Υψηλές Βαθμολογίες - Επίπεδο ' + ['1', '2', '3', '4', '5', '6'][weekNum-1];\n\n\t\t\t\thighScores.getHighScores('campaign_week'+weekNum)\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tvm.highScores = highScores.highScores['campaign_week'+weekNum];\n\t\t\t\t\t\t$log.log('got scores',vm.highScores);\n\t\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tfunction selectScoreType(st) {\n\t\t\t\tvm.scoreType = st;\n\t\t\t\tif (st==='week') {\n\t\t\t\t\tselectWeek(vm.weekNum);\n\t\t\t\t} else {\n\t\t\t\t\tvm.titleText = 'Υψηλές Βαθμολογίες - Προσπάθεια'; // 'high scores - campaign';\n\t\t\t\t\thighScores.getHighScores('campaign')\n\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\tvm.highScores = highScores.highScores['campaign'];\n\t\t\t\t\t\t\t$log.log('got scores',vm.highScores);\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\taudioService.playACSound('btn');\t\n\t\t\t}\n\n\t\t\tfunction selectScoringMode(sm) {\n\t\t\t\tvm.scoringMode = sm;\n\t\t\t\tif (sm==='highScores') {\n\t\t\t\t\tselectScoreType(vm.scoreType);\n\t\t\t\t} else {\n\t\t\t\t\tvm.titleText = 'Οι βαθμολογίες μου'; // 'my scores';\n\t\t\t\t}\n\t\t\t\taudioService.playACSound('btn');\n\t\t\t}\n\t\t}\n\t}\n\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('gamePayoff', gamePayoff);\n\n\t/** @ngInject */\n\tfunction gamePayoff($log, gameState, $window, playerService, audioService) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/gamePayoff/gamePayoff.html',\n\t\t\treplace: true,\n\t\t\tcontroller: controller\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\t$scope.gameState = gameState;\n\n\t\t\tvar totCorrect = 0, totArticles = 0;\n\t\t\tgameState.state.roundInfo.forEach(function(info) {\n\t\t\t\tinfo.progressPips.forEach(function(pip) {\n\t\t\t\t\ttotArticles += 1;\n\t\t\t\t\tif (pip==='win') {\n\t\t\t\t\t\ttotCorrect += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t$scope.percentCorrect = Math.round(100*totCorrect/totArticles);\n\n\t\t\tvar gameUrl = $window.location.href.split('#')[0];\n\n\t\t\tvar twitterMessage = {\n\t\t\t\ttext: \"I got \"+$scope.percentCorrect+\"% correct playing the Factitious Game at \"+gameUrl+\" !\",\n\t\t\t\toriginal_referer: gameUrl,\n\t\t\t\tref_src: \"twsrc^tfw\"\n\t\t\t};\n\n\n\t\t\t$scope.isSignedIn = !playerService.playerInfo.is_anonymous;\n\n\t\t\t$scope.gameState = gameState;\n\n\t\t\t//setupTestValues();\n\n\t\t\t$scope.netTimeBonus = gameState.state.timeBonus - gameState.state.timePenalty;\n\n\t\t\t$scope.gameBonus = [];\n\t\t\t$scope.totalBonuses = gameState.state.hintBonus + gameState.state.readingBonus + ($scope.netTimeBonus > 0 ? $scope.netTimeBonus : 0);\n\t\t\tif ($scope.netTimeBonus > 0) { $scope.gameBonus.push({label:'χρόνος', value: $scope.netTimeBonus}); } // time\n\t\t\tif (gameState.state.hintBonus > 0) { $scope.gameBonus.push({label:'συμβουλές', value: gameState.state.hintBonus}); } // hint\n\t\t\tif (gameState.state.readingBonus > 0) { $scope.gameBonus.push({label:'reading', value: gameState.state.readingBonus}); }\n\n\t\t\t$scope.gamePenalties = [];\n\t\t\t$scope.totalPenalties = -(gameState.state.articlePenalty + ($scope.netTimeBonus < 0 ? -$scope.netTimeBonus : 0));\n\t\t\tif (gameState.state.articlePenalty > 0) { $scope.gamePenalties.push({label:'incorrect ('+gameState.state.articlesIncorrect+')', value: -gameState.state.articlePenalty}); }\n\t\t\tif ($scope.netTimeBonus < 0) { $scope.gamePenalties.push({label:'time', value: $scope.netTimeBonus}); }\n\n\n\t\t\tvar twitterUrl = 'https://twitter.com/intent/tweet';\n\n\t\t\t$scope.twitterApiURI = constructUri(twitterUrl, twitterMessage);\n\n\t\t\t$scope.facebookApiURI = 'https://www.facebook.com/sharer/sharer.php?u='+encodeURIComponent(gameUrl);\n\n\t\t\tplayerService.couldAdoptGame = true;\n\n\n\t\t\t$scope.dismissPopup = dismissPopup;\n\n\t\t\tfunction dismissPopup() {\n\t\t\t\t$scope.hsp_showPopup = false;\n\t\t\t\taudioService.playACSound('btn');\n\t\t\t}\n\n\t\t\tfunction constructUri(url, obj) {\n\t\t\t\tvar uri = url+'?';\n\t\t\t\tvar queries = [];\n\t\t\t\tfor (var key in obj) {\n\t\t\t\t\tqueries.push(key+'='+encodeURIComponent(obj[key]));\n\t\t\t\t}\n\t\t\t\treturn uri+queries.join('&');\n\t\t\t}\n\n\t\t\tfunction setupTestValues() {\n\t\t\t\tvar state = gameState.state;\n\t\t\t\tstate.totalScore = 123;\n\n\t\t\t\t// for fact3 scoring support:\n\t\t\t\tstate.articlesCorrect = 10;\n\t\t\t\tstate.articlesIncorrect = 5;\n\t\t\t\tstate.articleBonus = 100;\n\t\t\t\tstate.articlePenalty = 25;\n\t\t\t\tstate.hintBonus = 4;\n\t\t\t\tstate.readingBonus = 3;\n\t\t\t\tstate.timeBonus = 40;\n\t\t\t\tstate.timePenalty = 50;\n\n\t\t\t\t$scope.isSignedIn = false;\n\t\t\t}\n\n\n\t\t}\n\t}\n})();\n\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('confettiItem', confettiItem)\n\n\t/** @ngInject */\n\tfunction confettiItem($log, $interval) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tlink: link,\n\t\t\tscope: {\n\n\t\t\t},\n\t\t\ttemplate: '
'\n\t\t\t// template: ''\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\t$scope.confID = Math.floor(Math.random()*7)+1;\n\n\t\t\t$scope.speedClass = ['rotate-fast', 'normal', 'rotate-slow', 'rotate-slowest'][Math.floor(Math.random()*3)];\n\t\t\tif (Math.random()>0.5) {\n\t\t\t\t$scope.speedClass += ' counter-rotate';\n\t\t\t}\n\t\t}\n\n\t\tfunction link(scope, elm) {\n\t\t\tvar intervalRate = 1000/60;\n\n\t\t\telm.css({'left': angular.element('.bigboy').width()*Math.random()-elm.width()});\n\t\t\t// elm.css({'left': (Math.random()*100)+'%'});\n\t\t\tvar top = -15 - Math.random()*70;\n\t\t\telm.css({'top': top+'%'});\n\n\t\t}\n\t}\n\n})();\n\n(function() {\n\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('expeditionPage',expeditionPage);\n\n\t/** @ngInject */\n\tfunction expeditionPage($log, playerService, gameSettings, campaignContentService, $timeout) {\n\t\treturn {\n\t\t\tcontroller: controller,\n\t\t\tscope: {\n\t\t\t\tmain: '='\n\t\t\t},\n\t\t\tcontrollerAs: 'ep',\n\t\t\tbindToCcontroller: true,\n\t\t\ttemplateUrl: 'app/components/expeditionPage/expeditionPage.html'\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar vm = this;\n\t\t\t$log.log('Hello, expeditionPage!');\n\n\t\t\tvm.showPopup = false;\n\t\t\tvm.showAdditionalPopup = false;\n\t\t\tvm.targetClicked = targetClicked;\n\n\t\t\tif ($scope.main) {\n\t\t\t\tcampaignContentService.fetchContent()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tvm.epPopup = campaignContentService.epDialog;\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tvm.epPopup = campaignContentService.epDialog;\n\t\t\t}\n\n\n\t\t\tclearCampaign();\n\t\t\tgetGameStates();\n\n\n\t\t\tvar pickedCampaign = undefined;\n\n\t\t\t$scope.$watch(function(){return playerService.playerInfo;}, getGameStates());\n\t\t\t$scope.$watch(function(){return campaignContentService.epDialog;}, function() {\n\t\t\t\t\t\tvm.epPopup = campaignContentService.epDialog;\n\t\t\t\t\t});\n\n\t\t\tvar pageKiller;\n\n\t\t\tif (!playerService.playerInfo.is_anonymopus) {\n\t\t\t\t\tpageKiller = $timeout(function() {\n\t\t\t\t\t\tplayerService.signOut();\n\t\t\t\t\t\t$scope.main.startOver();\n\t\t\t\t\t}, 1000*60*5);\n\t\t\t} \n\n\t\t\t$scope.$on('$destroy', onDestroy);\n\n\t\t\tfunction onDestroy() {\n\t\t\t\t$log.log('destroying expedition page');\n\t\t\t\t$timeout.cancel(pageKiller);\n\t\t\t}\t\t\t\n\n\t\t\tfunction getGameStates() {\n\t\t\t\tvar gn, pickedFidget;\n\t\t\t\t$scope.playerInfo = playerService.playerInfo;\n\t\t\t\tvm.showAdditionalPopup = playerService.playerInfo.is_anonymous;\n\n\t\t\t\tclearCampaign();\n\t\t\t\tgameSettings.getGameList().then(function(gameList) {\n\t\t\t\t\tgameList.forEach(function(gs) {\n\t\t\t\t\t\tgn = parseInt(gs.game_name.replace('campaign_week',''));\n\t\t\t\t\t\tif (gn>0 && gs.is_enabled) {\n\t\t\t\t\t\t\tvm.campaignItems[gn-1].canPlay = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (playerService.playerInfo.game_plays) {\n\t\t\t\t\t\tplayerService.playerInfo.game_plays.forEach(function(gp) {\n\t\t\t\t\t\t\tif (gp.is_completed && gp.game_name.indexOf('campaign_week')==0) {\n\t\t\t\t\t\t\t\tgn = parseInt(gp.game_name.replace('campaign_week',''));\n\t\t\t\t\t\t\t\tif (gp.is_first_play) {\n\t\t\t\t\t\t\t\t\tvm.campaignItems[gn-1].wasPlayed = true;\n\t\t\t\t\t\t\t\t\tvm.campaignItems[gn-1].score = gp.total_score;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tvm.campaignItems.forEach(function(c,ix) {\n\t\t\t\t\t\t$log.log(c,ix);\n\t\t\t\t\t\tif (!pickedFidget && c.canPlay && (playerService.playerInfo.is_anonymous || !c.wasPlayed)) {\n\t\t\t\t\t\t\tc.shouldFidget = true;\n\t\t\t\t\t\t\tpickedFidget = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction clearCampaign() {\n\t\t\t\tvm.campaignItems = [];\n\t\t\t\tfor (var i=0; i<6; i++) {\n\t\t\t\t\tvm.campaignItems[i] = {\n\t\t\t\t\t\twasPlayed: false, canPlay: false, score:0, gameName: 'campaign_week'+(i+1), shouldFidget: false\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction targetClicked(targetIx) {\n\t\t\t\t$log.log('clicked index '+targetIx);\n\t\t\t\tvm.pickedCampaign = vm.campaignItems[targetIx];\n\t\t\t\tif (vm.pickedCampaign) {\n\t\t\t\t\tif (!playerService.playerInfo.is_anonymous && vm.pickedCampaign.wasPlayed) {\n\t\t\t\t\t\tvm.showPopup = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$scope.main.startCampaignGame(vm.pickedCampaign.gameName);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvm.showPopup = false;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n\n\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('burgerPane', burgerPane);\n\n\t/** @ngInject */\n\tfunction burgerPane($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\ttemplateUrl: 'app/components/burgerPane/burgerPane.html'\n\t\t};\n\t}\n\n})();\n\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('muteUnmute', muteUnmute);\n\n\tfunction muteUnmute($log, audioService) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tscope: {\n\n\t\t\t},\n\t\t\txtemplate: [\n\t\t\t\t\t'
',\n\t\t\t\t\t\t'volume_off',\n\t\t\t\t\t\t'volume_up',\n\t\t\t\t\t'
'\n\t\t\t\t].join(''),\n\t\t\ttemplate: [\n\t\t\t\t\t'
',\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'',\n\t\t\t\t\t'
'\n\t\t\t\t].join('')\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\t$scope.audioService = audioService;\n\n\t\t\t$scope.toggleAudio = function() {\n\t\t\t\tif (audioService.muted) {\n\t\t\t\t\taudioService.unmuteAll();\n\t\t\t\t} else {\n\t\t\t\t\taudioService.muteAll();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n})();\n\n/*\n\nSee Apple Doc at:\n\nhttps://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/PlayingandSynthesizingSounds/PlayingandSynthesizingSounds.html#//apple_ref/doc/uid/TP40009523-CH6-SW1\n\n*/\n\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.service('audioService', audioService);\n\n\t/** @ngInject */\n\tfunction audioService($log, $window, $cookies, $interval, $http) {\n\t\tvar soundEffect;\n\n\t\t$log.log('getting audio settings... \"'+$cookies.get('muted')+'\" '+($cookies.get('muted')==='true'));\n\n\t\tvar audioContext = new ($window.AudioContext || $window.webkitAudioContext)();\n\n\t\tvar audioPath = 'assets/audio/';\n\n\t\tvar soundBuffers = {};\n\n\t\tloadSound('silent', 'silent.mp3');\n\t\tloadSound('whooshIncorrect', 'whooshIncorrect.mp3');\n\t\tloadSound('whooshCorrect', 'whooshCorrect.mp3');\n\t\tloadSound('gameOver', 'gameResults_kaChing.mp3');\n\t\tloadSound('btnWipe', 'bluppThenWipe2.mp3')\n\t\tloadSound('btn', 'bluppNoWipe.mp3')\n\n\t\tvar service = {\n\n\t\t\tmuted: ($cookies.get('muted')==='true'),\n\n\t\t\taudioPath: audioPath,\n\n\t\t\tplayACSound: function(soundName) {\n\t\t\t\tif (service.muted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar source = audioContext.createBufferSource();\n\t\t\t\tsource.buffer = soundBuffers[soundName];\n\t\t\t\tsource.connect(audioContext.destination);\n\t\t\t\t\t\t\t\t\n\t\t\t\t// Play the sound\n\t\t\t\tsource.start(0);\n\t\t\t},\n\n\t\t\tstopSoundEffect: function() {\n\t\t\t\tif (soundEffect) {\n\t\t\t\t\tsoundEffect.pause();\n\t\t\t\t\tsoundEffect = null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tplaySoundEffect: function(fname) {\n\t\t\t\tif (service.muted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tservice.stopSoundEffect();\n\t\t\t\tvar url = service.audioPath+fname;\n\t\t\t\t$log.log(\"play soundEffect: \"+url);\n\t\t\t\tsoundEffect = new $window.Audio();\n\t\t\t\tsoundEffect.src = url;\n\t\t\t\tsoundEffect.play();\n\t\t\t},\n\n\n\t\t\tmuteAll: function() {\n\t\t\t\tservice.stopSoundEffect();\n\t\t\t\tservice.muted = true;\n\t\t\t\t$cookies.put('muted', true);\n\t\t\t},\n\n\t\t\tunmuteAll: function() {\n\t\t\t\tservice.muted = false;\n\t\t\t\t$cookies.put('muted', false);\n\t\t\t}\n\t\t};\n\n\t\treturn service;\n\n\t\tfunction loadSound(soundName, soundPath) {\n\t\t\tsoundPath = soundPath || soundName;\n\n\t\t\t$http.get(audioPath+soundPath, {responseType:'arraybuffer'})\n\t\t\t\t.then(function(response) {\n\t\t\t\t\t// soundBuffers['moreSlideIn_whoosh.m4a'] = wkAudioContext.createBuffer(response.data, false);\n\n\t\t\t\t\taudioContext.decodeAudioData(response.data, function(buffer) {\n\t\t\t\t\t\tsoundBuffers[soundName] = buffer;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t}\n\t}\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('articlePayoff', articlePayoff)\n\t\t.filter('addHttp', addHttp)\n\t\t.filter('numPoints', numPoints);\n\n\t/** @ngInject */\n\tfunction articlePayoff($log) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\treplace: true,\n\t\t\tscope: {\n\t\t\t\tmain: '=',\n\t\t\t\tpayoffType: '='\n\t\t\t},\n\t\t\ttemplateUrl: 'app/components/articlePayoff/articlePayoff.html'\n\t\t};\n\t}\n\n\t/** @ngInject */\n\tfunction addHttp() {\n\t\treturn function(url) {\n\t\t\tif (url.indexOf('http')!==0) {\n\t\t\t\turl = 'http://'+url;\n\t\t\t}\n\t\t\treturn url;\n\t\t}\n\t}\n\n\t/** @ngInject */\n\tfunction numPoints() {\n\t\treturn function(pts) {\n\t\t\tif (pts>0) {\n\t\t\t\treturn 'won '+pts;\n\t\t\t} else if (pts<0) {\n\t\t\t\treturn 'lost '+(-pts);\n\t\t\t} else {\n\t\t\t\treturn 'got no';\n\t\t\t}\n\t\t}\n\t}\n\n})();\n(function() {\n\t'use strict';\n\n\tangular.module('fact2')\n\t\t.directive('roundProgress', roundProgress);\n\n\t/** @ngInject */\n\tfunction roundProgress($log, gameState) {\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\tcontroller: controller,\n\t\t\tcontrollerAs: 'vm',\n\t\t\tbindToController: true,\n\t\t\tscope: {\n\t\t\t\t// progressPips: '=',\n\t\t\t\tcurProgress: '='\n\t\t\t},\n\t\t\ttemplate: [\n\t\t\t\t'
',\n\t\t\t\t\t'
',\n\t\t\t\t'
'\n\t\t\t\t].join('')\n\t\t};\n\n\t\tfunction controller($scope) {\n\t\t\tvar vm = this;\n\t\t\t$scope.gameState = gameState;\n\n\t\t\t$scope.$watch(function() {return gameState.state.roundInfo[gameState.state.roundNumber];}, function() {\n\t\t\t\tif (gameState.state.roundNumbervm.articleAverageSeconds) {\n\t\t\t\t\t// $log.log('triggered');\n\t\t\t\t}\n\t\t\t}\n\t\t}, 100);\n\n\t\tvm.isPreview = $stateParams.isPreview;\n\n\t\tvm.simClasses = [\n\t\t\t{simClass: 'sim-iPhone5s', label: 'iPhone 5s'},\n\t\t\t{simClass: 'sim-iPhone6', label: 'iPhone 6'},\n\t\t\t{simClass: 'sim-iPhone6sP', label: 'iPhone 6s+'},\n\t\t\t{simClass: 'sim-iPhone6sPChrome', label: 'iPhone 6s+ Chrome'},\n\t\t\t{simClass: 'sim-galaxyS7', label: 'galaxy S7'},\n\t\t\t{simClass: 'sim-pixel7', label: 'Pixel 7.1'},\n\t\t\t{simClass: 'desktop', label: 'Desktop'}\n\t\t];\n\t\tvm.simClass = vm.simClasses[0].simClass;\n\n\t\t// for various debugging purposes...\n\t\tvm.isIphone = /(iPhone)/i.test(navigator.userAgent);\n\t\tvm.isSafari = !!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/);\n\t\tvm.debugStr = ''+('webkitAudioContext' in $window);\n\n\t\t// this is stand-in stuff; the articleService now maintains the actual values here\n\t\tvm.article = {\n\t\t\theadline: 'This is the headline. This will always be the headline.',\n\t\t\tinfo: {\n\t\t\t\tsource: 'Op-Ed Article, Albert Camus',\n\t\t\t\tpublisher: 'Bourbaki News',\n\t\t\t\treferences: 'Source: abcnews.com.co\\n\\nThis is one of the trickiest kinds of fake news. It mimics a real news site, down to the logo. Look carefully at the URL -- this is not ABC news! '\n\t\t\t},\n\t\t\tphoto_url: 'assets/images/oldman.png',\n\t\t\tbody: 'Electron capture is a decay which happens in many proton-rich, heavy nuclei. You can envision the situation in your title as \"forced electron capture\".\\n\\nSquishing atoms together at such high densities makes it energetically favorable for electrons to be destroyed so that the resulting particles can occupy lower energy levels.\\n\\nThere\\'s no need to think about nuclei at the quark level, but you certainly can. The actual matter in neutron stars is in the form of exotic phases of nuclear matter rather than discrete nuclei, but anyway what I said above gives a good heuristic description.\\n\\nIt\\'s not just the electron that turns into a neutrino and neutron, it\\'s both the electron and the proton, so there\\'s no net change of charge.'\n\t\t};\n\t\tvm.article.body += '\\n\\n'+vm.article.body;\n\n\t\tvm.curProgress = 0;\n\t\tvm.maxProgress = 10;\n\n\t\tvm.inSwipe = false;\n\n\t\tvm.showBurger = false;\n\t\tvm.showStartGameBanner = false;\n\n\t\tresetFact3Scoring();\n\n\t\tvm.swipeLeft = swipeLeft;\n\t\tvm.swipeRight = swipeRight;\n\n\t\tvm.showHint = showHint;\n\t\tvm.showAddlInfo = showAddlInfo;\n\n\t\tvm.nextQuestion = nextQuestion;\n\t\tvm.nextRound = nextRound;\n\t\tvm.startOver = startOver;\n\t\tvm.toggleBurger = toggleBurger;\n\t\t\n\t\tvm.quickStartGame = quickStartGame;\n\t\tvm.startCampaignGame = startCampaignGame;\n\n\t\tvm.goExpeditionPage = goExpeditionPage;\n\t\tvm.goSignIn = goSignIn;\n\t\tvm.showHighScores = showHighScores;\n\n\t\tvm.getSimClass = getSimClass;\n\t\tvm.setupForLaunch = setupForLaunch;\n\t\tvm.signOut = signOut;\n\t\tvm.resumeGame = resumeGame;\n\t\tvm.saveGame = saveGame;\n\t\tvm.showInstruct = showInstruct;\n\t\tvm.goTeachers = goTeachers;\n\n\t\tvm.preGameBanners = preGameBanners;\n\t\tvm.dismissAdditionalInstructions = dismissAdditionalInstructions;\n\n\t\tvm.buttonSound = buttonSound;\n\n\t\tvm.trackArticleScroll = trackArticleScroll;\n\n\t\tsetupForLaunch();\n\t\t\n\t\t// goSignIn();\n\n\t\t// vm.state = 'expedition';\n\t\t// vm.state = 'showGamePayoff';\n\t\t// vm.state = 'teacherPage';\n\t\t// vm.state = 'showPolicy';\n\n\t\t$scope.$watch(function() {return gameState.state.roundNumber;}, function() {\n\t\t\t// slideInBanner();\n\t\t});\n\n\t\t$scope.$watch(function() {return vm.article;}, function() {\n\t\t\tvm.slideInArticle = true;\n\t\t\t$timeout(function() {\n\t\t\t\tvm.slideInArticle = false;\n\t\t\t}, 750);\n\t\t});\n\n\t\t$scope.$watch(function(){return playerService.playerInfo;}, function() {\n\t\t\tvm.userIsAnonymous = playerService.isAnonymous;\n\t\t\tvm.userCanResume = playerService.canResume();\n\t\t\tvm.userPublicName = playerService.playerInfo.user_public_name;\n\t\t});\n\n\t\tfunction buttonSound() {\n\t\t\taudioService.playACSound('btn');\t\n\t\t}\n\n\t\tfunction goTeachers() {\n\t\t\tvm.state = \"teacherPage\";\n\t\t}\n\n\t\tfunction resetFact3Scoring() {\n\t\t\t$log.log('reseting fact3 scrolling flags for scoring an article');\n\t\t\tvm.fact3Scoring = {\n\t\t\t\tscrolledPast50: false,\n\t\t\t\tscrolledToEnd: false\n\t\t\t};\n\t\t}\n\n\t\tfunction trackArticleScroll(midPct, endPct) {\n\t\t\tif (midPct>0.5) {\n\t\t\t\tif (!vm.fact3Scoring.scrolledPast50) {\n\t\t\t\t\tvm.fact3Scoring.scrolledPast50 = true;\n\t\t\t\t\t$log.log('SCORING: scrolledPast50');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (endPct>0.95) {\n\t\t\t\tif (!vm.fact3Scoring.scrolledToEnd) {\n\t\t\t\t\tvm.fact3Scoring.scrolledToEnd = true;\n\t\t\t\t\t$log.log('SCORING: scrolledToEnd');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction showHighScores() {\n\t\t\tvm.state = \"showHighScores\";\n\t\t\t// audioService.playACSound('btn');\t\n\t\t}\n\n\t\tfunction goExpeditionPage() {\n\t\t\tvm.state = 'expedition';\n\t\t\taudioService.playACSound('btn');\t\n\t\t}\n\n\t\tfunction setupForLaunch() {\n\t\t\tvm.showBurger = false;\n\t\t\tvm.state = 'showLaunch';\n\t\t\tvm.checkingForUser = true;\n\t\t\tvm.showPregameInstructions = false;\n\t\t\tplayerService.refreshPlayerInfo()\n\t\t\t\t.then(function() {\n\t\t\t\t\tvm.checkingForUser = false;\n\t\t\t\t\tvm.userIsAnonymous = playerService.isAnonymous;\n\t\t\t\t\tvm.userCanResume = playerService.canResume();\n\t\t\t\t\tvm.hasSeenAdditionalInstructions = playerService.hasSeenAdditionalInstructions && !playerService.isAnonymous;\n\t\t\t\t\tif (false && playerService.isAnonymous) {\n\t\t\t\t\t\tvm.state = 'showLaunch';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvm.state = 'expedition';\n\t\t\t\t\t}\n\t\t\t\t\t$log.log('hasSeenAddl '+vm.hasSeenAdditionalInstructions);\n\t\t\t\t\tplayerService.couldAdoptGame = false;\n\t\t\t\t});\n\t\t}\n\n\t\tfunction dismissAdditionalInstructions() {\n\t\t\tvm.hasSeenAdditionalInstructions = playerService.hasSeenAdditionalInstructions = true;\n\t\t\t$log.log('dismissed');\n\t\t}\n\n\t\tfunction signOut() {\n\t\t\tplayerService.signOut();\n\t\t\tvm.userIsAnonymous = playerService.isAnonymous;\n\t\t\tsetupForLaunch();\n\t\t\taudioService.playACSound('btn');\t\t\t\t\n\t\t}\n\n\t\tfunction startCampaignGame(gameName) {\n\t\t\t$log.log('start game \"'+gameName+'\"');\n\t\t\tstartNamedGame(false, gameName);\n\t\t}\n\n\t\tfunction startGame(allowResume) {\n\t\t\tstartNamedGame(allowResume, 'default');\n\t\t}\n\n\t\tfunction startNamedGame(allowResume, gameName) {\n\t\t\t$log.log('starting new game of type \"'+gameName+'\"');\n\t\t\tvm.state = 'prepareArticle';\n\n\t\t\taudioService.playACSound('btnWipe');\n\t\t\treturn playerService.refreshPlayerInfo()\n\t\t\t\t.then(function() {\n\t\t\t\t\tvar gameLauncher;\n\t\t\t\t\tif (allowResume && playerService.canResume()) {\n\t\t\t\t\t\t$log.log('restore game');\n\t\t\t\t\t\tgameLauncher = gameState.restoreGame(playerService.playerInfo.current_game.pk);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$log.log('create new game');\n\t\t\t\t\t\tgameLauncher = gameState.beginNewGame(playerService.playerInfo.pk, gameName);\n\t\t\t\t\t}\n\t\t\t\t\tgameLauncher.then(function() {\n\t\t\n\t\t\t\t\t\t//////////////////////////////////////\n\t\t\t\t\t\t// vm.state = \"showGamePayoff\";\n\t\t\t\t\t\t// return; \n\t\t\t\t\t\t//////////////////////////////////////\n\n\t\t\t\t\t\tvm.numberOfRounds = gameState.state.roundInfo.length;\n\n\t\t\t\t\t\tif (gameState.state.articleNumber>=gameState.state.roundInfo[gameState.state.roundNumber].articleIds.length) {\n\t\t\t\t\t\t\tgameState.state.roundNumber += 1;\n\t\t\t\t\t\t\tgameState.state.articleNumber = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvm.progressPips = gameState.state.roundInfo[gameState.state.roundNumber].progressPips;\n\t\t\t\t\t\tvm.useLightbulb = gameState.game_settings.useLightbulb;\n\n\t\t\t\t\t\treturn articleService.getArticle(gameState.state.roundInfo[gameState.state.roundNumber].articleIds[gameState.state.articleNumber])\n\t\t\t\t\t\t\t.then(function(response) {\n\t\t\t\t\t\t\t\tvm.article = response;\n\t\t\t\t\t\t\t\tvm.articleAverageSeconds = vm.article.wordCount / gameState.game_settings.wordsPerMinute * 60 * 1000;\n\t\t\t\t\t\t\t\tvm.articleExpanded = false;\n\n\t\t\t\t\t\t\t\t$log.log('total words in article ',vm.article.wordCount);\n\t\t\t\t\t\t\t\t$log.log('seconds to read this article (average) ',vm.articleAverageSeconds);\n\t\t\t\t\t\t\t\tresetFact3Scoring();\n\t\t\t\t\t\t\t\tif (gameName.indexOf('campaign')>=0) {\n\t\t\t\t\t\t\t\t\tvm.gameTitle = 'week '+gameName[gameName.length-1];\n\t\t\t\t\t\t\t\t\tvm.gameTitle = ['easy 1','easy 2','medium 1','medium 2','hard 1','hard 2'][parseInt(gameName[gameName.length-1])-1];\n\n\t\t\t\t\t\t\t\t\tvm.gameTitle = 'επίπεδο παιχνιδιού '+gameName[gameName.length-1];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (true || playerService.playerInfo.is_anonymous || (gameName === \"campaign_week1\" && !playerService.hasPlayedGame(gameName))) {\n\t\t\t\t\t\t\t\t\tvm.showPregameInstructions = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tpreGameBanners();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tfunction preGameBanners() {\n\t\t\tvm.showPregameInstructions = false;\n\t\t\tslideInGameBanner().then(function() {\n\t\t\t\tvm.state = 'showArticle';\n\t\t\t\tslideInBanner();\n\t\t\t\t$log.log('show first article');\n\t\t\t\tdataTracking.startArticle(vm.article.pk);\n\t\t\t\tvm.articleStart = moment();\n\t\t\t});\n\n\t\t}\n\n\t\tfunction getSimClass() {\n\t\t\tif (vm.isPreview) {\n\t\t\t\treturn vm.simClass;\n\t\t\t} else {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\n\t\tfunction resumeGame() {\n\t\t\tstartGame(true);\n\t\t}\n\n\t\tfunction quickStartGame() {\n\t\t\tstartGame(false);\n\t\t}\n\n\t\tfunction saveGame() {\n\t\t\taudioService.playACSound('btn');\n\t\t\tgameState.saveGame();\n\t\t}\n\n\t\tfunction showInstruct(val) {\n\t\t\tvm.showInstructions = val;\n\t\t\taudioService.playACSound('btn');\n\t\t}\n\n\t\tfunction swipeLeft(dragX) {\n\t\t\t// if (vm.shouldSwipe) return;\n\t\t\tvm.shouldSwipe = true;\n\t\t\tvm.inSwipeLeft = true;\n\t\t\tvm.inSwipe = true;\n\t\t\tif (vm.article.articleType==='notNews') {\n\t\t\t\taudioService.playACSound('whooshCorrect');\n\t\t\t} else {\n\t\t\t\taudioService.playACSound('whooshIncorrect');\n\t\t\t}\n\t\t\tswiperService.swipeCard($scope, $('.article-card'), 'left', dragX)\n\t\t\t\t.then(function() {\n\t\t\t\t\t$log.log('Main swiped left!')\n\t\t\t\t\tvm.shouldSwipe = false;\n\t\t\t\t\tscoreSwipe('notNews');\n\t\t\t\t\tvm.state = 'showResult';\n\t\t\t\t\tvm.inSwipe = false;\n\t\t\t\t});\n\t\t}\n\n\t\tfunction swipeRight(dragX) {\n\t\t\t// if (vm.shouldSwipe) return;\n\t\t\tvm.shouldSwipe = true;\n\t\t\tvm.inSwipeRight = true;\n\t\t\tvm.inSwipe = true;\n\t\t\tif (vm.article.articleType==='news') {\n\t\t\t\taudioService.playACSound('whooshCorrect');\n\t\t\t} else {\n\t\t\t\taudioService.playACSound('whooshIncorrect');\n\t\t\t}\n\t\t\tswiperService.swipeCard($scope, $('.article-card'), 'right', dragX)\n\t\t\t\t.then(function() {\n\t\t\t\t\t$log.log('Main swiped right!')\n\t\t\t\t\tvm.shouldSwipe = false;\n\t\t\t\t\tscoreSwipe('news');\n\t\t\t\t\tvm.state = 'showResult';\n\t\t\t\t\tvm.inSwipe = false;\n\t\t\t\t});\n\t\t}\n\n\t\tfunction showHint(fromLightbulb) {\n\t\t\tvm.articleExpanded = true;\n\t\t\taudioService.playACSound('btn');\n\t\t\tif (!fromLightbulb) {\n\t\t\t\t$timeout(function() {\n\t\t\t\t\t$('.article-card').scrollTop($('.article-card').scrollTop()+50);\n\t\t\t\t}, 250);\n\t\t\t} else {\n\t\t\t\tvm.showHintDialog = true;\n\t\t\t}\n\t\t}\n\n\t\tfunction showAddlInfo() {\n\t\t\tvm.addlInfoExpanded = true;\n\t\t\taudioService.playACSound('btn');\n\t\t\t$timeout(function() {\n\t\t\t\t$('.article-card').scrollTop($('.article-card').scrollTop()+50);\n\t\t\t}, 250);\n\t\t}\n\n\t\tfunction scoreSwipe(swipeDir) {\n\t\t\tvar articleScore = 0;\n\n\t\t\tvar roundInfo = gameState.state.roundInfo[gameState.state.roundNumber];\n\t\t\troundInfo.progressPips[gameState.state.articleNumber] = (swipeDir===vm.article.articleType ? 'win' : 'lose');\n\t\t\tvar isCorrect = (swipeDir===vm.article.articleType);\n\t\t\t\n\t\t\t$log.log('');\n\t\t\t$log.log('==========================================================');\n\t\t\t$log.log('=================== Scoring for this article ====================');\n\t\t\t$log.log('==========================================================');\n\t\t\t$log.log('');\n\n\t\t\tif (isCorrect) {\n\t\t\t\tgameState.state.articlesCorrect += 1;\n\t\t\t\tarticleScore += gameState.game_settings.correctAnswerBonus;\n\t\t\t\tgameState.state.articleBonus += gameState.game_settings.correctAnswerBonus;\n\t\t\t\tvm.payoffType = 'correct';\n\t\t\t\t$log.log('Okay. First of all, their choice ('+swipeDir+') was correct.');\n\t\t\t\t$log.log('So they get the article correct bonus = '+gameState.game_settings.correctAnswerBonus+'.');\n\t\t\t} else {\n\t\t\t\tgameState.state.articlesIncorrect += 1;\n\t\t\t\tarticleScore -= gameState.game_settings.incorrectAnswerPenalty;\n\t\t\t\tgameState.state.articlePenalty += gameState.game_settings.incorrectAnswerPenalty;\n\t\t\t\tvm.payoffType = 'incorrect';\n\t\t\t\t$log.log('Okay. First of all, their choice ('+swipeDir+') was incorrect.');\n\t\t\t\t$log.log('So they start with an article incorrect penalty = '+(-gameState.game_settings.incorrectAnswerPenalty)+'.');\n\t\t\t}\n\n\t\t\tif (vm.articleExpanded) {\n\t\t\t\tarticleScore += gameState.game_settings.hintBonus;\n\t\t\t\tgameState.state.hintBonus += gameState.game_settings.hintBonus;\n\t\t\t\t$log.log('They clicked on lightbulb/show source, so they get the article hint bonus = '+(gameState.game_settings.hintBonus)+'.');\n\t\t\t}\n\n\t\t\tvar deltaSeconds = (vm.articleAverageSeconds - vm.articleSeconds)/1000;\n\n\t\t\t$log.log('The average time to read this article at '+gameState.game_settings.wordsPerMinute+' wpm would be about '+Math.round(vm.articleAverageSeconds/1000)+' seconds.');\n\t\t\t$log.log('The actual time was '+Math.round(vm.articleSeconds/1000)+' seconds; which is a delta of about '+Math.round(deltaSeconds)+' seconds differential.');\n\n\t\t\tif (deltaSeconds>0) {\n\t\t\t\tvar timeBonus = Math.min(gameState.game_settings.maxTimeBonus, Math.round(gameState.game_settings.timeBonusPerSecond * (deltaSeconds)));\n\t\t\t\tarticleScore += timeBonus;\n\t\t\t\tgameState.state.timeBonus += timeBonus;\n\t\t\t\t$log.log('So, more exactly, there\\'s an article time bonus = min('+(gameState.game_settings.timeBonusPerSecond)+'*'+(deltaSeconds)+', '+gameState.game_settings.maxTimeBonus+') = '+timeBonus+'.');\n\t\t\t} else {\n\t\t\t\tvar timePenalty = -Math.min(gameState.game_settings.maxTimePenalty, Math.round(gameState.game_settings.timePenaltyPerSecond * (-deltaSeconds)));\n\t\t\t\tarticleScore += timePenalty;\n\t\t\t\tgameState.state.timePenalty -= timePenalty;\n\t\t\t\t$log.log('So, more exactly, there\\'s an article time penalty = max('+(-gameState.game_settings.timePenaltyPerSecond)+'*'+(-deltaSeconds)+', '+gameState.game_settings.maxTimePenalty+') = '+timePenalty+'.');\n\t\t\t}\n\n\t\t\tif (vm.fact3Scoring.scrolledPast50) {\n\t\t\t\tarticleScore += gameState.game_settings.scrollingHalfwayBonus;\n\t\t\t\tgameState.state.readingBonus += gameState.game_settings.scrollingHalfwayBonus;\n\t\t\t\t$log.log('They scrolled a bit at least; so they get the article reading past 50% bonus = '+(gameState.game_settings.scrollingHalfwayBonus)+'.');\n\t\t\t} else {\n\t\t\t\t$log.log('They didn\\'t scroll much (if at all); so they don\\'t get any article reading bonus.');\n\t\t\t}\n\t\t\tif (vm.fact3Scoring.scrolledToEnd) {\n\t\t\t\tarticleScore += gameState.game_settings.scrollingToEndBonus;\n\t\t\t\tgameState.state.readingBonus += gameState.game_settings.scrollingToEndBonus;\n\t\t\t\t$log.log('In fact, they scrolled to the end; so they also get the article reading to end bonus = '+(gameState.game_settings.scrollingToEndBonus)+'.');\n\t\t\t}\n\n\t\t\tarticleScore = Math.round(articleScore);\n\t\t\tgameState.state.totalScore += articleScore;\n\n\t\t\t$log.log('That\\'s it for bonuses / penalties. So, that\\'s how I get to a total score for this article of '+articleScore+' points.');\n\n\n\t\t\t['articlesCorrect', 'articlesIncorrect', 'articleBonus', 'articlePenalty', 'hintBonus', 'readingBonus', 'timeBonus', 'timePenalty'].forEach(function(k) {\n\t\t\t\t$log.log(k+': '+gameState.state[k]);\n\t\t\t})\n\t\t\t$log.log('');\n\t\t\t$log.log('==========================================================');\n\t\t\t$log.log('==========================================================');\n\n\t\t\tdataTracking.endArticle(vm.article.pk, isCorrect, vm.articleExpanded);\n\n\t\t\tvm.articleScore = articleScore;\n\t\t}\n\n\t\tfunction nextQuestion() {\n\t\t\tvar roundInfo = gameState.state.roundInfo[gameState.state.roundNumber];\n\t\t\tgameState.state.articleNumber += 1;\n\t\t\tvm.articleStart = moment(); vm.articleSeconds = 0;\n\t\t\tif (gameState.state.articleNumber=gameState.state.roundInfo.length) {\n\t\t\t\tgameState.game_record.is_completed = true;\n\t\t\t\tif (!playerService.hasPlayedGame(gameState.game_record.game_name)) {\n\t\t\t\t\tgameState.game_record.is_first_play = true;\n\t\t\t\t}\n\t\t\t\tgameState.saveGame();\n\t\t\t\tif (!playerService.playerInfo.is_anonymous && gameState.game_record.is_first_play) {\n\t\t\t\t\t$log.log('highScoreTest from nextRound');\n\t\t\t\t\tvar gameScore = gameState.state.totalScore;\n\t\t\t\t\tplayerService.highScoreTest(playerService.playerInfo.pk, playerService.campaignScore()+gameScore,\n\t\t\t\t\t\t\t\t\t\t\t\t\tgameState.game_record.game_name, gameScore)\n\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\tplayerService.refreshPlayerInfo();\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvm.state = \"showGamePayoff\";\n\t\t\t\tslideInBanner();\n\t\t\t\taudioService.playACSound('gameOver');\n\t\t\t} else {\n\t\t\t\tgameState.state.articleNumber = 0;\n\t\t\t\tvm.state = 'prepareArticle';\n\n\t\t\t\tvm.progressPips = gameState.state.roundInfo[gameState.state.roundNumber];\n\n\t\t\t\tarticleService.getArticle(gameState.state.roundInfo[gameState.state.roundNumber].articleIds[gameState.state.articleNumber])\n\t\t\t\t\t.then(function(response) {\n\t\t\t\t\t\tvm.article = response;\n\t\t\t\t\t\tvm.state = 'showArticle';\n\t\t\t\t\t\tvm.articleExpanded = false;\n\t\t\t\t\t\tdataTracking.startArticle(vm.article.pk);\n\t\t\t\t\t\tvm.articleStart = moment(); vm.articleSeconds = 0;\n\t\t\t\t\t\tslideInBanner();\n\t\t\t\t\t});\n\t\t\t\taudioService.playACSound('btnWipe');\n\t\t\t}\n\t\t}\n\n\t\tfunction startOver() {\n\t\t\tif (!gameState.game_record.is_completed) {\n\t\t\t\tgameState.game_record.was_cancelled = true;\n\t\t\t\tgameState.saveGame()\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tvm.showBurger = false;\n\t\t\t\t\t\tsetupForLaunch();\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvm.showBurger = false;\n\t\t\t\t\t\tsetupForLaunch();\n\t\t\t}\n\t\t\taudioService.playACSound('btn');\n\t\t}\n\n\t\tfunction slideInBanner() {\n\t\t\tvm.showRoundBanner = true;\n\t\t\tvm.roundNumber = gameState.state.roundNumber;\n\t\t\treturn $timeout(function() {\n\t\t\t\tvm.showRoundBanner = false;\n\t\t\t\tvm.articleStart = moment(); vm.articleSeconds = 0;\n\t\t\t}, 2000);\n\t\t}\n\n\t\tfunction slideInGameBanner() {\n\t\t\tvm.showStartGameBanner = true;\n\t\t\treturn $timeout(function() {\n\t\t\t\tvm.showStartGameBanner = false;\n\t\t\t}, 2000);\n\t\t}\n\n\t\tfunction toggleBurger() {\n\t\t\tvm.showBurger = !vm.showBurger;\n\t\t\tvm.showInstructions = false;\n\t\t\tif (vm.showBurger) {\n\t\t\t\t$('burger-pane .gray-section').scrollTop(0);\n\t\t\t}\n\t\t\taudioService.playACSound('btn');\n\t\t}\n\n\t\tfunction goSignIn() {\n\t\t\taudioService.playACSound('btn');\n\t\t\tvm.state = 'startupSequence';\n\t\t}\n\n\t}\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('fact2')\n .run(runBlock);\n\n /** @ngInject */\n function runBlock($log) {\n\n $log.debug('runBlock end');\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('fact2')\n .config(routerConfig);\n\n /** @ngInject */\n function routerConfig($stateProvider, $urlRouterProvider) {\n $stateProvider\n .state('home', {\n url: '/',\n templateUrl: 'app/main/newMain.html',\n controller: 'MainController',\n controllerAs: 'main'\n })\n\n .state('preview', {\n url: '/preview',\n templateUrl: 'app/main/newMain.html',\n controller: 'MainController',\n controllerAs: 'main',\n params: {\n isPreview: true\n }\n })\n\n .state('manageHome', {\n url: '/manage',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n .state('manageLogin', {\n url: '/login',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n .state('articleEdit', {\n url: '/editor',\n template: ''\n })\n\n .state('gameSettingsEdit', {\n url: '/gameSettings',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n .state('statisticsPage', {\n url: '/statistics',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n .state('campaignContent', {\n url: '/campaign',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n\n .state('expedition', {\n url: '/exp',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n .state('privacy', {\n url: '/privacy',\n // templateUrl: 'app/main/articleEdit.html'\n template: ''\n })\n\n ;\n\n $urlRouterProvider.otherwise('/');\n }\n\n})();\n\n/* global malarkey:false, moment:false */\n(function() {\n 'use strict';\n\n angular\n .module('fact2')\n .constant('malarkey', malarkey)\n .constant('moment', moment);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('fact2')\n .config(config);\n\n /** @ngInject */\n function config($logProvider) {\n // Enable log\n $logProvider.debugEnabled(true);\n }\n\n})();\n\nangular.module(\"fact2\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/main/newMain.html\",\"
main.articleAverageSeconds && (main.state==\\'showArticle\\' || main.state==\\'showResult\\')}\\\" class=timer-warning>
Startup
Σύρε προς τα Δεξιά, εάν η είδηση είναι αληθής και σύρε προς τα Αριστερά, εάν η είδηση είναι ψευδής (ή πάτησε στο ΤΙΚ και στο Χ αντίστοιχα)
Το έπιασα!
{{main.gameTitle}}
Γύρος {{main.roundNumber+1}} από {{main.numberOfRounds}}
Συνέχισε
go to management home page
Approximate form factor for preview...
{{option.label}}
\");\n$templateCache.put(\"app/components/articleDisplay/articleDisplay.template.html\",\"

Δες την πηγή
ψευδής
αληθής
\");\n$templateCache.put(\"app/components/articleHeaderFooter/articleFooter.html\",\"
{{gameState.state.totalScore}}
Γύρος {{gameState.state.roundNumber+1}}
\");\n$templateCache.put(\"app/components/articleHeaderFooter/articleHeader.html\",\"
\");\n$templateCache.put(\"app/components/articleHeaderFooter/bigHeader.html\",\"
W
\");\n$templateCache.put(\"app/components/articleHeaderFooter/bigHeader3.html\",\"
2018
\");\n$templateCache.put(\"app/components/articleHeaderFooter/pencilProgress.html\",\"
pencil
\");\n$templateCache.put(\"app/components/articlePayoff/articlePayoff.html\",\"
{{ payoffType===\\'correct\\' ? \\'Σωστά!\\' : \\'Λάθος!\\' }}

Σωστά! Αυτό ήταν αληθής είδηση! Κέρδισες {{main.articleScore}} πόντους.

Συγγνώμη! Αυτό ήταν αληθής είδηση. Κέρδισες {{main.articleScore}} πόντους.

Σωστά! Αυτό ήταν ψευδής είδηση! Κέρδισες {{main.articleScore}} πόντους.

Συγγνώμη! Αυτό ήταν ψευδής είδηση. Κέρδισες {{main.articleScore}} πόντους.

Πηγή: {{main.article.payoffSourceLabel}}

Πηγή: {{main.article.payoffSourceLabel}}

Συνέχισε
\");\n$templateCache.put(\"app/components/burgerPane/burgerPane.html\",\"
Πως να παίξετε
Αποσύνδεση
Επανεκκίνηση

Σχετικά με το παιχνίδι

credits

ORIGINAL CONCEPT & CO-DESIGNER: Maggie Farley
CO-DESIGNER & PRODUCER: Bob Hone
UX/UI & ART LEAD: Joyce Rice
DEVELOPER/DESIGNER: Chas Brown
ADDITIONAL GAME DESIGN: Kelli Dunlap, Cherisse Datu
GAME DESIGN GURU: Lindsay Grace
EDITORIAL CONSULTANT: Amy Eisman

\");\n$templateCache.put(\"app/components/expeditionPage/expeditionPage.html\",\"
{{playerInfo.user_public_name || \\'foragingRacoon1234\\'}}
{{campaign.score}}
{{$index+1}}
Υψηλές Βαθμολογίες
Only the first play-through of each level counts for the public scoreboard.
ok
cancel
ΟΚ
\");\n$templateCache.put(\"app/components/gamePayoff/gamePayoff.html\",\"
Τελικό σκορ: {{gameState.state.totalScore}}
Σωστά ({{gameState.state.articlesCorrect}}):
{{gameState.state.articleBonus}}
Πόντοι:
{{totalBonuses}}
{{bonus.label}}
{{bonus.value}}
Πέναλτι:
{{totalPenalties}}
{{penalty.label}}
{{penalty.value}}
Σύνολο
{{gameState.state.totalScore}}
Εξαιρετική δουλειά! Για να δημοσιεύσετε τη βαθμολογία σας στον πίνακα αποτελεσμάτων, συνδεθείτε παρακάτω
Εξαιρετική δουλειά, {{main.userPublicName}}!
Αρχική Σελίδα
Υψηλή βαθμολογία
Αρχική Σελίδα
Συνδεθείτε
=50\\\" class=confetti-fall-1>=50\\\" class=confetti-fall-2>=50\\\" class=confetti-fall-3>
=50\\\" class=\\\"payoff-banner end-banner slide-down-banner\\\">ΚΕΡΔΙΖΕΙΣ !!
ΤΕΛΟΣ ΠΑΙΧΝΙΔΙΟΥ!!

Σωστές Απαντήσεις: +40 πόντους ο καθένας

Λανθασμένες απαντήσεις: -10 πόντους

Γρήγορο Παιχνίδι: +7 πόντους

Αργό Παιχνίδι: -5 πόντους

Αποκάλυψε την Πηγή: +2 πόντοι

Ανάγνωση όλου του άρθρου: +1 πόντος

Το κατάλαβα!
\");\n$templateCache.put(\"app/components/highScores/highScoresPage.html\",\"
# Παίκτης
Σκορ
{{$index+1}} {{hs.publicName}}
{{hs.score}}
Επίπεδο:
{{[\\'1\\',\\'2\\',\\'3\\',\\'4\\',\\'5\\',\\'6\\'][wn-1]}}
# Παίκτης
Σκορ
{{$index+1}} {{hs.publicName}}
{{hs.score}}
Επίπεδο
Σκορ
{{[\\'1\\',\\'2\\',\\'3\\',\\'4\\',\\'5\\',\\'6\\'][wn-1]}}
{{hsp.myScores[wn].score}}
--
Συνολική βαθμολογία
{{hsp.campaignScore}}
Θα θέλαμε να σας δείξουμε τις βαθμολογίες σας, αλλά για να το κάνετε αυτό πρέπει να συνδεθείτε.
\");\n$templateCache.put(\"app/components/instructPanel/instructPanel.html\",\"
Πως να παίξετε
Μετακινείστε την οθόνη προς τα δεξιά ή πατήστε, εάν πιστεύτε ότι το άρθρο είναι ΑΛΗΘΕΣ. Μετακινείστε την οθόνη προς τα αριστερά ή πατήστε, εάν πιστεύτε ότι το άρθρο είναι ΨΕΥΔΗΣ ΕΙΔΗΣΗ. Κάντε κλικ στην επιλογή «Αποκάλυψε την πηγή» για βοήθεια.
ΑΛΗΘΙΝΗ ΕΙΔΗΣΗ : ρεπορτάζ στηριγμένο σε αδιάσειστα στοιχεία, αποσκοπεί στην αντικειμενική ενημέρωση.
ΨΕΥΔΗΣ ΕΙΔΗΣΗ : κατασκευασμένες ειδήσεις, σάτιρα, διαφημίσεις ή απόψεις.
Το κατάλαβα!
\");\n$templateCache.put(\"app/components/launchPage/launchPage.html\",\"
Welcome to 2018 version of Factitious. There will be six new sets of articles, one released each Monday from October 1st to November 5th
ok
welcome back!
resume game
new game
sign out
\");\n$templateCache.put(\"app/components/privacyPolicy/privacyPolicy.html\",\"

AU Game Lab

Online game privacy statement

Factitious is a production of the American University Game Lab. It is a database supported online web app, with the database providing the content for the game and collecting information about the players to identify any usability issues, to analyze their gaming choices and actions, and perform aggregate analysis of key parameters such as average game time, # of correct/incorrect decisions, and how players click the Show Source button.

We place a small cookie when players first sign-in to be able to recognize them when they return to the game (so they don’t have to “sign-in” again). Although the target audience is the general public using their personal smartphones, it is possible the game will be played on a shared computer and therefore we prompt the player to log-out and sign-in each time they revisit the game.

Our policy for data collected in online games produced by AU Game Faculty is as follows:

  • The data collected is using for our game design research (AU Game Lab).
  • Sensitive information about a player (email, demographics) will never be shared with other entities.
  • Anonymized information will be shared with collaborating institutions on a case-by-case basis.

We will revise this policy as needed in the future.

got it!
\");\n$templateCache.put(\"app/components/roundPayoff/roundPayoff.html\",\"
Ολοκλήρωση {{gameState.state.roundNumber+1}}ου γύρου!
Αναγνώρισες σωστά την αληθή και ψευδή είδηση {{percentCorrect}}% του χρόνου.
Τρέχουσα βαθμολογία: {{gameState.state.totalScore}}.
Συνέχισε
\");\n$templateCache.put(\"app/components/simpleModalPopup/simpleModalPopup.html\",\"
{{smp.title}}
\");\n$templateCache.put(\"app/components/startup/startupSequence.html\",\"
Εισαγάγετε το όνομα χρήστη ή τη διεύθυνση email σας, ή δημιουργήστε έναν νέο χρήστη
privacy policy
Πηγαίνω!
Δημιουργήστε έναν νέο χρήστη
Ματαίωση
Καλως ορισες πισω!
Συνεχίστε να παίζετε
Νέο παιχνίδι
Αποσύνδεση
Το όνομα χρήστη \\\"{{userInfo.username}}\\\" δεν βρέθηκε

Δεν ήταν δυνατή η εύρεση ενός χρήστη με αυτό το όνομα. Εάν έρχεστε εδώ για πρώτη φορά, κάντε κλικ στο \\\"Δημιουργία\\\" για να δημιουργήσετε ένα νέο προφίλ και ξεκινήστε να παίζετε το παιχνίδι.

Εάν κάνατε λάθος πληκτρολογώντας το όνομα, κάντε κλικ στο \\\"Ματαίωση\\\" και δοκιμάστε ξανά.

Δημιουργία
Ματαίωση
Πώς είναι αυτό για ένα όνομα χρήστη;
{{user_public_name}}
Προσπάθησε ξανά
Πηγαίνω!
{{user_public_name}}
Αυτό είναι το όνομα χρήστη σας. Παρακαλώ γράψτε το ή τραβήξτε μια φωτογραφία.
Πείτε μας λίγα λόγια για τον εαυτό σας
θηλυκόαρσενικόςέθιμο
ΛύκειοΚολλέγιομάστερδιδακτορικό
χαμηλήμέσηυψηλή
Ακύρωσης
Παραλείψτε αυτό
Προαιρετικά, εισαγάγετε τη διεύθυνση email σας σε περίπτωση που ξεχάσετε το όνομα χρήστη σας:
privacy policy
Ακύρωσης και φύγετε!
Παραλείψτε αυτό
\");\n$templateCache.put(\"app/components/teacherPage/teacherPage.html\",\"
If you\\'re using Factitious in your classroom, we’d love to hear from you.
your email:
comments:
We are looking to develop a Classroom Edition tailored for you and how you\\'re using Factitious or are planning to. We want to hear your stories to help our design meet your needs.
Check back for new news when we have it (soon).

For the original Factitious, click here.
privacy policy
submit
home
We appreciate your interest! We\\'ll send you updates whenever there\\'s something new and exciting happening at Factitious.
We appreciate your interest! We\\'ll use your feedback to make Fac titious even better.
ok
\");\n$templateCache.put(\"app/components/managementPages/campaignContent/campaignContentPage.html\",\"
Title
Content
save changes
\");\n$templateCache.put(\"app/components/managementPages/gameSettings/gameSettingsEditor.html\",\"
save changes...
revert
Last modified: {{gameSettings.modified_date | utcStrToLocalDate}}
Total number of articles {{gameSettings.maximum_articles_played}}
Use Lightbulb
This game is enabled.
disable game...
This game is disabled.
enable game...

Campaign Game: {{selectedGame.game_name}}

scoring

articles, round {{$index+1}}

{{roundInfo.articleIds.length}} articles in this round, in this order:
{{articleDict[apk].article_id}}: {{articleDict[apk].headline}}
{{apk}}: Not found
\");\n$templateCache.put(\"app/components/managementPages/login/login.html\",\"
\");\n$templateCache.put(\"app/components/managementPages/manageHome/manageHome.html\",\"

This page provides access to the tools for managing the Factitious game content.

  • campaign content - a place where you can change the content shown in the poipup on the expedition page.
  • data reviewer - provides statistics for game play and article play.
  • game editor - allows changing the list of articles displayed and the scoring mechanisms, one a per round basis.
  • article editor - used to add and edit articles for use in the game.

You can also go to a special preview link to play the game while viewing it at various screen sizes. (This is useful during development to make sure that everything looks reasonable regardless of form factor.)

\");\n$templateCache.put(\"app/components/managementPages/statistics/statisticsPage.html\",\"

filters

 Filter by date from 
 to 
apply date filter
refresh

game play aggregates

save as csv...
avg. scoreavg. correctavg. played
outcome# playsavg. time#% max#%#%
{{g.outcome_status}}{{g.num_plays}}{{g.avg_time | number:1}}{{g.avg_score | number:1}}{{g.avg_pct_score*100 | number:0}}%{{g.avg_correct | number:1}}{{g.avg_pct_correct*100 | number:0}}%{{g.avg_completed | number:1}}{{g.avg_pct_completed*100 | number:0}}%

article play aggregates

enable article statistics...

article play aggregates

disable article statistics...
save as csv...
idheadline# playsavg. time% correct% hints
{{a.article_id}}{{a.headline}}{{a.num_plays}}{{a.avg_time | number:1}}{{100*a.num_correct/a.num_plays | number:1}}{{100*a.num_hints/a.num_plays | number:1}}

downloads

Entire Database
Download a copy of the entire SQLite3 database
Caclulating Aggregates...
This may take up to 1 minute
Please be patient and don\\'t reload!
\");\n$templateCache.put(\"app/components/managementPages/articleEdit/articleEditMain/articleEditMain.html\",\"
save changes
revert
new

not newsnews
Headline
Body
\\\"show source\\\" Content
Payoff \\\"Source: \\\" Link Label
Payoff \\\"Source: \\\" Link URL
Payoff Content
Notes
Approximate form factor...
{{option.label}}
Uploading...
\");}]);"],"sourceRoot":"/source/"}