﻿/******************************************************************
							Global functions
******************************************************************/
//Regist a namespace(IE,FireFox)
Namespace = new Object();
Namespace.Register = function( NameSpace )
{
   var nameSpaceParts = NameSpace.split(".");
   var statement = "";
   var typeName = "";   
   for (var i = 0; i < nameSpaceParts.length; i++)
   {
        if (i !== 0) 
        {
            typeName += ".";
        }
        typeName += nameSpaceParts[i];
        statement += "if (typeof(" + typeName + ") == 'undefined') " + typeName + " = new Object();";
    }
    if (statement !== '')
    {
        eval(statement); 
    }
};


Namespace.Register( "CEN" );

CEN.isIE = false; 
CEN.isMozilla = false;

if( typeof XMLHttpRequest == "undefined" && typeof ActiveXObject != "undefined" )
{
	var XH_ACTIVE_X_IDENTS=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MICROSOFT.XMLHTTP"];
	for( var i = 0;i < XH_ACTIVE_X_IDENTS.length; i++ )
	{
		var tryProgId = XH_ACTIVE_X_IDENTS[ i ];
		try
		{
			new ActiveXObject( tryProgId );
			CEN.xh_ProgId = tryProgId ;
			break;
		}
		catch( e ){}
	}
	if( undefined === CEN.xh_ProgId )
	{
		CEN.xh_ProgId = "MICROSOFT.XMLHTTP";
	}
}

CEN.GetBrowser = function()
{
	if( window.ActiveXObject )
	{ 
		CEN.isIE = true; 
	}
	else if ( document.implementation && document.implementation.createDocument )
	{
		CEN.isMozilla = true;
	}
	else
	{
		alert( "Unknow brawser, some function could not teke effect." );
		CEN.isIE = true; 
	}
};
// Return the gather which id is assigned (IE,FireFox)
// example: CEN.$("Button1")
CEN.$ = function()
{
	var destinDoc = arguments[1] || this.curDocument || document;
	var id = arguments[0];
	var elements = new Array();
	if( typeof id == "string" )
	{
		return destinDoc.getElementById(id);
	}
	else if( typeof id == "object" )
	{
		for( var i = 0; i < id.length; i ++ )
		{
			var element = null;
			element = destinDoc.getElementById( id[i] );
			elements.push( element );
		}
	}
	return elements;
};
var $ = CEN.$;

// competible with IE and Mozilla;
CEN.GetKeyCode = function( oEvent )
{
	var keyCode;
	if( oEvent.keyCode)
	{
		keyCode = oEvent.keyCode;
	}
	else if( oEvent.which)
	{
		keyCode = oEvent.which;
	}
	return keyCode;
};
// Get value from the url
CEN.getUrlPara = function( url, paraName )
{
	var reg = new RegExp( "(^|\\?|&)" + paraName + "=([^&]*)(\\s|&|$)", "i" );
	
	if ( reg.test( url ) )
	{
		return unescape( RegExp.$2 );
	}
	return "";
};

CEN.LoadJsFile = function( jsFile )
{
	if( typeof jsFile == "string" )
	{
		CEN.LoadJs( jsFile );
	}
	else
	{
		for( var i = 0; i < jsFile.length; i++ )
		{
			CEN.LoadJs( jsFile[ i ] );
		}
	}
};


/******************************************************************
							DOM functions
******************************************************************/
// Create new DOM object(IE,FireFox)
CEN.createXmlDom = function()
{
    var dom;
    if ( CEN.isIE )
    {
	    dom = new ActiveXObject( "MSXML2.FreeThreadedDomDocument.3.0" );
	    dom.async = false;
	    dom.setProperty("SelectionLanguage", "XPath");
	}
	else if ( CEN.isMozilla )
    {
        dom = document.implementation.createDocument("","",null);
        dom.async = false;
    }
    else
    {
        alert("XmlDOM is not supported on the brawser!");
    }
	return dom;
};

