topic.js 4.54 KB
$.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);
});