summaryrefslogtreecommitdiff
path: root/js/codeq/problem.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/codeq/problem.js')
-rw-r--r--js/codeq/problem.js138
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