{"version":3,"file":"uploadquestion.min.js","sources":["../src/ajaxupload.js","../src/modaldialog.js","../src/uploader.js"],"sourcesContent":["/**\n * AJAX Upload ( http://valums.com/ajax-upload/ )\n * Copyright (c) Andrew Valums\n * Licensed under the MIT license\n */\n(function () {\n /**\n * Attaches event to a dom element.\n * @param {Element} el\n * @param type event name\n * @param fn callback This refers to the passed element\n */\n function addEvent(el, type, fn){\n if (el.addEventListener) {\n el.addEventListener(type, fn, false);\n } else if (el.attachEvent) {\n el.attachEvent('on' + type, function(){\n fn.call(el);\n });\n } else {\n throw new Error('not supported or DOM not loaded');\n }\n }\n\n /**\n * Attaches resize event to a window, limiting\n * number of event fired. Fires only when encounteres\n * delay of 100 after series of events.\n *\n * Some browsers fire event multiple times when resizing\n * http://www.quirksmode.org/dom/events/resize.html\n *\n * @param fn callback This refers to the passed element\n */\n function addResizeEvent(fn){\n var timeout;\n\n addEvent(window, 'resize', function(){\n if (timeout){\n clearTimeout(timeout);\n }\n timeout = setTimeout(fn, 100);\n });\n }\n\n // Needs more testing, will be rewriten for next version\n // getOffset function copied from jQuery lib (http://jquery.com/)\n if (document.documentElement.getBoundingClientRect){\n // Get Offset using getBoundingClientRect\n // http://ejohn.org/blog/getboundingclientrect-is-awesome/\n var getOffset = function(el){\n var box = el.getBoundingClientRect();\n var doc = el.ownerDocument;\n var body = doc.body;\n var docElem = doc.documentElement; // for ie\n var clientTop = docElem.clientTop || body.clientTop || 0;\n var clientLeft = docElem.clientLeft || body.clientLeft || 0;\n\n // In Internet Explorer 7 getBoundingClientRect property is treated as physical,\n // while others are logical. Make all logical, like in IE8.\n var zoom = 1;\n if (body.getBoundingClientRect) {\n var bound = body.getBoundingClientRect();\n zoom = (bound.right - bound.left) / body.clientWidth;\n }\n\n if (zoom > 1) {\n clientTop = 0;\n clientLeft = 0;\n }\n\n var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;\n\n return {\n top: top,\n left: left\n };\n };\n } else {\n // Get offset adding all offsets\n var getOffset = function(el){\n var top = 0, left = 0;\n do {\n top += el.offsetTop || 0;\n left += el.offsetLeft || 0;\n el = el.offsetParent;\n } while (el);\n\n return {\n left: left,\n top: top\n };\n };\n }\n\n /**\n * Returns left, top, right and bottom properties describing the border-box,\n * in pixels, with the top-left relative to the body\n * @param {Element} el\n * @return {Object} Contains left, top, right,bottom\n */\n function getBox(el){\n var left, right, top, bottom;\n var offset = getOffset(el);\n left = offset.left;\n top = offset.top;\n\n right = left + el.offsetWidth;\n bottom = top + el.offsetHeight;\n\n return {\n left: left,\n right: right,\n top: top,\n bottom: bottom\n };\n }\n\n /**\n * Helper that takes object literal\n * and add all properties to element.style\n * @param {Element} el\n * @param {Object} styles\n */\n function addStyles(el, styles){\n for (var name in styles) {\n if (styles.hasOwnProperty(name)) {\n el.style[name] = styles[name];\n }\n }\n }\n\n /**\n * Function places an absolutely positioned\n * element on top of the specified element\n * copying position and dimentions.\n * @param {Element} from\n * @param {Element} to\n */\n function copyLayout(from, to){\n var box = getBox(from);\n\n addStyles(to, {\n position: 'absolute',\n left : box.left + 'px',\n top : box.top + 'px',\n width : from.offsetWidth + 'px',\n height : from.offsetHeight + 'px'\n });\n }\n\n /**\n * Creates and returns element from html chunk\n * Uses innerHTML to create an element\n */\n var toElement = (function(){\n var div = document.createElement('div');\n return function(html){\n div.innerHTML = html;\n var el = div.firstChild;\n return div.removeChild(el);\n };\n })();\n\n /**\n * Function generates unique id\n * @return unique id\n */\n var getUID = (function(){\n var id = 0;\n return function(){\n return 'ValumsAjaxUpload' + id++;\n };\n })();\n\n /**\n * Get file name from path\n * @param {String} file path to file\n * @return filename\n */\n function fileFromPath(file){\n return file.replace(/.*(\\/|\\\\)/, \"\");\n }\n\n /**\n * Get file extension lowercase\n * @param {String} file name\n * @return file extenstion\n */\n function getExt(file){\n file = file.toLowerCase();\n return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';\n }\n\n function hasClass(el, name){\n var re = new RegExp('\\\\b' + name + '\\\\b');\n return re.test(el.className);\n }\n function addClass(el, name){\n if ( ! hasClass(el, name)){\n el.className += ' ' + name;\n }\n }\n function removeClass(el, name){\n var re = new RegExp('\\\\b' + name + '\\\\b');\n el.className = el.className.replace(re, '');\n }\n\n function removeNode(el){\n el.parentNode.removeChild(el);\n }\n\n /**\n * Easy styling and uploading\n * @constructor\n * @param button An element you want convert to\n * upload button. Tested dimentions up to 500x500px\n * @param {Object} options See defaults below.\n */\n window.AjaxUpload = function(button, options){\n this._settings = {\n // Location of the server-side upload script\n action: 'upload.php',\n // File upload name\n name: 'userfile',\n // Select & upload multiple files at once FF3.6+, Chrome 4+\n multiple: false,\n // Additional data to send\n data: {},\n // Submit file as soon as it's selected\n autoSubmit: true,\n // The type of data that you're expecting back from the server.\n // html and xml are detected automatically.\n // Only useful when you are using json data as a response.\n // Set to \"json\" in that case.\n responseType: false,\n // Class applied to button when mouse is hovered\n hoverClass: 'hover',\n // Class applied to button when button is focused\n focusClass: 'focus',\n // Class applied to button when AU is disabled\n disabledClass: 'disabled',\n // When user selects a file, useful with autoSubmit disabled\n // You can return false to cancel upload\n onChange: function(file, extension){\n },\n // Callback to fire before file is uploaded\n // You can return false to cancel upload\n onSubmit: function(file, extension){\n },\n // Fired when file upload is completed\n // WARNING! DO NOT USE \"FALSE\" STRING AS A RESPONSE!\n onComplete: function(file, response){\n }\n };\n\n // Merge the users options with our defaults\n for (var i in options) {\n if (options.hasOwnProperty(i)){\n this._settings[i] = options[i];\n }\n }\n\n // button isn't necessary a dom element\n if (button.jquery){\n // jQuery object was passed\n button = button[0];\n } else if (typeof button == \"string\") {\n if (/^#.*/.test(button)){\n // If jQuery user passes #elementId don't break it\n button = button.slice(1);\n }\n\n button = document.getElementById(button);\n }\n\n if ( ! button || button.nodeType !== 1){\n throw new Error(\"Please make sure that you're passing a valid element\");\n }\n\n if ( button.nodeName.toUpperCase() == 'A'){\n // disable link\n addEvent(button, 'click', function(e){\n if (e && e.preventDefault){\n e.preventDefault();\n } else if (window.event){\n window.event.returnValue = false;\n }\n });\n }\n\n // DOM element\n this._button = button;\n // DOM element\n this._input = null;\n // If disabled clicking on button won't do anything\n this._disabled = false;\n\n // if the button was disabled before refresh if will remain\n // disabled in FireFox, let's fix it\n this.enable();\n\n this._rerouteClicks();\n };\n\n // assigning methods to our class\n AjaxUpload.prototype = {\n setData: function(data){\n this._settings.data = data;\n },\n disable: function(){\n addClass(this._button, this._settings.disabledClass);\n this._disabled = true;\n\n var nodeName = this._button.nodeName.toUpperCase();\n if (nodeName == 'INPUT' || nodeName == 'BUTTON'){\n this._button.setAttribute('disabled', 'disabled');\n }\n\n // hide input\n if (this._input){\n if (this._input.parentNode) {\n // We use visibility instead of display to fix problem with Safari 4\n // The problem is that the value of input doesn't change if it\n // has display none when user selects a file\n this._input.parentNode.style.visibility = 'hidden';\n }\n }\n },\n enable: function(){\n removeClass(this._button, this._settings.disabledClass);\n this._button.removeAttribute('disabled');\n this._disabled = false;\n\n },\n /**\n * Creates invisible file input\n * that will hover above the button\n *
\n */\n _createInput: function(){\n var self = this;\n\n var input = document.createElement(\"input\");\n input.setAttribute('type', 'file');\n input.setAttribute('name', this._settings.name);\n if(this._settings.multiple) input.setAttribute('multiple', 'multiple');\n\n addStyles(input, {\n 'position' : 'absolute',\n // in Opera only 'browse' button\n // is clickable and it is located at\n // the right side of the input\n 'right' : 0,\n 'margin' : 0,\n 'padding' : 0,\n 'fontSize' : '480px',\n // in Firefox if font-family is set to\n // 'inherit' the input doesn't work\n 'fontFamily' : 'sans-serif',\n 'cursor' : 'pointer'\n });\n\n var div = document.createElement(\"div\");\n addStyles(div, {\n 'display' : 'block',\n 'position' : 'absolute',\n 'overflow' : 'hidden',\n 'margin' : 0,\n 'padding' : 0,\n 'opacity' : 0,\n // Make sure browse button is in the right side\n // in Internet Explorer\n 'direction' : 'ltr',\n //Max zIndex supported by Opera 9.0-9.2\n 'zIndex': 2147483583\n });\n\n // Make sure that element opacity exists.\n // Otherwise use IE filter\n if ( div.style.opacity !== \"0\") {\n if (typeof(div.filters) == 'undefined'){\n throw new Error('Opacity not supported by the browser');\n }\n div.style.filter = \"alpha(opacity=0)\";\n }\n\n addEvent(input, 'change', function(){\n\n if ( ! input || input.value === ''){\n return;\n }\n\n // Get filename from input, required\n // as some browsers have path instead of it\n var file = fileFromPath(input.value);\n\n if (false === self._settings.onChange.call(self, file, getExt(file))){\n self._clearInput();\n return;\n }\n\n // Submit form when value is changed\n if (self._settings.autoSubmit) {\n self.submit();\n }\n });\n\n addEvent(input, 'mouseover', function(){\n addClass(self._button, self._settings.hoverClass);\n });\n\n addEvent(input, 'mouseout', function(){\n removeClass(self._button, self._settings.hoverClass);\n removeClass(self._button, self._settings.focusClass);\n\n if (input.parentNode) {\n // We use visibility instead of display to fix problem with Safari 4\n // The problem is that the value of input doesn't change if it\n // has display none when user selects a file\n input.parentNode.style.visibility = 'hidden';\n }\n });\n\n addEvent(input, 'focus', function(){\n addClass(self._button, self._settings.focusClass);\n });\n\n addEvent(input, 'blur', function(){\n removeClass(self._button, self._settings.focusClass);\n });\n\n div.appendChild(input);\n document.body.appendChild(div);\n\n this._input = input;\n },\n _clearInput : function(){\n if (!this._input){\n return;\n }\n\n // this._input.value = ''; Doesn't work in IE6\n removeNode(this._input.parentNode);\n this._input = null;\n this._createInput();\n\n removeClass(this._button, this._settings.hoverClass);\n removeClass(this._button, this._settings.focusClass);\n },\n /**\n * Function makes sure that when user clicks upload button,\n * the this._input is clicked instead\n */\n _rerouteClicks: function(){\n var self = this;\n\n // IE will later display 'access denied' error\n // if you use using self._input.click()\n // other browsers just ignore click()\n\n addEvent(self._button, 'mouseover', function(){\n if (self._disabled){\n return;\n }\n\n if ( ! self._input){\n self._createInput();\n }\n\n var div = self._input.parentNode;\n copyLayout(self._button, div);\n div.style.visibility = 'visible';\n\n });\n\n\n // commented because we now hide input on mouseleave\n /**\n * When the window is resized the elements\n * can be misaligned if button position depends\n * on window size\n */\n //addResizeEvent(function(){\n // if (self._input){\n // copyLayout(self._button, self._input.parentNode);\n // }\n //});\n\n },\n /**\n * Creates iframe with unique name\n * @return {Element} iframe\n */\n _createIframe: function(){\n // We can't use getTime, because it sometimes return\n // same value in safari :(\n var id = getUID();\n\n // We can't use following code as the name attribute\n // won't be properly registered in IE6, and new window\n // on form submit will open\n // var iframe = document.createElement('iframe');\n // iframe.setAttribute('name', id);\n\n var iframe = toElement('');\n // src=\"javascript:false; was added\n // because it possibly removes ie6 prompt\n // \"This page contains both secure and nonsecure items\"\n // Anyway, it doesn't do any harm.\n iframe.setAttribute('id', id);\n\n iframe.style.display = 'none';\n document.body.appendChild(iframe);\n\n return iframe;\n },\n /**\n * Creates form, that will be submitted to iframe\n * @param {Element} iframe Where to submit\n * @return {Element} form\n */\n _createForm: function(iframe){\n var settings = this._settings;\n\n // We can't use the following code in IE6\n // var form = document.createElement('form');\n // form.setAttribute('method', 'post');\n // form.setAttribute('enctype', 'multipart/form-data');\n // Because in this case file won't be attached to request\n var form = toElement('');\n\n form.setAttribute('action', settings.action);\n form.setAttribute('target', iframe.name);\n form.style.display = 'none';\n document.body.appendChild(form);\n\n // Create hidden input element for each data key\n for (var prop in settings.data) {\n if (settings.data.hasOwnProperty(prop)){\n var el = document.createElement(\"input\");\n el.setAttribute('type', 'hidden');\n el.setAttribute('name', prop);\n el.setAttribute('value', settings.data[prop]);\n form.appendChild(el);\n }\n }\n return form;\n },\n /**\n * Gets response from iframe and fires onComplete event when ready\n * @param iframe\n * @param file Filename to use in onComplete callback\n */\n _getResponse : function(iframe, file){\n // getting response\n var toDeleteFlag = false, self = this, settings = this._settings;\n\n addEvent(iframe, 'load', function(){\n\n if (// For Safari\n iframe.src == \"javascript:'%3CHtml%3E%3C/html%3E';\" ||\n // For FF, IE\n iframe.src == \"javascript:'';\"){\n // First time around, do not delete.\n // We reload to blank page, so that reloading main page\n // does not re-submit the post.\n\n if (toDeleteFlag) {\n // Fix busy state in FF3\n setTimeout(function(){\n removeNode(iframe);\n }, 0);\n }\n\n return;\n }\n\n var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;\n\n // fixing Opera 9.26,10.00\n if (doc.readyState && doc.readyState != 'complete') {\n // Opera fires load event multiple times\n // Even when the DOM is not ready yet\n // this fix should not affect other browsers\n return;\n }\n\n // fixing Opera 9.64\n if (doc.body && doc.body.innerHTML == \"false\") {\n // In Opera 9.64 event was fired second time\n // when body.innerHTML changed from false\n // to server response approx. after 1 sec\n return;\n }\n\n var response;\n\n if (doc.XMLDocument) {\n // response is a xml document Internet Explorer property\n response = doc.XMLDocument;\n } else if (doc.body){\n // response is html document or plain text\n response = doc.body.innerHTML;\n\n if (settings.responseType && settings.responseType.toLowerCase() == 'json') {\n // If the document was sent as 'application/javascript' or\n // 'text/javascript', then the browser wraps the text in a\n // tag and performs html encoding on the contents. In this case,\n // we need to pull the original text content from the text node's\n // nodeValue property to retrieve the unmangled content.\n // Note that IE6 only understands text/html\n if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {\n doc.normalize();\n response = doc.body.firstChild.firstChild.nodeValue;\n }\n\n if (response) {\n response = eval(\"(\" + response + \")\");\n } else {\n response = {};\n }\n }\n } else {\n // response is a xml document\n response = doc;\n }\n\n settings.onComplete.call(self, file, response);\n\n // Reload blank page, so that reloading main page\n // does not re-submit the post. Also, remember to\n // delete the frame\n toDeleteFlag = true;\n\n // Fix IE mixed content issue\n iframe.src = \"javascript:'';\";\n removeNode(iframe);\n });\n },\n /**\n * Upload file contained in this._input\n */\n submit: function(){\n var self = this, settings = this._settings;\n\n if ( ! this._input || this._input.value === ''){\n return;\n }\n\n var file = fileFromPath(this._input.value);\n\n // user returned false to cancel upload\n if (false === settings.onSubmit.call(this, file, getExt(file))){\n this._clearInput();\n return;\n }\n\n // sending request\n var iframe = this._createIframe();\n\n // Get response from iframe and fire onComplete event when ready\n this._getResponse(iframe, file);\n\n var form = this._createForm(iframe);\n\n // assuming following structure\n // div -> input type='file'\n removeNode(this._input.parentNode);\n removeClass(self._button, self._settings.hoverClass);\n removeClass(self._button, self._settings.focusClass);\n\n form.appendChild(this._input);\n\n form.submit();\n\n // request set, clean up\n removeNode(form); form = null;\n removeNode(this._input); this._input = null;\n\n // get ready for next request\n this._createInput();\n }\n };\n})();\n","window.uploadModalObjects = window.uploadModalObjects || {};\n\nclass UploadQuestionController {\n constructor(fieldname) {\n this.fieldname = fieldname\n this.$el = $('#upload_'+fieldname);\n this.$modalEl = $('#file-upload-modal-' + this.fieldname);\n this.show_title = this.$el.data('showtitle');\n this.show_comment = this.$el.data('showcomment');\n }\n\n prepareOpenUploadModalDialog() {\n const buttonsOpts = {};\n buttonsOpts[uploadLang.returnTxt] = () => {\n this.$el.dialog(\"close\");\n };\n\n $(document).off('shown.bs.modal.lsuploadquestion', '#file-upload-modal-' + this.fieldname);\n $(document).on('shown.bs.modal.lsuploadquestion', '#file-upload-modal-' + this.fieldname, () => {\n const uploadFrame = $('#uploader' + this.fieldname);\n uploadFrame.load(uploadFrame.data('src'));\n this.updateMaxHeightModalbody(this.$el);\n });\n\n this.$modalEl.off('hide.bs.modal.lsuploadquestion');\n this.$modalEl.on('hide.bs.modal.lsuploadquestion', () => {\n const uploadFrame = $('#uploader' + this.fieldname);\n window.currentUploadHandler.saveAndExit(this.fieldname, this.show_title, this.show_comment, 1);\n uploadFrame.html('');\n return true;\n\n });\n\n this.$el.off('click.lsuploadquestion');\n this.$el.on('click.lsuploadquestion', (e) => {\n console.ls.log(\"File upload modal opening\");\n this.$modalEl.modal('show');\n });\n }\n\n /* Function to update upload frame\n *\n * @param frameName name of the frame (here it's id too :) )\n * @param integer heigth\n */\n updateUploadFrame(frameName, heigth) {\n $(\"#\" + frameName).innerHeight(heigth);\n }\n /* Function to update modal body max height\n *\n * @param modal jquery object : the modal\n */\n updateMaxHeightModalbody(modal) {\n const modalHeader = $(modal).find(\".modal-header\").outerHeight();\n const modalFooter = $(modal).find(\".modal-footer\").outerHeight();\n const finalMaxHeight = Math.max(150, $(window).height() - (modalHeader + modalFooter + 16)); // Not less than 150px\n console.ls.log([$(window).height(), modalHeader, modalFooter, (modalHeader + modalFooter)]);\n $(modal).find(\".modal-body\").css(\"max-height\", finalMaxHeight);\n }\n\n getQueryVariable(variable, url) {\n const vars1 = url.split(\"/\");\n for (let i = 0; i < vars1.length; i++) {\n if (vars1[i] == variable) {\n return vars1[i + 1];\n }\n }\n // If not found try with ?\n // TODO : replace by a regexp\n const vars2 = url.replace(/\\&/g, '&').split(\"&\");\n for (let i = 0; i < vars.length; i++) {\n const pair = vars2[i].split(\"=\");\n if (pair[0] == variable) {\n return pair[1];\n }\n }\n return null;\n }\n\n isValueInArray(arr, val) {\n inArray = false;\n for (let i = 0; i < arr.length; i++) {\n if (val.toLowerCase() == arr[i].toLowerCase()) {\n inArray = true;\n }\n }\n\n return inArray;\n }\n\n displayUploadedFiles(filecount, fieldname, show_title, show_comment) {\n const jsonstring = $(\"#java\" + fieldname).val();\n let display = '';\n\n if (jsonstring == '[]' || jsonstring == '') {\n $('#' + this.fieldname + '_uploadedfiles').addClass('hidden');\n $('#' + this.fieldname + '_uploadedfiles').find('table>tbody').html('');\n return;\n }\n\n if (jsonstring !== '') {\n let jsonobj = [];\n try {\n jsonobj = JSON.parse(jsonstring);\n } catch (e) {};\n\n $('#' + this.fieldname + '_uploadedfiles').removeClass('hidden');\n $('#' + this.fieldname + '_uploadedfiles').find('table>tbody').html('');\n\n const image_extensions = new Array('gif', 'jpeg', 'jpg', 'png', 'swf', 'psd', 'bmp', 'tiff', 'jp2', 'iff', 'bmp', 'xbm', 'ico');\n const templateHtml = $('#filerowtemplate_'+this.fieldname).html();\n \n jsonobj.forEach((item, iterator) => {\n let imageOrPlaceholder, imageOrPlaceholderHtml, title, comment, name, filepointer;\n if (this.isValueInArray(image_extensions, item.ext)) {\n imageOrPlaceholder = \"image\";\n imageOrPlaceholderHtml = '');\n var previewContainer = $('');\n\n if (isValueInArray(image_extensions, item.ext.toLowerCase())) {\n previewContainer.append('';\n } else {\n imageOrPlaceholder = \"placeholder\";\n imageOrPlaceholderHtml = '';\n }\n\n title = (show_title != 0) ? item.title : '';\n comment = (show_comment != 0) ? item.comment : '';\n name = item.name;\n filepointer = iterator;\n const rowHtml = this.replaceWithObject(templateHtml, {imageOrPlaceholder, imageOrPlaceholderHtml, title, comment, name, filepointer});\n $('#' + this.fieldname + '_uploadedfiles').find('table>tbody').append(rowHtml)\n });\n \n $('.trigger_edit_upload_'+this.fieldname).off('click.lsuploadquestion');\n $('.trigger_edit_upload_'+this.fieldname).on('click.lsuploadquestion', \n () => {\n this.$modalEl.modal('show');\n });\n }\n };\n\n replaceWithObject(templateString, objectWithReplacements) {\n let outString = templateString;\n for( let key in objectWithReplacements) {\n outString = outString.replace(new RegExp(`\\{${key}\\}`), objectWithReplacements[key]);\n }\n return outString;\n }\n\n\n showBasic() {\n $('#basic').show();\n }\n\n hideBasic() {\n $('#basic').hide();\n }\n}\n\n\n\nwindow.UploadQuestionController = UploadQuestionController;\n","import './ajaxupload.js';\nimport './modaldialog.js';\n\n\"use strict\"\nvar uploadHandler = function (qid, options) {\n\n var init = function () {\n doFileUpload();\n };\n \n var fixParentHeigth = function () {\n return;\n };\n\n var renderPreviewItem = function (fieldname, item, iterator) {\n var i = iterator;\n var image_extensions = new Array('gif', 'jpeg', 'jpg', 'png', 'swf', 'psd', 'bmp', 'tiff', 'jp2', 'iff', 'bmp', 'xbm', 'ico', 'heic');\n\n var previewblock = $('
' + uploadLang.errorNoMoreFiles + '
');\n fixParentHeigth();\n return false;\n }\n\n /* If the file being uploaded is not allowed,\n * do not upload the file and display an error message!\n */\n let allowSubmit = false;\n for (let fileType of allowed_filetypes) {\n allowSubmit = allowed_filetypes.includes(fileType);\n }\n\n if (allowSubmit == false) {\n $('#notice').html('' + uploadLang.errorOnlyAllowed.replace('%s', $('#' + fieldname + '_allowed_filetypes').val()) + '
');\n fixParentHeigth();\n return false;\n }\n\n // change button text, when user selects file\n button.text(options.uploadLang.uploading);\n\n // If you want to allow uploading only 1 file at time,\n // you can disable upload button\n this.disable();\n\n button.append('');\n\n },\n onComplete: function (file, response) {\n button.text(uploadLang.selectfile);\n $('#loading-icon-fielupload').remove();\n // enable upload button\n this.enable();\n\n // Once the file has been uploaded via AJAX,\n // the preview is appended to the list of files\n try{\n var metadata = JSON.parse(response);\n } catch(e) {\n /* Suppose we get an HTML error ? Replace whole HTML (without head) */\n $('body').html(response);\n return;\n }\n\n var count = parseInt($('#' + fieldname + '_licount').val());\n count++;\n $('#' + fieldname + '_licount').val(count);\n\n if (metadata.success) {\n $('#notice').html('' + metadata.msg + '
');\n if ($('#field' + fieldname + '_listfiles').length == 0) {\n $(\"' + options.uploadLang.errorTooMuch + '
');\n fixParentHeigth();\n } else {\n $('#notice').html('' + metadata.msg + '
');\n fixParentHeigth();\n }\n\n }\n });\n }\n\n function isValueInArray(arr, val) {\n return arr.reduce(function (col, item) {\n return col || (val.toLowerCase() == item.toLowerCase())\n }, false);\n }\n\n // pass the JSON data from the iframe to the main survey page\n function passJSON(fieldname, show_title, show_comment, pos) {\n var jsonArray = [];\n var filecount = 0;\n var licount = parseInt($('#' + fieldname + '_licount').val());\n var i = 1;\n\n while (i <= licount) {\n if ($(\"#\" + fieldname + \"_li_\" + i).is(':visible')) {\n var fileObject = {\n title: ($(\"#\" + fieldname + \"_show_title\").val() == 1) ? $(\"#\" + fieldname + \"_title_\" + i).val() : '',\n comment: ($(\"#\" + fieldname + \"_show_comment\").val() == 1) ? $(\"#\" + fieldname + \"_comment_\" + i).val() : '',\n size: $(\"#\" + fieldname + \"_size_\" + i).val(),\n name: $(\"#\" + fieldname + \"_name_\" + i).val(),\n filename: $(\"#\" + fieldname + \"_filename_\" + i).val(),\n ext: $(\"#\" + fieldname + \"_ext_\" + i).val()\n };\n filecount += 1;\n jsonArray.push(fileObject);\n }\n i++;\n }\n\n\n $('#java' + fieldname).val(JSON.stringify(jsonArray)).trigger('updated');\n copyJSON(filecount, fieldname, show_title, show_comment, pos);\n }\n\n const copyJSON = function(filecount, fieldname, show_title, show_comment, pos) {\n $('#java'+fieldname+'_filecount').val(filecount).trigger('updated');\n window['uploadQuestionController_' + fieldname].displayUploadedFiles(filecount, fieldname, show_title, show_comment, pos);\n };\n\n var saveAndExit = function (fieldname, show_title, show_comment, pos) {\n var filecount = parseInt($('#java' + fieldname + '_filecount').val());\n var minfiles = parseInt($('#' + fieldname + '_minfiles').val());\n\n if (minfiles != 0 && filecount < minfiles && showpopups) {\n var confirmans = confirm(uploadLang.errorNeedMoreConfirm.replace('%s', (minfiles - filecount)))\n if (confirmans) {\n passJSON(fieldname, show_title, show_comment, pos);\n return true\n } else\n return false;\n } else {\n passJSON(fieldname, show_title, show_comment, pos);\n return true;\n }\n }\n\n var deletefile = function (fieldname, count) {\n var file_index;\n var filename = $(\"#\" + fieldname + \"_filename_\" + count).val();\n var name = $(\"#\" + fieldname + \"_name_\" + count).val();\n\n var filecount = parseInt($('#java' + fieldname + '_filecount').val());\n var licount = parseInt($('#' + fieldname + '_licount').val());\n\n $.ajax({\n method: \"POST\",\n url: uploadurl,\n data: {\n 'delete': 1,\n 'fieldname': fieldname,\n 'filename': filename,\n 'name': name,\n YII_CSRF_TOKEN: options.csrfToken\n }\n })\n .done(function (msg) {\n $('#notice').html('' + msg + '
');\n setTimeout(function () {\n $(\".success\").remove();\n }, 5000);\n $(\"#\" + fieldname + \"_li_\" + count).hide();\n filecount--;\n $('#java' + fieldname + '_filecount').val(filecount);\n file_index = $(\"#\" + fieldname + \"_file_index_\" + count).val();\n for (j = count; j <= licount; j++) {\n if ($('#' + fieldname + '_li_' + j).is(\":visible\")) {\n $('#' + fieldname + '_file_index_' + j).val(file_index);\n file_index++;\n }\n }\n var minfiles = parseInt($('#' + fieldname + '_minfiles').val());\n var maxfiles = parseInt($('#' + fieldname + '_maxfiles').val());\n\n if (filecount < minfiles) {\n $('#uploadstatus').html(uploadLang.errorNeedMore.replace('%s', (minfiles - filecount)));\n fixParentHeigth();\n } else {\n $('#uploadstatus').html(uploadLang.errorMoreAllowed.replace('%s', (maxfiles - filecount)));\n fixParentHeigth();\n }\n });\n };\n\n return {\n init: init,\n saveAndExit: saveAndExit,\n };\n}\n\n\nfunction escapeHtml(unsafe) {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nwindow.getUploadHandler = function(qid, options){\n window.currentUploadHandler = new uploadHandler(qid, options);\n window.currentUploadHandler.init();\n return window.currentUploadHandler;\n}\n"],"names":["addEvent","el","type","fn","addEventListener","attachEvent","Error","call","document","documentElement","getBoundingClientRect","getOffset","box","doc","ownerDocument","body","docElem","clientTop","clientLeft","zoom","bound","right","left","clientWidth","top","window","pageYOffset","scrollTop","pageXOffset","scrollLeft","offsetTop","offsetLeft","offsetParent","getBox","offset","offsetWidth","bottom","offsetHeight","addStyles","styles","name","hasOwnProperty","style","copyLayout","from","to","position","width","height","toElement","div","createElement","html","innerHTML","firstChild","removeChild","getUID","id","fileFromPath","file","replace","getExt","toLowerCase","indexOf","hasClass","RegExp","test","className","addClass","removeClass","re","removeNode","parentNode","AjaxUpload","button","options","i","_settings","action","multiple","data","autoSubmit","responseType","hoverClass","focusClass","disabledClass","onChange","extension","onSubmit","onComplete","response","jquery","slice","getElementById","nodeType","nodeName","toUpperCase","e","preventDefault","event","returnValue","_button","_input","_disabled","enable","_rerouteClicks","prototype","setData","disable","this","setAttribute","visibility","removeAttribute","_createInput","self","input","opacity","filters","filter","value","submit","_clearInput","appendChild","_createIframe","iframe","display","_createForm","settings","form","prop","_getResponse","toDeleteFlag","src","contentDocument","frames","readyState","XMLDocument","normalize","nodeValue","eval","setTimeout","uploadModalObjects","UploadQuestionController","constructor","fieldname","$el","$","$modalEl","show_title","show_comment","prepareOpenUploadModalDialog","uploadLang","returnTxt","dialog","off","on","uploadFrame","load","updateMaxHeightModalbody","currentUploadHandler","saveAndExit","console","ls","log","modal","updateUploadFrame","frameName","heigth","innerHeight","modalHeader","find","outerHeight","modalFooter","finalMaxHeight","Math","max","css","getQueryVariable","variable","url","vars1","split","length","vars2","vars","pair","isValueInArray","arr","val","inArray","displayUploadedFiles","filecount","jsonstring","jsonobj","JSON","parse","image_extensions","Array","templateHtml","forEach","item","iterator","imageOrPlaceholder","imageOrPlaceholderHtml","title","comment","filepointer","ext","uploadurl","decodeURIComponent","filename","rowHtml","replaceWithObject","append","templateString","objectWithReplacements","outString","key","showBasic","show","hideBasic","hide","uploadHandler","qid","renderPreviewItem","previewblock","previewContainer","reduce","col","escapeHtml","previewTitleContainer","previewCommentContainer","attr","text","titleFld","appendTo","wrap","commentFld","previewDeleteBlock","deleteFile","deletefile","size","doFileUpload","sFieldName","jsontext","json","insertAfter","surveyid","questgrppreview","valid_extensions","max_filesize","preview","YII_CSRF_TOKEN","csrfToken","maxfiles","parseInt","allowed_filetypes","errorNoMoreFiles","allowSubmit","fileType","includes","errorOnlyAllowed","uploading","selectfile","remove","metadata","count","success","msg","minfiles","errorNeedMore","errorMoreAllowed","errorMaxReached","errorTooMuch","passJSON","pos","jsonArray","licount","is","fileObject","push","stringify","trigger","copyJSON","file_index","ajax","method","done","j","init","showpopups","confirm","errorNeedMoreConfirm","unsafe","getUploadHandler"],"mappings":"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"}