
/*
ajax section
*/
var tmpDivNaMe = 'divAwdAjaxArea';
if(!document.getElementById(tmpDivNaMe)) document.write('<div id="' + tmpDivNaMe + '" name="' + tmpDivNaMe + '"></div>');

var objAjax = null;
var awdTasks;

function initTasks()
{
	if(!awdTasks) awdTasks = new class_awdTasks();
}

function class_awdTasks()
{
	this.initParam = function()
	{
		this.arrRequests = new Array();
		this.arrFrames = new Array();
	}
	this.setRequest = function(id, obj)
	{
		this.arrRequests[id] = obj;
	}
	this.getRequest = function(id)
	{
		return this.arrRequests[id];
	}
	this.makeRequest = function()
	{
		var obj = (arguments[0]) ? arguments[0] : new Object();
		return new Number(this.arrRequests.push(obj) - 1);
	}
	this.deleteRequest = function(id)
	{
		delete(this.arrRequests[id]);
	}
	this.setFrame = function(id, obj) {
		this.arrFrames[id] = obj;
	}
	this.getFrame = function(id) {
		return this.arrFrames[id];
	}
	this.deleteFrame = function(id)
	{
		delete(this.arrFrames[id]);
	}
	this.ready = function(id)
	{
		var tmpReq = this.getRequest(id);
		var tmpHTML = (arguments[1]) ? arguments[1] : "XxX";
		if(tmpHTML=="XxX") {
			if(tmpReq.callback instanceof Function) {
				tmpReq.callback(tmpReq.argsend, tmpHTML);
			}
			var tmpdom = new awdElement();
			if(document.getElementById(tmpdom.awdPrefix + id)) tmpdom.removeElement(document.getElementById(tmpdom.awdPrefix + id));
			this.deleteRequest(id);
		} else {
			if(tmpReq.typerun=='javascript') eval(tmpHTML);
			else {
				if(tmpReq.callback instanceof Function) {
					tmpReq.callback(tmpReq.argsend, tmpHTML);
				}
				var tmpdom = new awdElement();
				if(document.getElementById(tmpdom.awdPrefix + id)) tmpdom.removeElement(document.getElementById(tmpdom.awdPrefix + id));
				this.deleteRequest(id);
			}
		}
	}
	this.initParam();
}

function awdElement() 
{
	this.reqId = 'awdAjaxRequestId_';
	this.awdPrefix = 'awdGroup_';
	this.awdPrefixChild = 'divAwdAjaxChild';
	this.removeElement = function(elementName)
	{
		elementName.parentNode.removeChild(elementName);
	}
  
	this.createElement = function(parentElement, elementType, needProperty)
	{
		var textShow = (arguments[3]) ? arguments[3] : "";
		var el = document.createElement(elementType);
		var i = 0;
		for (var k in needProperty) 
		{
			var keys = k.split('.');
			if (keys.length == 2) el[keys[0]][keys[1]] = needProperty[k];
			else el[k] = needProperty[k];
		}
		try {el.innerHTML = textShow;} catch(e) {}
		parentElement.appendChild(el);
		return el;
	}

	this.createScript = function( parentElement, id, url )
	{ 
		var span = this.createElement( parentElement, 'span', {'style.display' : 'none', 'id' : id}, '%<scr' + 'ipt></' + 'script>' );
		setTimeout(
			function() {
				var tmpscript  = span.getElementsByTagName('script')[0];
				tmpscript.type = 'text/javascript';
				tmpscript.src  = url;
			}, 5
		);
	}
}

