// VitaminXP Javascript Framework
// Module: Ajax
// Copyright: www.VitaminXP.com
// Author: Dmitriy Kulikovskiy

// Create NameSpaces
VitaminXP.Namespace("Ajax");


// Create a Blank request instence which will be used everytime the request is made
VitaminXP.Ajax.Request = function(obj, url){
	this.Document = null;
	this.TargetObject = obj;
	this.SuccessAction = "html";
	this.Method = "GET";
	this.URL = url;
	this.Parameters = "";
	this.ExecuteFunction = "";
	this.Asynchronous = true;
	this.MicrosoftProgramIDs = "";
	this.States = new Array("uninitialized","loading","loaded","interacting","complete")
	this.MicrosoftProgramIDs = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
};

// Requests a URL and passes the request to aother function to handle the state change event
VitaminXP.Ajax.RequestUrl = function(obj,url){ // Object,URL,Parameters,Method,Action,Function Name
	
	// Create a copy of blank request
	var Request = new VitaminXP.Ajax.Request(obj, url);
	
	// Optinal arguments
	var args = VitaminXP.Ajax.RequestUrl.arguments;
	if(args.length > 2) Request.Parameters = args[2];
	if(args.length > 3) Request.Method = args[3].toUpperCase()
	if(args.length > 4) Request.SuccessAction = args[4].toLowerCase()
	if(args.length > 5) Request.ExecuteFunction = args[5];
	
	// Try to create an HTTP Request object
	try
	{
		if (window.XMLHttpRequest) // Mozilla, Safari,...
			Request.Document = new XMLHttpRequest();
		else if (window.ActiveXObject) // IE
		{
			while (!Request.Document && Request.MicrosoftProgramIDs.length)
			{
				try
				{
					Request.Document = new ActiveXObject(Request.MicrosoftProgramIDs[0]);
				}
				catch (e)
				{
					Request.Document = null;
				}
				
				if (!Request.Document) Request.MicrosoftProgramIDs.splice(0, 1);
			}
		}
	}
	catch (e)
	{
		Request.Document = null;
	}
	
	if(!Request.Document) return false;
	
	// Initialize request
	Request.Document.onreadystatechange = function(){VitaminXP.Ajax.ProcessStateChange(Request)};
	Request.Document.open(Request.Method, Request.URL, Request.Asynchronous);
	Request.Document.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	Request.Document.setRequestHeader("Content-length", Request.Parameters.length);
	Request.Document.setRequestHeader("Connection", "close");
	Request.Document.send(Request.Parameters);
	return true;
};

// Handles state change event of the request passed to this function
VitaminXP.Ajax.ProcessStateChange = function(Request){
	window.status = 'Ajax: ' + Request.States[Request.Document.readyState];
	
	if(Request.Document.readyState == 4){ // Complete
		if(Request.Document.status == 200 || Request.Document.status == 0){ // OK response
			if(Request.SuccessAction == "html")
			{
				Request.TargetObject.innerHTML = Request.Document.responseText;
			}
			else if(Request.SuccessAction == "text")
			{
				Request.TargetObject.innerText = Request.Document.responseText;
			}
			else if(Request.SuccessAction == "function")
			{
				eval(Request.ExecuteFunction)(Request.Document.responseText, Request.TargetObject)
			}
			else if(Request.SuccessAction == "value")
			{
				Request.TargetObject.value = Request.Document.responseText
			}
			else if(Request.SuccessAction == "link")
			{
				if(Request.Document.responseText.toUpperCase() == "OK")
				{
					window.location = Request.ExecuteFunction
				}
				else
				{
					alert(Request.Document.responseText)
				}
			}
			else if(Request.SuccessAction.toLowerCase() == "ok")
			{
				if(Request.Document.responseText.toUpperCase() == "OK")
				{
					if(Request.ExecuteFunction != "")
					{
						eval(Request.ExecuteFunction)(Request.TargetObject)
					}
				}
				else
				{
					alert(Request.Document.responseText)
				}
			}
			Request = null
		}
		else
		{
			window.status = 'Ajax: problem ' + Request.Document.statusText + ', status: ' + Request.Document.status
		}
	}
};