Event.observe(window, 'unload', Event.unloadCache, false);

function UtilAjax() {
	var self = this;
	this.xml = null;
	this.URLXML = UtilAjax.arguments[0];
	this.PARAMETERS = UtilAjax.arguments[1];
	this.CLASSNAME = UtilAjax.arguments[2];
	this.NUMARGS = UtilAjax.arguments.length;
	for (var i = 3;i < self.NUMARGS;i++) {
		eval('this.RESULT'+(i)+' = UtilAjax.arguments['+i+']');
	}

	this.retry = 0;
	this.bot = {dataLoader:0,dataRender:0};

	/*
	* Step 1 For XML Content
	*/
	this.render = function(){
		self.loadData();
	};

	/*
	* Step 2 For XML Content
	*/
	this.loadData = function(){
		clearTimeout(self.bot.dataLoader);
		var ajax = new Ajax.Request(self.URLXML, {method: "post", parameters: self.PARAMETERS, onComplete: self.prepareData});
	};
	
	/*
	* Step 3 For XML Content
	*/
	this.prepareData = function(originalRequest){
		self.xml =  originalRequest.responseXML;
		if(self.xml == null || self.xml.xml == ""){
			for (var i = 3;i < self.NUMARGS;i++) {
				$(eval('self.RESULT'+(i)+'.nameDiv')).style.display = "none";
			}
				
			if (self.retry <= 5) {
				for (var i = 3;i < self.NUMARGS;i++) {
					$(eval('self.RESULT'+(i)+'.nameDiv')).innerHTML = "<span class='"+self.CLASSNAME.nameClassCSS+"'>กำลังโหลดข้อมูล ...</span>";
				}
				
				self.retry++;
				self.bot.dataLoader = setTimeout(self.CLASSNAME.className+".loadData()",5000);
			} else {
				for (var i = 3;i < self.NUMARGS;i++) {
					$(eval('self.RESULT'+(i)+'.nameDiv')).innerHTML = "<a href='javascript:"+self.CLASSNAME.className+".loadData()' class='"+self.CLASSNAME.nameClassCSS+"'>ข้อมูลโหลดไม่สำเร็จ กรุณาคลิกที่นี้อีกครั้ง</a>";
				}
				self.retry = 0;
			}
			
			for (var i = 3;i < self.NUMARGS;i++) {
				Effect.Appear(eval('self.RESULT'+(i)+'.nameDiv'));
			}
			
			return;
		} else {
			for (var i = 3;i < self.NUMARGS;i++) {
				renderXML(self.xml, eval('self.RESULT'+(i)+'.nameXSL'), eval('self.RESULT'+(i)+'.nameDiv'));
			}
		}
	};
}

function UtilXSLT() {
	var self = this;
	this.xsl = null;
	this.retry = 0;

	/*
	* Step Load XSL
	*/
	this.loadXSL = function(urlXSL){
		Try.these(
			function() {
				self.xsl = new ActiveXObject("Microsoft.XMLDOM");
				self.xsl.async = false;
				self.xsl.load(urlXSL);
			},
		  	function() {
				self.xsl = new XMLHttpRequest();
				self.xsl.open("GET", urlXSL, false);
				self.xsl.send(null);
			}
		)
		
		return self.xsl;
	};
}

/*
* Step Render XML + XSLT = HTML
*/
function renderXML(xml, xsl, nameDivResult) {
	Try.these(
    	function() {
			$(nameDivResult).innerHTML = "";
			$(nameDivResult).style.display = "none";
			$(nameDivResult).innerHTML = xml.transformNode(xsl);
		},
    	function() {
			var xsltProcessor = new XSLTProcessor();
			var xslRef = xsl.responseXML;
			xsltProcessor.importStylesheet(xslRef);
			var fragment = xsltProcessor.transformToFragment(xml, document);

			$(nameDivResult).innerHTML = "";
			$(nameDivResult).appendChild(fragment);
		}
    )

	Effect.Appear(nameDivResult);
}