/*
 * SirYoAjax, Sir.Yo libs
 *
 *
 * Copyleft (c) 2007 Sir.Yo
 * Site: http://www.yoyhosoft.com/
 * Msn: iyoba_narak@hotmail.com
 */

/* Constructor */
function SirYoAjax(object)
{
	// common
	this.Url = null;
	this.UpdateId = null;
	this.Method = 'GET';

	this.xmlHttp = this.GetXmlHttpObject();

	this.onUninitialized=null; // readyState = 0
	this.onUninitializedEval=null; // readyState = 0
	this.onSetup=null; // readyState = 1
	this.onSetupEval=null; // readyState = 1
	this.onSent=null; // readyState = 2
	this.onSentEval=null; // readyState = 2
	this.onProcess=null; // readyState = 3	
	this.onProcessEval=null; // readyState = 3	
	this.onComplete=null; // readyState = 4
	this.onCompleteEval=null; // readyState = 3

	this.ResponseText = null;
	this.ResponseXML = null;
	this.Status = null;
	this.StatusText = null;

	this.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
	this.FormId = null;
	this.Loading = true;
	this.LoadingId = null;
	this.ReturnType = 'HTML';
	this.Async = true;

	if(object)
	{
		for (var key in object)
		{
//			if (!this[key])
//			{

			if (object[key] == '')
			{
				this[key] = null;
			}
			if (object[key] != null)
			{
				this[key] = object[key];
			}
			

//	console.log(key + ":" +object[key]);
//			}			
		}
	}

	this.loading_img0 = '<div style="text-align: center; color: #aaaaaa;"><img src="images/ajax-loader.gif"/> Loading...0&nbsp;&nbsp;&nbsp;</div>';
	this.loading_img1 = '<div style="text-align: center; color: #aaaaaa;"><img src="images/ajax-loader.gif"/> Loading...1&nbsp;&nbsp;&nbsp;</div>';
	this.loading_img2 = '<div style="text-align: center; color: #aaaaaa;"><img src="images/ajax-loader.gif"/> Loading...2&nbsp;&nbsp;&nbsp;</div>';
	this.loading_img3 = '<div style="text-align: center; color: #aaaaaa;"><img src="images/ajax-loader.gif"/> Loading...3&nbsp;&nbsp;&nbsp;</div>';
}

