﻿//////////////////////////////////////
/*
var i = 0,j=0;
window.onload = function() {
	var urlXml 	= "/ECS/data/order/retriveOrderItem.xsql?orderno=B05101000007";
	var urlXsl 	= "/ECS/data/order/transform/orderBaseInfo.xsl";
	try {
		//演示一: 渲染 
		for(;i<=1000;i++) {
			var args = {'payment':'true'};
			var r =	new bingo.TransformXmlXsl(urlXml,urlXsl,mycallbackHtml);
			r.transform(args); 
		}
		//演示二: 发请求(异步)
		//var xmlhttp = new bingo.XMLHttpRequest("POST",urlXml,true,mycallbackXml);
		//xmlhttp.send("Body");
		
		//演示三: 发请求(同步)
		//xmlhttp	 = new bingo.XMLHttpRequest("GET",urlXml,false);
		//var retDom = xmlhttp.send();
		//alert("同步调用"+retDom.xml);
	} catch(e) {
		alert(e.description)
	}
}
function mycallbackHtml(html) {
	if(window.ActiveXObject) {
		document.getElementById("result").innerHTML = (j++)+"<br>"+html;
	} else if(window.XMLHttpRequest) {
		document.getElementById("result").innerHTML = "(j++)"+"<br>";
		document.getElementById("result").appendChild(html);
	}
}
function mycallbackXml(xmlDom) {
	alert("异步调用"+xmlDom.xml);
}
*/
// JavaScript Document
// namespace object
var bingo = new Object();

bingo.XMLHttpRequest = function(method,url,async,callback) {
	this.url				=	url;
	this.method				= 	method;
	this.async				=	async;
	this.init				=	function() {	
		this.async = async ? true : false;
		this.method = method || "POST";
		var xmlhttp = null;
		if(window.ActiveXObject) { 
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} else if(window.XMLHttpRequest) { 
			xmlhttp = new XMLHttpRequest();
		} else {
			throw new Error("Could not create xmlhttp on this browser");
		}	
		return xmlhttp;
	}
	this.xmlhttp			=	this.init();
	this.callback			= 	callback;
	this.requestHeaderName	=	"Content-Type";
	this.requestHeaderValue	=	"text/xml";
	this.context			=	this;
}
bingo.XMLHttpRequest.prototype.setRequestHeader	= function(name,value) {
	this.requestHeaderName	= name;
	this.requestHeaderValue	= value;
}
bingo.XMLHttpRequest.prototype.onreadystatechange	= function() {
	
	if(this.xmlhttp==null) return;
	if(this.xmlhttp.readyState != 4) return;
	if(this.xmlhttp.status == 200 || this.xmlhttp.status == 304) {
		if(this.callback == null) {
			return;
		} else if(this.callback instanceof Function) {
			this.callback.call(this.context,this.xmlhttp.responseXML);
		} else {
			eval(this.callback.call+'(this.context,this.xmlhttp.responseXML)');
		}
		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);
		}
	}
}

bingo.XMLHttpRequest.prototype.send = function(httpBody) {
	this.xmlhttp.open(this.method,this.url,this.async);
	this.xmlhttp.setRequestHeader(this.requestHeaderName,this.requestHeaderValue);
	if(this.async) {
		var content = this;
		this.xmlhttp.onreadystatechange = function() {
			content.onreadystatechange.call(content);
		}
	}
	this.xmlhttp.send(httpBody);
	if(!this.async) {
		return this.xmlhttp.responseXML;
	}
}

bingo.TransformXmlXsl	= function(xmlUrl, xslUrl, callbackName,xmlMethod, httpBody) {

	this.xmlUrl			=	xmlUrl;
	this.xslUrl			=	xslUrl;
	this.callbackName	=	callbackName;
	this.xmlMethod		=	xmlMethod	||	"GET"
	this.httpBody		=	httpBody;
	this.args			=	null;
	this.xmlDom			= 	null;
	this.xslDom			=	null;
}
bingo.TransformXmlXsl.prototype.transform	=	function(args) {
	this.args		=	args || null;
	var context		=	this;
	if(typeof(this.xmlUrl.xml) != "undefined")
		this.xmlDom	= this.xmlUrl;
	else {
		var xmlhttpXML = new bingo.XMLHttpRequest(this.xmlMethod,this.xmlUrl,true,this.xmlCallback);
		xmlhttpXML.context	=	context;
		xmlhttpXML.send(this.httpBody);
		xmlhttpXML = null;
	}
	
	if(typeof(this.xslUrl.xml) != "undefined") {
		this.xslDom	= this.xslUrl;
	} else {
		var xmlhttpXSL = new bingo.XMLHttpRequest("GET",this.xslUrl,true,this.xslCallback);
		xmlhttpXSL.context	=	context;
		xmlhttpXSL.send();	
		xmlhttpXSL = null;
	}
	
	if(typeof(this.xmlUrl.xml) != "undefined" && typeof(this.xslUrl.xml) != "undefined") {
		this.onDataReady();
	}
}

bingo.TransformXmlXsl.prototype.xmlCallback	= function(xmlDom) {
	this.xmlDom = xmlDom;
	this.onDataReady();	
}
bingo.TransformXmlXsl.prototype.xslCallback	= function(xslDom) {
	this.xslDom = xslDom;
	this.onDataReady();
}

bingo.TransformXmlXsl.prototype.onDataReady = function() {
	if(this.xmlDom == null || this.xslDom == null)
		return;
		
	var html = this.transformNode();
	this.callbackName(html);
}	

bingo.TransformXmlXsl.prototype.transformNode = function() {
	var result = null;
	try {
		if(window.ActiveXObject) {
			if(this.args == null) {
				result = this.xmlDom.transformNode(this.xslDom);
			} else {
				var xslDoc=new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
				this.xslDom.save(xslDoc);
				this.xslDom = null;
				var xslTemplate=new ActiveXObject("MSXML2.XSLTemplate");
				xslTemplate.stylesheet=xslDoc;
				var xslProcessor=xslTemplate.createProcessor();
				if(this.args!=null) {
					for(var name in this.args) {
						xslProcessor.addParameter(name,this.args[name]);
					}
				}
				xslProcessor.input=this.xmlDom;
		    	xslProcessor.transform();
		    	result = xslProcessor.output;
		    	
		    	xslDoc = null;
		    	xslTemplate = null;
		    	xslProcessor = null;
			}
		} else if(window.XMLHttpRequest) {
				var xslProcessor = new XSLTProcessor();
				xslProcessor.importStylesheet(this.xslDom);
				if(this.args!=null) {
					for(var name in this.args) {
						xslProcessor.setParameter(null,name,this.args[name]);
					}
				}
				result = xslProcessor.transformToFragment(this.xmlDom,document);
				xslProcessor = null;
		} else {
			throw new Error("Could not transform xml on this browser");
		}
	} catch(e) {
		throw e;
	} finally {
		this.xmlDom = null;
		this.xslDom = null;
		this.count 	= 0;
		this.args 	= null;
	}
	return result;
}