var Msg1 = '%u8BF7%u5B89%u88C5%u6700%u65B0%u7248QQ%u65CB%u98CE%u8FDB%u884C%u4E0B%u8F7D%uFF0C%u5E76%u5728%u5B89%u88C5%u8FC7%u7A0B%u4E2D%u5141%u8BB8%u65CB%u98CE%u5B89%u88C5%u6D4F%u89C8%u5668%u63D2%u4EF6%u3002%20%u70B9%u51FB%22%u786E%u5B9A%22%u5F00%u59CB%u4E0B%u8F7D%20%u3002';
var Msg2 = "%u5bf9%u4e0d%u8d77%uff0c%u672c%u9875%u9762%u6682%u65f6%u53ea%u652f%u6301%u0049%u0045%u6216%u4f7f%u7528%u0049%u0045%u5185%u6838%u548c%u0046%u0069%u0072%u0065%u0046%u006f%u0078%u7b49%u76f8%u5173%u6d4f%u89c8%u5668%u3002";
var Msg3 = "%u88ABFirefox%u62D2%u7EDD%21";
var Msg4 = "%u4E0B%u8F7D%u5E76%u5B89%u88C5QQ%u65CB%u98CE%u540E%u4F7F%u7528%u672C%u670D%u52A1%u3002%u5982%u679C%u5DF2%u5B89%u88C5QQ%u65CB%u98CE%uFF0C%u8BF7%u5C1D%u8BD5%u91CD%u542F%u6D4F%u89C8%u5668%uFF0C%u82E5%u9700%u8981%u8FDB%u4E00%u6B65%u5E2E%u52A9%uFF0C%u8BF7%u8054%u7CFB%u5BA2%u670D%u3002";
var MainURI = "http://pc.qq.com/cgi-bin/jump_xf?oid=";
var ERR_OK = 0;
var ERR_VERSION_TOO_LOWLY = 1;
var ERR_NOT_SUPPORT_EXPLORER = 2;
var ERR_NOT_ENOUGH_PRIVILEGE = 3;
var ERR_NOT_INSTALL_QQDOWNLOAD = 4;
var ERR_FORBID_QQDOWNLOAD = 5;
var ERR_NOT_SUPPORT_PROTOCOL = 6;
var ERR_ED2K_NO_QQDOWNLOAD = 7;
var g_comFFDownload = null;
var g_QQDownloadREG = null;
var g_comIEQQDownload = null;
var NT_IE = 0;
var NT_FIREFOX = 1;
var NT_OPERA = 2;
var NT_NETSCAPE = 3;
var NT_SAFARI = 4;
var NT_UNKNOWN = 0XFFFF;
var g_lastMiniSecond = 0;
var g_lastUrl = "";
var g_libXFMid = null;
var g_CheckFileType = null;
var g_SendSingleTask4 = null;
var g_AddTask3 = null;
var g_SendMultiTask = null;

//通用函数
function isUrl(url) {
	if (url && typeof(url) == "string" && url.constructor == String) {
		return true;
	}
	return false;
}


function getFileName(linkObj) {
	if (linkObj.getAttribute("filename")!="") {
		return linkObj.getAttribute("filename");
	} 
	if (linkObj.getAttribute("FILENAME")!="") {
		return linkObj.getAttribute("FILENAME");
	} 
	if (linkObj.getAttribute("FileName")!="") {
		return linkObj.getAttribute("FileName");
	} 
	if (linkObj.getAttribute("fileName")!="") {
		return linkObj.getAttribute("fileName");
	} 
	if (linkObj.getAttribute("Filename")!="") {
		return linkObj.getAttribute("Filename");
	}
	
	return "";

}

function GetNavigatorType() {
	if ((navigator.appName.indexOf("Internet Explorer") != -1) && (navigator.userAgent.indexOf("Opera") == -1)) {return NT_IE;} 
	if (navigator.userAgent.indexOf("Navigator") != -1) {return NT_NETSCAPE;} 
	if (navigator.userAgent.indexOf("Firefox") != -1) {return NT_FIREFOX;} 
	if (navigator.userAgent.indexOf("Safari") != -1) {return NT_SAFARI;}
	if ((navigator.appName.indexOf("Opera") != -1) || (navigator.userAgent.indexOf("Opera") != -1)) {return NT_OPERA;}
	return NT_UNKNOWN;
}

