diff options
Diffstat (limited to 'js/codeq/problem.js')
-rw-r--r-- | js/codeq/problem.js | 138 |
1 files changed, 108 insertions, 30 deletions
diff --git a/js/codeq/problem.js b/js/codeq/problem.js index f19cbd4..fcb5d8a 100644 --- a/js/codeq/problem.js +++ b/js/codeq/problem.js @@ -1,33 +1,112 @@ -/** - * Created by robert on 9/18/15. - */ - -/** - * Created by robert on 9/18/15. - */ - (function(){ - var lastLanguage; + var jqScreen = $('#screen_problem'), + jqLanguageTitle = jqScreen.find('.language-title'), + jqLanguageDescription = jqScreen.find('.language-description'), + jqLanguageProblems = jqScreen.find('.language-problems'), + languageCache = {}, // keyed by language identifier + currentData = null, // currently active data + createLanguageData = function (data, languageIdentifier, lang) { // data is the content of language.json + var trLanguage = codeq.chooseTranslation(data.translations, lang), + groups = data.groups || {}, + languageHints = trLanguage.hint || {}, + html = [], + problemReferences = [], + groupIdentifier, group, trGroup, problems, problemIdentifier, problem, trProblem; + for (groupIdentifier in groups) { + if (!groups.hasOwnProperty(groupIdentifier)) continue; + group = groups[groupIdentifier] || {}; + trGroup = codeq.chooseTranslation(group.translations, lang); + html.push('<li><div class="group-title">', codeq.escapeHtml(trGroup.name || 'Group name not set: ' + groupIdentifier), '</div>'); + html.push('<div class="group-description">', codeq.escapeHtml(trGroup.description || 'Group description not set: ' + groupIdentifier), '</div>'); + html.push('<ul class="group-problems">'); + problems = group.problems || {}; + for (problemIdentifier in problems) { + if (!problems.hasOwnProperty(problemIdentifier)) continue; + problem = problems[problemIdentifier]; + trProblem = codeq.chooseTranslation(problem.translations, lang); + html.push('<li><a class="problem-', '' + problemReferences.length, '">', codeq.escapeHtml(trProblem.name || 'Problem name not set: ' + problemIdentifier), '</a></li>'); + problemReferences.push({'g': groupIdentifier, 'p': problemIdentifier}); + } + html.push('</ul></li>'); + } + return { + 'name': trLanguage.name || 'Language name not set: ' + languageIdentifier, + 'description': trLanguage.description || 'Description not set: ' + languageIdentifier, + 'html': html.join(''), + 'refs': problemReferences, + 'hints': trLanguage.hint || {} + }; + }, + onLangChange = function (args) { + purgeDom(); + createDom(currentData); + }, + createDom = function (languageData) { + var lang = codeq.getLang(), + language = languageData.identifier, + data = languageData[lang]; + if (!data) { + data = createLanguageData(languageData.raw, language, lang); + languageData[lang] = data; + } + jqLanguageTitle.html(data.name); + jqLanguageDescription.html(data.description); + jqLanguageProblems.html(data.html); + jqLanguageProblems.find('a').on('click', function () { + var index = +$(this).attr('class').split('-')[1], + ref = data.refs[index]; + if (!ref) { + codeq.log.error('Clicked on a problem link having erroneous index: ' + index); + return; + } + // transition + codeq.wait( + codeq.comms.getProblem(language, ref.g, ref.p) + .then(function (data) { + if (data.code !== 0) throw new Error('Failed to obtain problem data, code: ' + data.code + ', message: ' + data.message); + codeq.globalStateMachine.transition(language, data); + }) + ) + .fail(function (reason) { + codeq.log.error('Failed to obtain the problem definition: ' + reason, reason); + alert('Failed to obtain the problem definition: ' + reason); + }) + .done(); + }); + codeq.on('langchange', onLangChange); + }, + purgeDom = function () { + jqLanguageProblems.find('a').off(); + jqLanguageProblems.empty(); + jqLanguageDescription.empty(); + jqLanguageTitle.empty(); + codeq.off('langchange', onLangChange); + }, + lastLanguage; + codeq.globalStateMachine.register('problem',{ 'enter': function(language){ - if(language)lastLanguage = language; - else language = lastLanguage;//This happens when we hit this with the back button - - $('#disabled').css('display', ''); - $('#disabled').css('cursor', 'wait'); + if (language) lastLanguage = language; + else language = lastLanguage; // This happens when we hit this with the back button $('#navigation-login').css('display', ''); - /*$('#navigation-login').on('click', function(){ - codeq.globalStateMachine.transition('login'); - });*/ $('#navigation-language').css('display', ''); - /*$('#navigation-language').on('click', function(){ - codeq.globalStateMachine.transition('language'); - });*/ - $("#navigation-problem").addClass("active"); - $('#navigation-problem').css('display', ''); + $("#navigation-problem").addClass("active").css('display', ''); + jqScreen.css('display', ''); + + currentData = languageCache[language]; + if (currentData) { + createDom(currentData); + } + else { + codeq.wait(codeq.comms.getLanguageDef(language).then(function (rawData) { + currentData = {'raw': rawData, 'identifier': language}; + languageCache[language] = currentData; + createDom(currentData); + })).done(); + } - codeq.comms.send({'action': 'list_problems', 'language':language}) +/* codeq.comms.send({'action': 'list_problems', 'language':language}) .then( function success(data) { var i, groups, group, problems, problem, first_group, @@ -107,21 +186,20 @@ $('#disabled').css('cursor', ''); alert('Request to obtain list of problems failed: ' + reason); } - ).done(); + ).done();*/ }, 'exit' : function(){ - $('#problem_group').off(); + purgeDom(); +/* $('#problem_group').off(); $("#submit_problem").off(); $("#problem_group option").remove();//empty the selects $("#problems option").remove(); - $("#screen_problem").css('display', 'none'); + $("#screen_problem").css('display', 'none');*/ + jqScreen.css('display', 'none'); $('#navigation-login').css('display', 'none'); - //$('#navigation-login').off(); $('#navigation-language').css('display', 'none'); - //$('#navigation-language').off(); - $('#navigation-problem').css('display', 'none'); - $("#navigation-problem").removeClass("active"); + $('#navigation-problem').css('display', 'none').removeClass("active"); } }); })();
\ No newline at end of file |