var browser="unknown"; // browser name

var loaded = Array(); // Loaded html elements data for caching

if (document.all)
	browser="ie";
else if (document.layers)
	browser="nn";
else if (document.getElementById)
	browser="mozilla";
else
	browser="unknown";
	
var request;
var dest;
var Method;
var AjaxLoader = 'ajax_loader';
var callback = '';
var loadURL = ''; // URL that can be loaded after AJAX request finished

var OPTION_HIDE_LOADING_BAR = 0;

function registerURL(url)
{
	if (!url || url == "")
		return;
		
	loadURL = url;
}

function set_option(name, value)
{
	if (name == "HIDE_LOADING_BAR")
		OPTION_HIDE_LOADING_BAR = value;
	else
		return;
}

function registerCallback(name)
{
	if (name == "")
		return;
		
	callback = name;
}

function processStateChange()
{
	if (request.readyState == 4)
	{
		contentDiv = document.getElementById(dest);
		if (request.status == 200)
		{
			response = request.responseText;
			if (response != "OK")
			{
				if (response != '')
					contentDiv.innerHTML = response;
			}
			else
				reloadWithTimeout(900);
				
			// Executing callback function on successfull ready state
			if (callback != '')
				eval(callback + '();');
				
			if (loadURL != '')
			{
				var url = loadURL;
				loadURL = '';
				if (response != '')
					setTimeout('loadHTML("' + url + '", "' + dest + '")', 900);
				else
					loadHTML(url, dest);
			}
		}
		else
		{
			contentDiv.innerHTML = "Error: Status "+request.status;
		}
		
		hide(AjaxLoader);
	}
	else
	{
		if (!OPTION_HIDE_LOADING_BAR)
			show(AjaxLoader);
	}
	
}

function reload()
{
	document.location.reload();
}

function reloadWithTimeout(Timeout)
{
	if (!Timeout)
		Timeout = 0;
	
	setTimeout("reload()", Timeout);
}

// URL where AJAX will send the request
// MsgBox - element of page where messages will be displayed
// Name - works with forms. If added forms parser will be run with "Name" form name
// Method - mathod of data sending (such as GET, POST etc.). Default: GET
function loadHTML(URL, MsgBox, Name, method, doCache)
{
	if (!doCache)
		doCache = 0;
		
	if (doCache && loaded[MsgBox])
		return false;
		
	var contentDiv
	if (browser=="ie")
		eval("contentDiv = document.all."+MsgBox+";");
	else if (browser=="mozilla")
		eval("contentDiv = document.getElementById('"+MsgBox+"');");
			
	// Removing old messages
	//contentDiv.innerHTML = '';
	
	dest = MsgBox;
	
	if (Name && Name != "" && (!method || method == ""))
		Method = "POST";
	else if (!method || method == "")
		Method = "GET";
	else
		Method = method;
	
	data = parseForm(Name);
	
	loaded[MsgBox] = 1;
	
	if (window.ActiveXObject)
	{
		try
		{
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(MsxmlE)
		{
			try
			{
				request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(MicrosoftE)
			{
				return false;
			}
		}
		
		if (request)
		{
			request.open(Method, URL, true);
			request.onreadystatechange = processStateChange;
			sendAjaxHeader();
			if (data && data != "")
				request.send(data);
			else
				request.send(null);
		}
	}
	else if (window.XMLHttpRequest)
	{
		request = new XMLHttpRequest();
		request.open("POST", URL, true);
		request.onreadystatechange = processStateChange;
		sendAjaxHeader();
		request.send(data);
	}
}

function parseForm(FormName)
{
	if (!FormName || FormName == "")
		return false;
		
	var FormElemsCount; // Count of form elements (such as <input> and etc.)
	
	var ElemName = '';
	var ElemValue = '';
	var ElemType = '';
	var Vars = '';
	var FormObj = null;
	
	FormObj = getObject(FormName);
	
	// Preventing damage with no form object
	//if (FormObj)
		//eval("FormElemsCount = document.forms."+FormName+".length;");
	FormElemsCount = FormObj.length;
	
	for (var i = 0; i < FormElemsCount; i++)
	{
		//ElemType = (eval("document.forms."+FormName+".elements["+i+"].type;"));
		ElemType = FormObj.elements[i].type;
		//ElemName = (eval("document.forms."+FormName+".elements["+i+"].name;"));
		ElemName = FormObj.elements[i].name;
		
		if (ElemType != "checkbox")
		{
			//ElemValue = (eval("document.forms."+FormName+".elements["+i+"].value;"));
			if (ElemType == "radio")
			{
				if (FormObj.elements[i].checked == true)
					ElemValue = FormObj.elements[i].value;
			}
			else
				ElemValue = FormObj.elements[i].value;
		}
		//else if (eval("document.forms."+FormName+".elements["+i+"].checked;") == true)
		else if (FormObj.elements[i].checked == true)
			ElemValue = 'on';
		else
			ElemValue = 'off';
		
		if (ElemName && ElemName != "")
		{
			// Replace '&' characters
			replacedValue = '';
			for (var j = 0; j < ElemValue.length; j++)
			{
				if (ElemValue.substr(j, 1) == '&')
				{
					replacedValue = replacedValue + '%26';
				}
				else if (ElemValue.substr(j, 1) == '+')
				{
					replacedValue = replacedValue + '%2B';
				}
				else
					replacedValue = replacedValue + ElemValue.substr(j, 1);
			}
			ElemValue = replacedValue;
			
			Vars = Vars + ElemName + "=" + ElemValue;
		
			if (i != (FormElemsCount - 1))
				Vars = Vars + "&";
		}
	}
	return Vars;
}

function sendAjaxHeader()
{
	if (!request)
		return false;
		
	request.setRequestHeader('AJAX', 1);
	// Mozilla compability. Sending REFERER header for compability with Mozilla (Firefox)
	request.setRequestHeader('Referer', location.href);

	if (Method == "POST")
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}