$.fn.extend({ animateCSS: function (animation) { var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; this.addClass('animated ' + animation).one(animationEnd, function() { $(this).removeClass('animated ' + animation); }); } }); // Get current question function getQuestion() { $.ajax({ type: "GET", url: "/question", dataType: "json", // expected from server success: updateQuestion, error: function() {alert("O servidor não responde.");} }); } // updates question according to the response given by the server function updateQuestion(response) { var method = response["method"]; var params = response["params"]; $('#right').hide(); $('#wrong').hide(); switch (method) { case "new_question": new_question(params["type"], params["question"], params["tries"], params["progress"]); break; case "finished_topic": $('#submit').hide(); $("#content").html(response["params"]["question"]); $('#topic_progress').css('width', '100%').attr('aria-valuenow', 100); $("#content").animateCSS('tada'); setTimeout(function(){ window.location.replace('/'); }, 2000); break; } } function new_question(type, question, tries, progress) { $("#question_div").html(question); $("#comments").html(""); $("#solution").html(""); if (type == "info") { $("#submit").html("Continuar"); } else { $("#submit").html("Responder"); } $("#submit").off(); $("#submit").click(postAnswer); $("#tries").html(tries); $('#topic_progress').css('width', (100*progress)+'%').attr('aria-valuenow', 100*progress); MathJax.Hub.Queue(["Typeset",MathJax.Hub,"question_div"]); $('#question_div').animateCSS('bounceInDown'); // enable shift+enter to submit // $("input:text, input:radio, input:checkbox").keydown(function (e) { // if (e.keyCode == 13) { // e.preventDefault(); // if (e.shiftKey) { // $("#submit").click(); // } // return false; // }}); } // =========================================================================== // Send answer and receive a response with the result of the correction. // The response can be right, try_again or wrong. // A new question is not loaded. To load questions a GET is required. function postAnswer() { if (typeof editor === 'object') editor.save(); $.ajax({ type: "POST", url: "/question", data: $("#question_form").serialize(), // {'a':10,'b':20}, dataType: "json", // expected from server success: getFeedback, error: function() {alert("O servidor não responde.");} }); } function getFeedback(response) { var method = response["method"]; var params = response["params"]; if (params['type'] == "info") { getQuestion(); return; } switch (method) { case "right": $('#right').show(); $('#wrong').hide(); $('#comments').html(params['comments']); MathJax.Hub.Queue(["Typeset", MathJax.Hub, "#comments"]); $("#submit").html("Continuar"); $("#submit").off(); $("#submit").click(getQuestion); break; case "try_again": $('#question_div').animateCSS('shake'); $('#topic_progress').css('width', (100*params["progress"])+'%').attr('aria-valuenow', 100*params["progress"]); $("#tries").html(params["tries"]); $('#comments').html(params['comments']); MathJax.Hub.Queue(["Typeset",MathJax.Hub,"#comments"]); break; case "wrong": $('#right').hide(); $('#wrong').show(); // $('#question_div').animateCSS('shake'); $('#topic_progress').css('width', (100*params["progress"])+'%').attr('aria-valuenow', 100*params["progress"]); $("#tries").html(params["tries"]); $('#comments').html(params['comments']); MathJax.Hub.Queue(["Typeset", MathJax.Hub, "#comments"]); $('#solution').html(params['solution']); MathJax.Hub.Queue(["Typeset", MathJax.Hub, "#solution"]); $('#solution').animateCSS('flipInX'); $("fieldset").attr("disabled", "disabled"); $("#submit").html("Continuar"); $("#submit").off(); $("#submit").click(getQuestion); break; } } // =========================================================================== $(document).ready(function() { getQuestion(); $("#submit").click(postAnswer); });