Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function(jQuery) {
  2.     "use strict";
  3.  
  4.     function FillBlanksDDGame(instance, options) {
  5.         var defaultOptions = {
  6.             sentenceHolder: null,
  7.             wordsHolder: null,
  8.             submitBtn: null,
  9.             blank: "###",
  10.             sentences: [],
  11.             showResult: false,
  12.             isBack: false,
  13.             response: []
  14.         };
  15.         this.instance = instance;
  16.         this.options = jQuery.extend(true, {}, defaultOptions, options);
  17.         this.$el = jQuery(this.instance);
  18.         this.data = [];
  19.         this.currentData = {};
  20.         this.response = [];
  21.         this.index = 0;
  22.         this.halt = false;
  23.         this.init();
  24.     }
  25.     FillBlanksDDGame.prototype = {
  26.         init: function() {
  27.             var self = this;
  28.             //self.options.submitBtn.prop("disabled", true);
  29.             self.setupData();
  30.             self.setupEventListeners();
  31.             self.showChallenge();
  32.         },
  33.         setupEventListeners: function() {
  34.             var self = this;
  35.             self.options.submitBtn.on("click", function() {
  36.                 var holders = self.options.sentenceHolder.find(".word-drop-holder-data");
  37.                 var w = [];
  38.                 self.response = [];
  39.                 jQuery.each(holders, function(x, y) {
  40.                     var j = jQuery(y).find(".word-dropped");
  41.                     if (j.length > 0) {
  42.                         w.push({
  43.                             index: jQuery(j).attr("data-index"),
  44.                             word: jQuery(j).attr("data-word")
  45.                         });
  46.                     } else {
  47.                         w.push(null);
  48.                     }
  49.                 });
  50.                 self.response.push({
  51.                     correct_answer: self.data[self.index].options,
  52.                     response: w
  53.                 });
  54.                 if (self.index < self.data.length - 1) {
  55.                     self.index++;
  56.                     self.showChallenge();
  57.                 } else {
  58.                     self.onCompletion();
  59.                 }
  60.             });
  61.         },
  62.         onCompletion: function() {
  63.             var self = this;
  64.             if (self.options.showResult) {
  65.                 self.highlightResults();
  66.             }
  67.             let res = self.response[0];
  68.             let skipped = res.response.length != res.correct_answer.length;
  69.             let r = { skipped: skipped, correct: !skipped };
  70.             for (let i = 0, j = res.response.length; i < j; i++) {
  71.                 if (res.response[i] === null) {
  72.                     r.skipped = true;
  73.                     r.correct = false;
  74.                     //break;
  75.                 } else if (res.response[i].index != res.correct_answer[i].index) {
  76.                     r.correct = false;
  77.                     //break;
  78.                 }
  79.             }
  80.  
  81.             self.$el.trigger("gameComplete", [self.response, self.data, r]);
  82.         },
  83.         highlightResults: function() {
  84.             let self = this;
  85.             let result = self.response;
  86.  
  87.             for (let i = 0; i < result.length; i++) {
  88.                 let wordHolder = self.$el.find(`.word-drop-holder-data[question-index='${i}']`);
  89.                 for (let j = 0; j < result[i].response.length; j++) {
  90.                     let curHolder = Array.from(wordHolder).filter(h => h.getAttribute("data-index") == j)[0];
  91.                     if (curHolder) {
  92.                         var response = result[i].response[j];
  93.                         if (response) {
  94.                             if (response.index == result[i].correct_answer[j].index) {
  95.                                 curHolder.classList.add("correct");
  96.                             } else {
  97.                                 curHolder.classList.add("incorrect");
  98.                             }
  99.                         }
  100.                     }
  101.                 }
  102.             }
  103.         },
  104.         toggleSubmit: function() {
  105.             //var self = this;
  106.             //if (self.options.wordsHolder.find(".word-drag").length > 0) {
  107.             //    self.options.submitBtn.prop("disabled", true);
  108.             //} else {
  109.             //    self.options.submitBtn.prop("disabled", false);
  110.             //}
  111.         },
  112.         showChallenge: function() {
  113.             var self = this;
  114.             //self.options.submitBtn.prop("disabled", true);
  115.             self.currentData = self.data[self.index];
  116.             self.options.sentenceHolder.off().empty();
  117.             self.options.wordsHolder.off().empty();
  118.             let words = [];
  119.             let optionIndex = 0;
  120.             jQuery.each(self.currentData.sentence_words, function(i, w) {
  121.                 if (w.blank) {
  122.                     words.push(
  123.                         '<div class="word-drop-holder word-drop-holder-data"' +
  124.                             `question-index = ${self.index} data-index=${optionIndex}` +
  125.                             '><div class="word-drop-zone word-drop-zone-x"></div></div>'
  126.                     );
  127.                     optionIndex++;
  128.                 } else {
  129.                     words.push('<span class="not-blank">' + w.word + "</span>");
  130.                 }
  131.             });
  132.             let buttons = [];
  133.             jQuery.each(self.currentData.shuffled, function(i, d) {
  134.                 buttons.push(self.getDragWord(d.index, d.word));
  135.             });
  136.             self.options.wordsHolder.html(buttons.join(""));
  137.             self.options.sentenceHolder.html(words.join(""));
  138.             self.setupDragDrop();
  139.             if (self.options.isBack && self.options.response.length > 0) {
  140.                 let response = self.options.response[0].response;
  141.                 jQuery.each(response, function(i, r) {
  142.                     if (r !== null) {
  143.                         let $droppable = jQuery('.word-drop-holder[data-index="' + i + '"]').find(".word-drop-zone");
  144.                         let droppableOffset = $droppable.offset();
  145.                         let $draggable = jQuery('.word-drag[data-index="' + r.index + '"]');
  146.                         let draggableOffset = $draggable.offset();
  147.                         let dx = droppableOffset.left - draggableOffset.left;
  148.                         let dy = droppableOffset.top - draggableOffset.top;
  149.  
  150.                         $draggable.simulate("drag", {
  151.                             dx: dx,
  152.                             dy: dy
  153.                         });
  154.                     }
  155.                 });
  156.             }
  157.         },
  158.         setupDragDrop: function() {
  159.             var self = this;
  160.             self.$el.find(".word-drag").draggable({
  161.                 revert: "invalid",
  162.                 scroll: true,
  163.                 helper: "clone",
  164.                 start: function() {
  165.                     self.$el.trigger("dragStart");
  166.                 },
  167.                 stop: function() {
  168.                     self.$el.trigger("dragEnd");
  169.                 }
  170.             });
  171.             self.$el.find(".word-drop-zone").droppable({
  172.                 accept: ".word-drag, .word-dropped",
  173.                 classes: {
  174.                     "ui-droppable-active": "ui-state-active",
  175.                     "ui-droppable-hover": "ui-state-hover"
  176.                 },
  177.                 drop: function(event, ui) {
  178.                     var $holder = jQuery(ui.draggable).parent();
  179.                     jQuery(this).droppable("option", "disabled", true);
  180.                     var e = self.getDragWord(ui.draggable.attr("data-index"), ui.draggable.attr("data-word"), "word-dropped");
  181.  
  182.                     if ($holder[0].querySelector("span.word-dropped")) {
  183.                         $holder.parent().addClass("word-drop-holder");
  184.                         $holder.addClass("word-drop-zone");
  185.                         $holder.addClass("ui-droppable");
  186.                     }
  187.  
  188.                     this.parentElement.classList.remove("word-drop-holder");
  189.                     this.classList.remove("word-drop-zone");
  190.                     this.classList.remove("ui-droppable");
  191.  
  192.                     jQuery(ui.draggable).detach();
  193.                     jQuery(this)
  194.                         .removeClass("word-drop-zone-x")
  195.                         .append(e);
  196.                     if ($holder.hasClass("word-drop-zone")) {
  197.                         $holder.addClass("word-drop-zone-x").removeClass("ui-droppable-disabled");
  198.                         $holder.droppable("option", "disabled", false);
  199.                     }
  200.                     self.$el.trigger("itemSelected");
  201.                     self.setupReverseDragDrop();
  202.                     self.toggleSubmit();
  203.                 }
  204.             });
  205.             self.options.wordsHolder.droppable({
  206.                 accept: ".word-dropped",
  207.                 classes: {
  208.                     "ui-droppable-active": "ui-state-active",
  209.                     "ui-droppable-hover": "ui-state-hover"
  210.                 },
  211.                 drop: function(event, ui) {
  212.                     var $holder = jQuery(ui.draggable).parent();
  213.                     var e = self.getDragWord(ui.draggable.attr("data-index"), ui.draggable.attr("data-word"));
  214.  
  215.                     jQuery(ui.draggable).detach();
  216.                     jQuery(this).append(e);
  217.                     $holder.addClass("word-drop-zone-x").removeClass("ui-droppable-disabled");
  218.                     $holder.droppable("option", "disabled", false);
  219.  
  220.                     self.setupDragDrop();
  221.                     self.toggleSubmit();
  222.                 }
  223.             });
  224.         },
  225.         setupReverseDragDrop: function() {
  226.             var self = this;
  227.             self.$el.find(".word-dropped").draggable({
  228.                 revert: "invalid",
  229.                 scroll: true,
  230.                 helper: "clone"
  231.             });
  232.         },
  233.         getDragWord: function(index, word, cls) {
  234.             let self = this;
  235.             if (typeof cls === "undefined") {
  236.                 cls = "word-drag";
  237.             }
  238.             return '<span class="' + cls + '" data-word="' + self.escapeHTML(word) + '" data-index="' + index + '">' + word + "</span>";
  239.         },
  240.         setupData: function() {
  241.             var self = this;
  242.             var sentences = [];
  243.             var i, j, k, l, tmp, sentence;
  244.             for (i = 0, j = self.options.sentences.length; i < j; i++) {
  245.                 sentence = [];
  246.                 tmp = self.options.sentences[i].sentence.split(self.options.blank);
  247.                 for (k = 0, l = tmp.length; k < l; k++) {
  248.                     sentence.push({
  249.                         word: tmp[k],
  250.                         blank: false
  251.                     });
  252.                     if (k + 1 < l) {
  253.                         sentence.push({
  254.                             word: self.options.sentences[i].words[k],
  255.                             blank: true
  256.                         });
  257.                     }
  258.                 }
  259.                 sentences.push(sentence);
  260.             }
  261.             for (i = 0, j = sentences.length; i < j; i++) {
  262.                 var sentence_words = sentences[i];
  263.                 var options = [];
  264.                 var blank_index = 0;
  265.                 jQuery.each(sentence_words, function(i, w) {
  266.                     if (w.blank) {
  267.                         options.push({ index: blank_index, word: w.word });
  268.                         blank_index++;
  269.                     }
  270.                 });
  271.  
  272.                 tmp = {
  273.                     sentence_words: sentences[i].slice(),
  274.                     options: options,
  275.                     shuffled: options.slice()
  276.                 };
  277.                 self.shuffle(tmp.shuffled);
  278.                 self.data.push(tmp);
  279.             }
  280.             self.shuffle(self.data);
  281.         },
  282.         shuffle: function(array) {
  283.             var currentIndex = array.length;
  284.             var temporaryValue, randomIndex;
  285.             while (0 !== currentIndex) {
  286.                 randomIndex = Math.floor(Math.random() * currentIndex);
  287.                 currentIndex -= 1;
  288.                 temporaryValue = array[currentIndex];
  289.                 array[currentIndex] = array[randomIndex];
  290.                 array[randomIndex] = temporaryValue;
  291.             }
  292.             return array;
  293.         },
  294.         escapeHTML: function(html) {
  295.             return html
  296.                 .replace(/&/g, "&amp;")
  297.                 .replace(/</g, "&lt;")
  298.                 .replace(/>/g, "&gt;")
  299.                 .replace(/"/g, "&quot;")
  300.                 .replace(/'/g, "&#039;");
  301.         }
  302.     };
  303.  
  304.     jQuery.fn.FillBlanksDDGame = function(options) {
  305.         var args = Array.prototype.slice.call(arguments, 1);
  306.         var plgName = "FillBlanksDDGame";
  307.         return this.each(function() {
  308.             var inst = jQuery.data(this, plgName);
  309.             if (typeof inst === "undefined") {
  310.                 if (typeof options === "undefined" || typeof options == "string" || options instanceof String) {
  311.                     throw "invalid options passed while creating new instance.";
  312.                 }
  313.                 if (typeof options.sentences === "undefined" || !jQuery.isArray(options.sentences)) {
  314.                     throw "invalid options";
  315.                 }
  316.                 var p = new FillBlanksDDGame(this, options);
  317.                 jQuery.data(this, plgName, p);
  318.             } else if (typeof options !== "undefined") {
  319.                 if (typeof inst[options] === "function") {
  320.                     inst[options].apply(inst, args);
  321.                 }
  322.             }
  323.         });
  324.     };
  325. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement