MDL-69104 Questions: Drag and drop question family don't work with iOS
[moodle.git] / question / type / ddmarker / amd / build / question.min.js.map
CommitLineData
5fa8f1c8 1{"version":3,"sources":["../src/question.js"],"names":["define","$","dragDrop","Shapes","keys","DragDropMarkersQuestion","containerId","readOnly","visibleDropZones","thisQ","shapes","shapeSVGs","isPrinting","getRoot","addClass","cloneDrags","repositionDrags","drawDropzones","prototype","length","bgImage","find","html","outerWidth","outerHeight","svg","nextColourIndex","dropZoneNo","colourClass","addDropzone","dropZone","shape","make","existingmarkertext","bgRatio","parse","coords","markertext","remove","append","markerspan","handles","getHandlePositions","positionLeft","moveHandle","x","positionTop","y","css","data","position","left","top","handleElementScale","shapeSVG","makeSvg","setAttribute","root","not","each","key","item","input","choiceNo","getChoiceNoFromElement","getCoords","drag","i","dragInDrop","clone","sendDragToDrop","getDragClone","cloneDragIfNeeded","inputNode","val","coordsStrings","split","convertToWindowXY","Point","point","offset","convertToBgImgXY","coordsInBgImg","bgPosition","width","height","document","getElementById","handleDragStart","e","dragged","target","closest","info","prepare","start","placed","hasClass","hiddenDrag","dragEnd","dragXY","bgImgXY","sendDragHome","removeDragIfNeeded","saveCoordsForChoice","items","thiQ","join","handleKeyPress","keyCode","arrowLeft","arrowRight","arrowDown","arrowUp","space","escape","preventDefault","constrainToBgImg","focus","windowxy","bgImg","Math","max","min","node","getClassnameNumericSuffix","prefix","classes","attr","classesarr","index","patt1","RegExp","test","match","exec","handleResize","parseFloat","originCoords","updateSvg","markerSpan","draghome","placeHolder","removeClass","getDragNo","before","dropArea","after","isScaling","getInput","noOfDrags","displayedDragsInDropArea","displayedDragsInDragHomes","dragclone","questionManager","addEventHandlersToMarker","displayeddrags","first","bgImgNaturalWidth","get","naturalWidth","bgImgClientWidth","element","type","eventHandlersInitialised","isKeyboardNavigation","questions","init","setupEventHandlers","window","on","handleWindowResize","addEventListener","setTimeout","fixLayoutIfThingsMoved","focusin","handleKeyboardFocus","focusout","question","getQuestionForEvent","hasOwnProperty","isNavigating","currentTarget"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Question class for drag and drop marker question type, used to support the question and preview pages.\n *\n * @package qtype_ddmarker\n * @subpackage question\n * @copyright 2018 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/dragdrop', 'qtype_ddmarker/shapes', 'core/key_codes'], function($, dragDrop, Shapes, keys) {\n\n \"use strict\";\n\n /**\n * Object to handle one drag-drop markers question.\n *\n * @param {String} containerId id of the outer div for this question.\n * @param {boolean} readOnly whether the question is being displayed read-only.\n * @param {Object[]} visibleDropZones the geometry of any drop-zones to show.\n * Objects have fields shape, coords and markertext.\n * @constructor\n */\n function DragDropMarkersQuestion(containerId, readOnly, visibleDropZones) {\n var thisQ = this;\n this.containerId = containerId;\n this.visibleDropZones = visibleDropZones;\n this.shapes = [];\n this.shapeSVGs = [];\n this.isPrinting = false;\n if (readOnly) {\n this.getRoot().addClass('qtype_ddmarker-readonly');\n }\n thisQ.cloneDrags();\n thisQ.repositionDrags();\n thisQ.drawDropzones();\n }\n\n /**\n * Draws the svg shapes of any drop zones that should be visible for feedback purposes.\n */\n DragDropMarkersQuestion.prototype.drawDropzones = function() {\n if (this.visibleDropZones.length > 0) {\n var bgImage = this.bgImage();\n\n this.getRoot().find('div.dropzones').html('<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"dropzones\" ' +\n 'width=\"' + bgImage.outerWidth() + '\" ' +\n 'height=\"' + bgImage.outerHeight() + '\"></svg>');\n var svg = this.getRoot().find('svg.dropzones');\n\n var nextColourIndex = 0;\n for (var dropZoneNo = 0; dropZoneNo < this.visibleDropZones.length; dropZoneNo++) {\n var colourClass = 'color' + nextColourIndex;\n nextColourIndex = (nextColourIndex + 1) % 8;\n this.addDropzone(svg, dropZoneNo, colourClass);\n }\n }\n };\n\n /**\n * Adds a dropzone shape with colour, coords and link provided to the array of shapes.\n *\n * @param {jQuery} svg the SVG image to which to add this drop zone.\n * @param {int} dropZoneNo which drop-zone to add.\n * @param {string} colourClass class name\n */\n DragDropMarkersQuestion.prototype.addDropzone = function(svg, dropZoneNo, colourClass) {\n var dropZone = this.visibleDropZones[dropZoneNo],\n shape = Shapes.make(dropZone.shape, ''),\n existingmarkertext,\n bgRatio = this.bgRatio();\n if (!shape.parse(dropZone.coords, bgRatio)) {\n return;\n }\n\n existingmarkertext = this.getRoot().find('div.markertexts span.markertext' + dropZoneNo);\n if (existingmarkertext.length) {\n if (dropZone.markertext !== '') {\n existingmarkertext.html(dropZone.markertext);\n } else {\n existingmarkertext.remove();\n }\n } else if (dropZone.markertext !== '') {\n var classnames = 'markertext markertext' + dropZoneNo;\n this.getRoot().find('div.markertexts').append('<span class=\"' + classnames + '\">' +\n dropZone.markertext + '</span>');\n var markerspan = this.getRoot().find('div.ddarea div.markertexts span.markertext' + dropZoneNo);\n if (markerspan.length) {\n var handles = shape.getHandlePositions();\n var positionLeft = handles.moveHandle.x - (markerspan.outerWidth() / 2) - 4;\n var positionTop = handles.moveHandle.y - (markerspan.outerHeight() / 2);\n markerspan\n .css('left', positionLeft)\n .css('top', positionTop);\n markerspan\n .data('originX', markerspan.position().left / bgRatio)\n .data('originY', markerspan.position().top / bgRatio);\n this.handleElementScale(markerspan, 'center');\n }\n }\n\n var shapeSVG = shape.makeSvg(svg[0]);\n shapeSVG.setAttribute('class', 'dropzone ' + colourClass);\n\n this.shapes[this.shapes.length] = shape;\n this.shapeSVGs[this.shapeSVGs.length] = shapeSVG;\n };\n\n /**\n * Draws the drag items on the page (and drop zones if required).\n * The idea is to re-draw all the drags and drops whenever there is a change\n * like a widow resize or an item dropped in place.\n */\n DragDropMarkersQuestion.prototype.repositionDrags = function() {\n var root = this.getRoot(),\n thisQ = this;\n\n root.find('div.draghomes .marker').not('.dragplaceholder').each(function(key, item) {\n $(item).addClass('unneeded');\n });\n\n root.find('input.choices').each(function(key, input) {\n var choiceNo = thisQ.getChoiceNoFromElement(input),\n coords = thisQ.getCoords(input);\n if (coords.length) {\n var drag = thisQ.getRoot().find('.draghomes' + ' span.marker' + '.choice' + choiceNo).not('.dragplaceholder');\n drag.remove();\n for (var i = 0; i < coords.length; i++) {\n var dragInDrop = drag.clone();\n dragInDrop.data('pagex', coords[i].x).data('pagey', coords[i].y);\n thisQ.sendDragToDrop(dragInDrop, false);\n }\n thisQ.getDragClone(drag).addClass('active');\n thisQ.cloneDragIfNeeded(drag);\n }\n });\n };\n\n /**\n * Determine what drag items need to be shown and\n * return coords of all drag items except any that are currently being dragged\n * based on contents of hidden inputs and whether drags are 'infinite' or how many\n * drags should be shown.\n *\n * @param {jQuery} inputNode\n * @returns {Point[]} coordinates of however many copies of the drag item should be shown.\n */\n DragDropMarkersQuestion.prototype.getCoords = function(inputNode) {\n var coords = [],\n val = $(inputNode).val();\n if (val !== '') {\n var coordsStrings = val.split(';');\n for (var i = 0; i < coordsStrings.length; i++) {\n coords[i] = this.convertToWindowXY(Shapes.Point.parse(coordsStrings[i]));\n }\n }\n return coords;\n };\n\n /**\n * Converts the relative x and y position coordinates into\n * absolute x and y position coordinates.\n *\n * @param {Point} point relative to the background image.\n * @returns {Point} point relative to the page.\n */\n DragDropMarkersQuestion.prototype.convertToWindowXY = function(point) {\n var bgImage = this.bgImage();\n // The +1 seems rather odd, but seems to give the best results in\n // the three main browsers at a range of zoom levels.\n // (Its due to the 1px border around the image, that shifts the\n // image pixels by 1 down and to the left.)\n return point.offset(bgImage.offset().left + 1, bgImage.offset().top + 1);\n };\n\n /**\n * Utility function converting window coordinates to relative to the\n * background image coordinates.\n *\n * @param {Point} point relative to the page.\n * @returns {Point} point relative to the background image.\n */\n DragDropMarkersQuestion.prototype.convertToBgImgXY = function(point) {\n var bgImage = this.bgImage();\n return point.offset(-bgImage.offset().left - 1, -bgImage.offset().top - 1);\n };\n\n /**\n * Is the point within the background image?\n *\n * @param {Point} point relative to the BG image.\n * @return {boolean} true it they are.\n */\n DragDropMarkersQuestion.prototype.coordsInBgImg = function(point) {\n var bgImage = this.bgImage();\n var bgPosition = bgImage.offset();\n\n return point.x >= bgPosition.left && point.x < bgPosition.left + bgImage.width()\n && point.y >= bgPosition.top && point.y < bgPosition.top + bgImage.height();\n };\n\n /**\n * Get the outer div for this question.\n * @returns {jQuery} containing that div.\n */\n DragDropMarkersQuestion.prototype.getRoot = function() {\n return $(document.getElementById(this.containerId));\n };\n\n /**\n * Get the img that is the background image.\n * @returns {jQuery} containing that img.\n */\n DragDropMarkersQuestion.prototype.bgImage = function() {\n return this.getRoot().find('img.dropbackground');\n };\n\n DragDropMarkersQuestion.prototype.handleDragStart = function(e) {\n var thisQ = this,\n dragged = $(e.target).closest('.marker');\n\n var info = dragDrop.prepare(e);\n if (!info.start) {\n return;\n }\n\n dragged.addClass('beingdragged').css('transform', '');\n\n var placed = !dragged.hasClass('unneeded');\n if (!placed) {\n var hiddenDrag = thisQ.getDragClone(dragged);\n if (hiddenDrag.length) {\n hiddenDrag.addClass('active');\n dragged.offset(hiddenDrag.offset());\n }\n }\n\n dragDrop.start(e, dragged, function() {\n void (1);\n }, function(x, y, dragged) {\n thisQ.dragEnd(dragged);\n });\n };\n\n /**\n * Functionality at the end of a drag drop.\n * @param {jQuery} dragged the marker that was dragged.\n */\n DragDropMarkersQuestion.prototype.dragEnd = function(dragged) {\n var placed = false,\n choiceNo = this.getChoiceNoFromElement(dragged),\n bgRatio = this.bgRatio(),\n dragXY;\n\n dragged.data('pagex', dragged.offset().left).data('pagey', dragged.offset().top);\n dragXY = new Shapes.Point(dragged.data('pagex'), dragged.data('pagey'));\n if (this.coordsInBgImg(dragXY)) {\n this.sendDragToDrop(dragged, true);\n placed = true;\n\n // It seems that the dragdrop sometimes leaves the drag\n // one pixel out of position. Put it in exactly the right place.\n var bgImgXY = this.convertToBgImgXY(dragXY);\n bgImgXY = new Shapes.Point(bgImgXY.x / bgRatio, bgImgXY.y / bgRatio);\n dragged.data('originX', bgImgXY.x).data('originY', bgImgXY.y);\n }\n\n if (!placed) {\n this.sendDragHome(dragged);\n this.removeDragIfNeeded(dragged);\n } else {\n this.cloneDragIfNeeded(dragged);\n }\n\n this.saveCoordsForChoice(choiceNo);\n };\n\n /**\n * Save the coordinates for a dropped item in the form field.\n * @param {Number} choiceNo which copy of the choice this was.\n */\n DragDropMarkersQuestion.prototype.saveCoordsForChoice = function(choiceNo) {\n var coords = [],\n items = this.getRoot().find('div.droparea span.marker.choice' + choiceNo),\n thiQ = this,\n bgRatio = this.bgRatio();\n\n if (items.length) {\n items.each(function() {\n var drag = $(this);\n if (!drag.hasClass('beingdragged')) {\n var dragXY = new Shapes.Point(drag.data('pagex'), drag.data('pagey'));\n if (thiQ.coordsInBgImg(dragXY)) {\n var bgImgXY = thiQ.convertToBgImgXY(dragXY);\n bgImgXY = new Shapes.Point(bgImgXY.x / bgRatio, bgImgXY.y / bgRatio);\n coords[coords.length] = bgImgXY;\n }\n }\n });\n }\n\n this.getRoot().find('input.choice' + choiceNo).val(coords.join(';'));\n };\n\n /**\n * Handle key down / press events on markers.\n * @param {KeyboardEvent} e\n */\n DragDropMarkersQuestion.prototype.handleKeyPress = function(e) {\n var drag = $(e.target).closest('.marker'),\n point = new Shapes.Point(drag.offset().left, drag.offset().top),\n choiceNo = this.getChoiceNoFromElement(drag);\n\n switch (e.keyCode) {\n case keys.arrowLeft:\n case 65: // A.\n point.x -= 1;\n break;\n case keys.arrowRight:\n case 68: // D.\n point.x += 1;\n break;\n case keys.arrowDown:\n case 83: // S.\n point.y += 1;\n break;\n case keys.arrowUp:\n case 87: // W.\n point.y -= 1;\n break;\n case keys.space:\n case keys.escape:\n point = null;\n break;\n default:\n return; // Ingore other keys.\n }\n e.preventDefault();\n\n if (point !== null) {\n point = this.constrainToBgImg(point);\n drag.offset({'left': point.x, 'top': point.y});\n drag.data('pagex', drag.offset().left).data('pagey', drag.offset().top);\n var dragXY = this.convertToBgImgXY(new Shapes.Point(drag.data('pagex'), drag.data('pagey')));\n drag.data('originX', dragXY.x / this.bgRatio()).data('originY', dragXY.y / this.bgRatio());\n if (this.coordsInBgImg(new Shapes.Point(drag.offset().left, drag.offset().top))) {\n if (drag.hasClass('unneeded')) {\n this.sendDragToDrop(drag, true);\n var hiddenDrag = this.getDragClone(drag);\n if (hiddenDrag.length) {\n hiddenDrag.addClass('active');\n }\n this.cloneDragIfNeeded(drag);\n }\n }\n } else {\n drag.css('left', '').css('top', '');\n drag.data('pagex', drag.offset().left).data('pagey', drag.offset().top);\n this.sendDragHome(drag);\n this.removeDragIfNeeded(drag);\n }\n drag.focus();\n this.saveCoordsForChoice(choiceNo);\n };\n\n /**\n * Makes sure the dragged item always exists within the background image area.\n *\n * @param {Point} windowxy\n * @returns {Point} coordinates\n */\n DragDropMarkersQuestion.prototype.constrainToBgImg = function(windowxy) {\n var bgImg = this.bgImage(),\n bgImgXY = this.convertToBgImgXY(windowxy);\n bgImgXY.x = Math.max(0, bgImgXY.x);\n bgImgXY.y = Math.max(0, bgImgXY.y);\n bgImgXY.x = Math.min(bgImg.width(), bgImgXY.x);\n bgImgXY.y = Math.min(bgImg.height(), bgImgXY.y);\n return this.convertToWindowXY(bgImgXY);\n };\n\n /**\n * Returns the choice number for a node.\n *\n * @param {Element|jQuery} node\n * @returns {Number}\n */\n DragDropMarkersQuestion.prototype.getChoiceNoFromElement = function(node) {\n return Number(this.getClassnameNumericSuffix(node, 'choice'));\n };\n\n /**\n * Returns the numeric part of a class with the given prefix.\n *\n * @param {Element|jQuery} node\n * @param {String} prefix\n * @returns {Number|null}\n */\n DragDropMarkersQuestion.prototype.getClassnameNumericSuffix = function(node, prefix) {\n var classes = $(node).attr('class');\n if (classes !== undefined && classes !== '') {\n var classesarr = classes.split(' ');\n for (var index = 0; index < classesarr.length; index++) {\n var patt1 = new RegExp('^' + prefix + '([0-9])+$');\n if (patt1.test(classesarr[index])) {\n var patt2 = new RegExp('([0-9])+$');\n var match = patt2.exec(classesarr[index]);\n return Number(match[0]);\n }\n }\n }\n return null;\n };\n\n /**\n * Handle when the window is resized.\n */\n DragDropMarkersQuestion.prototype.handleResize = function() {\n var thisQ = this,\n bgRatio = this.bgRatio();\n if (this.isPrinting) {\n bgRatio = 1;\n }\n\n this.getRoot().find('div.droparea .marker').not('.beingdragged').each(function(key, drag) {\n $(drag)\n .css('left', parseFloat($(drag).data('originX')) * parseFloat(bgRatio))\n .css('top', parseFloat($(drag).data('originY')) * parseFloat(bgRatio));\n thisQ.handleElementScale(drag, 'left top');\n });\n\n this.getRoot().find('div.droparea svg.dropzones')\n .width(this.bgImage().width())\n .height(this.bgImage().height());\n\n for (var dropZoneNo = 0; dropZoneNo < this.visibleDropZones.length; dropZoneNo++) {\n var dropZone = thisQ.visibleDropZones[dropZoneNo];\n var originCoords = dropZone.coords;\n var shape = thisQ.shapes[dropZoneNo];\n var shapeSVG = thisQ.shapeSVGs[dropZoneNo];\n shape.parse(originCoords, bgRatio);\n shape.updateSvg(shapeSVG);\n\n var handles = shape.getHandlePositions();\n var markerSpan = this.getRoot().find('div.ddarea div.markertexts span.markertext' + dropZoneNo);\n markerSpan\n .css('left', handles.moveHandle.x - (markerSpan.outerWidth() / 2) - 4)\n .css('top', handles.moveHandle.y - (markerSpan.outerHeight() / 2));\n thisQ.handleElementScale(markerSpan, 'center');\n }\n };\n\n /**\n * Clone the drag.\n */\n DragDropMarkersQuestion.prototype.cloneDrags = function() {\n var thisQ = this;\n this.getRoot().find('div.draghomes span.marker').each(function(index, draghome) {\n var drag = $(draghome);\n var placeHolder = drag.clone();\n placeHolder.removeClass();\n placeHolder.addClass('marker choice' +\n thisQ.getChoiceNoFromElement(drag) + ' dragno' + thisQ.getDragNo(drag) + ' dragplaceholder');\n drag.before(placeHolder);\n });\n };\n\n /**\n * Get the drag number of a drag.\n *\n * @param {jQuery} drag the drag.\n * @returns {Number} the drag number.\n */\n DragDropMarkersQuestion.prototype.getDragNo = function(drag) {\n return this.getClassnameNumericSuffix(drag, 'dragno');\n };\n\n /**\n * Get drag clone for a given drag.\n *\n * @param {jQuery} drag the drag.\n * @returns {jQuery} the drag's clone.\n */\n DragDropMarkersQuestion.prototype.getDragClone = function(drag) {\n return this.getRoot().find('.draghomes' + ' span.marker' +\n '.choice' + this.getChoiceNoFromElement(drag) + '.dragno' + this.getDragNo(drag) + '.dragplaceholder');\n };\n\n /**\n * Get the drop area element.\n * @returns {jQuery} droparea element.\n */\n DragDropMarkersQuestion.prototype.dropArea = function() {\n return this.getRoot().find('div.droparea');\n };\n\n /**\n * Animate a drag back to its home.\n *\n * @param {jQuery} drag the item being moved.\n */\n DragDropMarkersQuestion.prototype.sendDragHome = function(drag) {\n drag.removeClass('beingdragged')\n .addClass('unneeded')\n .css('top', '')\n .css('left', '')\n .css('transform', '');\n var placeHolder = this.getDragClone(drag);\n placeHolder.after(drag);\n placeHolder.removeClass('active');\n };\n\n /**\n * Animate a drag item into a given place.\n *\n * @param {jQuery} drag the item to place.\n * @param {boolean} isScaling Scaling or not\n */\n DragDropMarkersQuestion.prototype.sendDragToDrop = function(drag, isScaling) {\n var dropArea = this.dropArea(),\n bgRatio = this.bgRatio();\n drag.removeClass('beingdragged').removeClass('unneeded');\n var dragXY = this.convertToBgImgXY(new Shapes.Point(drag.data('pagex'), drag.data('pagey')));\n if (isScaling) {\n drag.data('originX', dragXY.x / bgRatio).data('originY', dragXY.y / bgRatio);\n drag.css('left', dragXY.x).css('top', dragXY.y);\n } else {\n drag.data('originX', dragXY.x).data('originY', dragXY.y);\n drag.css('left', dragXY.x * bgRatio).css('top', dragXY.y * bgRatio);\n }\n dropArea.append(drag);\n this.handleElementScale(drag, 'left top');\n };\n\n /**\n * Clone the drag at the draghome area if needed.\n *\n * @param {jQuery} drag the item to place.\n */\n DragDropMarkersQuestion.prototype.cloneDragIfNeeded = function(drag) {\n var inputNode = this.getInput(drag),\n noOfDrags = Number(this.getClassnameNumericSuffix(inputNode, 'noofdrags')),\n displayedDragsInDropArea = this.getRoot().find('div.droparea .marker.choice' +\n this.getChoiceNoFromElement(drag) + '.dragno' + this.getDragNo(drag)).length,\n displayedDragsInDragHomes = this.getRoot().find('div.draghomes .marker.choice' +\n this.getChoiceNoFromElement(drag) + '.dragno' + this.getDragNo(drag)).not('.dragplaceholder').length;\n\n if (displayedDragsInDropArea < noOfDrags && displayedDragsInDragHomes === 0) {\n var dragclone = drag.clone();\n dragclone.addClass('unneeded')\n .css('top', '')\n .css('left', '')\n .css('transform', '');\n this.getDragClone(drag)\n .removeClass('active')\n .after(dragclone);\n questionManager.addEventHandlersToMarker(dragclone);\n }\n };\n\n /**\n * Remove the clone drag at the draghome area if needed.\n *\n * @param {jQuery} drag the item to place.\n */\n DragDropMarkersQuestion.prototype.removeDragIfNeeded = function(drag) {\n var displayeddrags = this.getRoot().find('div.draghomes .marker.choice' +\n this.getChoiceNoFromElement(drag) + '.dragno' + this.getDragNo(drag)).not('.dragplaceholder').length;\n if (displayeddrags > 1) {\n this.getRoot().find('div.draghomes .marker.choice' +\n this.getChoiceNoFromElement(drag) + '.dragno' + this.getDragNo(drag)).not('.dragplaceholder').first().remove();\n }\n };\n\n /**\n * Get the input belong to drag.\n *\n * @param {jQuery} drag the item to place.\n * @returns {jQuery} input element.\n */\n DragDropMarkersQuestion.prototype.getInput = function(drag) {\n var choiceNo = this.getChoiceNoFromElement(drag);\n return this.getRoot().find('input.choices.choice' + choiceNo);\n };\n\n /**\n * Return the background ratio.\n *\n * @returns {number} Background ratio.\n */\n DragDropMarkersQuestion.prototype.bgRatio = function() {\n var bgImg = this.bgImage();\n var bgImgNaturalWidth = bgImg.get(0).naturalWidth;\n var bgImgClientWidth = bgImg.width();\n\n return bgImgClientWidth / bgImgNaturalWidth;\n };\n\n /**\n * Scale the drag if needed.\n *\n * @param {jQuery} element the item to place.\n * @param {String} type scaling type\n */\n DragDropMarkersQuestion.prototype.handleElementScale = function(element, type) {\n var bgRatio = parseFloat(this.bgRatio());\n if (this.isPrinting) {\n bgRatio = 1;\n }\n $(element).css({\n '-webkit-transform': 'scale(' + bgRatio + ')',\n '-moz-transform': 'scale(' + bgRatio + ')',\n '-ms-transform': 'scale(' + bgRatio + ')',\n '-o-transform': 'scale(' + bgRatio + ')',\n 'transform': 'scale(' + bgRatio + ')',\n 'transform-origin': type\n });\n };\n\n /**\n * Singleton that tracks all the DragDropToTextQuestions on this page, and deals\n * with event dispatching.\n *\n * @type {Object}\n */\n var questionManager = {\n\n /**\n * {boolean} ensures that the event handlers are only initialised once per page.\n */\n eventHandlersInitialised: false,\n\n /**\n * {boolean} is printing or not.\n */\n isPrinting: false,\n\n /**\n * {boolean} is keyboard navigation.\n */\n isKeyboardNavigation: false,\n\n /**\n * {Object} all the questions on this page, indexed by containerId (id on the .que div).\n */\n questions: {}, // An object containing all the information about each question on the page.\n\n /**\n * Initialise one question.\n *\n * @param {String} containerId the id of the div.que that contains this question.\n * @param {boolean} readOnly whether the question is read-only.\n * @param {Object[]} visibleDropZones data on any drop zones to draw as part of the feedback.\n */\n init: function(containerId, readOnly, visibleDropZones) {\n questionManager.questions[containerId] =\n new DragDropMarkersQuestion(containerId, readOnly, visibleDropZones);\n if (!questionManager.eventHandlersInitialised) {\n questionManager.setupEventHandlers();\n questionManager.eventHandlersInitialised = true;\n }\n },\n\n /**\n * Set up the event handlers that make this question type work. (Done once per page.)\n */\n setupEventHandlers: function() {\n // We do not use the body event here to prevent the other event on Mobile device, such as scroll event.\n questionManager.addEventHandlersToMarker($('.que.ddmarker:not(.qtype_ddmarker-readonly) div.draghomes .marker'));\n questionManager.addEventHandlersToMarker($('.que.ddmarker:not(.qtype_ddmarker-readonly) div.droparea .marker'));\n $(window).on('resize', function() {\n questionManager.handleWindowResize(false);\n });\n window.addEventListener('beforeprint', function() {\n questionManager.isPrinting = true;\n questionManager.handleWindowResize(questionManager.isPrinting);\n });\n window.addEventListener('afterprint', function() {\n questionManager.isPrinting = false;\n questionManager.handleWindowResize(questionManager.isPrinting);\n });\n setTimeout(function() {\n questionManager.fixLayoutIfThingsMoved();\n }, 100);\n },\n\n /**\n * Binding the event again for newly created element.\n *\n * @param {jQuery} element Element to bind the event\n */\n addEventHandlersToMarker: function(element) {\n element\n .on('mousedown touchstart', questionManager.handleDragStart)\n .on('keydown keypress', questionManager.handleKeyPress)\n .focusin(function(e) {\n questionManager.handleKeyboardFocus(e, true);\n })\n .focusout(function(e) {\n questionManager.handleKeyboardFocus(e, false);\n });\n },\n\n /**\n * Handle mouse down / touch start events on markers.\n * @param {Event} e the DOM event.\n */\n handleDragStart: function(e) {\n e.preventDefault();\n var question = questionManager.getQuestionForEvent(e);\n if (question) {\n question.handleDragStart(e);\n }\n },\n\n /**\n * Handle key down / press events on markers.\n * @param {Event} e\n */\n handleKeyPress: function(e) {\n var question = questionManager.getQuestionForEvent(e);\n if (question) {\n question.handleKeyPress(e);\n }\n },\n\n /**\n * Handle when the window is resized.\n * @param {boolean} isPrinting\n */\n handleWindowResize: function(isPrinting) {\n for (var containerId in questionManager.questions) {\n if (questionManager.questions.hasOwnProperty(containerId)) {\n questionManager.questions[containerId].isPrinting = isPrinting;\n questionManager.questions[containerId].handleResize();\n }\n }\n },\n\n /**\n * Handle focus lost events on markers.\n * @param {Event} e\n * @param {boolean} isNavigating\n */\n handleKeyboardFocus: function(e, isNavigating) {\n questionManager.isKeyboardNavigation = isNavigating;\n },\n\n /**\n * Sometimes, despite our best efforts, things change in a way that cannot\n * be specifically caught (e.g. dock expanding or collapsing in Boost).\n * Therefore, we need to periodically check everything is in the right position.\n */\n fixLayoutIfThingsMoved: function() {\n if (!questionManager.isKeyboardNavigation) {\n this.handleWindowResize(questionManager.isPrinting);\n }\n // We use setTimeout after finishing work, rather than setInterval,\n // in case positioning things is slow. We want 100 ms gap\n // between executions, not what setInterval does.\n setTimeout(function() {\n questionManager.fixLayoutIfThingsMoved(questionManager.isPrinting);\n }, 100);\n },\n\n /**\n * Given an event, work out which question it effects.\n * @param {Event} e the event.\n * @returns {DragDropMarkersQuestion|undefined} The question, or undefined.\n */\n getQuestionForEvent: function(e) {\n var containerId = $(e.currentTarget).closest('.que.ddmarker').attr('id');\n return questionManager.questions[containerId];\n }\n };\n\n /**\n * @alias module:qtype_ddmarker/question\n */\n return {\n /**\n * Initialise one drag-drop markers question.\n *\n * @param {String} containerId id of the outer div for this question.\n * @param {String} bgImgUrl the URL of the background image.\n * @param {boolean} readOnly whether the question is being displayed read-only.\n * @param {String[]} visibleDropZones the geometry of any drop-zones to show.\n */\n init: questionManager.init\n };\n});\n"],"file":"question.min.js"}