CEN.TransformWithProcessor = function( xmlDoc, xslDoc, arrParams )
{
	if( CEN.isIE )
	{
		try
		{		
			var template = new ActiveXObject( "MSXML2.XSLTemplate.3.0" );
			
			template.stylesheet = xslDoc;
			var processor = template.createProcessor();
			processor.input = xmlDoc;
			if( arrParams && arrParams.length > 0 )
			{
				for( var i = 0; i < arrParams.length; i++ )
				{
					if(arrParams[i].paramvalue)
					{
						processor.addParameter( arrParams[i].paramname, arrParams[i].paramvalue );
					}
				}
			}

			processor.transform();
		}
		catch( e )
		{
			CEN.CatchException(e);
			return;
		}
 		return processor.output;
	}
	else if( CEN.isMozilla )
	{
//		var xslDoc = CEN.createXmlDomFromFile( xslPath );
		if ( xmlDoc != null && xslDoc != null )
		{
			try
			{
				var serializer = new XMLSerializer();

				var xsltProcessor = new XSLTProcessor();
				xsltProcessor.importStylesheet(xslDoc);
				
				if ( arrParams )
				{
					for( var parameterindex = 0; parameterindex < arrParams.length; parameterindex++ )
					{
						xsltProcessor.setParameter( null, arrParams[ parameterindex ].paramname, arrParams[ parameterindex ].paramvalue );
					}
				}
				
				var html = serializer.serializeToString( xsltProcessor.transformToDocument( xmlDoc ) );
			}
			catch( e )
			{
				CEN.CatchException(e);
			}
			return html;
		}
	}
};

// Create new DOM object from Xml string(IE,FireFox)
// Example: var dom = Dom.createXmlDomFromString("<a><b/><c/></a>");
CEN.createXmlDomFromString = function(xmlString)
{
	var dom = CEN.createXmlDom();
	dom.loadXML( xmlString );
	return dom;
};

// Create new DOM object from file(IE,FireFox)
// Example: var dom = Dom.createXmlDomFromFile("test.xml");
CEN.createXmlDomFromFile = function(filePath)
{
	if ("" == filePath)
		return null;
		
	var dom = CEN.createXmlDom();
	if( !dom.load( filePath ) )
	{
		return null;
	}
	return dom;
};

CEN.FillHTMLWithProcessor = function( xml, xsl, containerID, arrParams, destinDoc )
{
	containerID = containerID ? containerID : "amdiv";
	xml = ( typeof( xml ) === "object" ) ? xml : CEN.createXmlDomFromFile( xml ); 
	xsl = ( typeof( xsl ) === "object" ) ? xsl : CEN.createXmlDomFromFile( xsl );
	
	var html = CEN.TransformWithProcessor( xml, xsl, arrParams );
	
	CEN.$( containerID, destinDoc ).innerHTML = html;

	return true;
};
// Add a attribute for a node( IE, Firefox )
CEN.AppendAttributesNode = function( objDom, parentNode, attributeName, attributeValue )
{
	var node = objDom.createAttribute(attributeName);
	CEN.SetNodeValue(node, attributeValue);	
	parentNode.setAttributeNode(node);
};

CEN.GetNodeValue = function( objDoc, path )
{
	if (objDoc == null) 
	{
		return null;
	}
	path = path ? path : ".";
	var node = objDoc.selectSingleNode( path );
	if( node === null )
	{
		return null;
	}
	return node.text;
};

CEN.SetNodeValue = function( objDom, nodeValue, path )
{
	path = path ? path : ".";
	if( objDom = objDom.selectSingleNode( path ) )
	{
	    objDom.text = nodeValue;
	    return true;
	}
	return false;
};

CEN.GetAttributeValue = function( objDoc, path )
{
    //path = path ? path : ".";
	if(!objDoc)
		return null;
	var node = path ? objDoc.selectSingleNode( path ) : objDoc;
	if( !node )
		return null;
	return node.nodeValue;
};

