var qq=qq||{};qq.FileUploader=function(o){this._options={element:null,action:'/server/upload',params:{},allowedExtensions:[],sizeLimit:0,onSubmit:function(id,fileName){},onComplete:function(id,fileName,responseJSON){},template:'<div class="qq-uploader">'+'<div class="qq-upload-drop-area"><span>Drop files here to upload</span></div>'+'<div class="qq-upload-button">Datei ausw&auml;hlen</div>'+'<ul class="qq-upload-list"></ul>'+'</div>',fileTemplate:'<li>'+'<span class="qq-upload-file"></span>'+'<span class="qq-upload-spinner"></span>'+'<span class="qq-upload-size"></span>'+'<a class="qq-upload-cancel" href="#">Cancel</a>'+'<span class="qq-upload-failed-text">Failed</span>'+'</li>',classes:{button:'qq-upload-button',drop:'qq-upload-drop-area',dropActive:'qq-upload-drop-area-active',list:'qq-upload-list',file:'qq-upload-file',spinner:'qq-upload-spinner',size:'qq-upload-size',cancel:'qq-upload-cancel',success:'qq-upload-success',fail:'qq-upload-fail'},messages:{typeError:"{file} has invalid extension. Only {extensions} are allowed.",sizeError:"{file} is too large, maximum file size is {sizeLimit}.",emptyError:"{file} is empty, please select files again without it."},showMessage:function(message){alert(message);}};qq.extend(this._options,o);this._element=this._options.element;if(this._element.nodeType!=1){throw new Error('element param of FileUploader should be dom node');}
this._element.innerHTML=this._options.template;this._filesInProgress=0;this._classes=this._options.classes;this._handler=this._createUploadHandler();this._bindCancelEvent();var self=this;this._button=new qq.UploadButton({element:this._getElement('button'),multiple:qq.UploadHandlerXhr.isSupported(),onChange:function(input){self._onInputChange(input);}});this._setupDragDrop();};qq.FileUploader.prototype={setParams:function(params){this._options.params=params;},isUploading:function(){return!!this._filesInProgress;},_getElement:function(parent,type){if(typeof parent=='string'){type=parent;parent=this._element;}
var element=qq.getByClass(parent,this._options.classes[type])[0];if(!element){throw new Error('element not found '+type);}
return element;},_error:function(code,fileName){var message=this._options.messages[code];message=message.replace('{file}',this._formatFileName(fileName));message=message.replace('{extensions}',this._options.allowedExtensions.join(', '));message=message.replace('{sizeLimit}',this._formatSize(this._options.sizeLimit));this._options.showMessage(message);},_formatFileName:function(name){if(name.length>33){name=name.slice(0,19)+'...'+name.slice(-13);}
return name;},_isAllowedExtension:function(fileName){var ext=(-1!==fileName.indexOf('.'))?fileName.replace(/.*[.]/,'').toLowerCase():'';var allowed=this._options.allowedExtensions;if(!allowed.length){return true;}
for(var i=0;i<allowed.length;i++){if(allowed[i].toLowerCase()==ext){return true;}}
return false;},_setupDragDrop:function(){function isValidDrag(e){var dt=e.dataTransfer,isWebkit=navigator.userAgent.indexOf("AppleWebKit")>-1;return dt&&dt.effectAllowed!='none'&&(dt.files||(!isWebkit&&dt.types.contains&&dt.types.contains('Files')));}
var self=this,dropArea=this._getElement('drop');dropArea.style.display='none';var hideTimeout;qq.attach(document,'dragenter',function(e){e.preventDefault();});qq.attach(document,'dragover',function(e){if(isValidDrag(e)){if(hideTimeout){clearTimeout(hideTimeout);}
if(dropArea==e.target||qq.contains(dropArea,e.target)){var effect=e.dataTransfer.effectAllowed;if(effect=='move'||effect=='linkMove'){e.dataTransfer.dropEffect='move';}else{e.dataTransfer.dropEffect='copy';}
qq.addClass(dropArea,self._classes.dropActive);e.stopPropagation();}else{dropArea.style.display='block';e.dataTransfer.dropEffect='none';}
e.preventDefault();}});qq.attach(document,'dragleave',function(e){if(isValidDrag(e)){if(dropArea==e.target||qq.contains(dropArea,e.target)){qq.removeClass(dropArea,self._classes.dropActive);e.stopPropagation();}else{if(hideTimeout){clearTimeout(hideTimeout);}
hideTimeout=setTimeout(function(){dropArea.style.display='none';},77);}}});qq.attach(dropArea,'drop',function(e){dropArea.style.display='none';self._uploadFileList(e.dataTransfer.files);e.preventDefault();});},_createUploadHandler:function(){var self=this,handlerClass;if(qq.UploadHandlerXhr.isSupported()){handlerClass='UploadHandlerXhr';}else{handlerClass='UploadHandlerForm';}
var handler=new qq[handlerClass]({action:this._options.action,onProgress:function(id,fileName,loaded,total){self._updateProgress(id,loaded,total);},onComplete:function(id,fileName,result){self._filesInProgress--;var item=self._getItemByFileId(id);qq.remove(self._getElement(item,'cancel'));qq.remove(self._getElement(item,'spinner'));if(result.success){qq.addClass(item,self._classes.success);}else{qq.addClass(item,self._classes.fail);if(result.error){self._options.showMessage(result.error);}}
self._options.onComplete(id,fileName,result);}});return handler;},_onInputChange:function(input){if(this._handler instanceof qq.UploadHandlerXhr){this._uploadFileList(input.files);}else{if(this._validateFile(input)){this._uploadFile(input);}}
this._button.reset();},_uploadFileList:function(files){var valid=true;var i=files.length;while(i--){if(!this._validateFile(files[i])){valid=false;break;}}
if(valid){var i=files.length;while(i--){this._uploadFile(files[i]);}}},_uploadFile:function(fileContainer){var id=this._handler.add(fileContainer);var name=this._handler.getName(id);this._options.onSubmit(id,name);this._addToList(id,name);this._handler.upload(id,this._options.params);},_validateFile:function(file){var name,size;if(file.value){name=file.value.replace(/.*(\/|\\)/,"");}else{name=file.fileName!=null?file.fileName:file.name;size=file.fileSize!=null?file.fileSize:file.size;}
if(!this._isAllowedExtension(name)){this._error('typeError',name);return false;}else if(size===0){this._error('emptyError',name);return false;}else if(size&&this._options.sizeLimit&&size>this._options.sizeLimit){this._error('sizeError',name);return false;}
return true;},_addToList:function(id,fileName){var item=qq.toElement(this._options.fileTemplate);item.qqFileId=id;var fileElement=this._getElement(item,'file');qq.setText(fileElement,"<a href=\"javascript:showHint(0,'SelectMenu','CenterFrame.php','CSearch')\">"
+this._formatFileName(fileName)+'</a>');this._getElement(item,'size').style.display='none';this._getElement('list').appendChild(item);},_updateProgress:function(id,loaded,total){var item=this._getItemByFileId(id);var size=this._getElement(item,'size');size.style.display='inline';var text;if(loaded!=total){text=Math.round(loaded/total*100)+'% from '+this._formatSize(total);}else{text=this._formatSize(total);}
qq.setText(size,text);},_formatSize:function(bytes){var i=-1;do{bytes=bytes/1024;i++;}while(bytes>99);return Math.max(bytes,0.1).toFixed(1)+['kB','MB','GB','TB','PB','EB'][i];},_getItemByFileId:function(id){var item=this._getElement('list').firstChild;while(item){if(item.qqFileId==id){return item;}
item=item.nextSibling;}},_bindCancelEvent:function(){var self=this,list=this._getElement('list');qq.attach(list,'click',function(e){e=e||window.event;var target=e.target||e.srcElement;if(qq.hasClass(target,self._classes.cancel)){qq.preventDefault(e);var item=target.parentNode;self._handler.cancel(item.qqFileId);qq.remove(item);}});}};qq.UploadButton=function(o){this._options={element:null,multiple:false,name:'file',onChange:function(input){},hoverClass:'qq-upload-button-hover',focusClass:'qq-upload-button-focus'};qq.extend(this._options,o);this._element=this._options.element;qq.css(this._element,{position:'relative',overflow:'hidden',direction:'ltr'});this._input=this._createInput();};qq.UploadButton.prototype={getInput:function(){return this._input;},reset:function(){if(this._input.parentNode){qq.remove(this._input);}
qq.removeClass(this._element,this._options.focusClass);this._input=this._createInput();},_createInput:function(){var input=document.createElement("input");if(this._options.multiple){input.setAttribute("multiple","multiple");}
input.setAttribute("type","file");input.setAttribute("name",this._options.name);qq.css(input,{position:'absolute',right:0,top:0,fontFamily:'Arial',fontSize:'243px',margin:0,padding:0,cursor:'pointer',opacity:0});this._element.appendChild(input);var self=this;qq.attach(input,'change',function(){self._options.onChange(input);});qq.attach(input,'mouseover',function(){qq.addClass(self._element,self._options.hoverClass);});qq.attach(input,'mouseout',function(){qq.removeClass(self._element,self._options.hoverClass);});qq.attach(input,'focus',function(){qq.addClass(self._element,self._options.focusClass);});qq.attach(input,'blur',function(){qq.removeClass(self._element,self._options.focusClass);});if(window.attachEvent){input.setAttribute('tabIndex',"-1");}
return input;}};qq.UploadHandlerForm=function(o){this._options={action:'/upload',onComplete:function(id,fileName,response){}};qq.extend(this._options,o);this._inputs={};};qq.UploadHandlerForm.prototype={add:function(fileInput){fileInput.setAttribute('name','qqfile');var id='qq-upload-handler-iframe'+qq.getUniqueId();this._inputs[id]=fileInput;if(fileInput.parentNode){qq.remove(fileInput);}
return id;},upload:function(id,params){var input=this._inputs[id];if(!input){throw new Error('file with passed id was not added, or already uploaded or cancelled');}
var fileName=this.getName(id);var iframe=this._createIframe(id);var form=this._createForm(iframe,params);form.appendChild(input);var self=this;this._attachLoadEvent(iframe,function(){self._options.onComplete(id,fileName,self._getIframeContentJSON(iframe));delete self._inputs[id];setTimeout(function(){qq.remove(iframe);},1);});form.submit();qq.remove(form);return id;},cancel:function(id){if(id in this._inputs){delete this._inputs[id];}
var iframe=document.getElementById(id);if(iframe){iframe.setAttribute('src','javascript:false;');qq.remove(iframe);}},getName:function(id){return this._inputs[id].value.replace(/.*(\/|\\)/,"");},_attachLoadEvent:function(iframe,callback){qq.attach(iframe,'load',function(){if(!iframe.parentNode){return;}
if(iframe.contentDocument&&iframe.contentDocument.body&&iframe.contentDocument.body.innerHTML=="false"){return;}
callback();});},_getIframeContentJSON:function(iframe){var doc=iframe.contentDocument?iframe.contentDocument:iframe.contentWindow.document,response;try{response=eval("("+doc.body.innerHTML+")");}catch(err){response={};}
return response;},_createIframe:function(id){var iframe=qq.toElement('<iframe src="javascript:false;" name="'+id+'" />');iframe.setAttribute('id',id);iframe.style.display='none';document.body.appendChild(iframe);return iframe;},_createForm:function(iframe,params){var form=qq.toElement('<form method="post" enctype="multipart/form-data"></form>');var queryString='?'+qq.obj2url(params);form.setAttribute('action',this._options.action+queryString);form.setAttribute('target',iframe.name);form.style.display='none';document.body.appendChild(form);return form;}};qq.UploadHandlerXhr=function(o){this._options={action:'/upload',onProgress:function(id,fileName,loaded,total){},onComplete:function(id,fileName,response){}};qq.extend(this._options,o);this._files=[];this._xhrs=[];};qq.UploadHandlerXhr.isSupported=function(){var input=document.createElement('input');input.type='file';return('multiple'in input&&typeof File!="undefined"&&typeof(new XMLHttpRequest()).upload!="undefined");};qq.UploadHandlerXhr.prototype={add:function(file){return this._files.push(file)-1;},upload:function(id,params){var file=this._files[id],name=this.getName(id),size=this.getSize(id);if(!file){throw new Error('file with passed id was not added, or already uploaded or cancelled');}
var xhr=this._xhrs[id]=new XMLHttpRequest();var self=this;xhr.upload.onprogress=function(e){if(e.lengthComputable){self._options.onProgress(id,name,e.loaded,e.total);}};xhr.onreadystatechange=function(){if(!self._files[id]){return;}
if(xhr.readyState==4){self._options.onProgress(id,name,size,size);if(xhr.status==200){var response;try{response=eval("("+xhr.responseText+")");}catch(err){response={};}
self._options.onComplete(id,name,response);}else{self._options.onComplete(id,name,{});}
self._files[id]=null;self._xhrs[id]=null;}};var queryString='?qqfile='+encodeURIComponent(name)+'&'+qq.obj2url(params);xhr.open("POST",this._options.action+queryString,true);xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("X-File-Name",encodeURIComponent(name));xhr.send(file);},cancel:function(id){this._files[id]=null;if(this._xhrs[id]){this._xhrs[id].abort();this._xhrs[id]=null;}},getName:function(id){var file=this._files[id];return file.fileName!=null?file.fileName:file.name;},getSize:function(id){var file=this._files[id];return file.fileSize!=null?file.fileSize:file.size;}};var qq=qq||{};qq.extend=function(obj1,obj2){for(var prop in obj2){obj1[prop]=obj2[prop];}};qq.getUniqueId=(function(){var id=0;return function(){return id++;};})();qq.attach=function(element,type,fn){if(element.addEventListener){element.addEventListener(type,fn,false);}else if(element.attachEvent){element.attachEvent('on'+type,fn);}};qq.detach=function(element,type,fn){if(element.removeEventListener){element.removeEventListener(type,fn,false);}else if(element.attachEvent){element.detachEvent('on'+type,fn);}};qq.preventDefault=function(e){if(e.preventDefault){e.preventDefault();}else{e.returnValue=false;}};qq.insertBefore=function(a,b){b.parentNode.insertBefore(a,b);};qq.remove=function(element){element.parentNode.removeChild(element);};qq.contains=function(parent,descendant){if(parent.contains){return parent.contains(descendant);}else{return!!(descendant.compareDocumentPosition(parent)&8);}};qq.toElement=(function(){var div=document.createElement('div');return function(html){div.innerHTML=html;var element=div.firstChild;div.removeChild(element);return element;};})();qq.css=function(element,styles){if(styles.opacity!=null){if(typeof element.style.opacity!='string'&&typeof(element.filters)!='undefined'){styles.filter='alpha(opacity='+Math.round(100*styles.opacity)+')';}}
qq.extend(element.style,styles);};qq.hasClass=function(element,name){var re=new RegExp('(^| )'+name+'( |$)');return re.test(element.className);};qq.addClass=function(element,name){if(!qq.hasClass(element,name)){element.className+=' '+name;}};qq.removeClass=function(element,name){var re=new RegExp('(^| )'+name+'( |$)');element.className=element.className.replace(re,' ').replace(/^\s+|\s+$/g,"");};qq.setText=function(element,text){element.innerHTML=text;};qq.children=function(element){var children=[],child=element.firstChild;while(child){if(child.nodeType==1){children.push(child);}
child=child.nextSibling;}
return children;};qq.getByClass=function(element,className){if(element.querySelectorAll){return element.querySelectorAll('.'+className);}
var result=[];var candidates=element.getElementsByTagName("*");var len=candidates.length;for(var i=0;i<len;i++){if(qq.hasClass(candidates[i],className)){result.push(candidates[i]);}}
return result;};qq.obj2url=function(obj,temp){var uristrings=[],add=function(nextObj,i){var nextTemp=temp?(/\[\]$/.test(temp))?temp:temp+'['+i+']':i;uristrings.push(typeof nextObj==='object'?qq.obj2url(nextObj,nextTemp):(Object.prototype.toString.call(nextObj)==='[object Function]')?encodeURIComponent(nextTemp)+'='+encodeURIComponent(nextObj()):encodeURIComponent(nextTemp)+'='+encodeURIComponent(nextObj));};if(Object.prototype.toString.call(obj)==='[object Array]'){for(var i=0,len=obj.length;i<len;++i){add(obj[i],i);}}else if((obj!==undefined)&&(obj!==null)&&(typeof obj==="object")){for(var i in obj){add(obj[i],i);}}else{uristrings.push(encodeURIComponent(temp)+'='+encodeURIComponent(obj));}
return uristrings.join('&').replace(/%20/g,'+');};
