Beispiel #1
0
            // Success callback
            function(data) {
              lastSuccessfulSubmissionData = thisSubmissionData;
              $lastSaved.text(I18n.t('saved_at', 'Quiz saved at %{t}', { t: $.friendlyDatetime(new Date()) }));
              quizSubmission.currentlyBackingUp = false;
              quizSubmission.inBackground = false;
              if(repeat) {
                setTimeout(function() {quizSubmission.updateSubmission(true, true) }, 30000);
              }
              if(data && data.end_at) {
                var endAtFromServer     = Date.parse(data.end_at),
                    submissionEndAt     = Date.parse(endAt.text()),
                    serverEndAtTime     = endAtFromServer.getTime(),
                    submissionEndAtTime = submissionEndAt.getTime();

                quizSubmission.timeLeft = data.time_left * 1000;

                // if the new endAt from the server is different than our current endAt, then notify
                // the user that their time limit's changed and let updateTime do the rest.
                if (serverEndAtTime !== submissionEndAtTime) {
                    if(serverEndAtTime > submissionEndAtTime) {
                      $.flashMessage(I18n.t('You have been given extra time on this attempt'))
                    } else {
                      $.flashMessage(I18n.t('Your time for this quiz has been reduced.'));
                    }

                  quizSubmission.endAt.text(data.end_at);
                  quizSubmission.endAtParsed = endAtFromServer;
                }
              }
            },
Beispiel #2
0
 $(".hide_time_link").click(function(event) {
   event.preventDefault();
   if($(".time_running").css('visibility') != 'hidden') {
     $(".time_running").css('visibility', 'hidden');
     $(this).text(I18n.t('show_time_link', "Show"));
   } else {
     $(".time_running").css('visibility', 'visible');
     $(this).text(I18n.t('hide_time_link', "Hide"));
   }
 });
Beispiel #3
0
 showWarnings: function(currentTimeLeft) {
   if(currentTimeLeft > 30000 && currentTimeLeft < 60000 && !quizSubmission.oneMinuteDeadline) {
     quizSubmission.oneMinuteDeadline = true;
     $.flashWarning(I18n.t('notices.submission_one_minute_left', "This Quiz Will Be Submitted In One Minute"), 5000);
   } else if(currentTimeLeft > 250000 && currentTimeLeft < 300000 && !quizSubmission.fiveMinuteDeadline) {
     quizSubmission.fiveMinuteDeadline = true;
     $.flashWarning(I18n.t('notices.submission_five_minutes_left', "This Quiz Will Be Submitted In Five Minutes"), 5000);
   } else if(currentTimeLeft > 1770000 && currentTimeLeft < 1800000 && !quizSubmission.thirtyMinuteDeadline) {
     quizSubmission.thirtyMinuteDeadline = true;
     $.flashWarning(I18n.t('notices.submission_thirty_minutes_left', "This Quiz Will Be Submitted In Thirty Minutes"), 5000);
   }
 },
Beispiel #4
0
 showDueDateWarnings: function(currentTimeToDueDate) {
   if(currentTimeToDueDate > 30000 && currentTimeToDueDate < 60000 && !quizSubmission.oneMinuteDueDateDeadline) {
     quizSubmission.oneMinuteDueDateDeadline = true;
     $.flashMessage(I18n.t('notices.due_date_one_minute_left', "One Minute Left Before Quiz Will Be Marked Late"));
   } else if(currentTimeToDueDate > 250000 && currentTimeToDueDate < 300000 && !quizSubmission.fiveMinuteDueDateDeadline) {
     quizSubmission.fiveMinuteDueDateDeadline = true;
     $.flashMessage(I18n.t('notices.due_date_five_minutes_left', "Five Minutes Left Before Quiz Will Be Marked Late"));
   } else if(currentTimeToDueDate > 1770000 && currentTimeToDueDate < 1800000 && !quizSubmission.thirtyMinuteDueDateDeadline) {
     quizSubmission.thirtyMinuteDueDateDeadline = true;
     $.flashMessage(I18n.t('notices.due_date_thirty_minutes_left', "Thirty Minutes Left Before Quiz Will Be Marked Late"));
   }
 },
Beispiel #5
0
 updateQuestionIndicators: function(answer, questionId){
   var listSelector = "#list_" + questionId;
   var questionSelector = "#" + questionId;
   var combinedId = listSelector + ", " + questionSelector;
   var $questionIcon = $(listSelector + " i.placeholder");
   if(answer) {
     $(combinedId).addClass('answered');
     $questionIcon.addClass('icon-check').removeClass('icon-question');
     $questionIcon.find('.icon-text').text(I18n.t('question_answered', "Answered"));
   } else {
     $(combinedId).removeClass('answered');
     $questionIcon.addClass('icon-question').removeClass('icon-check');
     $questionIcon.find('.icon-text').text(I18n.t('question_unanswered', "Haven't Answered Yet"));
   }
 },