CEN.SetAttributeValue = function( doc,attributeName, attributeValue, path )    // bool
{
    path = path ? path : ".";
    if(!doc)
		return false;
	var node = doc.selectSingleNode( path );
	if( !node )
		return false;
	node.setAttribute(attributeName,attributeValue);
	return true;
};
CEN.CloneNode = function( doc, isIncludeChild, path )
{
    if( !doc ) 
        return null;
    path = path ? path : ".";
    var node = doc.selectSingleNode( path );
    if( !node )
        return null;
    return node.cloneNode( isIncludeChild );
};
CEN.AppendChild = function( doc, childNode, path )
{
    if( !doc ) 
        return false;
    var node = path ? doc.selectSingleNode( path ) : doc;
    if( !node )
        return false;
    node.appendChild( childNode );
    return true;
};
CEN.RemoveChild = function( doc, removeChildDoc, path )
{
    if( !doc || !removeChildDoc ) 
        return false;
    path = path ? path : ".";
    var node = doc.selectSingleNode( path );
    if( !node )
        return false;
    node.removeChild( removeChildDoc );
    return true;
};

// Get (a) node(s) ( IE, Firefox )
CEN.GetNode = function( objDom, path, isSingle )
{
	var result = null;
	if( isSingle )
	{	result = objDom.selectSingleNode( path );	}
	else
	{	result = objDom.selectNodes( path );	}
	return result;
};

// Delect a node( IE, Firefox )
CEN.RemoveNode = function( objDom, path )
{
	var node = null;

	switch( typeof( path ) )
	{
		case "string":
			node = objDom.selectSingleNode( path );
			break;
		case "object":
			node = path;
			break;
		default:
			break;
	}
	if( node !== null )
	{	objDom.removeChild( node );	}
};

/******************************************************************
							Ajax functions
******************************************************************/
// Gets the browser specific XmlHttpRequest Object
// Example: var httpRequest = CEN.GetXmlHttpRequestObject;
CEN.GetXmlHttpRequestObject = function()
{
	if (window.XMLHttpRequest)
	{
		// If IE7, Mozilla, Safari, etc: Use native object
		return new XMLHttpRequest();
	}
	if ( CEN.isMozilla ) 
	{
		return new XMLHttpRequest();
	}
	else if( CEN.isIE )
	{
		return new ActiveXObject( CEN.xh_ProgId );//CEN.xh_ProgId );
	} 
	else 
	{
		alert("Your Browser is out.\nSome functions will be inavailable.");
	}
};

