var xmlHttp;
loadAjaxClient();

function submitAjax(form, invokerId, ajaxSubmiiterId)
{
	showloading(ajaxSubmiiterId);
	if (form.enctype == 'multipart/form-data')
		sendFrame(form, invokerId, ajaxSubmiiterId);
	else
		sendAjax(form, invokerId, ajaxSubmiiterId);
}

function sendFrame(form, invokerId, ajaxSubmiiterId)
{
	var frame = document.getElementById(ajaxSubmiiterId + "uploadFrame");
	form.target = frame.name;
	form.submit();
}

function sendAjax(form, invokerId, ajaxSubmiiterId)
{
	invoker = document.getElementById(invokerId);
	var postData = preparePostData(form, invoker);
	if (form.action)
		xmlHttp.open("POST", form.action, true);
	else
		xmlHttp.open("POST", document.location.href, true);
	var formCharset = getCaharset();
	var contentType = "application/x-www-form-urlencoded; charset="
			+ formCharset;

	xmlHttp.setRequestHeader("Content-Type", contentType);
	xmlHttp.setRequestHeader("charset", formCharset);
	xmlHttp.onreadystatechange = render;
	xmlHttp.form = form;
	xmlHttp.send(postData);
}

function getCaharset()
{
	var metas = document.getElementsByTagName('meta');
	for ( var i = 0; i < metas.length; i++)
	{
		if (metas[i].httpEquiv == 'Content-Type')
		{
			var content = metas[i].content;
			var index = content.indexOf('charset=');
			if (index > 0)
				return content.substring(index + 8);
		}
	}
	return "UTF-8"
}

function preparePostData(form, invoker)
{
	var result = "jspx=ajax";
	for ( var i = 0; i < form.elements.length; i++)
	{
		var el = form.elements[i];
		if (el.tagName.toLowerCase() == "select")
		{
			for ( var j = 0; j < el.options.length; j++)
			{
				var op = el.options[j];
				if (op.selected)
					result += "&" + encodeURIComponent(el.name) + "="
							+ encodeURIComponent(op.value);
			}
		}
		else if (el.tagName.toLowerCase() == "textarea")
		{
			result += "&" + encodeURIComponent(el.name) + "="
					+ encodeURIComponent(el.value);
		}
		else if (el.tagName.toLowerCase() == "input")
		{
			if (el.type.toLowerCase() == "checkbox"
					|| el.type.toLowerCase() == "radio")
			{
				if (el.checked)
					result += "&" + encodeURIComponent(el.name) + "="
							+ encodeURIComponent(el.value);
			}
			else if (el.type.toLowerCase() == "submit")
			{
				if (el == invoker) // is "el" the submit button that fired
					// the form submit?
					result += "&" + encodeURIComponent(el.name) + "="
							+ encodeURIComponent(el.value);
			}
			else if (el.type.toLowerCase() != "button")
			{
				result += "&" + encodeURIComponent(el.name) + "="
						+ encodeURIComponent(el.value);
			}
		}
	}
	if (typeof invoker != 'undefined' && invoker != null
			&& typeof invoker == 'input'
			&& invoker.type.toLowerCase() == "image")
	{
		if (invoker.name == null || invoker.name == ""
				|| typeof invoker.name == "undefined")
			result += "&x=1&y=1"; // .x and .y coordinates calculation is not
		// supported.
		else
			result += "&" + encodeURIComponent(invoker.name) + ".x=1&"
					+ encodeURIComponent(invoker.name) + ".y=1";
	}
	return result;
}

function render()
{
	var myform = xmlHttp.form;
	// invoker
	myform.elements[0].value = '';
	// event name
	myform.elements[1].value = '';
	// event args
	myform.elements[2].value = '';
	// event type
	myform.elements[3].value = '';
	// Group
	myform.elements[4].value = '';
	// event target
	myform.elements[5].value = '';

	if (xmlHttp.readyState == 4)
	{
		if (xmlHttp.status == 200)
		{
			var pageStatus = xmlHttp.getResponseHeader("JSPX-Page-Status");
			if (pageStatus != null && pageStatus == 'DispatchedPage')
			{
				document.body.innerHTML = xmlHttp.responseText;
				return;
			}
			var ajaxPanel = xmlHttp.getResponseHeader("JSPX-AjaxPanel");
			if (ajaxPanel == null || ajaxPanel == '')
			{
				document.location.href = document.location.href;
				return;
			}
			var ajaxPanelRefresh = xmlHttp
					.getResponseHeader("JSPX-AjaxPanel-Refresh");
			var viewState = xmlHttp
					.getResponseHeader("JSPX-AjaxPanel-ViewState");
			var ajaxPanelRendered = xmlHttp
					.getResponseHeader("JSPX-AjaxPanel-Rendered");
			var aP = document.getElementById(ajaxPanel);
			if (aP != null)
				with (aP)
				{
					innerHTML = xmlHttp.responseText;
					eval(ajaxPanelRefresh);
					// add View State
					if (myform.elements[myform.elements.length - 1])
					{
						myform.elements[myform.elements.length - 1].value = viewState;
					}
					eval(ajaxPanelRendered);
				}
			else
				alert(ajaxPanel);
		}
		else if (xmlHttp.status == 302)
		{
			document.location.href = xmlHttp.getResponseHeader("location");
		}
		else
		{
			document.body.innerHTML = xmlHttp.responseText;
			document.body.removeAttribute('style');
		}
	}
}

function showloading(ajaxSubmiiterId)
{
	var loading = document.getElementById(ajaxSubmiiterId + "AjaxLoading");
	if (loading == null)
		return;
	var panel = document.getElementById(ajaxSubmiiterId);
	loading.style.display = 'block';
	loading.style.position = 'absolute';
	loading.style.width = panel.offsetWidth;
	loading.style.height = panel.offsetHeight;
	loading.zIndex = 200;
}

function loadAjaxClient()
{
	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();
	}
	catch (e)
	{ // Internet Explorer
		try
		{
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}
}