function awdAjax()
{
	this.awdError = function(errMessage, url, errLine)
	{
		var tmpFile = "File : " + url + " Line : " + errLine + "\n";
		var tmperror = "Error : " + errMessage + "\n" + tmpFile;
		if(errMessage.indexOf('unterminated string literal') + errMessage.indexOf('missing ;') + errMessage.indexOf('Syntax error') > -3) 
		{}
		alert(tmperror);
	}

	this.initParam = function()
	{
		this.setError = true;
		if(this.setError) window.onerror = this.awdError;

		this.dom = new awdElement();
		if(document.getElementById(tmpDivNaMe)) this.divAwdAjax = document.getElementById(tmpDivNaMe);
		else this.divAwdAjax = this.dom.createElement(document.body, 'div', {'id' : tmpDivNaMe});
	}

	this.validateFunction = function(callback)
	{
		if(callback && callback instanceof Function) return callback;
		else return function() {};
	}

	this.exec_query = function(url, callback)
	{
		var tmpid = (arguments[2]) ? arguments[2] : awdTasks.makeRequest();
		var methodToUse = (arguments[3]) ? arguments[3].toUpperCase() : "GET";
		var multiThread = (arguments[4]) ? arguments[4] : false;
		var argsend = (arguments[5]) ? arguments[5] : new Array();
		var typerun = (arguments[6]) ? arguments[6] : "html";
		var domuse = (arguments[7]) ? arguments[7] : "xml";
		callback = this.validateFunction(callback);
		var xmldom;
		try {xmldom = new XMLHttpRequest();} catch(e) {
			try {xmldom = new ActiveXObject('Msxml2.XMLHTTP');} catch(e) {
				try {xmldom = new ActiveXObject('Microsoft.XMLHTTP');} catch(e) {
					xmldom = null;
				}
			}
		}
		if((domuse=="xml") && (xmldom==null)) domuse = "awd";

		if(methodToUse=="GET") {
			awdTasks.setRequest(tmpid, {'callback' : callback, 'request' : url, 'argsend' : argsend, 'typerun' : typerun});
			(url.indexOf('?')==-1) ? url = url + '?' : url = url + '&';
			url = url + this.dom.reqId + '=' + tmpid;
		} else 

		if(methodToUse=="POST") {
			var variablesend = "";
			var tmpindexOf = url.indexOf("?");
			if(tmpindexOf!=-1) {
				variablesend = url.substring(tmpindexOf+1, url.length);
				url = url.substring(0, tmpindexOf);
			}
			if(variablesend=="") variablesend = this.dom.reqId + '=' + tmpid;
			else variablesend = variablesend + '&' + this.dom.reqId + '=' + tmpid;

			awdTasks.setRequest(tmpid, {'callback' : callback, 'request' : url, 'argsend' : argsend, 'typerun' : typerun});
		}

		if(domuse=="awd") {
			if(methodToUse=="GET") {
				//response must to be only javascript
				this.dom.createScript(this.divAwdAjax, this.dom.awdPrefix + tmpid, url);
			} else 
			
			if(methodToUse=="POST") {
				//response can be html or javascript upon callback function to process
				//html
				//   callback(HTML, typerun) {alert(HTML);}
				//javascript
				//   callback(HTML, typerun) {eval(HTML);}
				return this.frame({'url' : url, 'onComplete' : callback, 'argsend' : argsend, 'typerun' : typerun}, tmpid, multiThread);
			}
		} else {
			if(methodToUse=="GET") {
				xmldom.open(methodToUse, url, true);
				xmldom.onreadystatechange = function() {
					if(xmldom.readyState==4) {
						awdTasks.ready(tmpid, xmldom.responseText);
					}
				}
				xmldom.send(null);
			} else 
			
			if(methodToUse=="POST") {
				xmldom.open(methodToUse, url, false);
				xmldom.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
				xmldom.send(variablesend);
				awdTasks.ready(tmpid, xmldom.responseText);
			}
		}
	}

	this.ready = function(id)
	{
		var tmpReq = awdTasks.getRequest(id);
		if(tmpReq.callback instanceof Function) tmpReq.callback(tmpReq.argsend);
		if(document.getElementById(this.dom.awdPrefix + id)) this.dom.removeElement(document.getElementById(this.dom.awdPrefix + id));
		awdTasks.deleteRequest(id);
	}

	this.frame = function(c) 
	{
		var tmpid = (arguments[1]) ? arguments[1] : awdTasks.makeRequest();
		var multiThread = (arguments[2]) ? arguments[2] : false;
		var url = (c && c.url) ? c.url : "about:blank";
		var objRunResponse;
		objRunResponse = (multiThread) ? "awdTasks.getFrame("+tmpid+")" : "objAjax";
		var n = 'ifrmAwdAjax' + tmpid;
		var d = this.dom.createElement(this.divAwdAjax, 'div', {'id' : this.dom.awdPrefixChild+tmpid}, '<iframe style="display:;" height="100" width="100" src="" id="'+n+'" name="'+n+'" onload="'+objRunResponse+'.loaded(\''+n+'\', '+tmpid+')"></iframe>' );
		var i = document.getElementById(n);
		i.src = url;
		if(c && typeof(c.onComplete) == 'function') i.onComplete = c.onComplete;
		if(c && typeof(c.argsend) == 'object') i.argsend = c.argsend;
		return n;
	}
  
	this.form = function(f, name) {
		f.setAttribute('target', name);
	}
  
	this.submit = function(f, c) {
		var tmpid = (arguments[2]) ? arguments[2] : awdTasks.makeRequest();
		this.form(f, this.frame(c, tmpid, true));
		if(c && c.onStart instanceof Function) return c.onStart(f);
		else return true;
	}

	this.loaded = function(id, tmpid) {
        var i = document.getElementById(id);
        if (i.contentDocument) var d = i.contentDocument;
        else if (i.contentWindow) var d = i.contentWindow.document;
        else var d = window.frames[id].document;
        if (d.location.href == "about:blank") return;

		//if(i.onComplete instanceof Function) i.onComplete(i.argsend, d.body.innerHTML);
		awdTasks.ready(tmpid, d.body.innerHTML);
		if(i) {
			this.dom.removeElement(document.getElementById(this.dom.awdPrefixChild+tmpid));
			//awdTasks.deleteRequest(tmpid);
			awdTasks.deleteFrame(tmpid);
		}
	}
	this.initParam();
}

