 // ============================ Ajax Class ============================ //

// Copyright Paul Tesar 2008 
// paultesar@gmail.com

// ============== Main function / Fonction Principal / Hlavni funkce ============== // 

function ajaxClass(serverScript)
{
	this.xmlHttp;
	this.serverScript = serverScript;
	this.isWorking    = true; 
	
    this.xmlHttpObjectInit();   
}

ajaxClass.prototype.check = function (xmlHttpObj)
{     
	 var output      = xmlHttpObj.responseText; 
	 
	 if(output == "OK")
	 {
		this.isWorking    = true;
	 }
	 else
	 {
		this.isWorking    = false;
	 }
}
 
ajaxClass.prototype.ajaxRequest = function ( postVarsArr, callbackOnFinish, callbackOnProgress, callbackOnError )
{

   var pointer      = this;
   var xmlHttpObj   = this.xmlHttp;

   if(this.isWorking)
   {       
	   if((xmlHttpObj.readyState > 0))
	   {
		   setTimeout( function(){ pointer.ajaxRequest(postVarsArr,callbackOnFinish,callbackOnProgress,callbackOnError);  },100 );
	   }
	   else
	   {
		   var url;
           
               if( this.serverScript.indexOf( "?" ) > 0 )
                  url =  this.serverScript + "&";
               else
                  url =  this.serverScript + "?";
           
			   url         += "jsSid=" + Math.random();

		   for( var postVariable in postVarsArr )
		   {
			  url         += "&" + postVariable + "=" + encodeURIComponent(postVarsArr[postVariable]);
		   }


           xmlHttpObj.onreadystatechange = function(){ pointer.readyStateChangeHandler( xmlHttpObj,callbackOnFinish,callbackOnProgress,callbackOnError ); };
		   xmlHttpObj.open("GET",url,true);
		   xmlHttpObj.send(null);
	   }
   }
   else if(this.isFunction(callbackOnError))
   {
	   callbackOnError(xmlHttpObj);
   }
   
}

ajaxClass.prototype.readyStateChangeHandler = function(xmlHttpObj,callbackOnFinish,callbackOnProgress,callbackOnError)
{ 
	var readyState = xmlHttpObj.readyState;
		
	if ( (readyState == 4) && (this.isFunction(callbackOnFinish)) )
	{ 
		callbackOnFinish(xmlHttpObj);
		this.xmlHttp.abort();
	}
	else if( (readyState == 3) && (this.isFunction(callbackOnProgress)) )
	{
		callbackOnProgress(xmlHttpObj);
	}
	else if( readyState == 2 )
	{
		try
		{
			var httpStatus = xmlHttpObj.status;

			if(httpStatus != 200  && this.isFunction(callbackOnError))
			{
				callbackOnError(xmlHttpObj);
				this.xmlHttp.abort();
			}
		}
		catch( e )
		{

		}
	}    
}

ajaxClass.prototype.xmlHttpObjectInit = function()
{
	var object = null;
	
	try         // Firefox, Opera 8.0+, Safari   
	{
		object = new XMLHttpRequest();    
	}
	catch (e)   // Internet Explorer 
	{
		try
		{
			object = new ActiveXObject("Msxml2.XMLHTTP");    
		}
		catch(e)
		{
			object = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	
	if(object)
	{
		this.xmlHttp = object; 
		return true;
	}
	else
	{
		return false;
	}  
}

ajaxClass.prototype.isFunction = function(obj)
{      
	 if(typeof(obj) == 'function')
	 {
		return true;
	 }
	 else
	 {
		return false;
	 }
}


ajaxClass.prototype.processAjaxOutput = function( xmlHttpObj, attributes )
{
	
	var output      = new Array();

	if(!attributes)
	{
		attributes  = ["id","value"]

	}

	if(xmlHttpObj.responseXML)
	{                                                      
		var res  = xmlHttpObj.responseXML.getElementsByTagName('results');
		var res1 = res  ? res[0] : null;
		var rows = res1 ? res1.childNodes : null;
		
		if(rows)
		{
			var count = 0;
			
			for (var i = 0; i < rows.length; i++)
			{
				var row = rows[i];
				
				if (row)
				{    
					var dataArr = new Array();

					for(x in attributes)
					{
					   
					   var attribute          = attributes[x];
					   var val                = row.getAttribute(attribute);
						   dataArr[attribute] = val
					}
					
					output.push(dataArr);
					count++; 
				}
			}
		}
	}
	
	return output;
}