Beispiel #6
0
      $(document).delegate('a', 'click', function(event) {
        if($(this).closest('.ui-dialog,.mceToolbar,.ui-selectmenu').length > 0) { return; }

        if($(this).hasClass('no-warning')) {
          quizSubmission.alreadyAcceptedNavigatingAway = true
          return;
        }

        if(!event.isDefaultPrevented()) {
          var url = $(this).attr('href') || "";
          var hashStripped = location.href;
          if(hashStripped.indexOf('#')) {
            hashStripped = hashStripped.substring(0, hashStripped.indexOf('#'));
          }
          if(url.indexOf('#') == 0 || url.indexOf(hashStripped + "#") == 0) {
            return;
          }
          var result = confirm(I18n.t('confirms.navigate_away', "You're about to navigate away from this page.  Continue anyway?"));
          if(!result) {
            event.preventDefault();
          } else {
            quizSubmission.alreadyAcceptedNavigatingAway = true
          }
        }
      });
Beispiel #7
0
    $("#submit_quiz_form").submit(function(event) {
      $(".question_holder textarea.question_input").each(function() { $(this).change(); });

      var unanswered;
      var warningMessage;

      if(quizSubmission.cantGoBack) {
        if(!$(".question").hasClass("answered")) {
          warningMessage = I18n.t('confirms.cant_go_back_blank',
            "You can't come back to this question once you hit next. Are you sure you want to leave it blank?");
        }
      }

      if(quizSubmission.finalSubmitButtonClicked) {
        quizSubmission.finalSubmitButtonClicked = false; // reset in case user cancels

        if(quizSubmission.cantGoBack) {
          var unseen = $("#question_list .list_question:not(.seen)").length;
          if(unseen > 0) {
            warningMessage = I18n.t('confirms.unseen_questions',
              {'one': "There is still 1 question you haven't seen yet.  Submit anyway?",
               'other': "There are still %{count} questions you haven't seen yet.  Submit anyway?"},
               {'count': unseen})
          }
        }
        else {
          unanswered = $("#question_list .list_question:not(.answered):not(.text_only)").length;
          if(unanswered > 0) {
            warningMessage = I18n.t('confirms.unanswered_questions',
              {'one': "You have 1 unanswered question (see the right sidebar for details).  Submit anyway?",
               'other': "You have %{count} unanswered questions (see the right sidebar for details).  Submit anyway?"},
               {'count': unanswered});
          }
        }
      }

      if(warningMessage != undefined && !quizSubmission.submitting) {
        var result = confirm(warningMessage);
        if(!result) {
          event.preventDefault();
          event.stopPropagation();
          return false;
        }
      }

      quizSubmission.submitting = true;
    });
Beispiel #8
0
 showDeauthorizedDialog = function() {
   $("#deauthorized_dialog").dialog({
     modal: true,
     buttons: [{
       text: I18n.t("#buttons.cancel", "Cancel"),
       'class': "dialog_closer",
       click: function() { $(this).dialog("close"); }
     }, {
       text: I18n.t("#buttons.login", "Login"),
       'class': "btn-primary relogin_button button_type_submit",
       click: function() {
         quizSubmission.navigatingToRelogin = true;
         $('#deauthorized_dialog').submit();
       }
     }]
   });
 };
Beispiel #9
0
 window.addEventListener('beforeunload', function(e) {
   if (!quizSubmission.navigatingToRelogin) {
     if(!quizSubmission.submitting && !quizSubmission.alreadyAcceptedNavigatingAway && !unloadWarned) {
       quizSubmission.clearAccessCode = true
       setTimeout(function() { unloadWarned = false; }, 0);
       unloadWarned = true;
       e.returnValue = I18n.t('confirms.unfinished_quiz', "You're about to leave the quiz unfinished.  Continue anyway?");
       return e.returnValue;
     }
   }
 });
Beispiel #10
0
        keyup: function(event) {
          var $this = $(this);
          var val = $this.val().replace(/,/g, '');
          var $errorBox = $this.data('associated_error_box');

          if (val.match(/^$|^-$/) || !isNaN(parseFloat(val))) {
            if ($errorBox) {
              $this.triggerHandler('click');
            }
          } else {
            if (!$errorBox) {
              $this.errorBox(I18n.t('errors.only_numerical_values', "only numerical values are accepted"));
            }
          }
        }