/*
e.g.
runReturnFunction("sendparam.php?id=10", doneReturn);
function doneReturn(argsend, P) {
	//P is response look like text
	//should be use eval to compile text to command
	//e.g. P = "var Error = false;"
	eval(P);
	if(Error) alert("Has something error");
	else alert("OK");
}
function doneReturn(argsend, P) {   
	document.getElementById('r').innerHTML = P;
}
*/
function runAjax() {
	initTasks();
	var url = (arguments[0]) ? arguments[0] : null;
	var callback = (arguments[1]) ? arguments[1] : null;
	var multiThread = (arguments[2]) ? arguments[2] : false;
	var setMethod = (arguments[3]) ? arguments[3].toUpperCase() : "GET";
	var argsend = (arguments[4]) ? arguments[4] : new Array();
	var typerun = (arguments[5]) ? arguments[5] : "html";
	var domuse = (arguments[6]) ? arguments[6] : "xml";
	var tmparray = new Array();
	var tmpid = awdTasks.makeRequest();
	if(multiThread) {
		eval("var objAjax"+tmpid+" = new awdAjax();");
		eval("tmparray[0] = objAjax"+tmpid+";");
		awdTasks.setFrame(tmpid, tmparray[0]);
	} else {
		if(objAjax==null) objAjax = new awdAjax();
		tmparray[0] = objAjax;
	}
	tmparray[0].exec_query(url, callback, tmpid, setMethod, multiThread, argsend, typerun, domuse);
}

function runXmlReturnJavascript(url) {
	var callback = function() {}
	var multiThread = (arguments[1]) ? arguments[1] : false;
	var argsend = new Array();
	if(typeof(multiThread)=="object") {
		for(var k in multiThread) {
			if(k=="function") callback = multiThread[k];
			else if(k=="argsend") argsend = multiThread[k];
		}
		multiThread = false;
	}
	var setMethod = (arguments[2]) ? arguments[2].toUpperCase() : "GET";

	runAjax(url, callback, multiThread, setMethod, argsend, 'javascript', 'xml');
}

