var __callbackList = new Array();	//	Holds the asynchronous callback handler

//	Add the Callback Handler to array list
function addToCallbackList(cb) {
	__callbackList[__callbackList.length] = cb;
}

//	Is Microsoft Browser?
var __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);
var pageUrl = "";			//	Post Back URL
var __theFormPostData = "";	//	Form Data
function WebForm_InitClientCallback(cbUrl) {
	pageUrl = cbUrl;
	var theForm = document.forms[0];	//	ASP.NET currently support single form PostBack only
    count = theForm.elements.length;
    var element;

    for (i = 0; i < count; i++) {
        element = theForm.elements[i];
         if (element.tagName.toLowerCase() == "input") {
            __theFormPostData += element.name + "=" + encode(element.value).replace(new RegExp("\\x2B", "g"), "%2B") + "&";
         }
         else if (element.tagName.toLowerCase() == "select") {
            selectCount = element.childNodes.length;
            if(element.selectedIndex > -1)
            {
	            __theFormPostData += element.name + "=" + encode(element.options[element.selectedIndex].value).replace(new RegExp("\\x2B", "g"), "%2B") + "&";
            }
         }
    }
}

//	Callback asynchronously
function WebForm_DoAsyncCallback(eventTarget, eventArgument, eventCallback, context, errorCallback)
{
	var xmlRequest = null;
  
    if(__nonMSDOMBrowser)
    {
		xmlRequest = new XMLHttpRequest();
	}
	else
	{
		xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
	}

	var __callbackObject = new Object();
	__callbackObject.xmlRequest = xmlRequest;
	__callbackObject.eventTarget = eventTarget;
	__callbackObject.eventArgument = encode(eventArgument).replace(new RegExp("\\x2B", "g"), "%2B");
	__callbackObject.eventCallback = eventCallback;
	__callbackObject.context = context;
	__callbackObject.errorCallback = errorCallback;
	addToCallbackList(__callbackObject);

	var postData = __theFormPostData + "__SCRIPTCALLBACKID=" + eventTarget + "&__SCRIPTCALLBACKPARAM=" + encode(eventArgument).replace(new RegExp("\\x2B", "g"), "%2B");

	xmlRequest.onreadystatechange = WebForm_OnClientCallbackComplete;
	xmlRequest.open("POST", getPageUrl(), true);
	xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xmlRequest.send(postData);
}


//	Callback Synchronously
function WebForm_DoSyncCallback(eventTarget, eventArgument, eventCallback, context, errorCallback)
{
	var xmlRequest = null;
  
    if(__nonMSDOMBrowser)
    {
		xmlRequest = new XMLHttpRequest();
	}
	else
	{
		xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
	}

	var postData = __theFormPostData + "__SCRIPTCALLBACKID=" + eventTarget + "&__SCRIPTCALLBACKPARAM=" + encode(eventArgument).replace(new RegExp("\\x2B", "g"), "%2B");

	xmlRequest.open("POST", getPageUrl(), false);
	xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xmlRequest.send(postData);

	try
	{
		var response = xmlRequest.responseText;
		var status   = xmlRequest.getResponseHeader("__SCRIPTCALLBACKSTATUS");

		if (status == "200") 
		{			
			if (eventCallback != null)
			{
				eventCallback(response, context);
			}
			else
			{
				if (errorCallback != null)
				{
					errorCallback(response, context);
				}
			}
		}
		else
		{
			// For Testing Purposes
			window.location.reload();
		}
	}
	catch(e)
	{
		if (errorCallback != null)
		{
			errorCallback(e.message, context);
		}
		else
		{
			alert("Erro na chamada.\n" + e.message);
		}
	}        

	return response;
}

//	Asynchronous Callback Completed
function WebForm_OnClientCallbackComplete() 
{
	for(var i = 0; i < __callbackList.length; i++)
	{
		var __cbObject = __callbackList[i];

		if (__cbObject != null && __cbObject.xmlRequest.readyState == 4) 
		{
			__callbackList[i] = null;
		
			try
			{
				var xmlText	 = __cbObject.xmlRequest.responseXML;
				var response = __cbObject.xmlRequest.responseText;
				var status   = __cbObject.xmlRequest.getResponseHeader("__SCRIPTCALLBACKSTATUS");

				if (status == "200") 
				{
					if (__cbObject.eventCallback != null)
						__cbObject.eventCallback(response, __cbObject.context);
				}
				else
				{
					if (__cbObject.errorCallback != null)
						__cbObject.errorCallback(response, __cbObject.context);
					else
					{
						// For Testing Purposes
						window.location.reload();
					}
				}
			}
			catch(e)
			{
				if (__cbObject.errorCallback != null)
					__cbObject.errorCallback(e.message, __cbObject.context);
				else
				{
					//	For Testing Purposes
					alert("Erro na chamada.\n" + e.message);
				}
			}
			finally
			{
				__cbObject.xmlRequest = null;
				__cbObject = null;
			}
		}
    }
}

function getPageUrl()
{
	var guid = new Date().getTime();
	
	// Adiciona um guid a url para diferenciar a url a cada requisição. Caso o diferenciação não ocorra, quando o página está rodando
	// na execução da função showModalDialog a requisição será puxada da cache
	if(pageUrl.indexOf("?") != -1)
	{
		return pageUrl + "&" + guid;
	}
	else
	{
		return pageUrl + "?" + guid;
	}
}

function encode(value)
{
	// Código comentado durante periodo de teste do código adicionado utilizando encodeURIComponent
	/*
	var result = value;

	result = result.replace(/\//g,"%2F");
	result = result.replace(/\?/g,"%3F");
	result = result.replace(/=/g,"%3D");
	result = result.replace(/&/g,"%26");
	result = result.replace(/@/g,"%40");
	result = result.replace(/#/g,"%23");
	result = result.replace(/\+/g,"%2b");

	return result;
	*/
	
	if(encodeURIComponent)
	{
		return encodeURIComponent(value);
	}
	else
	{
		return escape(value);
	}
}