var Uploader = {
	ax: null,
	key: '',
	speed: 0,
	conn: 0,
	automode: 0,
	sizelimit: 0,
	__user: function () {
		var user = Cookie.get('u');
		if (user) if (user.charAt(0)=='%') user = decodeURIComponent(user);
		return user;
	},
	__ax: function () {
		try {
			return new ActiveXObject("YQUploaderPlugIn.YQUploader");
		} catch (e) {
			return null;
		}
	},
	__obj: function () {
        var v = document.cookie.match('(?:^|;)\\s*PHPSESSID=([^;]*)');
        v = v ? v[1] : false;
		var u = this.__user();
		if(!u) return false;
	 	return {cookie: 'PHPSESSID='+v, username: u, sizelimit: this.sizelimit};
	},
	__err: function (e) {
		//if(parseInt(e)!=0)
			//alert(e);
			//alert('操作失败，请重试。');
	},
	__empty: function () {},
	init: function(sl) {
		if(!document.all) { this.__err("请您使用 Internet Explorer。目前超级上传工具只有在 Internet Explorer 上才能正常工作。"); return false; }
		this.sizelimit = sl;
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return false; }
		if (this.ax) { this.__err("已初始化"); return false; }
		this.ax = this.__ax();
		if (!this.ax) { this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。"); return false; }
		try {
			this.key = this.ax.Init(window, Json.toString(o));
		} catch (e) {
			this.__err("初始化上传组件失败：安全限制"); return false;
		}
		//this.ax.LoadTask(Json.toString(o));
		this.getSpeed();
		this.getConn();
		return this.ax ? true : false;
	},
	upload: function (f, e) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		o.filename = f;
		//alert(f);
		o.extra = Json.toString(e||{});
		//alert(o.extra);
		window.util = [];
		var i = this.ax.Upload(Json.toString(o));
	},
	cancel: function (f,mybool) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		o.filename = f;
		//alert(f);
		if(mybool || confirm("确定删除吗？"))
			this.ax.Cancel(Json.toString(o));
	},
	pause: function (f) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		o.filename = f;
		//alert(f);
		this.ax.Pause(Json.toString(o));
	},
	resume: function (f) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		o.filename = f;
		//alert(f);
		this.ax.Resume(Json.toString(o));
	},
	getSpeed: function () {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		var s = this.ax.GetSpeedLimit();
		return this.speed = s==0?'不限制':s;
	},
	getConn: function () {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		return this.conn = this.ax.GetMaxThreads();
	},
	getAutoMode: function () {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		return this.automode = this.ax.GetAutoRunFlag();
	},
	setFileSize: function (l) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		this.ax.SetFileSizeLimit(l);
	},
	setSpeed: function (l) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		this.ax.SetSpeedLimit(l);
	},
	setAutoMode: function (l) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		this.ax.SetAutoRunFlag(l);
	},
	setConn: function (l) {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return; }
		this.ax.SetMaxThreads(l);
	},
	checkVer: function () {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		/* var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return 0; } */
        try {
            v = this.ax.GetVersion();
        } catch (e) {
            v = '0';
        }
		return v;
	},
	getMID: function () {
		if(!this.ax){
			this.__err("您可能没有安装超级上传客户端工具。请点击上面的“安装”按钮进行安装。");
			return;
		}
		/* var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return 0; } */
		var m = '';
        try {
            m = this.ax.GetMachineIdentifier();
        } catch (e) {
            m = '0';
        }
		return m;
	},
	status: function (c) {
		var error = {
			1: '服务器发生未知错误',
			2: '未登陆',
			3: '无效会话',
			4: '数据重叠',
			5: '校验失败',
			6: '文件未完',
			7: '数据错误',
			8: '授权失败',
			9: '协议数据不匹配',
			10: '版本不支持',
			101: '服务器响应不可识别',
			102: '网络传输失败',
			103: '无法打开文件'
		};
		var status = {
			0: '就绪',
			1: '正在上传',
			2: '暂停',
			3: '已取消',
			4: '队列中',
			5: '错误'
		};
		var s = c<0 ? error[-c] : status[c];
		if (!s) {
			if (c<-100) s = '未知错误';
			else if (c<0) s = '未知的服务器错误';
			else s = '未知状态';
		}
		return s;
	},
	pad: function(str,len) {
		len = len || 50;
		if(str.length>len) return str;
		var tmp = '';
		for (var i=0; i<len-str.length; i++)
			tmp += ' ';
		return str+tmp;
	},
	query: function (tp,od,init) {
		var o = this.__obj();
		if (!o) { this.__err("尚未登录"); return -1; }
		var n = 0;
		if(init){
			var __q = setInterval(function(){
				n = this.ax.GetUploadTaskCount();
				if(parseInt(n)!=9999){
					$('debug').innerHTML += n+', ';
					clearInterval(__q);
					__q = null;
				}
			}.bind(this),20);
			return [];
		}else{
			n = this.ax.GetUploadTaskCount();
			if (parseInt(n)==9999)
				return -1;
		}
		var r = [];
		//var d1 = new Date();
		//var t1 = d1.getUTCMilliseconds();
		for ( var i = 0; i < n; i++ ) {
			var t = new Task(Json.evaluate(this.ax.QueryTaskInfo(i)));
			r[t.id] = r[r.length] = t;
			/*if(t._filesize>200*1024*1024&&!window.util[t.id]){
				this.cancel(t.filename);
				util[t.id] = true;
				alert("文件："+t.filename+" 大小超过200M，将不能继续上传。");
				//return this.query(tp,od);
			}*/
		}
		//var d2 = new Date();
		//alert(d2.getUTCMilliseconds()-t1);
		od = od==0?'a,b':'b,a';
		switch(tp){
			case 0:
				break;
			case 1:/* by status */
				eval('r.sort(function('+od+') { if(arguments[0].status<0&&arguments[1].status<0) return 0; if(arguments[0].status<0) return -1; if(arguments[1].status<0) return 1; return a.status-b.status; })');
				break;
			case 2:/* by title || filename */
				eval('r.sort(function('+od+') { if(arguments[0].status<0&&arguments[1].status<0) return 0; if(arguments[0].status<0) return -1; if(arguments[1].status<0) return 1; for(var i=0;i<50;i++) { if(Uploader.pad(orderstr_arr[a.id]||a.filename).charCodeAt(i)!=Uploader.pad(orderstr_arr[b.id]||b.filename).charCodeAt(i)) return Uploader.pad(orderstr_arr[a.id]||a.filename).charCodeAt(i)-Uploader.pad(orderstr_arr[b.id]||b.filename).charCodeAt(i);} return 0; })');
				break;
			case 3:/* by progress */
				eval('r.sort(function('+od+') { if(arguments[0].status<0&&arguments[1].status<0) return 0; if(arguments[0].status<0) return -1; if(arguments[1].status<0) return 1; return parseInt(a.progress)-parseInt(b.progress); })');
				break;
			case 4:/* by speed */
				eval('r.sort(function('+od+') { if(arguments[0].status<0&&arguments[1].status<0) return 0; if(arguments[0].status<0) return -1; if(arguments[1].status<0) return 1; return a._speed-b._speed; })');
				break;
			case 5:/* by time */
				eval('r.sort(function('+od+') { if(arguments[0].status<0&&arguments[1].status<0) return 0; if(arguments[0].status<0) return -1; if(arguments[1].status<0) return 1; return (!isNaN(a._time)?a._time:0)-(!isNaN(b._time)?b._time:0); })');
				break;
			case 6:/* by filesize */
				eval('r.sort(function('+od+') { if(arguments[0].status<0&&arguments[1].status<0) return 0; if(arguments[0].status<0) return -1; if(arguments[1].status<0) return 1; return a._filesize-b._filesize; })');
				break;
			default:
				break;
		}
		return r;
	}
};

