<!--
/*++++填充+++++*/

var r_index = /<%=index%>/g
var r_text = /<%=text%>/g
//var r_attribute_global = /<%=@([\[\]\w\'\"\(\)]+)%>/g
var r_attribute_global = /<%=@([^%]+)%>/g

function FillDiv_Ex(divId,xDoc){
	var div;
	if(typeof(divId) == "object")
		div = divId;
	else
		div = document.getElementById(divId);
	if (!div) {/*window.status=("指定的模板容器"+divId+"不存在");*/return;}
	var templetHTML;
	if (div.oldHTML) {
		templetHTML = div.oldHTML;
	}else{
		var m=div.childNodes;
		var bHave=false;
		for(var i=0;i<m.length;i++){
			if('TEXTAREA'==m[i].tagName&&m[i].className=='template'){
				templetHTML = div.oldHTML = m[i].value;
				bHave=true;
				break;
			}
		}
		if(!bHave)
			templetHTML = div.oldHTML = div.innerHTML;
	}

	templetHTML = templetHTML.replace(/\[%/g,"<%").replace(/%\]/g,"%>").replace(/\{%/g,"<%").replace(/%\}/g,"%>").replace(/\<!--%/g,"<%").replace(/%-->/g,"%>")
	div.innerHTML = doDataFill_Ex(templetHTML,xDoc,0);
	div.style.display = "";
}

/**
*支持对xml数据和json数据的处理
*控制循环的范围, repeat_num="index,len" 从下标index开始（0开始）最多为len个
*对数据的预处理 [%=@id[preFix(__VAR__)]%] 在[]中间的为用户自定义的预处理函数
*不允许套嵌层次9个以上，建议不超过2层,xml兄弟对应json的数组成员，xml的属性对应json的对象的key
*/