function runAwdReturnJavascript(url) {
	var callback = function() {}
	var multiThread = (arguments[1]) ? arguments[1] : false;
	var argsend = new Array();
	if(typeof(multiThread)=="object") {
		for(var k in multiThread) {
			if(k=="function") callback = multiThread[k];
			else if(k=="argsend") argsend = multiThread[k];
		}
		multiThread = false;
	}
	var setMethod = (arguments[2]) ? arguments[2].toUpperCase() : "GET";

	runAjax(url, callback, multiThread, setMethod, argsend, 'javascript', 'awd');
}

function runXmlReturnHtml(url, callback) {
	var multiThread = (arguments[2]) ? arguments[2] : false;
	var setMethod = (arguments[3]) ? arguments[3] : "POST";
	var argsend = new Array();
	if(typeof(callback)=="object") {
		var tmpcallback = callback;
		for(var k in tmpcallback) {
			if(k=="function") callback = tmpcallback[k];
			else if(k=="argsend") argsend = tmpcallback[k];
		}
	}

	runAjax(url, callback, multiThread, setMethod, argsend, 'html', 'xml');
}

function runAwdReturnHtml(url, callback) {
	var multiThread = (arguments[2]) ? arguments[2] : false;
	var setMethod = "POST";
	var argsend = new Array();
	if(typeof(callback)=="object") {
		var tmpcallback = callback;
		for(var k in tmpcallback) {
			if(k=="function") callback = tmpcallback[k];
			else if(k=="argsend") argsend = tmpcallback[k];
		}
	}

	runAjax(url, callback, multiThread, setMethod, argsend, 'html', 'awd');
}

function runFormReturn(f, callback) {
	initTasks();
	var tmparray = new Array();
	var tmpid = awdTasks.makeRequest();
	eval("var objAjax"+tmpid+" = new awdAjax();");
	eval("tmparray[0] = objAjax"+tmpid+";")
	awdTasks.setFrame(tmpid, tmparray[0]);
	return tmparray[0].submit(f, {
			'onStart' : ((callback && callback.onStart instanceof Function) ? callback.onStart : ""), 
			'onComplete' : (callback && callback.onComplete instanceof Function) ? callback.onComplete : ""
			}, tmpid);
}

/*
useful function
*/
function setInnerHTML(textShow, elementId) 
{
	var showError = (arguments[2]) ? arguments[2] : true;
	var divspan = document.getElementById(elementId);
	if(typeof(divspan)!='object') {
		if(showError) alert("Does not have object id : " + elementId);
		return false;	
	}
	var tag;
	try {
		tag = divspan.tagName;
	} catch(e) {
		tag = "";
	}
	if(tag!="") tag = tag.toUpperCase();
	if((tag=="DIV") || (tag=="SPAN")) divspan.innerHTML = textShow;
	else if(showError) alert("Can not set text : " + textShow);
}

/*
user defined function
*/
function runPostForm(f, startCallback) {
	runFormReturn(f, {'onStart' : startCallback, 'onComplete' : completeCallback});
}

function donereturn(argsend, P) {
	setInnerHTML(P, 'myElement');
}

function clearHTML() {
	setInnerHTML("Loading...", 'myElement');
}

var zdgfdf1;
var zdgfdf2;
var zdgfdf3;

function AAA1() {
	zdgfdf1.submit();
}

function AAA2() {
	zdgfdf2.submit();
}

function AAA3() {
	zdgfdf3.submit();
}

function startCallback1(f) {
	zdgfdf1 = f;
	setTimeout(AAA1, 3000);
	return false;
}

function startCallback2(f) {
	zdgfdf2 = f;
	setTimeout(AAA2, 3000);
	return false;
}

function startCallback3(f) {
	zdgfdf3 = f;
	setTimeout(AAA3, 3000);
	return false;
}

function completeCallback(response) {
	document.getElementById('nr').innerHTML = parseInt(document.getElementById('nr').innerHTML) + 1;
	document.getElementById('r').innerHTML = document.getElementById('r').innerHTML+'<br>'+response;
}


