/
uploadquestion.min.js.map
1 lines (1 loc) · 63.1 KB
/
uploadquestion.min.js.map
1
{"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 * <div><input type='file' /></div>\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('<iframe src=\"javascript:false;\" name=\"' + id + '\" />');\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 iframe.setAttribute('srcdoc', this._settings.action);\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('<form method=\"post\" enctype=\"multipart/form-data\"></form>');\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:'<html></html>';\"){\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 <pre>\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:'<html></html>';\";\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 = $(\"#\" + 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 = `<img src=\"${uploadurl}/filegetcontents/${decodeURIComponent(item.filename)}\" class=\"uploaded\" />`;\n } else {\n imageOrPlaceholder = \"placeholder\";\n imageOrPlaceholderHtml = `<div class=\"upload-placeholder\"></div>`;\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 = $('<li id=\"' + fieldname + '_li_' + i + '\" class=\"previewblock file-element\"></li>');\n var previewContainer = $('<div class=\"file-preview\"></div>');\n\n if (isValueInArray(image_extensions, item.ext.toLowerCase())) {\n previewContainer.append('<img src=\"' + options.uploadurl + '/filegetcontents/' + item.filename + '\" class=\"uploaded\" />');\n } else {\n previewContainer.append('<div class=\"upload-placeholder\"></div>');\n }\n\n previewContainer.append('<span class=\"file-name\">' + escapeHtml(decodeURIComponent(item.name)) + '</span>');\n\n if ($('#' + fieldname + '_show_title').val() == 1 || $('#' + fieldname + '_show_comment').val() == 1) {\n\n var previewTitleContainer = $('');\n var previewCommentContainer = $('');\n\n if ($('#' + fieldname + '_show_title').val() == 1) {\n var previewTitleContainer = $('<div class=\"form-group\"></div>');\n $('<label class=\"control-label col-xs-4\"></label>')\n .attr('for', fieldname + '_title_' + i)\n .text(options.uploadLang.titleFld)\n .appendTo(previewTitleContainer);\n $('<input class=\"form-control\" type=\"text\"/>')\n .attr('id', fieldname + \"_title_\" + i)\n .val(item.title)\n .wrap('<div class=\"input-container\"></div>')\n .appendTo(previewTitleContainer);\n }\n\n if ($('#' + fieldname + '_show_comment').val() == 1) {\n var previewCommentContainer = $('<div class=\"form-group\"></div>');\n $('<label class=\"control-label col-xs-4\"></label>')\n .attr('for', fieldname + '_comment_' + i)\n .text(options.uploadLang.commentFld)\n .appendTo(previewCommentContainer);\n $('<input class=\"form-control\" type=\"text\"/>')\n .attr('id', fieldname + \"_comment_\" + i)\n .val(item.comment)\n .wrap('<div class=\"input-container\"></div>')\n .appendTo(previewCommentContainer);\n }\n\n }\n\n var previewDeleteBlock = $('<div class=\"form-group\"></div>').append(\n $('<a class=\"btn btn-danger\"></a>')\n .html('<span class=\"fa fa-trash\"></span> ' + options.uploadLang.deleteFile )\n .on('click', function () {\n deletefile(fieldname, i);\n })\n .wrap('<div class=\"input-container text-center\"></div>')\n );\n\n $('<fieldset></fieldset>')\n .append(previewTitleContainer).append(previewCommentContainer).append(previewDeleteBlock)\n .wrap('<div class=\"file-info\"></div>')\n .appendTo(previewContainer);\n\n \n $('<input type=\"hidden\" />').attr('id', fieldname + '_size_' + i).attr('value', item.size).appendTo(previewblock);\n $('<input type=\"hidden\" />').attr('id', fieldname + '_name_' + i).attr('value', item.name).appendTo(previewblock);\n $('<input type=\"hidden\" />').attr('id', fieldname + '_file_index_' + i).attr('value', i).appendTo(previewblock);\n $('<input type=\"hidden\" />').attr('id', fieldname + '_filename_' + i).attr('value', item.filename).appendTo(previewblock);\n $('<input type=\"hidden\" />').attr('id', fieldname + '_ext_' + i).attr('value', item.ext).appendTo(previewblock);\n \n // add file to the list only if it doesn't exists already\n if ($(\"#\" + fieldname + \"_li_\" + i).length === 0){\n previewblock.append(previewContainer);\n $('#field' + fieldname + '_listfiles').append(previewblock);\n }\n }\n\n var doFileUpload = function () {\n var fieldname = options.sFieldName;\n /* Load the previously uploaded files */\n var filecount = $('#' + fieldname + '_filecount').val();\n\n $('#' + fieldname + '_filecount').val(filecount);\n\n var image_extensions = ['gif', 'jpeg', 'jpg', 'png', 'swf', 'psd', 'bmp', 'tiff', 'jp2', 'iff', 'bmp', 'xbm', 'ico', 'heic'];\n if (filecount > 0) {\n var jsontext = $('#' + fieldname).val();\n\n var json = '';\n try{\n json = JSON.parse(jsontext);\n } catch(e) {}\n\n if ($('#field' + fieldname + '_listfiles').length == 0) {\n $('<ul id=\"field' + fieldname + '_listfiles\" class=\"files-list\" />').insertAfter('#uploadstatus_' + qid);\n }\n\n $('#' + fieldname + '_licount').val(filecount);\n\n json.forEach(function (item, iterator) {\n renderPreviewItem(fieldname, item, iterator+1);\n });\n }\n\n // The upload button\n var button = $('#button_' + qid);\n new AjaxUpload(button, {\n action: options.uploadurl + '/sid/' + surveyid + '/preview/' + options.questgrppreview + '/fieldname/' + fieldname + '/',\n name: 'uploadfile',\n data: {\n valid_extensions: $('#' + fieldname + '_allowed_filetypes').val(),\n max_filesize: $('#' + fieldname + '_maxfilesize').val(),\n preview: $('#preview').val(),\n surveyid: surveyid,\n fieldname: fieldname,\n YII_CSRF_TOKEN: options.csrfToken\n },\n onSubmit: function (file, ext) {\n var maxfiles = parseInt($('#' + fieldname + '_maxfiles').val());\n var filecount = parseInt($('#' + fieldname + '_filecount').val());\n var allowed_filetypes = $('#' + fieldname + '_allowed_filetypes').val().split(\",\");\n\n /* If maximum number of allowed filetypes have already been uploaded,\n * do not upload the file and display an error message ! */\n if (filecount >= maxfiles) {\n $('#notice').html('<p class=\"alert alert-danger\"><span class=\"fa fa-exclamation-circle\"></span> ' + uploadLang.errorNoMoreFiles + '</p>');\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('<p class=\"alert alert-danger\"><span class=\"fa fa-exclamation-circle\"></span> ' + uploadLang.errorOnlyAllowed.replace('%s', $('#' + fieldname + '_allowed_filetypes').val()) + '</p>');\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('<i id=\"loading-icon-fielupload\" class=\"fa fa-spinner fa-pulse fa-3x fa-fw\"></i>');\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('<p class=\"alert alert-success\"><span class=\"fa fa-success\"></span> ' + metadata.msg + '</p>');\n if ($('#field' + fieldname + '_listfiles').length == 0) {\n $(\"<ul id='field\" + fieldname + \"_listfiles' class='files-list' />\").insertAfter(\"#uploadstatus_\" + options.qid);\n }\n renderPreviewItem(fieldname, metadata, count);\n\n var filecount = parseInt($('#' + fieldname + '_filecount').val());\n var minfiles = parseInt($('#' + fieldname + '_minfiles').val());\n filecount++;\n var maxfiles = parseInt($('#' + fieldname + '_maxfiles').val());\n $('#' + fieldname + '_filecount').val(filecount);\n\n if (filecount < minfiles)\n $('#uploadstatus').html(options.uploadLang.errorNeedMore.replace('%s', (minfiles - filecount)));\n else if (filecount < maxfiles)\n $('#uploadstatus').html(options.uploadLang.errorMoreAllowed.replace('%s', (maxfiles - filecount)));\n else\n $('#uploadstatus').html(options.uploadLang.errorMaxReached);\n fixParentHeigth();\n if (filecount >= maxfiles)\n $('#notice').html('<p class=\"alert alert-success\"><span class=\"fa fa-check\"></span> ' + options.uploadLang.errorTooMuch + '</p>');\n fixParentHeigth();\n } else {\n $('#notice').html('<p class=\"alert alert-danger\"><span class=\"fa fa-exclamation-circle\"></span> ' + metadata.msg + '</p>');\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 $('#' + fieldname).val(JSON.stringify(jsonArray));\n copyJSON(filecount, fieldname, show_title, show_comment, pos);\n }\n\n const copyJSON = function(filecount, fieldname, show_title, show_comment, pos) {\n $('#'+fieldname+'_filecount').val(filecount);\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($('#' + 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($('#' + 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('<p class=\"alert alert-success\"><span class=\"fa fa-check\"></span> ' + msg + '</p>');\n setTimeout(function () {\n $(\".success\").remove();\n }, 5000);\n $(\"#\" + fieldname + \"_li_\" + count).hide();\n filecount--;\n $('#' + 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 .replace(/'/g, \"'\");\n}\n\nwindow.getUploadHandler = function(qid, options){\n if (!window.currentUploadHandler){\n window.currentUploadHandler = new uploadHandler(qid, options);\n }\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","fieldname","$el","$","$modalEl","show_title","show_comment","uploadLang","returnTxt","_this","dialog","off","on","uploadFrame","load","updateMaxHeightModalbody","currentUploadHandler","saveAndExit","console","ls","log","modal","frameName","heigth","innerHeight","modalHeader","find","outerHeight","modalFooter","finalMaxHeight","Math","max","css","variable","url","vars1","split","length","vars2","vars","pair","arr","val","inArray","filecount","jsonstring","jsonobj","JSON","parse","image_extensions","Array","templateHtml","forEach","item","iterator","imageOrPlaceholder","imageOrPlaceholderHtml","title","comment","filepointer","_this2","isValueInArray","ext","uploadurl","decodeURIComponent","filename","rowHtml","replaceWithObject","append","templateString","objectWithReplacements","outString","key","show","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","copyJSON","displayUploadedFiles","file_index","ajax","method","done","j","init","showpopups","confirm","errorNeedMoreConfirm","unsafe","getUploadHandler"],"mappings":"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"}