function XMLHttpRequestObject()
{
	this.xmlhttp = null;
	
	if (window.XMLHttpRequest)
	{
		this.xmlhttp = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) // IE-only
	{
		try
		{
			this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e1)
		{
			try
			{
				this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e2)
			{
				this.xmlhttp = null;
			}
		}
	}
}


var requests = new Array ();

function onReadyStateChangeHandler (requestId)
{
	if (requests[requestId].xmlhttp.readyState == 4)
	{
		if (requests[requestId].xmlhttp.status == 200)
		{
			if (requests[requestId].handlers.method == 'HEAD')
			{
				requests[requestId].handlers.hLoad (requests[requestId].xmlhttp.getAllResponseHeaders());
			}
			else
			{
				switch (requests[requestId].handlers.format)
				{
					case 'XML':	
						//alert (requests[requestId].xmlhttp.responseText);
						requests[requestId].handlers.hLoad (requests[requestId].xmlhttp.responseXML);								
					break;

					default:
						requests[requestId].handlers.hLoad (requests[requestId].xmlhttp.responseText);
					break;
				}
			}
		}
		else
		{
			alert ("Изникна проблем при комуникацията със сървъра: " + requests[requestId].xmlhttp.statusText);
		}
	}
	
	requests[requestId].finished = true;
}

function initiateAjaxRequest (relativePath, method, format, async, onLoadHandler, onErrorHandler, postData)
{
	var current = 0;
	
	if (requests.length != 0)
	{
		for (var i = 0; i < requests.length; i++)
		{
			if (requests[i].finished)
			{
				current = i;
				break;
			}
		}
		
		if (current == 0)
		{
			current = requests.length;
		}
	}
		
	requests[current] = new XMLHttpRequestObject();
					
	if (requests[current].xmlhttp != null)
	{
		requests[current].finished = false;
	
		requests[current].handlers = new Object ();
		
		requests[current].handlers.hLoad = onLoadHandler;
		requests[current].handlers.hError = onErrorHandler;
		requests[current].handlers.format = format;
		
		// Prevent IE caching using random numbers in argument
		if (relativePath.indexOf ("?") > -1)
		{
			if (!postData)
				requests[current].xmlhttp.open (method, relativePath + "&random=" + Math.random(), true);
			else
			{
				requests[current].xmlhttp.open (method, relativePath + "&random=" + Math.random() , true);

                if (method == 'POST') {
                    requests[current].xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                }

                requests[current].xmlhttp.send(postData);
			}
		}
		else
		{
			if (!postData)
				requests[current].xmlhttp.open (method, relativePath + "?random=" + Math.random(), async);
			else
			{
				requests[current].xmlhttp.open (method, relativePath + "?random=" + Math.random() , true);

                if (method == 'POST') {
                    requests[current].xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                }

                requests[current].xmlhttp.send(postData);
			}

		}

		requests[current].xmlhttp.onreadystatechange = new Function ("onReadyStateChangeHandler (" + current + ");");

		if (!postData)
			requests[current].xmlhttp.send('');
	}
}

var queryString;

function addField (name, value)
{
	if (queryString.length > 0) {
		queryString += "&";
	}
	
	queryString += name + "=";
	
	if (encodeURIComponent)
		queryString += encodeURIComponent(value);
	else
		queryString += escape(value);
}

function encodeForm (formId)
{
	var elements = document.getElementById (formId).elements;
	var length = elements.length;
	queryString = "";

	for (var i = 0; i < length; i++)
	{
		var currentElement = elements[i];

		if (!currentElement.disabled)
		{
			switch (currentElement.type)
			{
				case 'text':
				case 'password':
				case 'hidden':
				case 'textarea':

					addField (currentElement.name, currentElement.value);

				break;

				case 'select-one':
					if (currentElement.selectedIndex >= 0)
					{
						addField (currentElement.name, currentElement.options [currentElement.selectedIndex].value);
					}
					else
					{
						addField (currentElement.name, "");
					}
				break;

				case 'select-multiple':

					var elementAdded = false;

					for (var j = 0; j < currentElement.options.length; j++)
					{
						if (currentElement.options[j].selected)
						{
							addField (currentElement.name, currentElement.options[j].value);
							elementAdded = true;
						}
					}

					if (!elementAdded)
					{
						addField (currentElement.name, "");
					}
				break;

				case 'checkbox':
					if (currentElement.checked)
					{
						addField (currentElement.name, "true");
					}
					else
					{
						addField (currentElement.name, "false");
					}
				break;

				case 'radio':
					if (currentElement.checked)
					{
						addField (currentElement.name, currentElement.value);
					}
				break;
			}
		}
	}

	//alert (queryString);

	return queryString;
}


function initiateFormSubmit (formId, handlingScript, hLoad)
{
	var current = 0;

	if (requests.length != 0)
	{
		for (var i = 0; i < requests.length; i++)
		{
			if (requests[i].finished)
			{
				current = i;
				break;
			}
		}

		if (current == 0)
		{
			current = requests.length;
		}
	}

	requests[current] = new XMLHttpRequestObject();

	if (requests[current].xmlhttp != null)
	{
		requests[current].finished = false;

		requests[current].handlers = new Object ();

		if (hLoad)
			requests[current].handlers.hLoad = hLoad;
		else
			requests[current].handlers.hLoad = new Function ("return false;");

		requests[current].handlers.format = 'XML';

		requests[current].xmlhttp.open ("POST", handlingScript, true);

		requests[current].xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

		requests[current].xmlhttp.onreadystatechange = new Function ("onReadyStateChangeHandler (" + current + ");");

		var formData = encodeForm (formId);

		requests[current].xmlhttp.send (formData);
	}
}