docs: function initParsons(exer) {
      exercise = exer;
      feedbackTimeHistory = [];
  
      if (!PARSONS_SETTINGS) {
        PARSONS_SETTINGS = {};
      }
  
      var widget_options = $.extend({
                    'sortableId': 'sortable', 'trashId': 'sortableTrash',
                    'max_wrong_lines': 100,
                    'action_cb': actionCallback
                    }, PARSONS_SETTINGS.widget_options);
      if (exercise.unit_tests) {
        widget_options.unittests = exercise.unit_tests;
      }
  
      // initialize the widget
      parson = new ParsonsWidget(widget_options);
      parson.init(exercise.code);
      parson.shuffleLines();
      parson.showDialog = showDialog;
  
      // initialize UI
      AssignmentTab.init();
      // update, clear, and position the previously visited feedback tab
      RevisitFeedback.init().html("").available(false);
      previousFeedbackState = undefined;
  
      // add modality panel
      $("#modality").addClass("visible");
  
  
      $(".output").css({minHeight: $(".output").height() + "px" });
  
      $("#submitLink").off("click").click(function(event) {
        event.preventDefault();
        // if feedback is disabled (timer available), don't give feedback
        if ($("#header").hasClass("timer")) { return; }
        var feedback = parson.getFeedback(),
            callbackHandler = function(data, textStatus, jqXhr) {
              if ($.isFunction(PARSONS_SETTINGS.submit_callback)) {
                PARSONS_SETTINGS.submit_callback(feedback, data, textStatus, jqXhr);
              } else {
                feedbackHandler(feedback);
              }
            };
        previousFeedbackState = {
          state: parson.user_actions[parson.user_actions.length - 1].output,
          feedback: feedback
        };
        setLastFeedback(feedback); // update the Last feedback tab
  
  
        if (PARSONS_SETTINGS.submit_url) {
          var post_data = $.extend({'submission': JSON.stringify({'actions': parson.user_actions }),
                                    'feedback': $.isArray(feedback)?feedback.length:(feedback.success?0:1)},
                                  PARSONS_SETTINGS.submit_data);
          $.post(PARSONS_SETTINGS.submit_url, post_data, function(data, textStatus, jqXhr) {
            callbackHandler(data, textStatus, jqXhr);
          });
        } else {
          callbackHandler();
        }
      });
  
      handleOrientationChange(); // size things up properly
  
      // return the widget
      return parson;
    }