SirYoAjax.prototype = {


	debug: function()
	{
		alert(this.onProcess);
	},


	Run: function()
	{
		if(this.getObjectById(this.LoadingId, 1))
		{
			this.getObjectById(this.LoadingId, 1).innerHTML = "";
		}
		if(this.ReturnType == 'HTML')
		{
			if(this.getObjectById(this.UpdateId))
			{
				this.getObjectById(this.UpdateId).innerHTML = "";
			}
		}
		if(this.ReturnType == 'XML')
		{
			if(this.getObjectById(this.UpdateId, 1))
			{
				this.getObjectById(this.UpdateId, 1).innerHTML = "";
			}
		}

		switch(this.ReturnType)
		{
			case 'HTML':
						switch(this.Method)
						{
							case 'GET':
								this.getAjaxHtml();
								break;
							case 'POST':
								this.postAjaxHtml();
								break;
							default:
								console.log("Unknow method (GET/POST): " + this.Method);
								alert("Unknow method (GET/POST): " + this.Method);
								return;
								break;
						}
						break;
			case 'XML':
						switch(this.Method)
						{
							case 'GET':
								this.getAjaxXml();
								break;
							case 'POST':
								this.postAjaxXml();
								break;
							default:
								console.log("Unknow method (GET/POST): " + this.Method);
								alert("Unknow method (GET/POST): " + this.Method);
								return;
								break;
						}
						break;
			default:
					console.log("Unknow ReturnType (HTML/XML): " + this.ReturnType);
					alert("Unknow ReturnType (HTML/XML): " + this.ReturnType);
					break;
		}
	},


	//*************************************************************
	// Get
	// Return : HTML
	//*************************************************************
	getAjaxHtml: function()
	{
		str = this.Url;
		tmp_url = str.split("?");
		if(tmp_url.length > 1)
		{
			tmp_url = this.Url+"&sid="+Math.random();
		}
		else
		{
			tmp_url = this.Url+"?sid="+Math.random();
		}
		this.AjaxHtmlExec(tmp_url, "GET", "");
	},
	//*************************************************************
	// Post
	// Return : HTML
	//*************************************************************
	postAjaxHtml: function()
	{
		var post_data = "";	
		post_data = this.getObjFormValues(this.FormId, "");
		str = this.Url;
		tmp_url = str.split("?");
		if(tmp_url.length > 1)
		{
			tmp_url = this.Url+"&sid="+Math.random();
		}
		else
		{
			tmp_url = this.Url+"?sid="+Math.random();
		}
		this.AjaxHtmlExec(tmp_url, "POST", post_data);
	},

	//*************************************************************
	// Ajax HTML Exec
	// Return : callbackfn (HTML)
	//*************************************************************
	AjaxHtmlExec: function(url, method, post_data)
	{
		var xmlHttp = this.xmlHttp;

		var onUninitialized = this.onUninitialized;
		var onUninitializedEval = this.onUninitializedEval;
		var onSetup = this.onSetup;
		var onSetupEval = this.onSetupEval;
		var onSent = this.onSent;
		var onSentEval = this.onSentEval;
		var onProcess = this.onProcess;
		var onProcessEval = this.onProcessEval;
		var onComplete = this.onComplete;
		var onCompleteEval = this.onCompleteEval;
		var UpdateId = this.UpdateId;
		var Loading = this.Loading;
		var LoadingId = this.LoadingId;
		var ReturnType = this.ReturnType;
		var Async = this.Async;
		var self = this;


		if (xmlHttp==null)
		{
			alert ("Browser does not support HTTP Request");
			return 0;
		}
		// State is changed for many request
		xmlHttp.onreadystatechange =function()
		{
				self.onReadyStateChange(self,
										xmlHttp,
										onUninitialized,
										onUninitializedEval,
										onSetup,
										onSetupEval,
										onSent,
										onSentEval,
										onProcess,
										onProcessEval,
										onComplete,
										onCompleteEval,
										UpdateId,
										LoadingId,
										ReturnType,
										Loading);
		};
		xmlHttp.open( method, url, Async ); 
		xmlHttp.setRequestHeader("Content-Type", this.ContentType);
		xmlHttp.setRequestHeader("Connection", "close");
		xmlHttp.send(post_data);
	},

	//*************************************************************
	// XML Get
	// Return : Xml
	//*************************************************************
	getAjaxXml: function()
	{
		str = this.Url;
		tmp_url = str.split("?");
		if(tmp_url.length > 1)
		{
			tmp_url = this.Url+"&sid="+Math.random();
		}
		else
		{
			tmp_url = this.Url+"?sid="+Math.random();
		}
		this.AjaxXmlExec(tmp_url, "GET", "");
	},
	//*************************************************************
	// XML Post
	// Return : Xml
	//*************************************************************
	postAjaxXml: function()
	{
		var post_data = "";	
		post_data = this.getObjFormValues(this.FormId, "");
//alert(post_data);
		str = this.Url;
		tmp_url = str.split("?");
//alert(tmp_url.length);
		if(tmp_url.length > 1)
		{
			tmp_url = this.Url+"&sid="+Math.random();
		}
		else
		{
			tmp_url = this.Url+"?sid="+Math.random();
		}
		this.AjaxXmlExec(tmp_url, "POST", post_data);
	},

	//*************************************************************
	// Ajax XML Exec
	// Return : callbackfn (XML)
	//*************************************************************
	AjaxXmlExec: function(url, method, post_data)
	{
		var xmlHttp = this.xmlHttp;

		var onUninitialized = this.onUninitialized;
		var onUninitializedEval = this.onUninitializedEval;
		var onSetup = this.onSetup;
		var onSetupEval = this.onSetupEval;
		var onSent = this.onSent;
		var onSentEval = this.onSentEval;
		var onProcess = this.onProcess;
		var onProcessEval = this.onProcessEval;
		var onComplete = this.onComplete;
		var onCompleteEval = this.onCompleteEval;
		var UpdateId = this.UpdateId;
		var Loading = this.Loading;
		var LoadingId = this.LoadingId;
		var ReturnType = this.ReturnType;
		var Async = this.Async;
		var self = this;

		

		if (xmlHttp==null)
		{
			alert ("Browser does not support HTTP Request");
			return 0;
		}

		xmlHttp.onreadystatechange =function()
		{
				self.onReadyStateChange(self,
										xmlHttp,
										onUninitialized,
										onUninitializedEval,
										onSetup,
										onSetupEval,
										onSent,
										onSentEval,
										onProcess,
										onProcessEval,
										onComplete,
										onCompleteEval,
										UpdateId,
										LoadingId,
										ReturnType,
										Loading);
		};
		xmlHttp.open( method, url, Async ); 
		xmlHttp.setRequestHeader("Content-Type", this.ContentType);
		xmlHttp.setRequestHeader("Connection", "close");
		xmlHttp.send(post_data);
	},
	


	onReadyStateChange: function(self,xmlHttp,
								onUninitialized,
								onUninitializedEval,
								onSetup,
								onSetupEval,
								onSent,
								onSentEval,
								onProcess,
								onProcessEval,
								onComplete,
								onCompleteEval,
								UpdateId,
								LoadingId,
								ReturnType,
								Loading)
	{
		if (xmlHttp.readyState == 0)
		{
			if(typeof(onUninitialized) == 'function')
			{
				tmp = onUninitialized;
				eval("tmp();");
			}
			if(onUninitializedEval != null)
			{
				eval(onUninitializedEval);
			}
		}
		if (xmlHttp.readyState == 1)
		{
			if(typeof(onSetup) == 'function')
			{
				tmp = onSetup;
				eval("tmp();");
			}
			if(onSetupEval != null)
			{
				eval(onSetupEval);
			}
		}
		if (xmlHttp.readyState == 2)
		{
			if(typeof(onSent) == 'function')
			{
				tmp = onSent;
				eval("tmp();");
			}
			if(onSentEval != null)
			{
				eval(onSentEval);
			}
		}
		if (xmlHttp.readyState == 3)
		{
			if(typeof(onProcess) == 'function')
			{
				tmp = onProcess;
				eval("tmp();");
			}
			if(onProcessEval != null)
			{
				eval(onProcessEval);
			}
		}
		if (xmlHttp.readyState == 4)
		{
			self.ResponseText = xmlHttp.responseText;
			self.ResponseXML = xmlHttp.responseXML;
			self.Status = xmlHttp.status;
			self.StatusText = xmlHttp.statusText;
			window.status = "";

			if(typeof(onComplete) == 'function')
			{
				// Clear Loading
				if(this.getObjectById(LoadingId, 1))
				{
					this.getObjectById(LoadingId, 1).innerHTML = '';
				}
				if(ReturnType == 'HTML')
				{
					if(this.getObjectById(UpdateId))
					{
						this.getObjectById(UpdateId).innerHTML = xmlHttp.responseText;
					}
					//var _YoZVar = [];
					//_YoZVar['xmlHttp'] = xmlHttp;
					//_YoZVar['UpdateId'] = UpdateId;
					tmp = onComplete;
					
					eval("tmp(self);");
//					console.log("HTML :" + xmlHttp.responseText);
//					console.log("XML :" + xmlHttp.responseXML);
					//eval("tmp(_YoZVar);");
				}
				if(ReturnType == 'XML')
				{
					var _YoZVar = [];
					//_YoZVar['xmlHttp'] = xmlHttp;
					//_YoZVar['UpdateId'] = UpdateId;
					tmp = onComplete;

					eval("tmp(self);");
//					console.log("HTML :" + xmlHttp.responseText);
//					console.log("XML :" + xmlHttp.responseXML);
					//eval("tmp(_YoZVar);");
				}
			}
			if(onCompleteEval != null)
			{
				eval(onCompleteEval);
			}
		}
		else
		{
			if(Loading)
			{
				if(LoadingId != '')
				{
					this.setLoading(LoadingId, xmlHttp.readyState);
				}
				else
				{
					this.setLoading(UpdateId, xmlHttp.readyState);
				}
			}
		}

	},


	getObjectById: function(id, unShowError)
	{                          
		var obj;
		
		if (document.getElementById)
		{
			obj = document.getElementById(id);       
		}
		else if(document.layers)
		{
			obj = document.layers[id];
		}
		else if(document.all.item)
		{                                              
			obj = document.all.item(id);                     
		}
		else
		{
			obj = null;
		}


//console.log("x");
		if(!obj && (unShowError==null || unShowError==0))
		{
			console.log("getObjectById:: Unknow ID \"" + id + "\"");
		}

		return obj;                                        
	},

	// From Kitty
	GetXmlHttpObject: function()
	{ 
		var objXMLHttp=null;

		if (window.XMLHttpRequest)
		{
			objXMLHttp=new XMLHttpRequest();
		}
		else if (window.ActiveXObject)
		{
			objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		return objXMLHttp;
	},	

	getObjFormValues: function(fobj,valFunc) 
	{ 
		var str = "";
		var valueArr = null; 
		var val = ""; 
		var cmd = "";

		fobj = this.getObjectById(fobj);

		for(var i = 0;i < fobj.elements.length;i++) 
		{ 
		   switch(fobj.elements[i].type) 
		   { 
			   case "text": 
					if(valFunc) 
					{ 
						//use single quotes for argument so that the value of 
						//fobj.elements[i].value is treated as a string not a literal 
						cmd = valFunc + "(" + 'fobj.elements[i].value' + ")"; 
						val = eval(cmd);
					} 
		//              str += fobj.elements[i].name + "=" + escape(fobj.elements[i].value) + "&"; 
					str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
					break; 
				case "select-one": 
					str += fobj.elements[i].name + "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&"; 
					break; 
				case "textarea":
		//				str += fobj.elements[i].name + "=" + escape(fobj.elements[i].value) + "&"; 
					str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
					break;
				case "hidden": 
					str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
					break;
				case "password": 
					str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
					break;
				case "checkbox":
					str += fobj.elements[i].name + "=" + escape(fobj.elements[i].value) + "&"; 
					break;
		   } 
		}
	   str = str.substr(0,(str.length - 1)); 
	   return str; 
	},

	
	setLoading: function(obj_id, state)
	{

		if(this.getObjectById(obj_id, 1))
		{
			if(state == 0)
			{
				document.getElementById(obj_id).innerHTML = this.loading_img0;
				window.status = "AJAX Loading... 0";
			}
			if(state == 1)
			{
				document.getElementById(obj_id).innerHTML = this.loading_img1;
				window.status = "AJAX Loading... 1";
			}
			if(state == 2)
			{
				document.getElementById(obj_id).innerHTML = this.loading_img2;
				window.status = "AJAX Loading... 2";
			}
			if(state == 3)
			{
				document.getElementById(obj_id).innerHTML = this.loading_img3;
				window.status = "AJAX Loading... 3";
			}
		}
	}




};


function getElementText (local, parentElem, index)
{
	var result = "";
	
	result = parentElem.getElementsByTagName(local)[index];

	if (result)
	{
		// get text, accounting for possible
		// whitespace (carriage return) text nodes 
		if (result.childNodes.length > 1)
		{
			return result.childNodes[1].nodeValue;
		} 
		else if(result.childNodes.length < 1)
		{
			return "";
		}
		else
		{
			return result.firstChild.nodeValue;    		
		}
	}
	else
	{
		return "";
	}
}