Beispiel #11
0
      .delegate(".flag_question", 'click', function(e) {
        e.preventDefault();
        var $question = $(this).parents(".question");
        $question.toggleClass('marked');
        $(this).attr("aria-checked", $question.hasClass('marked'));
        $("#list_" + $question.attr('id')).toggleClass('marked');

        var markedText;
        if ($("#list_" + $question.attr('id')).hasClass('marked')) {
          markedText = I18n.t('titles.come_back_later', 'You marked this question to come back to later');
        } else {
          markedText = "";
        }
        $("#list_" + $question.attr('id')).find(".marked-status").text(markedText);

        quizSubmission.updateSubmission();
      })
Beispiel #12
0
      window.addEventListener('unload', function(e) {
        var data = $("#submit_quiz_form").getFormData();
        var url = $(".backup_quiz_submission_url").attr('href');

        data.leaving = !!quizSubmission.clearAccessCode;

        $.flashMessage(I18n.t('Saving...'));
        $.ajax({
          url,
          data,
          type: 'POST',
          dataType: 'json',
          async: false
        });

        // since this is sync, a callback never fires to reset this
        quizSubmission.currentlyBackingUp = false;
      },
Beispiel #13
0
      showTimeUpDialog: function(now) {
        quizSubmission.dialogged = true;
        quizSubmission.countDown = new Date(now.getTime() + 10000);

        $("#times_up_dialog").show().dialog({
          title: I18n.t('titles.times_up', "Time's Up!"),
          width: "auto",
          height: "auto",
          modal: true,
          overlay: {
            backgroundColor: "#000",
            opacity: 0.7
          },
          close: function() {
            if(!quizSubmission.submitting) {
              quizSubmission.submitting = true;
              quizSubmission.submitQuiz();
            }
          }
        });

      },
Beispiel #14
0
 updateTimeString: function(timeDiff) {
   var date = new Date(Math.abs(timeDiff));
   var yr = date.getUTCFullYear() - 1970;
   var mon = date.getUTCMonth();
   var day = date.getUTCDate() - 1;
   var hr = date.getUTCHours();
   var min = date.getUTCMinutes();
   var sec = date.getUTCSeconds();
   var times = [];
   if(yr) { times.push(I18n.t('years_count', "Year", {'count': yr})); }
   if(mon) { times.push(I18n.t('months_count', "Month", {'count': mon})); }
   if(day) { times.push(I18n.t('days_count', "Day", {'count': day})); }
   if(hr) { times.push(I18n.t('hours_count', "Hour", {'count': hr})); }
   if(true || min) { times.push(I18n.t('minutes_count', "Minute", {'count': min})); }
   if(true || sec) { times.push(I18n.t('seconds_count', "Second", {'count': sec})); }
   $timeRunningTimeRemaining.text(times.join(", "));
 },
Beispiel #15
0
      window.addEventListener('unload', function(e) {
        var data = $("#submit_quiz_form").getFormData();
        var url = $(".backup_quiz_submission_url").attr('href');

        data.leaving = !!quizSubmission.clearAccessCode;

        if(navigator.sendBeacon){
          var blob = new Blob([JSON.stringify(data)], {type : 'application/json; charset=utf-8'});
          navigator.sendBeacon(url, blob);
        }
        else {
            $.flashMessage(I18n.t('Saving...'));
            $.ajax({
              url: url,
              data: data,
              type: 'POST',
              dataType: 'json',
              async: false
            });
        }
        // since this is sync, a callback never fires to reset this
        quizSubmission.currentlyBackingUp = false;
      },
Beispiel #16
0
      updateSubmission: function(repeat, autoInterval) {
        /**
         * Transient: CNVS-9844
         * Disable auto-backups if backup=true was passed as a query parameter.
         *
         * This is required to test updating questions via the API.
         */
        if (quizSubmission.backupsDisabled) {
          return;
        }

        if(quizSubmission.submitting && !repeat) { return; }
        var now = new Date();
        if(!autoInterval && (now - quizSubmission.lastSubmissionUpdate) < 1000) {
          return;
        }
        if(quizSubmission.currentlyBackingUp) { return; }

        quizSubmission.currentlyBackingUp = true;
        quizSubmission.lastSubmissionUpdate = new Date();
        var data = $("#submit_quiz_form").getFormData();

        $(".question_holder .question").each(function() {
          var value = ($(this).hasClass("marked")) ? "1" : "";
          data[$(this).attr('id') + "_marked"] = value;
        });

        $lastSaved.text(I18n.t('saving', 'Saving...'));
        var url = $(".backup_quiz_submission_url").attr('href');
        (function(submissionData) {
          // Need a shallow clone of the data here because $.ajaxJSON modifies in place
          var thisSubmissionData = _.clone(submissionData);
          // If this is a timeout-based submission and the data is the same as last time,
          // palliate the server by skipping the data submission
          if (!quizSubmission.inBackground && repeat && _.isEqual(submissionData, lastSuccessfulSubmissionData)) {
            $lastSaved.text(I18n.t('saving_not_needed', "No new data to save. Last checked at %{t}", { t: $.friendlyDatetime(new Date()) }));

            quizSubmission.currentlyBackingUp = false;

            setTimeout(function() { quizSubmission.updateSubmission(true, true) }, 30000);
            return;
          }
          $.ajaxJSON(url, 'PUT', submissionData,
            // Success callback
            function(data) {
              lastSuccessfulSubmissionData = thisSubmissionData;
              $lastSaved.text(I18n.t('saved_at', 'Quiz saved at %{t}', { t: $.friendlyDatetime(new Date()) }));
              quizSubmission.currentlyBackingUp = false;
              quizSubmission.inBackground = false;
              if(repeat) {
                setTimeout(function() {quizSubmission.updateSubmission(true, true) }, 30000);
              }
              if(data && data.end_at) {
                var endAtFromServer     = Date.parse(data.end_at),
                    submissionEndAt     = Date.parse(endAt.text()),
                    serverEndAtTime     = endAtFromServer.getTime(),
                    submissionEndAtTime = submissionEndAt.getTime();

                quizSubmission.timeLeft = data.time_left * 1000;

                // if the new endAt from the server is different than our current endAt, then notify
                // the user that their time limit's changed and let updateTime do the rest.
                if (serverEndAtTime !== submissionEndAtTime) {
                    if(serverEndAtTime > submissionEndAtTime) {
                      $.flashMessage(I18n.t('You have been given extra time on this attempt'))
                    } else {
                      $.flashMessage(I18n.t('Your time for this quiz has been reduced.'));
                    }

                  quizSubmission.endAt.text(data.end_at);
                  quizSubmission.endAtParsed = endAtFromServer;
                }
              }
            },
            // Error callback
            function(resp, ec) {
              quizSubmission.currentlyBackingUp = false;

              // has the user logged out?
              // TODO: support this redirect in LDB, by getting out of high security mode.
              if (ec.status === 401 || resp['status'] == 'unauthorized') {
                showDeauthorizedDialog();
                // since we popped up our own "not logged in" modal, skip the default error handler
                // see jquery.ajaxJSON.js defaultAjaxError
                if ($.inArray(ec, $.ajaxJSON.ignoredXHRs) === -1) {
                  $.ajaxJSON.ignoredXHRs.push(ec)
                }
              }
              else {
                // Connectivity lost?
                var current_user_id = window.ENV.current_user_id || "none";
                $.ajaxJSON(
                  location.protocol + '//' + location.host + "/simple_response.json?user_id=" + current_user_id + "&rnd=" + Math.round(Math.random() * 9999999),
                  'GET', {},
                  function() {},
                  function() {
                    $.flashError(I18n.t('errors.connection_lost', "Connection to %{host} was lost.  Please make sure you're connected to the Internet before continuing.", {'host': location.host}));
                  }
                );
              }

              if(repeat) {
                setTimeout(function() {quizSubmission.updateSubmission(true) }, 30000);
              }
            },
            {
              timeout: 15000
            }
          );
        })(data);
      },
Beispiel #17
0
 .on('login_failure.take_quiz', function() {
   $.flashError(I18n.t('login_failed', 'Login failed.'));
 });
Beispiel #18
0
 function() {
   $.flashError(I18n.t('errors.connection_lost', "Connection to %{host} was lost.  Please make sure you're connected to the Internet before continuing.", {'host': location.host}));
 }
Beispiel #19
0
 .on('login_success.take_quiz', function() {
   $.flashMessage(I18n.t('login_successful', 'Login successful.'));
 })
Beispiel #20
0
 getTimeElapsed: function() {
   $(".time_header").text(I18n.beforeLabel(I18n.t('labels.time_elapsed', "Time Elapsed")));
   var now = new Date().getTime();
   var startedAt = Date.parse(quizSubmission.startedAt.text()).getTime();
   return now - startedAt;
 },