/**
 * @name AJAX Client Side Controller
 * @author Lyubomir Gardev
 * @package Core Libraries
 * @subpackage Maintaining System
 * @version 2.1
 * @copyright Intelligent Systems Ltd., 2008 - 2009. All rights (legal, intelectual, etc.) reserved.
 */
 
function AJAXRequest(CustomCallback, RowSeparator, ColSeparator)
{
	this.Request = GetAJAXObject();

	if(!this.Request)
	{
		alert('AJAX Request is either not supported by current browser or could not be loaded.');
		return null;
	}
	
	function Perform(URL, params)
	{
		if(!params || typeof(params) == 'undefined')
			params = null;
		
		var method = (arguments.length > 1 && params != null) ? 'POST' : 'GET';
		URL = URL.replace(/&amp;/gi, '&');
		
		this.Request.open(method, URL, true);
		
		if(arguments.length > 1 && params != null)
		{
			this.Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			this.Request.setRequestHeader("Content-length", params.length);
			this.Request.setRequestHeader("Connection", "close");
		}

		this.Request.onreadystatechange = this.StateHandler;
		this.Request.send(params);
	}
	this.Perform = Perform;
	
	function StateHandler()
	{
	    if(window[CustomCallback])
	    {
		    if(this.readyState == 4 || this.readyState == 'complete')
			    window[CustomCallback](this.readyState, this.responseText, RowSeparator, ColSeparator);
		    else
			    window[CustomCallback](this.readyState, '', RowSeparator, ColSeparator);
	    }
	    else
	    {
	        if(this.readyState == 4 || this.readyState == 'complete')
			    callback = CustomCallback + '(' + this.readyState + ', ' + this.responseText + ', ' + RowSeparator + ', ' + ColSeparator + ');';
		    else
		        callback = CustomCallback + '(' + this.readyState + ', \'\', ' + RowSeparator + ', ' + ColSeparator + ');';
			    
		    eval(callback);
	    }
	}
	this.StateHandler = StateHandler;
	
	function GetParams(formid)
	{
		res = '';
		
		var obj = document.getElementById(formid);
		if(!obj || obj == null || typeof(obj) == 'undefined')
			return;
			
		for(i = 0; i < obj.elements.length; i++)
		{
			if (obj.elements[i].checked != undefined && obj.elements[i].type == 'checkbox')
			{
				if (obj.elements[i].checked == false)
				{
					obj.elements[i].value = 'off';
				} else {
					obj.elements[i].value = 'on';
				}
			}
			res += obj.elements[i].name + '=' + obj.elements[i].value + '&';
		}
			
		res = res.substr(0, res.length - 1);
		
		return res;
	}
	this.GetParams = GetParams;
}

function GetAJAXObject()
{
	var hAJAXRequest = null;
	
	try
	{
		hAJAXRequest = new XMLHttpRequest();
	}
	catch(e)
	{
		try
		{
			hAJAXRequest = new ActiveXObject("Msxml3.XMLHTTP");
		}
		catch(e)
		{
			try
			{
				hAJAXRequest = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e)
			{
				try
				{
					hAJAXRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e)
				{
					
				}
			}
		}
	}
	
	return hAJAXRequest;
}
