﻿/**
 * 脚本功能类
 * 脚本功能类，提供若干通用的处理函数
 *
 * @author	2006-07-21	yangzhang
*/
var CXUtility = new Object();

with (CXUtility)
{
	// 定义公共成员
	/** 浏览器类型判断标志 */
	CXUtility.m_bIsMozilla	= (typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined') && (typeof HTMLDocument!='undefined');
	CXUtility.m_bIsIE			= window.ActiveXObject ? true : false;
	CXUtility.m_bIsFirefox	= (navigator.userAgent.toLowerCase().indexOf("firefox")!=-1);
	CXUtility.m_bIsOpera		= (navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
	
	/** 判断脚本运行模式：web网站上，还是本地？ */
	CXUtility.m_bIsLocal		= document.location.toString().toLowerCase().indexOf("file:///") == 0
									|| document.location.toString().toLowerCase().indexOf("x-gadget:///") == 0;
	
	// 定义私有成员
	/** 动态加载脚本列表 */
	m_ScriptList	= new Object();
	/** 动态加载xml文件列表 */
	m_XmlList		= new Object();
	
	if (m_bIsMozilla) {
		HTMLElement.prototype.removeNode = function() {
			this.parentNode.removeChild(this);
		}
	}
}	

/**
 * 读取DOM Node值
 * 读取DOM Node值，CData类型按父节点的值处理
 *
 * @param xmlNode:	[IN]/起始节点
 * @param xPath:	[IN]/指定节点的xPath,为空则读取起始节点的值
 * @param list:		[IN]/当xPath为多个子节点时候，决定是否以列表形式返回结果
 * @return string
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.GetXmlNodeText = function(xmlNode, xPath, list) {with(CXUtility)
{
	if (xmlNode != null)
	{
		if (list)
		{
			var nodeList = (xPath != null) ? xmlNode.selectNodes(xPath) : xmlNode.childNodes;
			var textlist = new Array();
			
			for (var i = 0; i < nodeList.length; i++)
				textlist.push(nodeList[i].nodeValue);
				
			return textlist;
		}

		if (xmlNode != null)
			xmlNode = xmlNode.selectSingleNode(xPath);
			
		if (xmlNode != null)
			return xmlNode.text;
	}
	
	return "";
}}

/**
 * 读取提交参数值
 * 读取提交参数值
 *
 * @param name:	[IN]/参数名称
 * @return string/array
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.GetPostParameter = function(name, url)
{ 
	name=name.toLowerCase();
	var paramStr = url != null ? url : paramStr=location.search;
	if(paramStr.length==0)
		return ""; 
	var pos = paramStr.indexOf("?");
	if (pos<0)
		return "";

	paramStr = paramStr.substring(pos + 1, paramStr.length);
	if(paramStr.length==0)
		return ""; 
	
	var params=paramStr.split('&'); 
	for(var i=0;i<params.length;i++) 
	{ 
		var parts=params[i].split('=',2); 
		if(parts[0].toLowerCase()==name) 
		{ 
			if(parts.length<2||typeof(parts[1])=="undefined"||parts[1]=="undefined"||parts[1]=="null")return ""; 
			return unescape(parts[1]); 
		} 
	} 
	
	return ""; 
}

/**
 * 按指定长度截取字符串
 * 按指定长度截取字符串
 *
 * @param str:	[IN]/指定字符串
 * @param len:	[IN]/指定长度
 * @return string	
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.TrimText = function(str, len) {with (self)
{
	var strlen = str.length;
	var t = 0;

	for (var k = 0; k < strlen; k++)
	{
		t += (str.charCodeAt(k) < 128 ? 1 : 2);
		if (t >= len)
			return str.substr(0, k) + "...";
	}
	
	return str;
}}

/**
 * 去除字符串无效字符
 * 去除字符串无效字符
 *
 * @param str:	[IN]/指定字符串
 * @return string
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.Trim = function(str) {with(CXUtility)
{
	return str != null && str!= "" ? str.replace(/^\s*|\s*$/g, "") : null;
}}

/**
 * 动态加载脚本
 * 动态加载脚本
 *
 * @param url:	[IN]/脚本路径
 * @param func:	[IN]/回调函数
 * @param args: [IN]/回调函数参数，如果需要指定多个参数，可以使用object属性列表
 * @return	true/false
 *
 * @author	2006-07-21	yangzhang
*/	
CXUtility.LoadScript = function(url, func, args) {with(CXUtility)
{
	if (m_ScriptList[url] != null)
	{
		waitForExistence();
	}
	else
	{
		var oScript = document.createElement('script');
		m_ScriptList[url] = oScript;
		
		oScript.setAttribute('src', url);
		oScript.setAttribute('type', 'text/javascript')
		
		var oHead = document.getElementsByTagName("head")[0];
		if (m_bIsFirefox) 
		{
			oScript.onload = waitForExistence;
			oHead.appendChild(oScript);
		} 
		else 
		{
			oHead.appendChild(oScript);
			waitForExistence();
		}
	}

	function waitForExistence() {with(CXUtility)
	{
		if (m_ScriptList[url].readyState == "complete" || m_ScriptList[url].readyState == "loaded") 
		{
			if(func)
				func(args);
		} 
		else 
		{
			setTimeout(waitForExistence,1);
		}
	}}
	
	return true;
}}

/**
 * 判断指定脚本是否已经动态加载
 * 判断指定脚本是否已经动态加载
 *
 * @param url:	[IN]/脚本路径
 * @rturn true/false
 *
 * @author	2006-07-21	yangzhang
*/	
CXUtility.IsScriptLoaded = function(url) {with(CXUtility)
{
	return m_ScriptList[url] != null && (m_ScriptList[url].readyState == "complete" || m_ScriptList[url].readyState == "loaded");
}}

/**
 * 动态加载XML
 * 动态加载XML
 *
 * @param url:		[IN]/xml路径
 * @param func:		[IN]/回调函数
 * @param args:		[IN]/回调函数参数，如果需要指定多个参数，可以使用object属性列表
 * @param refresh:	[IN]/是否强制刷新
 * @return	true/false
 *
 * @author	2006-07-21	yangzhang
*/	
CXUtility.LoadXml = function(url, func, args, sendData, refresh) {with(CXUtility)
{
	function handleStateChange() {with(CXUtility)
	{
		if (xmlHttp.readyState == 4) 
		{
			m_XmlList[key] = null;
			if (xmlHttp.status == 200 && xmlHttp.responseXML.xml != "")
				m_XmlList[key] = xmlHttp.responseXML;
				
			func(m_XmlList[key], args);		
		}
	}}
	
	function handleStateChange1() {with(CXUtility)
	{
		if (xml.readyState == 4) 
		{
			m_XmlList[key] = null;
			if(xml.xml != "")
				m_XmlList[key] = xml;
				
			func(m_XmlList[key], args);
		}
	}}
	
	var xmlHttp = null, xml = null;
	var key = url;
	if (sendData != null && sendData != "")
		key += ":" + sendData;
	
	if (refresh)
	{
		delete m_XmlList[key];	
		m_XmlList[key] = null;
	}
	
	if (url != null && url != "" && !m_XmlList[key])
	{
		if (url.toLowerCase().indexOf("uta:client") == 0)
		{
			if (CXUtility.UTAShell == null)
				CXUtility.UTAShell = new ActiveXObject("UTA.UTAShell");
			
			if (CXUtility.UTAShell)
			{
				text = CXUtility.UTAShell.GetResponse(url, sendData, document.cookie);
				if (text != null && text != "")
				{
					xml = new ActiveXObject("MSXML.DOMDocument");
					xml.onreadystatechange = handleStateChange1;
					try 
					{
						xml.loadXML(text);
						
						var list = xml.selectNodes('*/folder[@attribute="root"]/rec[@alias="cookie"]/var');
						for (var i = 0; i < list.Length; i++)
						{
						}
					} 
					catch(e) 
					{
						xml = null; 
						func(null, args);
					}
				}
			}
		}
		else if (m_bIsLocal && url.indexOf("://") == -1)
		{
			xml = new ActiveXObject("MSXML.DOMDocument");
			xml.onreadystatechange = handleStateChange1;
			try 
			{
				xml.load(url);
			} 
			catch(e) 
			{
				xml = null; 
				func(null, args);
			}
		}
		else
		{
			if (!m_bIsLocal && url.indexOf("://") != -1)
				url = CXConfig.m_RemoteUrl + escape(url);

			if (window.ActiveXObject)
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			else if(window.XMLHttpRequest)
				xmlHttp = new XMLHttpRequest();
				
			if (refresh)
			{
				if (url.indexOf('?') == -1)
					url += "?" + Math.random();
				else
					url += "&" + Math.random();
			}

			if (sendData != null && sendData != "")
			{
				//向服务器发送消息，当调用本地静态文件时,该操作无效
				xmlHttp.open("POST", url, true);
				if (func)
					xmlHttp.onreadystatechange = handleStateChange;
				xmlHttp.setRequestHeader("content-length", sendData.length); 
				xmlHttp.setRequestHeader("content-type", "application/x-www-form-urlencoded; charset=utf-8"); 
				xmlHttp.send(sendData);
			}
			else
			{
				xmlHttp.open("get",url,true);
				if (func)
					xmlHttp.onreadystatechange=handleStateChange;
				if (refresh)
					xmlHttp.setRequestHeader("If-Modified-Since","0");
				xmlHttp.send();
			}
		}
	}
	else
	{
		func(m_XmlList[key], args);
	}
}}

/**
 * 判断指定XML是否已经动态加载
 * 判断指定XML是否已经动态加载
 *
 * @param url:	[IN]/XML路径
 * @rturn true/false
 *
 * @author	2006-07-21	yangzhang
*/	
CXUtility.IsXmlLoaded = function(url, sendData) {with(CXUtility)
{
	var key = url;
	if (sendData != null && sendData != "")
		key += ":" + sendData;
		
	return m_XmlList[key] != null && m_XmlList[key].readyState == 4 && m_XmlList[key].xml != "";
}}

/**
 * 读取文档节点绝对路径
 * 读取文档节点绝对路径
 *
 * @param base:	[IN]/文档路径
 * @param url:	[IN]/节点路径
 * @return string
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.GetActualFilePos = function(base, url) {with(CXUtility)
{
	if (url == null || url == "" || base == null || base == "" || url.substring(0, 7).toLowerCase() == "http://")
		return url;
			
	url = url.replace(/\\/g, "/");
	if (url.substring(0, 1) == "/")
		url = url.substring(1, url.length);
	
	var pos = base.lastIndexOf('?');
	if (pos != -1)
		base = base.substring(0, pos);
	pos = base.lastIndexOf('/');
	if (pos != -1)
	{
		if (pos == base.length - 1 || base.substring(pos, base.length).indexOf('.') != -1)
			base = base.substring(0, pos);
	}	
	
	return base + "/" + url;
}}

/**
 * 脚本编码
 * 脚本编码
 *
 * @param js:	[IN]/脚本
 * @return string
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.JSEncode = function(js) {with(CXUtility)
{
	if (js == null)
		return "";
	
	if (typeof(js) != "string")
		js = new String(js);
		
	return js.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/'/g, "\\\'").replace(/\r/g, "\\r").replace(/\n/g, "\\n");
}}

/**
 * 脚本编码
 * 脚本编码
 *
 * @param js:	[IN]/脚本
 * @return string
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.HTMLEncode = function(js) {with(CXUtility)
{
	if (js == null)
		return "";
	
	if (typeof(js) != "string")
		js = new String(js);
		
	return js.replace(/(\r\n|\n)/g, "<br/>");
}}

/**
 * 获取操作返回信息
 * 获取操作返回信息
 *
 * @param xml:	[IN]/xml文档
 * @param list:	[IN]/是否是列表文档
 * @return bool
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.CheckResult = function(xml, list) {with(CXUtility)
{
	if (list)
		return xml != null;
		
	return GetXmlNodeText(xml, "//rec/var[@name='code']/@value") == "NoError";
}}

/**
 * 获取操作返回信息
 * 获取操作返回信息
 *
 * @param xml:	[IN]/xml文档
 * @param list:	[IN]/是否是列表文档
 * @return string
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.GetResultMsg = function(xml, list) {with(CXUtility)
{
	if (list)
		return xml != null;
		
	return GetXmlNodeText(xml, "//rec/var[@name='message']/@value");
}}

/**
 * 获取日期文本
 * 获取日期文本
 *
 * @param date:	[IN]/日期
 * @return Date
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.GetDateText = function(date) {with(CXUtility)
{
	if (date == null)
		date = new Date();

	if (typeof(date) != "object")
		return String(date);
	
	var text = date.getYear() + "-";

	if (date.getMonth() < 9)
		text += 0;
	text += (date.getMonth() + 1) + "-";

	if (date.getDate() < 10)
		text += 0;
	text += date.getDate();

	return text;
}}

/**
 * 获取日期
 * 获取日期
 *
 * @param date:	[IN]/日期
 * @return Date
 *
 * @author	2006-07-21	yangzhang
*/
CXUtility.GetDateValue = function(date) {with(CXUtility)
{
	var d = new Date();

	if (typeof(date) == "string")
	{
		d.setYear(date.substring(0, 4));
		d.setMonth(Number(date.substring(5, 7)) - 1);
		d.setDate(date.substring(8, 10));
	}

	return d;
}}

function $(id, win)
{
	if (win == null)
		return document.getElementById(id);

	var list = win.all;
	if (list != null)
	{
		for (var i = 0; i < list.length; i++)
		{
			if (list.item(i).id == id)
				return list.item(i);
		}
	}
	
	return null;
}