﻿/*
    本版本说明：
    页面初始化时，外部调用示例
    upload.createUpload('divupload','D',false,false,'img1');
        createUpload 参数 objid:外部容器id modal:对应UploadMethods.xml的Modal txt: 浏览按钮显示内容 btclass:按钮样式 previd:外部预览图片img的id

    
    ****************************************
    下一版本要实现的
    1.多浏览器 用jquery实现
    2.上传 存在按钮/不存在通过传入参数实现 参数值为上传完成后要执行的函数(例如 'func()' ) ,控件会在上传完毕后自动调用
    3.浏览后文件前面显示的图标 根据文件类型显示不同
    4.使用方法可能要变
    
    可能要注意的是 上传文件限制类型需要参数传入，因为firefox读取xml和ie不同
*/
var callback = function back(obj)
{
    upload.setStatus(obj.responseText);
}
var upload={
    arrupload:{},
    curupload:null,
    createUpload:function(objid,modal,txt,btclass,previd){
        this.curupload=null;
        var o=new uploadclass().createUpload(objid,modal,txt,btclass,previd);
        this.arrupload[objid]=o;
        return o;
    },
    initprogress:function(objid){
        this.arrupload[objid].initprogress();
    },
    progressUpdate:function(objid){
        this.arrupload[objid].progressUpdate();
    },
    setStatus:function(str){
        if(this.curupload)
            this.curupload.strStatus=str;
    }
};
function uploadclass(){
    this.intMaxBox=20;
    this.strUploadMethodsXml="UploadMethods.xml";//改变路径    
    this.strmodal="ALL";//默认值 上传的模块，与UploadMethod.xml中的模块对应
    this.strbttxt="浏览";//默认值  浏览按钮显示内容
    this.strbtclass="btupload";
    this.strbtclassover="btuploadover";
    this.initupload=function(){
        this.objupFormdocment=null;
        this.objuploadForm=null;
        this.objfilelist=null;
        this.objoutdiv=null;
        this.objbtupload=null;
        this.objbtaddfile=null;
        this.objdivProgressDisplay=null;
        this.objdivuploadStatus=null;
        this.objdivprogressContainer=null;
        this.objdivprogressBar=null;
        this.objhandler=null;
        this.objprogresshandler=null;       
        this.arruploadBoxes=[];
        this.struploadId=null;
        this.strFiletype=null;
        this.strFilepath=null;
        this.strStatus="";
    };
    this.createUpload=function(objid,modal,txt,btclass,previd){//debugger;
        this.initupload();
        this.stroutdivid=objid;//外部容器id
        this.objoutdiv=this.getE(objid);//外部容器
        if(modal)
            this.strmodal=modal;
        if(txt)
            this.strbttxt=txt;
        if(btclass)
            this.strbtclass=btclass;
        this.previd=previd;//外部图像容器id
        this.setBtupload(); 
        return this;       
    };
    this.setBtupload=function(e){//debugger;
        var objupload=this;
        if(e){
            var objbt = e.srcElement ? e.srcElement : e.target;  
            if(objbt.obju)
                objupload=objbt.obju;
        }
        objupload.struploadId = objupload.generateGuid();
        var str='<input id="bt'+objupload.stroutdivid+'" obju="" class="'+objupload.strbtclass+'" type="button" value="'+objupload.strbttxt+'"onmouseover="this.className=\''+objupload.strbtclassover+'\'" onmouseout="this.className=\''+objupload.strbtclass+'\'" />';
            str+='<input id="btup'+objupload.stroutdivid+'" obju="" class="'+objupload.strbtclass+'" style="margin-left: 8px;" type="button" value="上传" onmouseover="this.className=\''+objupload.strbtclassover+'\'" onmouseout="this.className=\''+objupload.strbtclass+'\'" />';
            str+='<div id="div'+objupload.stroutdivid+'"></div>';
            str+='<iframe frameborder="0" name="uploadFrame'+objupload.stroutdivid+'" id="uploadFrame'+objupload.stroutdivid+'" scrolling="no" style="display:none;"></iframe>';
            str+='<div id="divProgressDisplay'+objupload.stroutdivid+'" style="display:none;"></div>';
        objupload.objoutdiv.innerHTML=str;
        objupload.objbtaddfile=objupload.objoutdiv.childNodes[0];
        objupload.objbtupload=objupload.objoutdiv.childNodes[1];
        objupload.objfilelist=objupload.objoutdiv.childNodes[2];
        objupload.objdivProgressDisplay=objupload.objoutdiv.childNodes[4];
        objupload.objbtaddfile.attachEvent("onclick",objupload.addFile);
        objupload.objbtupload.attachEvent("onclick",objupload.upFiles);
        objupload.objbtaddfile.obju=objupload;
        objupload.objbtupload.obju=objupload;
        objupload.setFrameDoc();
        this.sfileName =document.getElementById("divfileName");
    };
    this.setFrameDoc=function(){
        var doc=this.objoutdiv.childNodes[3].contentWindow.document;
        doc.appendChild(doc.createElement("html"));
        doc.appendChild(doc.createElement("body")); 
        doc.body.innerHTML='<form id="frm'+this.stroutdivid+'" action="a.ascx?Modal='+this.strmodal+'&uploadId='+this.struploadId+'" method="post" enctype="multipart/form-data" target="uploadFrame'+this.stroutdivid+'"></form>';
        this.objupFormdocment=doc;
        this.objuploadForm=doc.forms[0];
    };
    this.addFile=function(e){//alert(e);
        var objupload = e.srcElement ? e.srcElement.obju : e.target.obju;  
        if(objupload.arruploadBoxes&&objupload.intMaxBox<=objupload.arruploadBoxes.length){
            alert("已超过最大上传个数!");
            return;
        }
        if(objupload.arruploadBoxes.length==0||objupload.arruploadBoxes[objupload.arruploadBoxes.length-1].value!="")
	        objupload.addUploadBox().click();
	    else
	        objupload.arruploadBoxes[objupload.arruploadBoxes.length-1].click();
    };
    this.addUploadBox=function(){
        var id="ehaiupload"+((this.arruploadBoxes.length>0)?parseInt(this.arruploadBoxes[this.arruploadBoxes.length-1].id.substring(10,11))+1:1);
        var newBox;
        try{
            newBox= this.objupFormdocment.createElement("input");
        }catch(e){
            this.setFrameDoc();
            newBox = this.objupFormdocment.createElement("input"); 
        }
            newBox.type = "file";
            newBox.id=id;
            newBox.name=id;
            newBox.setAttribute("obju",this); 
            newBox.attachEvent("onchange",this.changeUploadbox); 
            this.objuploadForm.appendChild(newBox);
            this.arruploadBoxes.push(newBox); 
            return newBox;
    };
    this.changeUploadbox=function(e){
        var objfile = e.srcElement ? e.srcElement : e.target;        
        var objupload=objfile.obju;
        var v=objfile.value;
        if(v==""){
            objupload.delUploadBox(objfile);
            return;
        }
        if(objupload.strFiletype==null){
            objupload.setFiletype();
        }
        var filetype="";
        if(v.lastIndexOf(".")>0&&objupload.strFiletype!="")
        {
            filetype=v.substring(v.lastIndexOf(".")+1,v.length);
            if((objupload.strFiletype+"|").indexOf(filetype+"|".toLowerCase())<0){
                objupload.delUploadBox(objfile);
                alert("这个文件不符合上传的类型！只有以下的类型才允许上传：\n"+objupload.strFiletype);
                return;
            }
        }
        if(objupload.isExistValue(objfile)){
            objupload.delUploadBox(objfile);
            alert("该文件已经被添加！");
            return;
        } 
        var filename=v.substring(((v.lastIndexOf("\\")<0)?v.lastIndexOf("/"):v.lastIndexOf("\\"))+1,v.length);
        var newfile = objupload.createElementWithHTML('<div style="white-space:nowrap;float:left;"><label class="filelistimg">&nbsp;</label><label class="filelist" title="'+v+'">'+filename+'</label><label file="" obju="" class="filedelete" title="删除">&nbsp;</label></div>');
        newfile.childNodes[2].attachEvent("onclick",objupload.deleteFile);
        newfile.childNodes[2].file=objfile;
        newfile.childNodes[2].obju=objupload;
        if(objupload.previd&&(("jpg|bmp|png|gif|jepg|").indexOf(filetype+"|".toLowerCase())>=0)){
            newfile.file=v;
            newfile.childNodes[0].attachEvent("onclick",objupload.viewFile);
            newfile.childNodes[0].obju=objupload;
            newfile.childNodes[1].attachEvent("onclick",objupload.viewFile);
            newfile.childNodes[1].obju=objupload;
            objupload.getE(objupload.previd).src=v;
        }
        objupload.objfilelist.appendChild(newfile);
    };
    this.delUploadBox=function(obj){
        this.objuploadForm.removeChild(obj);
        this.arruploadBoxes.splice(this.getIndex(obj),1);                
    };
    this.viewFile=function(e){
        var obj= e.srcElement ? e.srcElement : e.target;
        var objupload =obj.obju;
        var v=obj.parentNode.file;
        objupload.getE(objupload.previd).src=v;
    };
    this.upFiles=function(e){
        var obj= e.srcElement ? e.srcElement : e.target;
        var objupload =obj.obju;
        if(objupload.arruploadBoxes.length>0&&objupload.arruploadBoxes[0].value!=""){
            upload.curupload=objupload;
            objupload.objbtaddfile.style.display="none";
            objupload.objfilelist.innerHTML="正在初始化...";
            window.status="正在初始化...";  
            obj.value="取消上传";
            obj.detachEvent("onclick",objupload.upFiles);
            obj.attachEvent("onclick",objupload.cancelupFile);
            objupload.objhandler=window.setTimeout("upload.initprogress('"+objupload.stroutdivid+"')", 1);
        }else{
            alert("请先添加上传文件！");
        }
    };
    this.initprogress=function(){        
        var str='<div id="divuploadStatus"></div><div id="divprogressContainer"><div id="divprogressBar"></div></div>';
        this.objdivProgressDisplay.innerHTML=str;
        this.objdivuploadStatus=this.objdivProgressDisplay.childNodes[0];
        this.objdivprogressContainer=this.objdivProgressDisplay.childNodes[1];
        this.divprogressBar=this.objdivProgressDisplay.childNodes[1].childNodes[0];  
        this.objhandler=null;
        this.objuploadForm.submit();
        this.progressUpdate(); 
    };
    this.progressUpdate=function(){
        Request.reSend("b.ascx?uploadStatus=&Modal="+this.strmodal+"&uploadId="+this.struploadId,'',callback);
        var uploadComplete=false;
        var isError=false;
        var sfileName ="";	
        if(!this.objdivuploadStatus)
            return;
        if(this.strStatus!=""){
            window.status="正在上传文件...";  
            this.objfilelist.style.display="none";
            this.objdivProgressDisplay.style.display="";
            //                        var progress=$.parseJSON(inoptions.strStatus);
                        var pjson = $.parseJSON ? $.parseJSON : parent.$.parseJSON;
                        var progress=pjson(this.strStatus);
//            var progress=$.parseJSON(this.strStatus);
    	    var status = progress.status;
    	    if ( status == "ReceivingData"|| status == "Init"|| status == "ReceiveFinish")
		    {
			    var showStatus;
				var readTotalSize = progress.readTotalSize;
			    var uploadTotalSize = progress.uploadTotalSize;
				var runningTime = progress.elapsedTimeText;
				var uploadSpeed = readTotalSize/runningTime;
				showStatus = "大小: " + this.transformUnit(readTotalSize) + "/" + this.transformUnit(uploadTotalSize);
				showStatus += "&nbsp;&nbsp;已上传:" + this.formateString(readTotalSize * 100 / uploadTotalSize,2) + "%";
			    showStatus += "<br />";
			    showStatus += "剩余时间:" + this.transformTime((uploadTotalSize-readTotalSize)*runningTime/readTotalSize) ;//+ "/" + this.transformTime(progress.processEndTime);
			    showStatus += "&nbsp;&nbsp;";
				showStatus += "速度:" + this.transformUnit(uploadSpeed*1000) + "/s";
			    this.objdivuploadStatus.innerHTML = showStatus;
				if (readTotalSize != uploadTotalSize)
				{
					this.divprogressBar.style.width = (readTotalSize / uploadTotalSize) * this.objdivprogressContainer.offsetWidth + "px";
				}
				else
					this.divprogressBar.style.width = "100%";
		    }
		    else
		    {
			    if (status == "Error"){
				    this.objdivuploadStatus.innerHTML ='上传出错，请重试！';
				    isError=true;
			    }else if (status == "ErrorMaxRequestLengthExceeded"){
			        this.objdivuploadStatus.innerHTML ='上传出错. 超出允许上传大小，请重试！';
				    isError=true;				    
			    }else if (status == "Complete"){
				    uploadComplete = true;
				    sfileName = progress.fileName;		    
			    }
		    }
	    }//debugger;
	    if (!uploadComplete&&!isError){
		    this.objprogresshandler=window.setTimeout("upload.progressUpdate('"+this.stroutdivid+"')", 1000);
	    }else if(uploadComplete){//div2.innerHTML+=sfileName+"<br>";
            this.finishupFile(sfileName);
	    }else
		    return;
    };
    this.isExistValue=function(obj){
        for(var i=0;i<this.arruploadBoxes.length;i++){
            if(this.arruploadBoxes[i]!=obj&&this.arruploadBoxes[i].value==obj.value)
                return true;
        }
        return false;
    };
    this.deleteFile=function(e){
         var obj = e.srcElement ? e.srcElement : e.target;
         obj.obju.delUploadBox(obj.file);
         obj.obju.objfilelist.removeChild(obj.parentElement);
    };
    this.finishupFile=function(sfileName){
		window.status="完毕";
        this.disposeProgress();
        this.disposeFile();
        var str='<input id="btup'+this.stroutdivid+'" obju="" class="'+this.strbtclass+'" style="float:left;" type="button" value="继续上传" onmouseover="this.className=\''+this.strbtclassover+'\'" onmouseout="this.className=\''+this.strbtclass+'\'" />';
        this.objoutdiv.innerHTML=str+"<div id='FileN' style='float:left; margin-left:5px; height:25px; margin-top:4px;'></div>";
        this.objbtupload=this.objoutdiv.childNodes[0];
        this.objbtupload.attachEvent("onclick",this.setBtupload); 
		this.objbtupload.obju=this; 
		if(window.importExcel)importExcel(sfileName,this.strFilepath,this.objbtupload.id);//导入excel文件到access
		//rainpher adds to set filename which can stored into database
		if(window.setFilePath)
		    setFilePath();
    };
    this.cancelupFile=function(e){   
        var obj= e.srcElement ? e.srcElement : e.target;
        var objupload =obj.obju;
        objupload.disposeFile();
        objupload.disposeProgress();
        objupload.setBtupload();
        objupload.objupFormdocment.location = objupload.objupFormdocment.location;  
    };
    this.setFiletype=function(){
        if(this.strmodal.indexOf("ALL")>=0)
            this.strFiletype="";
        else{
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
            xmlDoc.async = false;
            xmlDoc.load(this.strUploadMethodsXml);
            var obj=xmlDoc.documentElement.selectSingleNode("Method[@Modal='"+this.strmodal+"']/FileType");
            this.strFiletype=obj.text;
            obj=xmlDoc.documentElement.selectSingleNode("Method[@Modal='"+this.strmodal+"']/Path");
            this.strFilepath=obj.text;
        }
    };
    this.getIndex=function(item){
	    for (var i = 0; i < this.arruploadBoxes.length; i++)
	    {
		    if (this.arruploadBoxes[i] == item)
			    return i;
	    }
	    return -1;
    };
    this.generateGuid =function()
    {
	    var hex = new Array('0','1','2','3','4','5','6','7','8', '9','a','b','c','d','e','f');
	    var outB = '{';
	    for (count = 0; count < 32; count++)
	    {
		    if ((count == 8) || (count == 12) || (count == 16) || (count == 20))
			    outB += '-';
		    outB += hex[Math.floor(Math.random() * 16)];
	    }
	    return outB.toUpperCase() + '}';
    };
    this.disposeFile=function(){
//        this.objbtaddfile=null;
        this.arruploadBoxes=[];
        this.objuploadForm=null;
        this.objupFormdocment=null;    
    };
    this.disposeProgress=function(){
        this.strStatus="";
        this.objprogresshandler=null;
//        this.objdivProgressDisplay=null;
        this.objdivuploadStatus=null;
        this.objdivprogressContainer=null;
        this.divprogressBar=null;
    };    
    this.getE=function(id){
	    return document.getElementById(id);
    };
    this.createElementWithHTML=function(str){
	    var d = document.createElement("DIV");
	    d.innerHTML = str;    	
	    return d.childNodes[0];
    };
	this.formateString=function(formateStr,dotNum){
		if (isNaN(formateStr)) return "0";
		if (dotNum == undefined)
		{
			dotNum = 3;
		}
		var strValue = "" + formateStr;
		var pos = strValue.indexOf(".");
		if (pos == -1)
			return strValue;
		else
			return strValue.substring(0, pos + dotNum + 1)
	};
	this.transformUnit=function(intBytesValue)
	{
		 var ONE_KB = 1024;
         var ONE_MB = ONE_KB * 1024;
         var ONE_GB = ONE_MB * 1024;
         var ONE_TB = ONE_GB * 1024;
         var ONE_PB = ONE_TB * 1024;
         var ONE_EB = ONE_PB * 1024;
         var ONE_ZB = ONE_EB * 1024;
         var ONE_YB = ONE_ZB * 1024;
		 if (intBytesValue <= 999)
		 {
			 return intBytesValue + " bytes";
		 }
		 else if (intBytesValue <= ONE_KB * 999)
             return this.formateString(intBytesValue / ONE_KB) + " KB";
         else if (intBytesValue <= ONE_MB * 999)
             return this.formateString(intBytesValue / ONE_MB) + " MB";
         else if (intBytesValue <= ONE_GB * 999)
             return this.formateString(intBytesValue / ONE_GB) + " GB";
         else if (intBytesValue <= ONE_TB * 999)
             return this.formateString(intBytesValue / ONE_TB) + " TB";
         else if (intBytesValue <= ONE_PB * 999)
             return this.formateString(intBytesValue / ONE_PB) + " PB";
         else if (intBytesValue <= ONE_EB * 999)
             return this.formateString(intBytesValue / ONE_EB) + " EB";
         else if (intBytesValue <= ONE_ZB * 999)
             return this.formateString(intBytesValue / ONE_ZB) + " ZB";
         else
             return this.formateString(intBytesValue / ONE_YB) + " YB";
		return
	};
	this.transformTime=function(intTimeValue){
		if(isNaN(intTimeValue)) return "0秒";
		var strTime = "";
		if (intTimeValue == "" && intTimeValue != 0) return strTime;
		var intSecond = parseInt(intTimeValue / 1000);
		var intHour = parseInt(intSecond / 3600);
		var intMinute = parseInt(intSecond  / 60 - intHour * 60);
		if (intHour > 0)
		{
			strTime += intHour + "小时";
		}
		if (intMinute>0)
		{
			strTime += intMinute + "分";
		}
		strTime += (intSecond - intHour * 3600 - intMinute*60) + "秒";
		return strTime;
	}
}