/** 
 * @fileoverview common.js Qzone公用方法文件  
 */

/**
 * 浏览器对象，包括类别属性
 */
var Browser = new Object(); 

/**
 * 判断是否为IE旧版浏览器
 * @type boolean
 */
Browser.isIE = window.ActiveXObject ? true : false;

/**
 * 判断是否为IE7浏览器
 * @type boolean
 */
Browser.isIE7 = Browser.isIE && window.XMLHttpRequest;

/**
 * 判断是否为Mozilla浏览器
 * @type boolean
 */
Browser.isMozilla = Browser.isIE?false:(typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined') && (typeof HTMLDocument!='undefined');

/**
 * 判断是否为Firefox浏览器
 * @type boolean
 */
Browser.isFirefox = Browser.isIE?false:(navigator.userAgent.toLowerCase().indexOf("firefox")!=-1);

/**
 * 判断是否为Safari浏览器
 * @type boolean
 */
Browser.isSafari = Browser.isIE?false:(navigator.userAgent.toLowerCase().indexOf("safari")!=-1);

/**
 * 判断是否为Opera浏览器
 * @type boolean
 */
Browser.isOpera = Browser.isIE?false:(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);

/**
* 事件绑定
* @param {DocumentElement} obj 需要添加事件的页面对象
* @param {String} evenTypeName 需要添加的事件
* @param {Function} fn 事件需要绑定到的处理函数
* @return  是否绑定成功(true为成功，false为失败)
* @type Boolean
* @version 1.0
* @author zishunchen
*/

function addEvent(obj, evenTypeName, fn){
     if (obj.addEventListener){
            obj.addEventListener(evenTypeName, fn, true);
            return true;
     } else if (obj.attachEvent){
            return obj.attachEvent("on"+evenTypeName, fn);
     } else {
            return false;
     }
}

/**
* 方法取消绑定
* @param {DocumentElement} obj 需要取消事件绑定的页面对象
* @param {String} evenTypeName 需要取消绑定的事件
* @param {Function} fn 需要取消绑定的函数
* @return  是否成功取消(true为成功，false为失败)
* @type Boolean
* @version 1.0
* @author zishunchen
*/

function removeEvent(obj, evenTypeName, fn){
      if (obj.removeEventListener){
            obj.removeEventListener(evenTypeName, fn, true);
            return true;
      } else if (obj.detachEvent){
            var r = obj.detachEvent("on"+evenTypeName, fn);
            return r;
      } else {
            alert("Error.");
      }
}
/**
* $ 取代 document.getElementById
* @param {String} id 元素在document中的id或者uniqueID
* @return 指定的id的元素。如不存在则返回null。
* @type DocumentElement
* @version 1.0
* @author zishunchen
*/

function $(id){return document.getElementById(id);}

/**
* $n 取代 document.getElementsByName
* @param {String} n 元素在document中的name或者id（IE only）
* @return 指定的name的元素集合。如不存在则返回[]。
* @type set of DocumentElement 
* @version 1.0
* @author stonehuang
*/

function $n(n){return document.getElementsByName(n);}

/**
* 删除Dom对象
* @see #$
* @param {DocumentElement or String} element 需要从页面中删除的对象
* @version 1.0
* @author zishunchen
*/

function removeElement(element){
	if((typeof element)=="string")
		element=$(element);

	if(!!element && (typeof element)=="object"){
		element.parentNode.removeChild(element);
	}
}

/**
 * 根据不同浏览器获取对应的Event对象
 * @param {Event} evt
 * @return 修正过的Event对象
 * @type Event
 */ 
function getEvent(evt){
    evt=(Browser.isIE)?(window.event?window.event:null):evt;
    if (!evt) return null;
    if (Browser.isMozilla) {evt.btn=evt.button+1;} else {evt.btn=evt.button;}
    return evt;
}

/**
 * 获取对象坐标
 * @param {Object} obj
 * @return 坐标数组，["top","left","width","height"]
 * @type Array
 */ 
function getPosition(obj) {
    var top=0;
    var left=0;
    var width=obj.offsetWidth;
    var height=obj.offsetHeight;
    while (obj.offsetParent) {
        top += obj.offsetTop;
        left += obj.offsetLeft;
        obj = obj.offsetParent;
    }
    
    return {"top":top,"left":left,"width":width,"height":height};
}

/**
 * 根据class名称来获取对象
 * @param {Object} source
 * @param {String} className
 * @return 如果找到和class名称相对应的对象,则返回该对象,否则返回null
 * @type Object
 */
function getParentByClass(source,className) {
    while (source.offsetParent) {
          if (source.className == className) {
              return source;
            }
            source = source.offsetParent;
        }
    return null;
}

/**
 * 设置文件Cookie
 * @param {String} name 字段名称
 * @param {Object} value 值
 * @param {Int} timeout 过期时间
 * @param {String} 域名,默认域名为"qq.com"
 */ 
function setFileCookie(name,value,timeout,dm)//time精确到毫秒
{
    var expires=new Date();
    if(!timeout)
        timeout=10*12*30*24*3600*1000;
    if(!dm)
        dm="qq.com";
    expires.setTime(expires.getTime()+timeout);
    document.cookie = name + "=" + value + ";expires="+expires.toGMTString()+"; path=/; domain="+dm;
}

/**
 * 设置Cookie
 * @param {String} name 字段名称
 * @param {Object} value 值
 * @param {String} path 路径
 * @param {String} 域名,默认域名为"qq.com"
 */
function setCookie(name,value,path,domain){
    if(!path)
        path="/";
    if(!domain)
        domain="qq.com";
    document.cookie = name + "=" + value + "; path="+path+"; domain="+domain;
}

/**
 * 获取Cookie
 * @param {String} name 字段名称
 */ 
function getCookie(name){
    var r = new RegExp("(^|;|\\s)*"+name+"=([^;]*)(;|$)");
    var m = document.cookie.match(r);
    return (!m?"":m[2]);
}

/**
 * 清除Cookie
 * @param {String} name 字段名称
 * @param {String} path 路径
 * @param {String} 域名,默认域名为"qq.com"
 */ 
function deleteCookie(name, path, domain){
    if(!path)
        path="/";
    if(!domain)
        domain="qq.com";
    document.cookie = name + "=" + "; path=" + path + "; domain=" + domain + "; expires=Thu, 1 Jan 1970 00:00:01 UTC";
}

/**
 * UserData 支持
 * 创建UserData对象
 */ 
var userData = function(){
    this.normalDB = "defaultDB";
    this.error = false;
    if (Browser.isIE){
        var id = "udLink";
        this.UD = $(id);
        if (!this.UD){
            this.UD = document.createElement("script");
            this.UD.id = id;
            document.getElementsByTagName("head")[0].appendChild(this.UD);
            try{
                UDiID = this.UD.addBehavior("#default#userdata");
            }catch(e){this.error = true;return;}
        }
        var expiresDate = new Date();
        expiresDate.setTime(expiresDate.getTime() + 12*30*24*3600*1000); // 有效期默认是一年
        this.UD.expires = expiresDate.toUTCString();
    }
    if (getCookie("userData") != 1) {this.clear();}
}

/**
 * 设置UserData的清理操作
 * @param {String} sStoreName
 */
userData.prototype.clear = function(sStoreName){
    if (this.error) return false;
    if (Browser.isIE){
        sStoreName = (!sStoreName)?this.normalDB:sStoreName;
        this.UD.load(sStoreName);
        this.UD.expires = new Date(315532799000).toUTCString();
        this.UD.save(sStoreName);
        setFileCookie("userData",1,0,"qzone.qq.com");
    }
}        

/**
 * 移除 UserData 节点
 * @param {NodeItem} key  
 * @param {String} sStoreName
 */
userData.prototype.remove = function(key,sStoreName){
    if (Browser.isIE){
        sStoreName = (!sStoreName)?this.normalDB:sStoreName;
        this.UD.setAttribute(key,null);
        this.UD.save(sStoreName);
    }else if(window.sessionStorage){
        sessionStorage.removeItem(key);
    }
}

/**
 * 保存数据到 UserData 数据
 * @param {NodeItem} key
 * @param {Object} value
 * @param {String} sStoreName
 */
userData.prototype.save = function(key,value,sStoreName){
    if (this.error) return false;
    if (Browser.isIE){
        sStoreName = (!sStoreName)?this.normalDB:sStoreName;
        this.UD.setAttribute(key,value);
        this.UD.save(sStoreName);
    }else if(window.sessionStorage){
        sessionStorage.setItem(key,value);
    }
}

/**
 * 读取数据到 UserData 数据
 * @param {NodeItem} key
 * @param {String} sStoreName
 */
userData.prototype.load = function(key,sStoreName){
    if (this.error) return false;
    if (Browser.isIE)
    {
        sStoreName = (!sStoreName)?this.normalDB:sStoreName;
        this.UD.load(sStoreName);
        return this.UD.getAttribute(key);
    }else if(window.sessionStorage){
        return sessionStorage.getItem(key);
    }
}

/**
 * 样式表控制
 * @type Array
 */
var blogStyleSheet = [];

/**
 * 插入新的样式
 * @param {Int} sheetIndex  样式索引值
 * @param {String} selectorText
 * @param {String} cssText
 */
function insertCSS(sheetIndex,selectorText,cssText){ 
    if (!blogStyleSheet[sheetIndex]) blogStyleSheet[sheetIndex] = [];
    document.styleSheets[sheetIndex].addRule(selectorText,"{" + cssText + "}",blogStyleSheet[sheetIndex].length);
    blogStyleSheet[sheetIndex].push({selectorText:selectorText,cssText:cssText});
}

/**
 * 更新样式	
 * @param {Int} sheetIndex 样式索引值
 * @param {Int} ruleId 
 * @param {String} cssText
 */
function updateCSS(sheetIndex,ruleId,cssText){ 
    var selectorText = blogStyleSheet[sheetIndex][ruleId].selectorText;
    blogStyleSheet[sheetIndex][ruleId].cssText = cssText;
    document.styleSheets[sheetIndex].removeRule(ruleId);
    document.styleSheets[sheetIndex].addRule(selectorText, "{" + cssText + "}", ruleId);
}

/**
 * 复制到剪贴板
 * @param {String} text 将要复制的内容，暂时只支持在IE中复制内容
 */
function copyToClip(text){
    if (Browser.isIE) {
        clipboardData.setData("Text",text);
        showMsgbox("链接已经复制到剪贴板",0,1000);
    }else{
        showMsgbox("抱歉没有权限复制文本",1,1000);
    }
}

/**
 * 获取web参数
 * @param {String} name
 * @param {Boolean} cancelBubble
 */
function getParameter(name,cancelBubble){
    var r = new RegExp("(\\?|#|&)"+name+"=([^&#]*)(&|#|$)");
    var m = location.href.match(r);
    if ((!m || m=="") && !cancelBubble) m = top.location.href.match(r);
    return (!m?"":m[2]);
}

/**
 * 引用新的JS脚本
 * @param {Object} src
 * @param {Object} option 可以为回调函数或者延迟回收时间
 * @param {Object} _doc 指定创建script的document
 */
function includeJS(src,option,_doc){
	if(!_doc)
		_doc=document;
    var callback;

    var s = _doc.createElement("script");
    s.id="includeScript"+Math.round(Math.random()*10000);

    if(typeof option=="function") 
        callback=option;
    else if(typeof option=="number")
        callback=new Function("setTimeout(\"try{removeElement($('"+s.id+"'))}catch(ex){}\","+option+")");
    if (callback){ 	
        if (Browser.isIE) {
            s.onreadystatechange = function(){
                if (s.readyState != "loaded" && s.readyState != "complete")
                    return;
                s.onreadystatechange = null;
                setTimeout(callback,50);
            };
        }else{
            s.onload = callback;
        }
    }
     s.src = src;
    _doc.getElementsByTagName("head")[0].appendChild(s);
    return s;
}


/**
 * 获取Dom对象,如果对象不存在则自动在body创建
 * @param {Object} id 对象ID
 * @param {String} tagName 标签名
 * @param {Boolean} insertFirst 创建对象时插入的次序；如果为true则作为父结
 *                               点的第一个节点插入，否则附加在其他子结点之后
 * @param {Object} parentNodeID  
 * @param {String} className
 * @param {String} initCSSText
 * @return 已存在或新创建的Dom对象
 * @type NodeElement
 */ 
function getElementInBody(id,tagName,insertFirst,parentNodeID,className,initCSSText){
    var e = $(id);
    if (!e){
        tagName = (!tagName)?"div":tagName; //如果没有设置tagName 则默认为div
        e = document.createElement(tagName);
        e.id = id;
        var parentNode = (!parentNodeID)?document.body:$(parentNodeID)
        if (insertFirst)
            parentNode.insertBefore(e,parentNode.firstChild);
        else
            parentNode.appendChild(e);
        e.className = className?className:"";
        e.style.cssText = initCSSText?initCSSText:"";
    }
    parentNode = null;
    return e;
}

/**
 * 过滤特殊符号
 * @param {String} srcString
 * @type String
 */
function htmlReplace(srcString) {
    return srcString.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br/>").replace(/\"/g,"&quot;");
}

/**
 * 还原特殊符号
 * @param {String} srcString
 */
function unReplaceStr(srcString){
    return srcString.replace(/&amp;/g,"&").replace(/&#45;/g,"-").replace(/&#95;/g,"_").replace(/&#63;/g,"?").replace(/&#61;/g,"=").replace(/&#37;/g,"%").replace(/&#58;/g,":").replace(/&#32;/g," ").replace(/&#64;/g,".");
}

/**
 * 获取Flash版本号
 * @param {Object} reqVer
 * @type swfVersion Object
 */
function getFlashVersion(reqVer) {
    var PlayerVersion = new swfVersion(0, 0, 0);
    if (navigator.plugins && navigator.mimeTypes.length) {
    var x = navigator.plugins['Shockwave Flash'];
        if (x && x.description)	{
            PlayerVersion = new swfVersion(x.description.replace(/([a-z]|[A-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
        }
    }else{
        try {
        var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
            for (var i = 3; axo != null; i++) {
                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
                PlayerVersion = new swfVersion([i, 0, 0]);
            }
        } catch (e) {}
        if (reqVer && PlayerVersion.major > reqVer.major) {return PlayerVersion;}
        if (!reqVer || (reqVer.minor != 0 || reqVer.rev != 0) && PlayerVersion.major == reqVer.major || PlayerVersion.major != 6) {
            try {PlayerVersion = new swfVersion(axo.GetVariable("$version").split(" ")[1].split(","));} catch (e) {}
        }
    }
    return PlayerVersion;
};

/**
 * swfVersion类
 * 处理Flash版本号
 * @param {Array} arrVersion
 */
function swfVersion(arrVersion) {
    this.major = parseInt(arrVersion[0]) || 0;
    this.minor = parseInt(arrVersion[1]) || 0;
    this.rev = parseInt(arrVersion[2]) || 0;
    this.version = arrVersion.toString();
};

var flashVersion = getFlashVersion();

/**
 * 过滤注入脚本
 * @param {String} srcString
 */
function ScriptReplace(srcString) {
    srcString = srcString.replace(/&#(\d+);?/g,function(a,b){return String.fromCharCode(b)}).replace(/&#x(\d+);?/ig,function(a,b){return String.fromCharCode(parseInt(b,16))}).replace(/(\Won)(\w+\s*=)/ig,"$1<wbr>$2").replace(/(\Wexpres)(sion\()/ig,"$1<wbr>$2").replace(/(\Wbehav)(ior\s*:)/ig,"$1<wbr>$2").replace(/(obj)(ect)/ig,"$1<wbr>$2").replace(/(scr)(ipt)/ig,"$1<wbr>$2").replace(/(emb)(ed)/ig,"$1<wbr>$2").replace(/\n|\r/g,"<br>").replace(/\t/g," &nbsp; &nbsp;");
    return srcString;
}

/**
 * 校验url地址合法性,一般用来判断get方式获得的url地址
 * @param {String} url
 */
function vaildUrl(url){ 
    if (/javascript/ig.test(url)) return false;
    if (/^http/ig.test(url) && !(/^http:\/\/([\w\.]+)\.(qq.com|paipai.com|soso.com)/ig.test(url))) return false;
    return true;
}

/**
 * 过滤关键脚本
 * @param {String} str
 */
function ScriptSearch(str) {
    var reg = new RegExp("Location|onload|meta|iframe|cookie|craker|innerHTML|object|script", "gi");
    var returnStr = str.match(reg);
    return returnStr;
}
    
/**
 * 计算对象高度
 * @param {String} sName
 */
function contheight (sName){
    if (parent.$[sName]!=null) {
        parent.$[sName].style.height = document.body.scrollHeight;
    }
}

/**
 * 调整大小到指定的范围内
 * @param {Object} obj
 * @param {Int} w 指定宽度
 * @param {Int} h 指定高度
 * @param {Boolean} openWindows 预览新图
 */
function adjustSize(obj,w, h,openWindows) {
    var w0=obj.width,h0=obj.height,r=false;
    if(w0<1){var i = new Image();i.src=obj.src;w0=i.width;h0=i.height;}
    if((w0/h0)>(w/h)){
        if(w0>w){obj.style.width = w;r=true;}
    }else {
        if(h0>h){obj.style.height = h;r=true;}
    }
    if (openWindows && r) { 
        obj.style.cursor = "pointer";
        obj.title = "点击预览原图";
        obj.onclick = function(){
            window.open(obj.src);
        }
    }
    obj.onload=null;
}

/**
 * Fix IE WCO(Window Crazy Opening) Bug
 */
function fixWCO(){try{$("myFrame").innerHTML="";}catch(e){}}	

/**
 * Fix Flash Player 9,0,16,0 Bug
 */
function fixFlashBug(){__flash_unloadHandler = function(){};__flash_savedUnloadHandler = function(){};}

/**
 * beforeunload functoin 
 */
function prepUnload(){
	fixWCO();
	fixFlashBug();
}

addEvent(window,"beforeunload",prepUnload);
    
/**
 * 插入Flash动画
 * @param {Array} flashArguments 作为一个 Hash表，把flash的参数进行传递,例如 a={id:"swf1",src:"123.swf",allowScriptAccess:"always"}
 * @param {Object} requiredVersion
 * @type String
 */ 
function insertFlash(flashArguments,requiredVersion){
	var params="",embedArgm="",objArgm="";
	for (k in flashArguments){
		switch(k){
			case "movie":
				continue;
				break;
			case "id":
			case "name":
			case "width":
			case "height":
			case "style":
				objArgm += k + '=\'' + flashArguments[k]+'\' ';
				embedArgm += k + '=\''+flashArguments[k]+'\' ';
				break;
			default:
				params += '<param name=\'' + ((k=="src")?"movie":k) + '\' value=\''+flashArguments[k]+'\' />';
				embedArgm += k + '="'+flashArguments[k]+'" ';
		}
	}
	if (requiredVersion) {
		objArgm += 'codeBase=\'http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab#version=' + requiredVersion+'\' ';
	}
	
	fixFlashBug();
	if (Browser.isIE)
		return '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' + objArgm + '>' + params + '</object>';
	else
		return '<embed '+ embedArgm +' pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>'
}

/**
 * 插入Window Media Player 播放器
 * 例如a={id:"wmp1",src:"123.mp3"}; insertWMP(a) 
 * @param {Array} wmpArguments 作为一个 Hash表，把WMP的参数进行传递
 * @param {Object} mp9Upon 使用更高版本的 WMP Player
 * @param {Boolean} outputEmbed 是否嵌入到html中
 * @return 嵌入在html中的语句
 * @type String
 */ 
function insertWMP(wmpArguments,mp9Upon,outputEmbed){
	var params="",objArgm="";
	for (k in wmpArguments){
		switch(k){
			case "id":
			case "width":
			case "height":
			case "style":
				objArgm += k + '="' + wmpArguments[k]+'" ';
				break;
			case "src":
				if (outputEmbed) objArgm += k + '="' + wmpArguments[k]+'" ';
				break;
			default:
				if (outputEmbed) objArgm += k + '="' + wmpArguments[k]+'" ';
				params += '<param name="' + k + '" value="'+wmpArguments[k]+'" />';
		}
	}
	if (mp9Upon == "auto"){ //自动检测是否使用 WMP 9 的播放插件
		mp9Upon = false;
		if (window.ActiveXObject){
			var clsId="{22D6F312-B0F6-11D0-94AB-0080C74C7E95}";
			with(document.body){
				addBehavior('#default#clientcaps');
				if (isComponentInstalled(clsId,"componentid")){
					mp9Upon = (getComponentVersion(clsId,"componentid").split(",")[0] > 6.4)?true:false;
				}
			}
		}
	}
	if (mp9Upon){
			classId = "clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"; //使用 WMP 9 以上的播放插件
			if (wmpArguments["src"]) {
				params += '<param name="URL" value="'+wmpArguments["src"]+'" />';
			}
	}
	else{
			classId = "clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95"; //默认使用 WMP 6.4 播放插件
			if (wmpArguments["src"]) {
				params += '<param name="src" value="'+wmpArguments["src"]+'" />';
			}
	}
	
	if (outputEmbed)
		return '<embed '+ objArgm +'></embed>';
	else
		return '<object classid="' + classId + '" ' + objArgm + '>' + params + '</object>';
}


//Ajax 异步调用方法
var callBackHsmp=new Array();
function getXMLDOM(){
	if(!Browser.isIE) return null;
	var xmldomversions = ['MSXML2.DOMDocument.5.0', 'MSXML2.DOMDocument.4.0', 'MSXML2.DOMDocument.3.0', 'MSXML2.DOMDocument', 'Microsoft.XMLDOM'];
	for(var i=xmldomversions.length-1;i>=0;i--)
		try{
			return new ActiveXObject(xmldomversions[i]);
		}catch(e){
		}
	return null;
}

function getXMLHTTP(){
	if(window.XMLHttpRequest) return new XMLHttpRequest();
	if(Browser.isIE){
		var xmlhttpversions=['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
		for(var i=xmlhttpversions.length-1;i>=0;i--){
			try{
				return new ActiveXObject(xmlhttpversions[i]);
			}catch(e){
			}
		};
		var s="对不起，您浏览器设置不支持QQ空间打开，请尝试在IE菜单中打开\n“工具”-“Internet选项”-“安全”-“自定义级别”，将\n“对标记为可安全执行脚本的ActiveX控件执行脚本”和\n“运行ActiveX控件和插件”\n这两项选项更改为“允许”，再重新打开空间。";
		if(document.cookie.indexOf("xmlhttp_fail")>-1)
			alert(s);
		status = s;
		for(var i=1;i<32;i++){
			setTimeout("status=\""+s.substring(0,123).replace(/\n/g,"").substr(i)+"\"", i*300+3000);
		}
		document.cookie="xmlhttp_fail=prompted";
		return null;
	}
}

/**
 * parse XML
 * @param {Object} st
 */ 
function parseXML(st){
    if(Browser.isIE){
        var result = getXMLDOM();
        result.loadXML(st);
    }else{
        var parser = new DOMParser();
        var result = parser.parseFromString(st, "text/xml");
    }
    return result;
}


/**
 * 获取XML节点的文本  
 * @param {Document} doc XML文档对象
 * @param {Object} xpath 结点路径
 * @return 文本内容
 * @type String
 */ 
function getElementText(doc, xpath) {
    var retval="";
    if (!doc) return "";
    var v = doc.selectSingleNode(xpath);
    if (v) retval = v.text;
    return retval;
}

var callBackHsmp=new Array();
/**
* @see #loadXMLAsync
*/
	function loadXMLAsyncNoCache(xID, xUrl, callback, err_callback,data,returnType){return loadXMLAsync(xID, xUrl, callback, err_callback,true,data,returnType);};
	
/**
* @see #loadXMLAsync
*/
	function LoadXMLDataEx(itemno,url,callback,err_callback,data){return loadXMLAsync(itemno, url, callback, err_callback,false,data);};
	
/**
* 用XMLHTTP加载异步加载数据
* @param {String} xID
* @param {String} xUrl
* @param {Function} callback
* @param {Function} err_callback
* @param {Boolean} nocache
* @param {String} data
* @param {String} returnType
* @see #LoadXMLDataEx
* @see #loadXMLAsyncNoCache
*/
function loadXMLAsync(xID, xUrl, callback, err_callback,nocache,data,returnType){
	var m=xUrl.match(/(^http:\/\/([a-z,A-Z,0-9,\-,_,\.]+\.qq\.com)\/)/);
	if(!m){alert("不能访问非qq.com域的资源");return;}
	var domain = m[0];
	var host = m[2];
	var proxyPageURL = domain+"proxy.html";
	if(domain == "http://imgcache.qq.com/")
		proxyPageURL = "http://imgcache.qq.com/qzone/proxy.html";
		var f = document.getElementsByTagName("iframe");
		for(var i=0;i<f.length;i++){
			var isRightProxy=false;
			try{isRightProxy=f[i].src.indexOf(proxyPageURL)==0}catch(e){}
			if(isRightProxy){//找到了代理页面
				if(!callBackHsmp[host] && typeof callBackHsmp[host] != "undefined"){//代理页面没用回调等待队列（初始化已经完成）
					frames[i].loadXMLAsync(xID, xUrl, callback, err_callback,nocache,data,returnType);
				}else{
					if (typeof callBackHsmp[host] == "undefined") callBackHsmp[host] = [];
					callBackHsmp[host][callBackHsmp[host].length]={
						"callback":callback,
						"xID":xID,
						"xUrl":xUrl,
						"err_callback":err_callback,
						"nocache":nocache,
						"data":data,
						"returnType":returnType
					};
				}
				return;
			}
		}
	
	if (!callBackHsmp[host]){
			callBackHsmp[host]=[{
				"callback":callback,
				"xID":xID,
				"xUrl":xUrl,
				"err_callback":err_callback,
				"nocache":nocache,
				"data":data,
				"returnType":returnType
			}];
		createProxy(proxyPageURL);
	}
};

/**
 * 创建proxy页面
 * @param {String} src
 */
function createProxy(src){
	var f = document.getElementsByTagName("iframe");
	for(var i=0;i<f.length;i++)
		if (f[i].src.indexOf(src)!= -1) return;
	
	var i = document.createElement("iframe");
	var proxyDiv = $("proxy");
	if (!proxyDiv) document.body.insertBefore(i,null); else $("proxy").appendChild(i);
	i.width=0;
	i.height=0;
	i.src=src;
	i = null;
}

/**
 * 在创建Document Element时指定名字
 * @param {DocumentElement} element
 * @param {String} name，名字为null时操作和document.createElement相同
 * @type DocumentElement
 */
document.createElementByName = function (element,name) {
    if (!name) return document.createElement(element);
    if (Browser.isIE){
        return document.createElement("<" + element + " name=\""+name+"\"/>");
    } else {
          element = document.createElement(element);
          element.name=name;
          return element;
    }
}

String.prototype.getRealLength = function(){return this.replace(/[^\x00-\xff]/g,"aa").length;};
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g,"");};
String.prototype.encode = function(){return this.replace(r,function(a){return "%"+a.charCodeAt(0).toString(16)}).replace(/\x20/g,"+")};
String.prototype.decode=function(){
	return this.replace(/&#58;/g,":").replace(/&quot;/g,"\"").replace(/(?:&#39;)|(?:&apos;)/g,"\'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&#(\d+);/g,
		function($0,$1){
			var num = parseInt($1,10).toString(16);
			if(num.length > 2){
				return unescape('%u' + num);
			}else{
				return decodeURI('%' + num);
			}
		}
	);
};
String.prototype.encode2 = function(){return this.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")};

/**
 * 分行操作
 * @param {Int} lineNum
 * @type String
 */
// 好像不起作用... added by hyc 07.07.28
String.prototype.cutLine = function(lineNum){ 
    //var re = /(.*?)<br>/ig;
		var i = 0;
		var fPos = 0 ,cPos = 0;
		while (i<lineNum && fPos!=-1)
		{
			fPos = this.indexOf("<br>",cPos);
			cPos = fPos + 1;
			i++
		}
		if (!cPos){
			return this;
		}else{
			return this.substr(0,cPos-1);
		}
	};

String.prototype.closeHTML = function(){ //闭合HTML
		var arrTags = ["a","div","span","table","font","b","u","i","center","marquee"];
		var str = this;
		for (var i=0;i<arrTags.length;i++)
		{
			var re1 = new RegExp("<" + arrTags[i] + "( [^<>]+|)>","ig");
			var re2 = new RegExp("</" + arrTags[i] + ">","ig");
			var openTags = str.match(re1);
			var closeTag = str.match(re2);

			var openTagLength = openTags?openTags.length:0;
			var closeTagLength = closeTag?closeTag.length:0;
			var fixHTML = "";
			for (var j=0;j<openTagLength-closeTagLength;j++) fixHTML += "</" + arrTags[i] + ">";
			str += fixHTML;
		}
		return str;
};

/**
 * 日期转换
 * @param {String} expression 日期表达式例如: "yyyy-MM-dd hh:mm:ss"
 * @author zishunchen
 */
Date.prototype.format = function(expression){
	var str = expression?expression:"yyyy-MM-dd hh:mm:ss";
	str = str.replace(/yyyy/g,this.getFullYear());
	str = str.replace(/yy/g,this.getFullYear().toString().substr(2));

	str = str.replace(/MM/g,(this.getMonth() + 1).fixDigit(2));
	str = str.replace(/dd/g,this.getDate().fixDigit(2));
	str = str.replace(/hh/g,this.getHours().fixDigit(2));
	str = str.replace(/mm/g,this.getMinutes().fixDigit(2));
	str = str.replace(/ss/g,this.getSeconds().fixDigit(2));

	return str;
}

/**
 * 数值补位
 * @param {Number} len 字符传直接显示长度
 * @return 补位后的字符传
 * @type String
 * @deprecated 注意数值不能为非负数
 * @author zishunchen
 */
Number.prototype.fixDigit = function(len){
	var fixLen = len - this.toString().length + 1;
	return new Array(fixLen<0?0:fixLen).join("0") + this;
}

// Mozilla 兼容处理
if(Browser.isMozilla) includeJS("http://imgcache.qq.com/qzone/client/async/mozilla.js");

var _st = window.setTimeout;
if(!window.setTimeout.constructor)
window.setTimeout = function(fRef, mDelay) {
    if(typeof fRef == 'function'){
        var argu = Array.prototype.slice.call(arguments,2);
        var f = (function(){ fRef.apply(null, argu); });
        return _st(f, mDelay);
    }
    return _st(fRef,mDelay);
}

var _int = window.setInterval;
if(!window.setInterval.constructor)
window.setInterval = function(fRef, mDelay) {
    if(typeof fRef == 'function'){
        var argu = Array.prototype.slice.call(arguments,2);
        var f = (function(){ fRef.apply(null, argu); });
        return _int(f, mDelay);
    }
    return _int(fRef,mDelay);
}

// json支持
function objSelectNodes(obj,oPath){
	if(/^\//.test(oPath)) oPath = oPath.substr(1);
	var a = oPath.split("/");
	var o = obj[a.shift()];
	if(!o) return [];
	if(!o.sort) o = [o];
	if(a.length==0)	return o;
	var subPath = a.join("/");
	var result = [];
	for(var i=0;i<o.length;i++){
		var a = objSelectNodes(o[i],subPath);
		if(a && a.length>0)
			result = result.concat(a);
	}
	return result;
}

function objSelectSingleNode(obj,oPath){
	var o = objSelectNodes(obj,oPath);
	return (o.length>=1)?(o[0]):(null);
}

function isValidXMLdom(o){
	if(!o)
		return false;
	if(!o.xml)
		return false;
	if(o.xml=="")
		return false;
	if(!(/^<\?xml/.test(o.xml)))
		return false;
	//if(!o.selectNodes("error").length>0)
	//	return false;
	return true;
}

function pickNumFromDom(path,o,type,attr){
	var tn;
	if(!type)
		type="n";
	try{
		if(/n/.test(type))
			tn=parseInt(o.selectSingleNode(path).text);
		else{
			if(path=="")
				tn=parseInt(o.getAttribute(attr));
			else
				tn=parseInt(o.selectSingleNode(path).getAttribute(attr));
		}
		if(isNaN(tn))
			tn=0;
	}
	catch(err){
		tn=0;
	}
	return tn;
}

function getBitMapFlag(i){
	if(typeof g_UserBitmap=="string")
		return parseInt(g_UserBitmap.charAt(15-Math.floor((i-1)/4)),16) >>((i-1)%4) &1;
	else
		return 0;
	//按照bitmap位规划1.3，返回指定标记位的值，从右到左分别为1～64
}

function setBitMapFlag(i,bV){
	var _t=15-Math.floor((i-1)/4);
	var _c=(i-1)%4;
	var fix=(_c==0)?1:(2<<(_c-1));

	if(typeof g_UserBitmap=="string"){
		var res=parseInt(g_UserBitmap.charAt(_t),16);
		if(bV)
			res|=fix;
		else
			res&=(~fix);
		return (g_UserBitmap=([g_UserBitmap.substring(0,_t),res.toString(16),g_UserBitmap.substring(_t+1)]).join(""));
	}
	else
		return null;
	//按照bitmap位规划1.3，设定指定标记位的值，从右到左分别为1～64，最后返回整个UserBitMap串
}

/**
 * 获取xmlnode的指定子节点的text
 * @param {domnode} xmlnode
 * @param {String} subnodename 指定字节点的name(path)
 */
function getSubNodeText(xmlnode,subnodename){
	with(xmlnode){
		try{
			return selectSingleNode(subnodename).text;
		}catch(e){
			return "";
		}
	}
}

/**
* 加载 json 数据
* @param {String} xID 缓存ID
* @param {String} url 数据来源URL
* @param {Function} callback 回调方法
* @param {Function} errcallback 错误回调
* @param {Boolean} refresh 是否总是获取服务器数据
* @param {String} charset 数据源charset
* @param {String} callbackFunctionName 数据源回调接口
* @version 1.3
* @author zishunchen & stonghuang
* @see #loadXMLAsync
*/
function loadJsonData(xID,url,callback,errcallback,refresh,charset,callbackFunctionName){
	if (top.g_JData[xID] && !refresh && !top.g_JData[xID].error){
		callback(top.g_JData[xID]);
		return;
	}
	
	charset = charset?charset:"GB2312";
	var cFN = callbackFunctionName?callbackFunctionName:"JsonCallback";
	
	if(Browser.isIE){
		var df = document.createDocumentFragment();    
		
		df[cFN] = function(data){
			s.onreadystatechange = null;
			df = null;
			top.g_JData[xID] = data;
			try{
				if(callback)callback(data);
			}catch(e){
				if(e.number == -2146823277) return;
				status = e.message;
				setTimeout("status=''",3000);
			}
		}
		
		var s = df.createElement("SCRIPT");
		s.charset = charset;
		df.appendChild(s);
		
		s.onreadystatechange = function(){
			if(s.readyState=="loaded") {
				s.onreadystatechange=null;
				df = null;
				try{
					if (errcallback) errcallback({error:{msg:"服务器繁忙，请稍后再试.",type:900}});
				}catch(e){
					if(e.number != -2146823277)
						status=e.message;
						setTimeout("status=''",3000);
				}
			}
		}
		s.src = url;
	}else{
		var i = document.createElement("IFRAME");    
		i.style.display = "none";
		i.callback = function(data){
			top.g_JData[xID] = data;
			callback(data);
			i.callback = null;
			i.src="about:blank"
			removeElement(i);
			i = null;
		};
		i.errcallback = errcallback;
		i.src="javascript:\"<script>function " + cFN + "(data){frameElement.callback(data)};<\/script><script src='"+url+"' charset='" + charset + "'><\/script><script>setTimeout('frameElement.errcallback({error:{msg:\"服务器繁忙，请稍后再试.\",type:900}})',0)<\/script>\"";
		document.body.appendChild(i);
	}
}

/**
 * Flash ShareObject 对象应用
 */
 
/**
* 利用ShareObject存储数据
* @param {string} key 存储的key
* @param {string} value 存储内容
* @deprecated 不建议存Object
*/
function setShareData(key,value){
	if (window._shareObjectReady){
		$("shareObject").set("seed",Math.random());
		$("shareObject").set(key,value);
		$("shareObject").flush();
	}
}

/**
* 获取ShareObject数据
* @param {string} key 存储的key
* @return 返回value
* @type string
*/
function getShareData(key){
	if (window._shareObjectReady)
		return $("shareObject").get(key);
	else
		return "";
}

/**
* 利用Flash设置剪贴板内容
* @param {string} value 存储到剪贴版的内容
*/
function setClipboard(value){
	if (window._shareObjectReady)
		$("shareObject").setClipboard(value);
	else 
		copyToClip(value);
}

/**
* 获取ShareObject数据
*/
function clearShareData(){
	if (window._shareObjectReady)
		$("shareObject").clear();
}

/**
* 获取ShareObject已用大小
* @return 返回存储空间已占用空间
* @type int
*/
function getShareDataSize(){
	if (window._shareObjectReady)
		return $("shareObject").getSize();
	else
		return -1;
}

/**
 * 向ShareObject请求权限。
 */
function getShareObjectPrefix(){
	window._shareObjectReady = true;	
	return location.host.match(/\w+/)[0];
}

/**
* 建立存储对象
*/
function buildShareObject(){
	if (flashVersion.major < 8) {
		window._shareObjectReady = false;
		return false;
	}
	var shareObjectDiv = document.createElement("div");
	document.body.appendChild(shareObjectDiv);
	shareObjectDiv.innerHTML = insertFlash({
		src:"http://"+top.imgcacheDomain+"/qzone/dataset/getset.swf",
		id:"shareObject",width:0,height:0,
		allowscriptaccess:"always"});
}

/**
*JSON对象克隆方法 不能够克隆 function undefined 两种值
*@param {Object/Array/String/Number} obj 入值
*@return 克隆出来的新对象
*/
function objectClone(obj){
	if((typeof obj)===(typeof null)){
		var res=(!obj.sort)?{}:[];
		for(var i in obj)
			res[i]=objectClone(obj[i]);
		return res;
	}
	return obj;
}
/**
* 转换文本内容为html
*/
String.prototype.Text2HTML=function(){
	var d=document.createElement("DIV");
	if(Browser.isIE) {d.innerText=this;return d.innerHTML}
	d.textContent=this;
	return d.innerHTML.replace(/\x0a/g,"<br>").replace(/ /g,"&nbsp;")
};
/**
* 转换样式长度为数字
* @param 
*/
String.prototype.s2n=function(unit){
	if(!unit)
		unit="px";
	var re=new RegExp(unit+"$","i");
	return parseInt(this.replace(re,""),10);
};

var verifyCounter=[];
function VerifyImage(eleID,x,y){
	var c=verifyCounter.length;
	this.timeout=null;
	this.ipt = null;
	if(!eleID)
		this.eleID=eleID="verifyIMG_"+c;
	this.od=document.createElement("div");
	with(this.od){
		style.position="absolute";
		style.backgroundColor="#505050";
		style.border="solid 1px #545454";
		style.padding="3px";
		id=eleID+"_anchor";
	}
	this.templete=('<img id="'+eleID+'" onclick="getVerify(\''+eleID+'\','+c+')" style="cursor:pointer;margin-bottom:5px" src="http://ptlogin2.qq.com/getimage?aid=8000101&sds={{_random_}}" alt="获取中..." title="点击更换" width="130" height="53" /><br /><span onclick="getVerify(\''+eleID+'\','+c+')" style="color:white;cursor:pointer">看不清楚?换一个</span>');
	this.seed=Math.random();
	this.appended=false;

	verifyCounter[c]=this;
}

VerifyImage.prototype.showMe=function(x,y){
	with(this.od){
		style.top=(y-85)+"px";
		style.left=(x+1)+"px";
	}
	if(!this.appended){
		document.body.appendChild(this.od);
		this.od.innerHTML=this.templete.replace(/\{\{_random_\}\}/g,this.seed);
		this.appended=true;
	}	
	
	this.od.style.display="";
}

VerifyImage.prototype.killMe=function(){
	this.od.style.display="none";
}

VerifyImage.prototype.change=function(){
	var o=$(this.eleID);
	this.seed=Math.random();
	o.src="http://ptlogin2.qq.com/getimage?aid=8000101&sds="+this.seed;
}

//获取验证码
function getVerify(s,n){
	clearTimeout(verifyCounter[n].timeout);
	verifyCounter[n].change();
	//var i=$("verifycode");
	if(verifyCounter[n].ipt){
		verifyCounter[n].ipt.value="";
		verifyCounter[n].ipt.focus();
	}
}

//input focus获取验证码
function focusGetVerify(o){
	var pos=getPosition(o);
	var e=(verifyCounter.length>0)?(verifyCounter[0]):(new VerifyImage());
	e.ipt = o;
	e.showMe(pos.left,pos.top);
//	o.value="";
	o.select();
}

//干掉验证码
function hiddenVerify(isImme){
	if(!verifyCounter[0])
		return;
	if(!isImme)
		verifyCounter[0].timeout=setTimeout(function(){verifyCounter[0].killMe()},500);
	else
		verifyCounter[0].killMe();
}

// common.js end ////////////////////////