var Task = new Class({
	initialize: function(o) {
		this._speed = o.speed;
		if(this._speed>1024)
			this.speed = (this._speed/1024).toFixed(1)+' MB/s';
		else this.speed = this._speed.toFixed(1)+' KB/s';
		this._progress = o.progress;
		this.filename = o.filename;
		this.status = o.status;
		this._filesize = o.filesize;

		this._time = this._speed==0?"unknown":Math.round((this._filesize-this._progress)/this._speed/1024);
		this.time = this.getTime(this._time);
		this.progress = (100 * this._progress / this._filesize).toFixed(1)+'%';
		this.filesize = this.getSize(this._filesize);

		this.hash = o.hash?o.hash.substring(0,32):'HASH';//$('test').innerHTML = o.hash;
		this.uuid = this.hash+''+this._filesize;
		this.id = escape(this.filename);
	},
	getSize: function(size) {
		if(size>0&&size<1024)
			return size+'B';
		else if(size>=1024&&size<1024*1024)
			return Math.round(size/1024)+'K';
		else
			return Math.round(size/1024/1024)+'M';
	},
	getTime: function(time) {
		time = parseInt(time);
		if(isNaN(time)||time==0) return "未知";
		return Math.floor(time/60)==0?time+' 秒':Math.floor(time/60)+' 分钟';
		var _h = Math.floor(time/3600);
		var h = _h==0?'00':_h>=10?_h:'0'+_h;
		var _m = Math.floor((time-_h*3600)/60);
		var m = _m==0?'00':_m>=10?_m:'0'+_m;
		var _s = Math.floor(time-_h*3600-_m*60);
		var s = _s==0?'00':_s>=10?_s:'0'+_s;
		return h+":"+m+":"+s;
	}
});