// Ajax class;
CEN.XMLHttpRequest = function( method, url, async, callback, needLoading, forText )
{
	this.forText = forText;
	this.url = url;
	this.method = method;
	this.async = async;
	this.needLoading = needLoading;
	this.init = function() 
	{
		this.async = async ? true : false;
		this.method = method || "POST";
		var xmlHttp = null;
		xmlHttp = CEN.GetXmlHttpRequestObject();
		return xmlHttp;
	};
	this.xmlHttp = this.init();
	this.callback = callback;
	this.requestHeaderName = "Content-Type";
	this.requestHeaderValue = "text/xml";
	this.context = this;
};
CEN.XMLHttpRequest.prototype.onreadystatechange	= function()
{
	if( this.xmlHttp == null )
	{
		return;
	}
	if( this.xmlHttp.readyState != 4) 
	{
		return;
	}
	if( this.xmlHttp.status == 200 || this.xmlHttp.status == 304 || this.xmlHttp.readyState == 4)
	{
		if( this.needLoading )
		{	CEN.HideLoadingDiv();	}
		if( this.forText )
		{
			var returnDoc = this.xmlHttp.responseText;
		}
		else
		{
			var returnDoc = this.xmlHttp.responseXML;
			if( ( returnDoc == null || returnDoc.xml == "" ) && this.xmlHttp.responseText != null )
				returnDoc = CEN.createXmlDomFromString(this.xmlHttp.responseText);
		}
			
		if( this.callback === null)
		{
			return;
		}
		//else if( this.callback instanceof Function )
		else if(typeof(this.callback)=="function")
		{
            this.callback.call(this.context,returnDoc);//this.xmlHttp.responseXML);
		}
		else
		{
			eval(this.callback.call+"(this.context,returnDoc)");
		}
		this.context = null;
		this.xmlHttp = null;
	}
	else
	{
		if( typeof( processException ) != "undefined" )
		{
			processException( this.xmlHttp.status, this.xmlHttp.statusText );
		} else {
			alert( this.xmlHttp.status + ": " + this.xmlHttp.statusText );
		}
	}
};
CEN.XMLHttpRequest.prototype.send = function( httpBody, needLoading, forText )
{
	forText = forText ? true : false;
	this.xmlHttp.open( this.method, this.url, this.async );
	this.xmlHttp.setRequestHeader( this.requestHeaderName, this.requestHeaderValue );
	if( this.method === "POST" )
	{
		this.xmlHttp.setRequestHeader( "content-length",httpBody.length );
		this.xmlHttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
	}
	if( this.async )
	{
		if( this.needLoading )
		{	CEN.ShowLoadingDiv();	}
		var content = this;		
		this.xmlHttp.onreadystatechange = function()
		{
			content.onreadystatechange.call( content );
		};
	}
	this.xmlHttp.send( httpBody );
	if( !this.async )
	{
		if( this.forText )
			return this.xmlHttp.responseText;
			
		var returnDoc = this.xmlHttp.responseXML;
		if( ( returnDoc == null || returnDoc.xml == "" ) && this.xmlHttp.responseText != null )
			returnDoc = CEN.createXmlDomFromString(this.xmlHttp.responseText);
	    return returnDoc;
	}
};
CEN.AddRandom2Url = function(url)
{
    var random = Math.random();
   if(url.indexOf("&")>0) 
   {
        return url +="&rd=" + random;//.php?&param=1
   }
   else
   {
        return url +="rd=" + random;////.php?
   }
}

CEN.SendHttpRequest = function(url, async, callback, postPara, method, needLoading, forText)
{
    forText = forText ? false : true;//default is true
	postPara = ( postPara === ''|| postPara === undefined ) ? null : postPara;
	method = method ? method : ( postPara ? "POST" : "GET" );
	async = ( async != null ) ? async : ( callback ? true : false );
	needLoading = async ? ( needLoading == undefined ? false :needLoading ) : false;
	url = CEN.AddRandom2Url(url);
	var request = CEN.GetXmlHttpRequestObject();
	request.open( method, url, async );
	var requestHeaderName = "Content-Type";
	var requestHeaderValue = "text/xml";
	request.setRequestHeader( requestHeaderName, requestHeaderValue );
	if( method === "POST" )
	{
	    request.setRequestHeader( "content-length",postPara.length );
	    request.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
	}
	if( async )
	{
		request.onreadystatechange = function( response )
	                    {
	                        if( request.readyState != 4 ) return;
	                        if( needLoading )
		                    {	CEN.HideLoadingDiv(needLoading);	}
		                    if( forText )
                            {
	                            var returnDoc = request.responseText;
                            }
                            else
                            {
	                            var returnDoc = request.responseXML;
	                            if( ( returnDoc == null || returnDoc.xml == "" ) && request.responseText != null )
		                            returnDoc = CEN.createXmlDomFromString(request.responseText);
                            }
                            	
                            if( callback == null)
                            {
	                            return returnDoc;
                            }
                            //else if( this.callback instanceof Function )
                            else if(typeof(callback)=="function")
                            {
                                callback.call(null ,returnDoc);//this.xmlHttp.responseXML);
                            }
                            else
                            {
	                            eval(callback.call+"(null,returnDoc)");
                            }
	                    };
	    if( needLoading )
	    {	CEN.ShowLoadingDiv(needLoading);	}
	}
	request.send(postPara);
	if( !async )
	{
		if( forText )
			return request.responseText;
			
		var returnDoc = request.responseXML;
		if( ( returnDoc == null || returnDoc.xml == "" ) && request.responseText != null )
			returnDoc = CEN.createXmlDomFromString(request.responseText);
	    return returnDoc;
	}
};

