{"version":3,"sources":["fileuploader.js"],"names":["qq","extend","first","second","prop","indexOf","arr","elt","from","len","length","getUniqueId","id","attach","element","type","fn","addEventListener","attachEvent","detach","removeEventListener","detachEvent","preventDefault","e","returnValue","insertBefore","a","b","parentNode","remove","removeChild","contains","parent","descendant","compareDocumentPosition","toElement","div","document","createElement","html","innerHTML","firstChild","css","styles","opacity","style","filter","Math","round","hasClass","name","RegExp","test","className","addClass","removeClass","re","replace","setText","text","innerText","textContent","children","child","nodeType","push","nextSibling","getByClass","querySelectorAll","result","candidates","target","getElementsByTagName","i","obj2url","obj","temp","prefixDone","add","nextObj","nextTemp","uristrings","Object","prototype","toString","call","encodeURIComponent","prefix","join","FileUploaderBasic","o","this","_options","debug","action","params","button","multiple","maxConnections","allowedExtensions","sizeLimit","minSizeLimit","onSubmit","fileName","onProgress","loaded","total","onComplete","responseJSON","onCancel","messages","typeError","sizeError","minSizeError","emptyError","onLeave","showMessage","message","alert","_filesInProgress","_handler","_createUploadHandler","_button","_createUploadButton","_preventLeaveInProgress","setParams","getInProgress","self","UploadButton","UploadHandlerXhr","isSupported","onChange","input","_onInputChange","handlerClass","_onProgress","_onComplete","_onCancel","window","event","_onSubmit","error","_uploadFileList","files","_validateFile","_uploadFile","reset","fileContainer","getName","upload","file","size","value","fileSize","_isAllowedExtension","_error","code","r","replacement","_formatFileName","_formatSize","slice","ext","toLowerCase","allowed","bytes","max","toFixed","FileUploader","apply","arguments","listElement","classes","drop","dropActive","list","spinner","cancel","success","fail","_element","_listElement","_find","_classes","_bindCancelEvent","_setupDragDrop","Error","dropArea","dz","UploadDropZone","onEnter","stopPropagation","onLeaveNotDescendants","onDrop","display","dataTransfer","_isValidFileDrag","relatedTarget","elementFromPoint","clientX","clientY","nodeName","_addToList","item","_getItemByFileId","fileTemplate","fileElement","qqFileId","appendChild","srcElement","_disableDropOutside","_attachEvents","dropOutsideDisabled","dropEffect","effect","effectAllowed","dt","isWebkit","navigator","userAgent","types","hoverClass","focusClass","position","overflow","direction","_input","_createInput","getInput","setAttribute","right","top","fontFamily","fontSize","margin","padding","cursor","UploadHandlerAbstract","response","_queue","_params","log","str","console","copy","_upload","_cancel","_dequeue","cancelAll","getSize","getQueue","splice","nextId","UploadHandlerForm","_inputs","fileInput","iframe","getElementById","_createIframe","form","_createForm","_attachLoadEvent","_getIframeContentJSON","setTimeout","submit","callback","contentDocument","body","doc","contentWindow","eval","err","queryString","_files","_xhrs","_loaded","File","XMLHttpRequest","getLoaded","xhr","onprogress","lengthComputable","onreadystatechange","readyState","open","setRequestHeader","send","status","responseText","abort"],"mappings":"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","file":"../fileuploader-5f415b6e.js","sourcesContent":["/**\r\n * http://github.com/valums/file-uploader\r\n * \r\n * Multiple file upload component with progress-bar, drag-and-drop. \r\n * © 2010 Andrew Valums ( andrew(at)valums.com ) \r\n * \r\n * Licensed under GNU GPL 2 or later and GNU LGPL 2 or later, see license.txt.\r\n */ \r\n\r\n//\r\n// Helper functions\r\n//\r\n\r\nvar qq = qq || {};\r\n\r\n/**\r\n * Adds all missing properties from second obj to first obj\r\n */ \r\nqq.extend = function(first, second){\r\n for (var prop in second){\r\n first[prop] = second[prop];\r\n }\r\n}; \r\n\r\n/**\r\n * Searches for a given element in the array, returns -1 if it is not present.\r\n * @param {Number} [from] The index at which to begin the search\r\n */\r\nqq.indexOf = function(arr, elt, from){\r\n if (arr.indexOf) return arr.indexOf(elt, from);\r\n \r\n from = from || 0;\r\n var len = arr.length; \r\n \r\n if (from < 0) from += len; \r\n\r\n for (; from < len; from++){ \r\n if (from in arr && arr[from] === elt){ \r\n return from;\r\n }\r\n } \r\n return -1; \r\n}; \r\n \r\nqq.getUniqueId = (function(){\r\n var id = 0;\r\n return function(){ return id++; };\r\n})();\r\n\r\n//\r\n// Events\r\n\r\nqq.attach = function(element, type, fn){\r\n if (element.addEventListener){\r\n element.addEventListener(type, fn, false);\r\n } else if (element.attachEvent){\r\n element.attachEvent('on' + type, fn);\r\n }\r\n};\r\nqq.detach = function(element, type, fn){\r\n if (element.removeEventListener){\r\n element.removeEventListener(type, fn, false);\r\n } else if (element.attachEvent){\r\n element.detachEvent('on' + type, fn);\r\n }\r\n};\r\n\r\nqq.preventDefault = function(e){\r\n if (e.preventDefault){\r\n e.preventDefault();\r\n } else{\r\n e.returnValue = false;\r\n }\r\n};\r\n\r\n//\r\n// Node manipulations\r\n\r\n/**\r\n * Insert node a before node b.\r\n */\r\nqq.insertBefore = function(a, b){\r\n b.parentNode.insertBefore(a, b);\r\n};\r\nqq.remove = function(element){\r\n element.parentNode.removeChild(element);\r\n};\r\n\r\nqq.contains = function(parent, descendant){ \r\n // compareposition returns false in this case\r\n if (parent == descendant) return true;\r\n \r\n if (parent.contains){\r\n return parent.contains(descendant);\r\n } else {\r\n return !!(descendant.compareDocumentPosition(parent) & 8);\r\n }\r\n};\r\n\r\n/**\r\n * Creates and returns element from html string\r\n * Uses innerHTML to create an element\r\n */\r\nqq.toElement = (function(){\r\n var div = document.createElement('div');\r\n return function(html){\r\n div.innerHTML = html;\r\n var element = div.firstChild;\r\n div.removeChild(element);\r\n return element;\r\n };\r\n})();\r\n\r\n//\r\n// Node properties and attributes\r\n\r\n/**\r\n * Sets styles for an element.\r\n * Fixes opacity in IE6-8.\r\n */\r\nqq.css = function(element, styles){\r\n if (styles.opacity != null){\r\n if (typeof element.style.opacity != 'string' && typeof(element.filters) != 'undefined'){\r\n styles.filter = 'alpha(opacity=' + Math.round(100 * styles.opacity) + ')';\r\n }\r\n }\r\n qq.extend(element.style, styles);\r\n};\r\nqq.hasClass = function(element, name){\r\n var re = new RegExp('(^| )' + name + '( |$)');\r\n return re.test(element.className);\r\n};\r\nqq.addClass = function(element, name){\r\n if (!qq.hasClass(element, name)){\r\n element.className += ' ' + name;\r\n }\r\n};\r\nqq.removeClass = function(element, name){\r\n var re = new RegExp('(^| )' + name + '( |$)');\r\n element.className = element.className.replace(re, ' ').replace(/^\\s+|\\s+$/g, \"\");\r\n};\r\nqq.setText = function(element, text){\r\n element.innerText = text;\r\n element.textContent = text;\r\n};\r\n\r\n//\r\n// Selecting elements\r\n\r\nqq.children = function(element){\r\n var children = [],\r\n child = element.firstChild;\r\n\r\n while (child){\r\n if (child.nodeType == 1){\r\n children.push(child);\r\n }\r\n child = child.nextSibling;\r\n }\r\n\r\n return children;\r\n};\r\n\r\nqq.getByClass = function(element, className){\r\n if (element.querySelectorAll){\r\n return element.querySelectorAll('.' + className);\r\n }\r\n\r\n var result = [];\r\n var candidates = element.target.getElementsByTagName(\"*\");\r\n var len = candidates.length;\r\n\r\n for (var i = 0; i < len; i++){\r\n if (qq.hasClass(candidates[i], className)){\r\n result.push(candidates[i]);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * obj2url() takes a json-object as argument and generates\r\n * a querystring. pretty much like jQuery.param()\r\n * \r\n * how to use:\r\n *\r\n * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`\r\n *\r\n * will result in:\r\n *\r\n * `http://any.url/upload?otherParam=value&a=b&c=d`\r\n *\r\n * @param Object JSON-Object\r\n * @param String current querystring-part\r\n * @return String encoded querystring\r\n */\r\nqq.obj2url = function(obj, temp, prefixDone){\r\n var uristrings = [],\r\n prefix = '&',\r\n add = function(nextObj, i){\r\n var nextTemp = temp \r\n ? (/\\[\\]$/.test(temp)) // prevent double-encoding\r\n ? temp\r\n : temp+'['+i+']'\r\n : i;\r\n if ((nextTemp != 'undefined') && (i != 'undefined')) { \r\n uristrings.push(\r\n (typeof nextObj === 'object') \r\n ? qq.obj2url(nextObj, nextTemp, true)\r\n : (Object.prototype.toString.call(nextObj) === '[object Function]')\r\n ? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj())\r\n : encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj) \r\n );\r\n }\r\n }; \r\n\r\n if (!prefixDone && temp) {\r\n prefix = (/\\?/.test(temp)) ? (/\\?$/.test(temp)) ? '' : '&' : '?';\r\n uristrings.push(temp);\r\n uristrings.push(qq.obj2url(obj));\r\n } else if ((Object.prototype.toString.call(obj) === '[object Array]') && (typeof obj != 'undefined') ) {\r\n // we wont use a for-in-loop on an array (performance)\r\n for (var i = 0, len = obj.length; i < len; ++i){\r\n add(obj[i], i);\r\n }\r\n } else if ((typeof obj != 'undefined') && (obj !== null) && (typeof obj === \"object\")){\r\n // for anything else but a scalar, we will use for-in-loop\r\n for (var i in obj){\r\n add(obj[i], i);\r\n }\r\n } else {\r\n uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj));\r\n }\r\n\r\n return uristrings.join(prefix)\r\n .replace(/^&/, '')\r\n .replace(/%20/g, '+'); \r\n};\r\n\r\n//\r\n//\r\n// Uploader Classes\r\n//\r\n//\r\n\r\nvar qq = qq || {};\r\n \r\n/**\r\n * Creates upload button, validates upload, but doesn't create file list or dd. \r\n */\r\nqq.FileUploaderBasic = function(o){\r\n this._options = {\r\n // set to true to see the server response\r\n debug: true,\r\n action: '/server/upload',\r\n params: {},\r\n button: null,\r\n multiple: true,\r\n maxConnections: 3,\r\n // validation \r\n allowedExtensions: [], \r\n sizeLimit: 0, \r\n minSizeLimit: 0, \r\n // events\r\n // return false to cancel submit\r\n onSubmit: function(id, fileName){},\r\n onProgress: function(id, fileName, loaded, total){},\r\n onComplete: function(id, fileName, responseJSON){},\r\n onCancel: function(id, fileName){},\r\n // messages \r\n messages: {\r\n typeError: \"{file} has invalid extension. Only {extensions} are allowed.\",\r\n sizeError: \"{file} is too large, maximum file size is {sizeLimit}.\",\r\n minSizeError: \"{file} is too small, minimum file size is {minSizeLimit}.\",\r\n emptyError: \"{file} is empty, please select files again without it.\",\r\n onLeave: \"The files are being uploaded, if you leave now the upload will be cancelled.\" \r\n },\r\n showMessage: function(message){\r\n alert(message);\r\n } \r\n };\r\n qq.extend(this._options, o);\r\n \r\n // number of files being uploaded\r\n this._filesInProgress = 0;\r\n this._handler = this._createUploadHandler(); \r\n \r\n if (this._options.button){ \r\n this._button = this._createUploadButton(this._options.button);\r\n }\r\n \r\n this._preventLeaveInProgress(); \r\n};\r\n \r\nqq.FileUploaderBasic.prototype = {\r\n setParams: function(params){\r\n this._options.params = params;\r\n },\r\n getInProgress: function(){\r\n return this._filesInProgress; \r\n },\r\n _createUploadButton: function(element){\r\n var self = this;\r\n \r\n return new qq.UploadButton({\r\n element: element,\r\n multiple: this._options.multiple && qq.UploadHandlerXhr.isSupported(),\r\n onChange: function(input){\r\n self._onInputChange(input);\r\n } \r\n }); \r\n }, \r\n _createUploadHandler: function(){\r\n var self = this,\r\n handlerClass; \r\n \r\n if(qq.UploadHandlerXhr.isSupported()){ \r\n handlerClass = 'UploadHandlerXhr'; \r\n } else {\r\n handlerClass = 'UploadHandlerForm';\r\n }\r\n\r\n var handler = new qq[handlerClass]({\r\n debug: this._options.debug,\r\n action: this._options.action, \r\n maxConnections: this._options.maxConnections, \r\n onProgress: function(id, fileName, loaded, total){ \r\n self._onProgress(id, fileName, loaded, total);\r\n self._options.onProgress(id, fileName, loaded, total); \r\n }, \r\n onComplete: function(id, fileName, result){\r\n self._onComplete(id, fileName, result);\r\n self._options.onComplete(id, fileName, result);\r\n },\r\n onCancel: function(id, fileName){\r\n self._onCancel(id, fileName);\r\n self._options.onCancel(id, fileName);\r\n }\r\n });\r\n\r\n return handler;\r\n }, \r\n _preventLeaveInProgress: function(){\r\n var self = this;\r\n \r\n qq.attach(window, 'beforeunload', function(e){\r\n if (!self._filesInProgress){return;}\r\n \r\n var e = e || window.event;\r\n // for ie, ff\r\n e.returnValue = self._options.messages.onLeave;\r\n // for webkit\r\n return self._options.messages.onLeave; \r\n }); \r\n }, \r\n _onSubmit: function(id, fileName){\r\n this._filesInProgress++; \r\n },\r\n _onProgress: function(id, fileName, loaded, total){ \r\n },\r\n _onComplete: function(id, fileName, result){\r\n this._filesInProgress--; \r\n if (result.error){\r\n this._options.showMessage(result.error);\r\n } \r\n },\r\n _onCancel: function(id, fileName){\r\n this._filesInProgress--; \r\n },\r\n _onInputChange: function(input){\r\n if (this._handler instanceof qq.UploadHandlerXhr){ \r\n this._uploadFileList(input.files); \r\n } else { \r\n if (this._validateFile(input)){ \r\n this._uploadFile(input); \r\n } \r\n } \r\n this._button.reset(); \r\n }, \r\n _uploadFileList: function(files){\r\n for (var i=0; i this._options.sizeLimit){ \r\n this._error('sizeError', name);\r\n return false;\r\n \r\n } else if (size && size < this._options.minSizeLimit){\r\n this._error('minSizeError', name);\r\n return false; \r\n }\r\n \r\n return true; \r\n },\r\n _error: function(code, fileName){\r\n var message = this._options.messages[code]; \r\n function r(name, replacement){ message = message.replace(name, replacement); }\r\n \r\n r('{file}', this._formatFileName(fileName)); \r\n r('{extensions}', this._options.allowedExtensions.join(', '));\r\n r('{sizeLimit}', this._formatSize(this._options.sizeLimit));\r\n r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit));\r\n \r\n this._options.showMessage(message); \r\n },\r\n _formatFileName: function(name){\r\n if (name.length > 33){\r\n name = name.slice(0, 19) + '...' + name.slice(-13); \r\n }\r\n return name;\r\n },\r\n _isAllowedExtension: function(fileName){\r\n var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';\r\n var allowed = this._options.allowedExtensions;\r\n \r\n if (!allowed.length){return true;} \r\n \r\n for (var i=0; i 99);\r\n \r\n return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; \r\n }\r\n};\r\n \r\n \r\n/**\r\n * Class that creates upload widget with drag-and-drop and file list\r\n * @inherits qq.FileUploaderBasic\r\n */\r\nqq.FileUploader = function(o){\r\n // call parent constructor\r\n qq.FileUploaderBasic.apply(this, arguments);\r\n \r\n // additional options \r\n qq.extend(this._options, {\r\n element: null,\r\n // if set, will be used instead of qq-upload-list in template\r\n listElement: null, \r\n \r\n classes: {\r\n // used to get elements from templates\r\n button: 'qq-upload-button',\r\n drop: 'qq-upload-drop-area',\r\n dropActive: 'qq-upload-drop-area-active',\r\n list: 'qq-upload-list',\r\n \r\n file: 'qq-upload-file',\r\n spinner: 'qq-upload-spinner',\r\n size: 'qq-upload-size',\r\n cancel: 'qq-upload-cancel',\r\n\r\n // added to list item when upload completes\r\n // used in css to hide progress spinner\r\n success: 'qq-upload-success',\r\n fail: 'qq-upload-fail'\r\n }\r\n });\r\n // overwrite options with user supplied \r\n qq.extend(this._options, o); \r\n\r\n this._element = this._options.element;\r\n //this._element.innerHTML = this._options.template; \r\n this._listElement = this._options.listElement || this._find(this._element, 'list');\r\n \r\n this._classes = this._options.classes;\r\n \r\n this._button = this._createUploadButton(this._find(this._element, 'button')); \r\n \r\n this._bindCancelEvent();\r\n this._setupDragDrop();\r\n};\r\n\r\n// inherit from Basic Uploader\r\nqq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype);\r\n\r\nqq.extend(qq.FileUploader.prototype, {\r\n /**\r\n * Gets one of the elements listed in this._options.classes\r\n **/\r\n _find: function(parent, type){ \r\n var element = qq.getByClass(parent, this._options.classes[type])[0]; \r\n if (!element){\r\n throw new Error('element not found ' + type);\r\n }\r\n \r\n return element;\r\n },\r\n _setupDragDrop: function(){\r\n var self = this,\r\n dropArea = this._find(this._element, 'drop'); \r\n\r\n var dz = new qq.UploadDropZone({\r\n element: dropArea,\r\n onEnter: function(e){\r\n qq.addClass(dropArea, self._classes.dropActive);\r\n e.stopPropagation();\r\n },\r\n onLeave: function(e){\r\n e.stopPropagation();\r\n },\r\n onLeaveNotDescendants: function(e){\r\n qq.removeClass(dropArea, self._classes.dropActive); \r\n },\r\n onDrop: function(e){\r\n dropArea.style.display = 'none';\r\n qq.removeClass(dropArea, self._classes.dropActive);\r\n self._uploadFileList(e.dataTransfer.files); \r\n }\r\n });\r\n \r\n dropArea.style.display = 'none';\r\n\r\n qq.attach(document, 'dragenter', function(e){ \r\n if (!dz._isValidFileDrag(e)) return; \r\n \r\n dropArea.style.display = 'block'; \r\n }); \r\n qq.attach(document, 'dragleave', function(e){\r\n if (!dz._isValidFileDrag(e)) return; \r\n \r\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\r\n // only fire when leaving document out\r\n if ( ! relatedTarget || relatedTarget.nodeName == \"HTML\"){ \r\n dropArea.style.display = 'none'; \r\n }\r\n }); \r\n },\r\n _onSubmit: function(id, fileName){\r\n qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments);\r\n this._addToList(id, fileName); \r\n },\r\n _onProgress: function(id, fileName, loaded, total){\r\n qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments);\r\n\r\n var item = this._getItemByFileId(id);\r\n var size = this._find(item, 'size');\r\n size.style.display = 'inline';\r\n \r\n var text; \r\n if (loaded != total){\r\n text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total);\r\n } else { \r\n text = this._formatSize(total);\r\n } \r\n \r\n qq.setText(size, text); \r\n },\r\n _onComplete: function(id, fileName, result){\r\n qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments);\r\n\r\n // mark completed\r\n var item = this._getItemByFileId(id); \r\n qq.remove(this._find(item, 'cancel'));\r\n qq.remove(this._find(item, 'spinner'));\r\n \r\n if (result.success){\r\n qq.addClass(item, this._classes.success); \r\n } else {\r\n qq.addClass(item, this._classes.fail);\r\n } \r\n },\r\n _addToList: function(id, fileName){\r\n var item = qq.toElement(this._options.fileTemplate); \r\n item.qqFileId = id;\r\n\r\n var fileElement = this._find(item, 'file'); \r\n qq.setText(fileElement, this._formatFileName(fileName));\r\n this._find(item, 'size').style.display = 'none'; \r\n\r\n this._listElement.appendChild(item);\r\n },\r\n _getItemByFileId: function(id){\r\n var item = this._listElement.firstChild; \r\n \r\n // there can't be txt nodes in dynamically created list\r\n // and we can use nextSibling\r\n while (item){ \r\n if (item.qqFileId == id) return item; \r\n item = item.nextSibling;\r\n } \r\n },\r\n /**\r\n * delegate click event for cancel link \r\n **/\r\n _bindCancelEvent: function(){\r\n var self = this,\r\n list = this._listElement; \r\n \r\n qq.attach(list, 'click', function(e){ \r\n e = e || window.event;\r\n var target = e.target || e.srcElement;\r\n \r\n if (qq.hasClass(target, self._classes.cancel)){ \r\n qq.preventDefault(e);\r\n \r\n var item = target.parentNode;\r\n self._handler.cancel(item.qqFileId);\r\n qq.remove(item);\r\n }\r\n });\r\n } \r\n});\r\n \r\nqq.UploadDropZone = function(o){\r\n this._options = {\r\n element: null, \r\n onEnter: function(e){},\r\n onLeave: function(e){}, \r\n // is not fired when leaving element by hovering descendants \r\n onLeaveNotDescendants: function(e){}, \r\n onDrop: function(e){} \r\n };\r\n qq.extend(this._options, o); \r\n \r\n this._element = this._options.element;\r\n \r\n this._disableDropOutside();\r\n this._attachEvents(); \r\n};\r\n\r\nqq.UploadDropZone.prototype = {\r\n _disableDropOutside: function(e){\r\n // run only once for all instances\r\n if (!qq.UploadDropZone.dropOutsideDisabled ){\r\n\r\n qq.attach(document, 'dragover', function(e){\r\n if (e.dataTransfer){\r\n e.dataTransfer.dropEffect = 'none';\r\n e.preventDefault(); \r\n } \r\n });\r\n \r\n qq.UploadDropZone.dropOutsideDisabled = true; \r\n } \r\n },\r\n _attachEvents: function(){\r\n var self = this; \r\n \r\n qq.attach(self._element, 'dragover', function(e){\r\n if (!self._isValidFileDrag(e)) return;\r\n \r\n var effect = e.dataTransfer.effectAllowed;\r\n if (effect == 'move' || effect == 'linkMove'){\r\n e.dataTransfer.dropEffect = 'move'; // for FF (only move allowed) \r\n } else { \r\n e.dataTransfer.dropEffect = 'copy'; // for Chrome\r\n }\r\n \r\n e.stopPropagation();\r\n e.preventDefault(); \r\n });\r\n \r\n qq.attach(self._element, 'dragenter', function(e){\r\n if (!self._isValidFileDrag(e)) return;\r\n \r\n self._options.onEnter(e);\r\n });\r\n \r\n qq.attach(self._element, 'dragleave', function(e){\r\n if (!self._isValidFileDrag(e)) return;\r\n \r\n self._options.onLeave(e);\r\n \r\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY); \r\n // do not fire when moving a mouse over a descendant\r\n if (qq.contains(this, relatedTarget)) return;\r\n \r\n self._options.onLeaveNotDescendants(e); \r\n });\r\n \r\n qq.attach(self._element, 'drop', function(e){\r\n if (!self._isValidFileDrag(e)) return;\r\n \r\n e.preventDefault();\r\n self._options.onDrop(e);\r\n }); \r\n },\r\n _isValidFileDrag: function(e){\r\n var dt = e.dataTransfer,\r\n // do not check dt.types.contains in webkit, because it crashes safari 4 \r\n isWebkit = navigator.userAgent.indexOf(\"AppleWebKit\") > -1; \r\n\r\n // dt.effectAllowed is none in Safari 5\r\n // dt.types.contains check is for firefox \r\n return dt && dt.effectAllowed != 'none' && \r\n (dt.files || (!isWebkit && dt.types.contains && dt.types.contains('Files')));\r\n \r\n } \r\n}; \r\n\r\nqq.UploadButton = function(o){\r\n this._options = {\r\n element: null, \r\n // if set to true adds multiple attribute to file input \r\n multiple: false,\r\n // name attribute of file input\r\n name: 'file',\r\n onChange: function(input){},\r\n hoverClass: 'qq-upload-button-hover',\r\n focusClass: 'qq-upload-button-focus' \r\n };\r\n \r\n qq.extend(this._options, o);\r\n \r\n this._element = this._options.element;\r\n \r\n // make button suitable container for input\r\n qq.css(this._element, {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n // Make sure browse button is in the right side\r\n // in Internet Explorer\r\n direction: 'ltr'\r\n }); \r\n \r\n this._input = this._createInput();\r\n};\r\n\r\nqq.UploadButton.prototype = {\r\n /* returns file input element */ \r\n getInput: function(){\r\n return this._input;\r\n },\r\n /* cleans/recreates the file input */\r\n reset: function(){\r\n if (this._input.parentNode){\r\n qq.remove(this._input); \r\n } \r\n \r\n qq.removeClass(this._element, this._options.focusClass);\r\n this._input = this._createInput();\r\n }, \r\n _createInput: function(){ \r\n var input = document.createElement(\"input\");\r\n \r\n if (this._options.multiple){\r\n input.setAttribute(\"multiple\", \"multiple\");\r\n }\r\n \r\n input.setAttribute(\"type\", \"file\");\r\n input.setAttribute(\"name\", this._options.name);\r\n \r\n qq.css(input, {\r\n position: 'absolute',\r\n // in Opera only 'browse' button\r\n // is clickable and it is located at\r\n // the right side of the input\r\n right: 0,\r\n top: 0,\r\n fontFamily: 'Arial',\r\n // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118\r\n fontSize: '118px',\r\n margin: 0,\r\n padding: 0,\r\n cursor: 'pointer',\r\n opacity: 0\r\n });\r\n \r\n this._element.appendChild(input);\r\n\r\n var self = this;\r\n qq.attach(input, 'change', function(){\r\n self._options.onChange(input);\r\n });\r\n \r\n qq.attach(input, 'mouseover', function(){\r\n qq.addClass(self._element, self._options.hoverClass);\r\n });\r\n qq.attach(input, 'mouseout', function(){\r\n qq.removeClass(self._element, self._options.hoverClass);\r\n });\r\n qq.attach(input, 'focus', function(){\r\n qq.addClass(self._element, self._options.focusClass);\r\n });\r\n qq.attach(input, 'blur', function(){\r\n qq.removeClass(self._element, self._options.focusClass);\r\n });\r\n\r\n // IE and Opera, unfortunately have 2 tab stops on file input\r\n // which is unacceptable in our case, disable keyboard access\r\n if (window.attachEvent){\r\n // it is IE or Opera\r\n input.setAttribute('tabIndex', \"-1\");\r\n }\r\n\r\n return input; \r\n } \r\n};\r\n\r\n/**\r\n * Class for uploading files, uploading itself is handled by child classes\r\n */\r\nqq.UploadHandlerAbstract = function(o){\r\n this._options = {\r\n debug: false,\r\n action: '/upload.php',\r\n // maximum number of concurrent uploads \r\n maxConnections: 999,\r\n onProgress: function(id, fileName, loaded, total){},\r\n onComplete: function(id, fileName, response){},\r\n onCancel: function(id, fileName){}\r\n };\r\n qq.extend(this._options, o); \r\n \r\n this._queue = [];\r\n // params for files in queue\r\n this._params = [];\r\n};\r\nqq.UploadHandlerAbstract.prototype = {\r\n log: function(str){\r\n if (this._options.debug && window.console) console.log('[uploader] ' + str); \r\n },\r\n /**\r\n * Adds file or file input to the queue\r\n * @returns id\r\n **/ \r\n add: function(file){},\r\n /**\r\n * Sends the file identified by id and additional query params to the server\r\n */\r\n upload: function(id, params){\r\n var len = this._queue.push(id);\r\n\r\n var copy = {}; \r\n qq.extend(copy, params);\r\n this._params[id] = copy; \r\n \r\n // if too many active uploads, wait...\r\n if (len <= this._options.maxConnections){ \r\n this._upload(id, this._params[id]);\r\n }\r\n },\r\n /**\r\n * Cancels file upload by id\r\n */\r\n cancel: function(id){\r\n this._cancel(id);\r\n this._dequeue(id);\r\n },\r\n /**\r\n * Cancells all uploads\r\n */\r\n cancelAll: function(){\r\n for (var i=0; i= max && i < max){\r\n var nextId = this._queue[max-1];\r\n this._upload(nextId, this._params[nextId]);\r\n }\r\n } \r\n};\r\n\r\n/**\r\n * Class for uploading files using form and iframe\r\n * @inherits qq.UploadHandlerAbstract\r\n */\r\nqq.UploadHandlerForm = function(o){\r\n qq.UploadHandlerAbstract.apply(this, arguments);\r\n \r\n this._inputs = {};\r\n};\r\n// @inherits qq.UploadHandlerAbstract\r\nqq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype);\r\n\r\nqq.extend(qq.UploadHandlerForm.prototype, {\r\n add: function(fileInput){\r\n fileInput.setAttribute('name', 'qqfile');\r\n var id = 'qq-upload-handler-iframe' + qq.getUniqueId(); \r\n \r\n this._inputs[id] = fileInput;\r\n \r\n // remove file input from DOM\r\n if (fileInput.parentNode){\r\n qq.remove(fileInput);\r\n }\r\n \r\n return id;\r\n },\r\n getName: function(id){\r\n // get input value and remove path to normalize\r\n return this._inputs[id].value.replace(/.*(\\/|\\\\)/, \"\");\r\n }, \r\n _cancel: function(id){\r\n this._options.onCancel(id, this.getName(id));\r\n \r\n delete this._inputs[id]; \r\n\r\n var iframe = document.getElementById(id);\r\n if (iframe){\r\n // to cancel request set src to something else\r\n // we use src=\"javascript:false;\" because it doesn't\r\n // trigger ie6 prompt on https\r\n iframe.setAttribute('src', 'javascript:false;');\r\n\r\n qq.remove(iframe);\r\n }\r\n }, \r\n _upload: function(id, params){ \r\n var input = this._inputs[id];\r\n \r\n if (!input){\r\n throw new Error('file with passed id was not added, or already uploaded or cancelled');\r\n } \r\n\r\n var fileName = this.getName(id);\r\n \r\n var iframe = this._createIframe(id);\r\n var form = this._createForm(iframe, params);\r\n form.appendChild(input);\r\n\r\n var self = this;\r\n this._attachLoadEvent(iframe, function(){ \r\n self.log('iframe loaded');\r\n \r\n var response = self._getIframeContentJSON(iframe);\r\n\r\n self._options.onComplete(id, fileName, response);\r\n self._dequeue(id);\r\n \r\n delete self._inputs[id];\r\n // timeout added to fix busy state in FF3.6\r\n setTimeout(function(){\r\n qq.remove(iframe);\r\n }, 1);\r\n });\r\n\r\n form.submit(); \r\n qq.remove(form); \r\n \r\n return id;\r\n }, \r\n _attachLoadEvent: function(iframe, callback){\r\n qq.attach(iframe, 'load', function(){\r\n // when we remove iframe from dom\r\n // the request stops, but in IE load\r\n // event fires\r\n if (!iframe.parentNode){\r\n return;\r\n }\r\n\r\n // fixing Opera 10.53\r\n if (iframe.contentDocument &&\r\n iframe.contentDocument.body &&\r\n iframe.contentDocument.body.innerHTML == \"false\"){\r\n // In Opera event is fired second time\r\n // when body.innerHTML changed from false\r\n // to server response approx. after 1 sec\r\n // when we upload file with iframe\r\n return;\r\n }\r\n\r\n callback();\r\n });\r\n },\r\n /**\r\n * Returns json object received by iframe from server.\r\n */\r\n _getIframeContentJSON: function(iframe){\r\n // iframe.contentWindow.document - for IE<7\r\n var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document,\r\n response;\r\n \r\n this.log(\"converting iframe's innerHTML to JSON\");\r\n this.log(\"innerHTML = \" + doc.body.innerHTML);\r\n \r\n try {\r\n response = eval(\"(\" + doc.body.innerHTML + \")\");\r\n } catch(err){\r\n response = {};\r\n } \r\n\r\n return response;\r\n },\r\n /**\r\n * Creates iframe with unique name\r\n */\r\n _createIframe: function(id){\r\n // We can't use following code as the name attribute\r\n // won't be properly registered in IE6, and new window\r\n // on form submit will open\r\n // var iframe = document.createElement('iframe');\r\n // iframe.setAttribute('name', id);\r\n\r\n var iframe = qq.toElement('