function BuildUri(uri, ref, remark, cookie, rate, sid, filesize, filehash, filename, isU2A) {
	var loc = "";
	if (uri.indexOf("qqdl://") != -1) {
		loc = uri + "\x01\x01";
	} else {
		loc = SchemeEncode(uri, isU2A);
	}
	loc += "\x01\x01" + ref + "\x01\x01" +
	remark + "\x01\x01" +
	cookie + "\x01\x01" +
	rate.toString(10) + "\x01\x01" +
	sid.toString(10) + "\x01\x01" +
	filesize + "\x01\x01" +
	filehash + "\x01\x01" +
	filename;
	return loc;
}

//右键菜单
function OnContextClick(linkObj, evt) {
    if(linkObj){
	    var link=linkObj.getAttribute("QHref");
		linkObj.setAttribute("href", link);
	}else{
	    var myevt=window.event?window.event:evt;
		var element = myevt.target||myevt.srcElement;
		var link = element.getAttribute('QHref');
		element.setAttribute("href", link);
	}
}

function CreateQQDownloadREG() {
	if (g_QQDownloadREG) {
		return true;
	}
	if ("@mozilla.org/windows-registry-key;1" in Components.classes) {
		g_QQDownloadREG = Components.classes["@mozilla.org/windows-registry-key;1"].createInstance(Components.interfaces.nsIWindowsRegKey);
	}
	return (g_QQDownloadREG === null) ? false : true;
}

function GetQQDownloadREG(strPath, strName) {
	if (!CreateQQDownloadREG()) {
		return false;
	}
	g_QQDownloadREG.open(Components.interfaces.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE, strPath, Components.interfaces.nsIWindowsRegKey.ACCESS_READ);
	return g_QQDownloadREG.readStringValue(strName);
}

function FindQQDownload() {
	var path = "";
	path = GetQQDownloadREG("SOFTWARE\\Tencent\\QQDownload", "Exe");
	var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
	file.initWithPath(path);
	try {
		file.isFile();
		return true;
	} catch (exception) {
		return false;
	}
	return true;
}


//创建IE对象
function CreateIEObject() {
	if (g_comIEQQDownload === null) {
		try {
			g_comIEQQDownload = new ActiveXObject("QQIEHelper.QQRightClick.2");
			return (g_comIEQQDownload === null) ? false : true;
		} catch (e) {
			alert(e.message);
			return false;
		}
	}
	return true;
}

//Firefox,创建Firefox对象
function CreateFFObject() {
	if (g_comFFDownload === null) {
	   if (!FindQQDownload()) {return false;}
		try {
			//新的FF创建方式
			CreateQQDownloadFFH();
		} catch (e) {
		    //兼容老的方式
			try{
				g_comFFDownload = Components.classes["@qq.com/QQDownloadFFH;1"].createInstance();
				g_comFFDownload = g_comFFDownload.QueryInterface(Components.interfaces.IQQDownloadFFH);
				return true;
			}catch (e){
				return false;
				}	
		}
	}
	return true;
}

//新的Firefox对象创建方式,ctypes,支持之后的FF升级
function CreateQQDownloadFFH()
{
	//条件编译
	/*@cc_on
    /*@if (@_jscript)
      //IE
    @else @*/
    Components.utils.import("resource://gre/modules/ctypes.jsm");
    /*@end
    @*/
	if(g_libXFMid == null)
	{
		var file_pro = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);   

		var dll_file = file_pro.path + "\\extensions\\{00000000-965C-475f-92C9-8D9EB7B27605}\\components\\XFFirefoxExtMid.dll";

		g_libXFMid = ctypes.open(dll_file);	
		
		if(g_libXFMid == null)
		{
			alert("CreateQQDownloadFFH g_libXFMid null");
			return;
		}
				
		g_CheckFileType = g_libXFMid.declare("CheckFileType", ctypes.winapi_abi, ctypes.int32_t, ctypes.jschar.ptr);
		
		if(g_CheckFileType == null)
		{			
			alert("g_CheckFileType == null");
		}
		
		
		g_SendSingleTask4 = g_libXFMid.declare("SendSingleTask4", ctypes.winapi_abi, ctypes.int32_t, ctypes.jschar.ptr, ctypes.jschar.ptr,
				ctypes.jschar.ptr, ctypes.jschar.ptr, ctypes.int32_t, ctypes.int32_t, ctypes.int32_t, 
				ctypes.jschar.ptr, ctypes.jschar.ptr, ctypes.jschar.ptr);
		
		if(g_SendSingleTask4 == null)
		{			
			alert("g_SendSingleTask4 == null");
		}				
				
				
		g_AddTask3 = g_libXFMid.declare("AddTask3", ctypes.winapi_abi, ctypes.int32_t, ctypes.jschar.ptr, ctypes.jschar.ptr,
				ctypes.jschar.ptr, ctypes.jschar.ptr, ctypes.int32_t, ctypes.jschar.ptr);	
				
		if(g_AddTask3 == null)
		{			
			alert("g_AddTask3 == null");
		}		
				
		g_SendMultiTask = g_libXFMid.declare("SendMultiTask", ctypes.winapi_abi, ctypes.void_t);
		
		if(g_SendMultiTask == null)
		{			
			alert("g_SendMultiTask == null");
		}
		
	}	
	
}
 