// Init the framework
CEN.init = function()
{
	CEN.GetBrowser();
	if ( CEN.isMozilla )
	{
		XMLDocument.prototype.__defineGetter__( "xml", function(){ return new XMLSerializer().serializeToString( this ); } );
		Node.prototype.__defineGetter__("xml", function (){return (new XMLSerializer()).serializeToString(this);});	
		Node.prototype.__defineGetter__("text",function(){ return this.textContent; } );
		Node.prototype.__defineSetter__("text",function(txt){if(txt!=null&&txt != undefined)this.textContent=String(txt);});
		XMLDocument.prototype.loadXML = function(xmlString)
		{
			var childNodes = this.childNodes;
			for (var i = childNodes.length - 1; i >= 0; i--)
			{	this.removeChild(childNodes[i]); }
			var dp = new DOMParser();
			var newDOM = dp.parseFromString(xmlString, "text/xml");
			var newElt = this.importNode(newDOM.documentElement, true);
			this.appendChild(newElt);
		};
		// Implement selectNodes and selectSingleNode in Firefox
		if( document.implementation.hasFeature("XPath", "3.0") )
		{
			XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
			{
				if( !xNode ) { xNode = this; } 

				var oNSResolver = this.createNSResolver(this.documentElement);
				var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
				var aResult = [];	
				for( var i = 0; i < aItems.snapshotLength; i++)
				{
					aResult[i] =  aItems.snapshotItem(i);
				}
				
				return aResult;
			};
			XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
			{
				if( !xNode ) { xNode = this; } 
				
				var oNSResolver = this.createNSResolver(this.documentElement);
				var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
				//var xItems = this.selectNodes(cXPathString, xNode);
				if( aItems && aItems.snapshotLength > 0 )
				{
					return aItems.snapshotItem(0);
					//return xItems[0];
				}
				else
				{
					return null;
				}
			};

			Element.prototype.selectNodes = function(cXPathString)
			{
				if(this.ownerDocument.selectNodes)
				{
					return this.ownerDocument.selectNodes(cXPathString, this);
				}
				else{throw "For XML Elements Only";}
			};

			Element.prototype.selectSingleNode = function(cXPathString)
			{	
				if(this.ownerDocument.selectSingleNode)
				{
					return this.ownerDocument.selectSingleNode(cXPathString, this);
				}
				else{throw "For XML Elements Only";}
			};

		}
	}
}
CEN.init();

//write js debug error to server txt file
CEN.OutputExceptionToServer=function(ex, msg)
{
	var errcode;
	if(ex!=null)
	{
		if(CEN.isIE){
			errcode="MSG:"+ex.message;
			errcode+="|Name:"+ex.name;
			errcode+="|errcode:"+ex.number;
			errcode+="|description:"+ex.description;
			errcode+="|log:"+log;
		}
		else if(CEN.isMozilla)
		{
			errcode="MSG:"+ex.message;
			errcode+="|Name:"+ex.name;
			errcode+="|fileName:"+ex.fileName;
			errcode+="|Line:"+ex.lineNumber;
			errcode+="|description:"+ex.stack;
			errcode+="|log:"+log;
		}
		else
		{
			errcode="MSG:"+ex.message;
		}		
	}
	else
	{
		errcode="exception is null";
		errcode+="|log:"+log;
	}
	var request = CEN.GetXmlHttpRequestObject();
	if(typeof request!="undefined"){
	var url = "/SB/Home/AMLog.aspx?Cache="+Date();
	
	request.open("POST", url, true);
	request.send(escape(errcode));
	}
	else
	{
		alert('error can not write into the server txt log file');
	}
};
CEN.ShowLoadingDiv = function(objID)
{
    Alert(objID,"loading...",0);   
}
CEN.HideLoadingDiv = function()
{
    HideTip();
}