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};

	this.render = function() {
		self.loadData();
	};

	this.loadData = function() {
		clearTimeout(self.bot.dataLoader);
		var ajax = new Ajax.Request(self.URLXML, {method: "post", parameters: self.PARAMETERS, onComplete: self.prepareData});
	};
	
	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'));
			}
		}
	};

	// Util 1
	this.renderXSLT = function(xsl, nameDivResult) {
		renderXML(self.xml, xsl, nameDivResult);
	};
}

function UtilXSLT() {
	var self = this;
	this.xsl = null;

	this.loadXSL = function(urlXSL) {
		var xslt = new Ajax.Request(urlXSL, {method: "post", parameters: "", onComplete: self.prepareData, asynchronous: false});
		return self.xsl;
	};
	
	this.prepareData = function(originalRequest) {
		self.xsl = originalRequest.responseXML;
	};
}

function UtilHTML() {
	this.loadHTML = function(urlHTML, nameDivResult) {
		new Ajax.Updater(nameDivResult, urlHTML, {method: "post", parameters: "", evalScripts: true});
	};
}

/*
* 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();
			xsltProcessor.importStylesheet(xsl);
			var fragment = xsltProcessor.transformToFragment(xml, document);

			$(nameDivResult).innerHTML = "";
			$(nameDivResult).appendChild(fragment);
		}
    );

	Try.these(
		function () {
			Effect.Appear(nameDivResult);
		},
		function () {
			$(nameDivResult).style.display = "";
		}
	);
}

// init
var xsl = new UtilXSLT();