function doDataFill_Ex(templetHTML,xDoc,xLevel){
	var stRegPrefix = "<%repeat_"+xLevel+"\\s*match=\"([^\"]+)\"[^%]*%>";
	var stRegContent = "<%repeat_"+xLevel+"[^>]*%>((.|\\n)+)<%_repeat_"+xLevel+"%>";

	var r_repeat_match = new RegExp(stRegPrefix);
	var r_repeat_match_global = new RegExp(stRegPrefix,"g");
	var r_repeat_content = new RegExp(stRegContent);
	var r_repeat_match_next_level = new RegExp("<%repeat_"+(xLevel+1)+" match=\"([^\"]+)\"");

	if (templetHTML.match(r_repeat_match)==null){
		alert("没有找到节点<%repeat_"+(xLevel)+"%>");
		return;
	}
	var isXML=!!xDoc.xml;

	var arPrefix = templetHTML.match(r_repeat_match_global);
	var startPosition = 0;
	for (var i=0;i<arPrefix.length;i++){
		var st = arPrefix[i];
		var nodePath = st.replace(/^.*match=\"|\".*$/g,""); //获得节点路径
		if (st.indexOf("callback")>0)
			var fnCallBack = eval(st.replace(/^.*callback=\"|\".*$/g,"")); //获得回调函数
		startPosition = templetHTML.indexOf(st);
		var endPosition = templetHTML.indexOf("<%_repeat_"+xLevel+"%>",startPosition);
		var replaceContent = templetHTML.substring(startPosition,endPosition+13)
		startPosition += st.length;
		var repeatContent = templetHTML.substring(startPosition,endPosition); //获得内容模板(循环部分)
		var nodes = isXML?xDoc.selectNodes(nodePath):objSelectNodes(xDoc,nodePath); //获得节点
		if(!nodes){
			alert("没有找到节点"+nodePath);
			return;
		}
		var arContent = [];
		var attributes = repeatContent.match(r_attribute_global);
		if (attributes == null) attributes = [];

		var repeatStartIndex=0;//开始repeat的数组下标，从0开始
		var repeatTimes = nodes.length;//repeat的个数[0,nodes.length]
		if (st.indexOf("repeat_num")>0)	{
			var repeatAttrContent = (st.replace(/^.*repeat_num=\"*|\".*$/g,"")); //获得repeat_num里的内容
			var repeatArry=repeatAttrContent.split(",");
			if(repeatArry.length==2){
				if(repeatArry[0]>=0 && repeatArry[0]<nodes.length)
					repeatStartIndex=repeatArry[0];
				if(repeatArry[1]>0 && repeatArry[1]<=nodes.length)	
					repeatTimes=repeatArry[1];	
			}else{
				if(repeatArry[0]>0 && repeatArry[0]<=nodes.length)	
					repeatTimes=repeatArry[0];
			}		
		}
		for (var j=repeatStartIndex;j<repeatTimes;j++){
			var node = nodes[j];
			var content = repeatContent;
			if (repeatContent.match(r_repeat_match_next_level)!=null) //处理子节点
				content = doDataFill_Ex(repeatContent,node,xLevel+1)
			//var s = content.replace(r_index,(j+1)).replace(r_text,isXML?node.text:node);
				var s = content.replace(r_index,(j+1));
			for (var k=0;k<attributes.length;k++){
				var tmp = attributes[k].replace(/[^\w,\'\"\[\]\(\)]/g,"");
				//取出需要操作的函数
				var attrFunc;
				if(tmp.indexOf("[") > -1){	
					attrFunc = tmp.replace(/(\w+\[)|(\]\w*)/g,"");
				}else{//如果没有函数
					attrFunc = "";
				}
				var attrTag = tmp.replace(/\[.*\]/g,"");
				var attrValue="";
				if(isXML){
				 attrValue= node.getAttribute(attrTag);
				if (attrValue==null && node.selectSingleNode(attrTag)!=null)
					attrValue = node.selectSingleNode(attrTag).text;
				}else{
					attrValue = node[attrTag];
				}
				if(attrValue==null){
					attrValue = "";
				}
				if (attrValue!==""){
					if(attrFunc && attrFunc != "") {
						attrFunc = attrFunc.replace("__INDEX__",(j+1)).replace("__VAR__",attrValue);
						try {
							attrValue = eval(attrFunc);
						}
						catch (e){
							attrValue = "";
						}
					}
				}
				s = s.replace(attributes[k],attrValue);
			}
			
			arContent[j] = s;
			if (fnCallBack) fnCallBack(node,arContent,j);
		}
		templetHTML = templetHTML.replace(replaceContent,arContent.join(""));
	}
	return templetHTML;
}
/**
* JSON支持 得到所指路径的节点数组数据（为了填充函数）
* @param {Object} obj json对象
* @param {String} oPath 对应的节点路径
* @return {Array} 返回所要的节点数组
*/

function objSelectNodes(obj,oPath){
	if(/^\/$/.test(oPath)) return obj;   // 根基点，返回对象本身
	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;
}

/**
* JSON支持 得到所指路径的节点数组数据的第一个数据
* @param {Object} obj json对象
* @param {String} oPath 对应的节点路径
* @return {Array} 返回所要的节点数据
*/
function objSelectSingleNode(obj,oPath){
	var o = objSelectNodes(obj,oPath);
	return (o.length>=1)?(o[0]):(null);
}

/**
*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;
}

/*++++JSON加载处理方法+++++*/
/**
*简单的JSON加载方法
* @param {String} url 数据源url
* @param {function} errCallBack 出错处理，暂时没用
*/
function jsonInit(url,errCallBack){
	var s = document.createElement("SCRIPT");
	document.getElementsByTagName("HEAD")[0].appendChild(s);
	s.src=url;
	if(errCallBack){
		s.onerror=errCallBack;
		if(!!document.all){
		    s.onreadystatechange=function() {
				s.onreadystatechange=null;
				if(this.readyState=="loaded")
					setTimeout(errCallBack,2000);
			}
		}
	}
	return s;
}

/**
* 加载 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 数据源回调接口
* @see #loadXMLAsync
*/
function loadJsonData(xID,url,callback,errcallback,refresh,charset,callbackFunctionName){
	if(typeof(top.g_JData)!="object"){
		top.g_JData=[];
	}
	if (!refresh && top.g_JData[xID] && !top.g_JData[xID].error){
		callback(top.g_JData[xID]);
		return;
	}
	
	charset = charset?charset:"GB2312";
	var cFN = callbackFunctionName?callbackFunctionName:"JsonCallback";
	
	if(!!document.all){
		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);
	}
}


/*++++++xml加载处理方法++++++++*/
/**
*基本上我们不会使用
*/
if(!Browser){
	var Browser = {};
	Browser.isIE = window.ActiveXObject ? true : false;
}

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 = document.getElementById("proxy");

	if (!proxyDiv){
		document.body.insertBefore(i,null); 
	}else{
		document.getElementById("proxy").appendChild(i);
	}

	i.width=0;
	i.height=0;
	i.src=src;
	i = null;
}
//Ajax 异步调用方法

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;
}

/**
 * 获取xmlnode的指定子节点的text
 * @param {domnode} xmlnode
 * @param {String} subnodename 指定字节点的name(path)
 */
function getSubNodeText(xmlnode,subnodename){
	with(xmlnode){
		try{
			return selectSingleNode(subnodename).text;
		}catch(e){
			return "";
		}
	}
}
//-->