function OnIEDownloadClick(uri, ref, remark, cookie, rate, sid, filesize, filehash, filename) {
	if (CreateIEObject()) {
			var ver = g_comIEQQDownload.GetVersion();
			ver = ver.split(".");
			if (parseInt(ver[3], 10) >= 248) {
				g_comIEQQDownload.SendUrl4(uri, ref, remark, cookie, rate, sid, filesize, filehash, filename);
				return ERR_OK;
			} else {
				return ERR_VERSION_TOO_LOWLY;
			}
	} else {
				return ERR_NOT_INSTALL_QQDOWNLOAD;
     }
}

function OnFFDownloadClick(uri, ref, remark, cookie, rate, sid, filesize, filehash, filename) {
	try {
		netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
	} catch (e) {
		return ERR_NOT_ENOUGH_PRIVILEGE;
	}
	if (CreateFFObject()) {
		try {
		    //新的FF插件调用
			filesize=filesize.toString();
			filehash=filehash.toString();
			filename=filename.toString();
			g_SendSingleTask4(uri, ref, remark, cookie, 1, rate, sid, filesize, filehash, filename);
		} catch (e) {
		    //兼容旧的
			g_comFFDownload.SendSingleTask4(uri, ref, remark, cookie, 1, rate, sid, filesize, filehash, filename);
		}
		return ERR_OK;
	} else {
			return ERR_NOT_INSTALL_QQDOWNLOAD;
	}
}

function OnDownloadClick(linkObj, evt, uri, ref, remark, cookie, rate, sid, filesize, filehash, filename, defopen, isU2A, redirectUrl) {
	var ret = ERR_OK;
	switch (GetNavigatorType()) {
	case NT_IE:
		if (linkObj) {
			linkObj.href = "###";
		}
		ret = OnIEDownloadClick(uri, ref, remark, cookie, rate, sid, filesize, filehash, filename);
		g_comIEQQDownload = null;
		break;
	case NT_FIREFOX:
		if (evt) {
			var element = evt.target;
			element.setAttribute("href", "###");
		}
		ret = OnFFDownloadClick(uri, ref, remark, cookie, rate, sid, filesize, filehash, filename);
		break;
	default:
		ret = ERR_NOT_SUPPORT_EXPLORER;
		break;
	}
	
	
	if (ret != ERR_OK && defopen) {
			window.location.href = uri;
		} else{
				   if (ret != ERR_OK) {
							var msg = Msg1;
							if (ret == ERR_NOT_SUPPORT_EXPLORER) {msg = Msg2;} 
							if (ret == ERR_NOT_ENOUGH_PRIVILEGE) {msg = Msg3;} 				
							if (isUrl(redirectUrl)) {
								window.open(redirectUrl);
							 } else {
								if (confirm(unescape(msg), 2)) {window.location = MainURI + sid;}
							}
						}
				}
	return (ret == ERR_OK) ? true : false;
}


function OnDownloadClick_Simple(linkObj, evt, sid) {
	var uri = "";
	var remark = "";
	var ref = "";
	var filename = "";
	
	if(linkObj){
		uri = linkObj.getAttribute('QHref')||"";
		remark = linkObj.innerText||linkObj.textContent||"";
		ref = window.location.href||"";
		filename = getFileName(linkObj)||"";
	}else{
		var myevt=window.event?window.event:evt;
		var element = myevt.target||myevt.srcElement;
		uri = element.getAttribute('QHref')||"";
		remark = element.innerText||element.textContent||"";
		ref = window.location.href||"";
		filename = getFileName(element)||"";
		}
	var nType = GetNavigatorType();
	if (nType == NT_IE || nType == NT_FIREFOX) {
		OnDownloadClick(linkObj, evt, uri, ref, remark, document.cookie, 0, sid, 0, 0, filename, false, true);
	} else {
		window.location.href = uri;
	}
}

function OnDownloadClick_QQ(linkObj, evt, sid) {
	var uri = "";
	var remark = "";
	var ref = "";
	var filename = "";
	if(linkObj){
		uri = linkObj.getAttribute('QHref')||"";
		remark = linkObj.innerText||linkObj.textContent||"";
		ref = window.location.href||"";
		filename = getFileName(linkObj)||"";
	}else{
		var myevt=window.event?window.event:evt;
		var element = myevt.target||myevt.srcElement;
		uri = element.getAttribute('QHref')||"";
		remark = element.innerText||element.textContent||"";
		ref = window.location.href||"";
		filename = getFileName(element)||"";
		}
	var nType = GetNavigatorType();
	if (nType == NT_IE || nType == NT_FIREFOX) {
		OnDownloadClick(linkObj, evt, uri, ref, remark, document.cookie, 0, sid, 0, 0, filename, true, false);
	} else {
		window.location.href = uri;
	}
}

function OnDownloadClick_Game(linkObj, evt, sid, rate, isWChar, redirectUrl, specRef) {
	var uri = "";
	var remark = "";
	var ref = "";
	var filename = "";
	if(linkObj){
		uri = linkObj.getAttribute('QHref')||"";
		remark = linkObj.innerText||linkObj.textContent||"";
		ref = window.location.href||"";
		filename = getFileName(linkObj)||"";
	}else{
		var myevt=window.event?window.event:evt;
		var element = myevt.target||myevt.srcElement;
		uri = element.getAttribute('QHref')||"";
		remark = element.innerText||element.textContent||"";
		ref = window.location.href||"";
		filename = getFileName(element)||"";
		}
	var nType = GetNavigatorType();
	if (nType == NT_IE || nType == NT_FIREFOX) {
		if (specRef) {
			ref = specRef;
		}
		OnDownloadClick(linkObj, evt, uri, ref, remark, document.cookie, rate, sid, 0, 0, filename, false, isWChar, redirectUrl);
	} else {
		window.location.href = uri;
	}
}

function OnDownloadClick_xw(linkObj, evt, ref, remark, filesize, filehash) {
	var uri = "";
	var filename = "";
	if(linkObj){
		uri = linkObj.getAttribute('QHref')||"";
		filename = getFileName(linkObj)||"";
	}else{
		var myevt=window.event?window.event:evt;
		var element = myevt.target||myevt.srcElement;
		uri = element.getAttribute('QHref')||"";
		filename = getFileName(element)||"";
		}
	var nType = GetNavigatorType();
	if (nType == NT_IE || nType == NT_FIREFOX) {
		return OnDownloadClick(linkObj, evt, uri, ref, remark, "", 0, 10001, filesize, filehash, filename, false, true);
	} else {
		window.location.href = uri;
		return true;
	}
}

function OnDownloadClick_easy(linkObj, evt, uri, sid, redirectUrl) {
	var ref = "";
	var filename = "";
	if(linkObj){
		ref = window.location.href||"";
		filename = getFileName(linkObj)||"";
	}else{
		var myevt=window.event?window.event:evt;
		var element = myevt.target||myevt.srcElement;
		ref = window.location.href||"";
		filename = getFileName(element)||"";
		}
	var nType = GetNavigatorType();
	if (nType == NT_IE || nType == NT_FIREFOX) {
		OnDownloadClick(linkObj, evt, uri, ref, "", document.cookie, 0, sid, 0, 0, filename, false, true, redirectUrl);
	} else {
		window.location.href = uri;
	}
}

function OnDownload_template(uri, sid) {
	OnDownloadClick_easy(false, false, uri, sid);
}

function BatchTask_FileName(count,Array){
	 //兼容
	}

function OnDownloadBatchTask(tasks) {
	var nType = GetNavigatorType();
	count=tasks.length;
	switch (nType) {
	case NT_IE: {
			if (CreateIEObject()) {
				for (var i = 0; i < count;i = i + 2 ) {
					g_comIEQQDownload.AddTask3(tasks[i], "", tasks[i + 1], 0, "");
				}
				g_comIEQQDownload.SendMultiTask();
			} else {
				alert(unescape(Msg4));
			}
		}
		break;
	case NT_FIREFOX: {
			try {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				if (CreateFFObject()) {
					for (var i = 0; i < count;i = i + 2 ) {
						try {
						    //新方式
						    g_AddTask3(tasks[i], "", "", tasks[i+1], 0, "");
						} catch (e) {
							//旧兼容
							g_comFFDownload.AddTask3(tasks[i],"" , "", tasks[i + 1], 0, "");
						}
					}
					try{g_SendMultiTask()}catch (e){g_comFFDownload.SendMultiTask();}
				} else {
					alert(unescape(Msg4));
				}
			} catch (e) {
				alert(unescape(Msg3));
			}
		}
		break;
	default: {
			if (confirm(unescape(Msg2), 2)) {
				//TODO
			}
		}
		break;
	}
}



