//---------------------------------------------------------------
// hpweb_ajax.js
// Version 1.0, a component of hpweb.1.2f
//---------------------------------------------------------------
var ajax_debug = true;

function ValidateInput(url, waitMsg, errMsg)
{
	var check = "";

	check = /(https?:\/\/\w{1}[\w-:.]*\w{1}\/)?\w{1}[\w-?\/&.+%#]*\w{1}/;
	if ( !check.test(url) ) {
		if (ajax_debug) alert('Error: Invalid Url.');
		return false;
	}

	check = /[#~!`\r\n\^\|\\'%&]/;
	if ( check.test(waitMsg) ) {
		if (ajax_debug) alert('Error: Wait message contains invalid characters.');
		return false;
	}
	if ( check.test(errMsg) ) {
		if (ajax_debug) alert('Error: Error message contains invalid characters.');
		return false;
	}

	return true;
}

function GetXmlHttpObject()
{ 
	var obj = null;

	if (window.XMLHttpRequest) {
		obj = new XMLHttpRequest();   // IE7, Mozilla, Safari, ...
	} else if (window.ActiveXObject) {
		try {
			obj = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				obj = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				obj = null;
			}
		}
	}

	return obj;
}


function SendHttpRequest(url, appendUniqueId, idResponseNode, is_async, waitMsg, errMsg, callbackFunc)
{
	var objHttpRequest = null;
	var responseNode = null;

	if ( !ValidateInput(url, waitMsg, errMsg) )
		return false;

	responseNode = document.getElementById(idResponseNode);
	if ( !responseNode ) {
		if (ajax_debug) alert('Error: Response container ' + idResponseNode + ' was not found in the document.');
		return false;
	}


	if (appendUniqueId) {
		url += (url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime();
	}


	objHttpRequest = GetXmlHttpObject();

	if (objHttpRequest) {
		if (waitMsg) {
			responseNode.innerHTML = waitMsg + responseNode.innerHTML;
		}

		if (is_async) {
			objHttpRequest.onreadystatechange = 
				function() { ProcessHttpResponse(objHttpRequest, idResponseNode, errMsg, callbackFunc) };
		}

		objHttpRequest.open( "GET", url, is_async );
		objHttpRequest.send( null );

		if (!is_async) {
			var strResponse = "";
			var strError = "";
			try {
				strResponse = objHttpRequest.responseText;
				if (objHttpRequest.status != 200) {
					strError = 'Error: ' + objHttpRequest.status + ' ' + objHttpRequest.statusText;
				}
			} catch (e) {
				strError = 'Error: Exception in ProcessHttpResponse(). ' + e.description;
		        }
			objHttpRequest = null;

			if (strError == "") {
				responseNode.innerHTML = strResponse;
				return( strResponse );
			} else {
				if (errMsg) responseNode.innerHTML = errMsg;
				if (ajax_debug) alert( strError );
				return( strError );
			}
		}
	} else {
		return false;
	}

	return true;
}


function ProcessHttpResponse(objHttpRequest, idResponseNode, errMsg, callbackFunc)
{
	var strError = "";
	var strResponse = "";

	try {
		if ( (objHttpRequest.readyState == 4) || (objHttpRequest.readyState == "complete") ) {
			strResponse = objHttpRequest.responseText;

			if (objHttpRequest.status != 200) {
				if (errMsg) {
					document.getElementById(idResponseNode).innerHTML = errMsg;
				}

				strError = 'Error: ' + objHttpRequest.status + ' ' + objHttpRequest.statusText;

				if (ajax_debug) {
					alert( strError );
				}
			}

			if (typeof callbackFunc == "function") {
				callbackFunc(strResponse, strError, idResponseNode);
			} else if (strError == "") {
				document.getElementById(idResponseNode).innerHTML = strResponse;
			}
		}
	} catch (e) {
		strError = 'Error: Exception in ProcessHttpResponse(). ' + e.description;

		if (errMsg)
			document.getElementById(idResponseNode).innerHTML = errMsg;

		if (ajax_debug)
			alert( strError );

		if (typeof callbackFunc == "function") {
			callbackFunc(strResponse, strError, idResponseNode);
		}
        }

	objHttpRequest = null;
}


function GetContentByToken(url, appendUniqueId, idResponseNode, is_async_request, waitMsg, errMsg, strPrefixToken, strSuffixToken)
{
	if ( idResponseNode == "" ) {
		if (ajax_debug) alert( 'Error: Id of requested node is not provided.' );
		return false;
	}


	// Create global dynamic variables for prefix and suffix tokens
	eval( "g_ajax_prefix_token_" + idResponseNode + " = '" + strPrefixToken + "'" );
	eval( "g_ajax_suffix_token_" + idResponseNode + " = '" + strSuffixToken + "'"  );


	if (is_async_request) {
		if ( !SendHttpRequest(url, appendUniqueId, idResponseNode, is_async_request, waitMsg, errMsg, DisplayContentByToken) ) {
			return false;
		}
	} else {
		var strResponse = "";
		var strError = "";

		strResponse = SendHttpRequest(url, appendUniqueId, idResponseNode, is_async_request, waitMsg, errMsg)

		if ( strResponse.indexOf("Error: ") == 0 ) {
			strError = strResponse;
		}

		return( DisplayContentByToken(strResponse, strError, idResponseNode) );
	}

	return true;
}

function DisplayContentByToken(strResponse, strError, idResponseNode)
{
	if ( strError ) {
		return false;
	}

	var indexPrefix;
	var indexSuffix;
	var strDisplay = "";

	// Read global dynamic variables for prefix and suffix tokens
	var strPrefix = eval( "g_ajax_prefix_token_" + idResponseNode );
	var strSuffix = eval( "g_ajax_suffix_token_" + idResponseNode );

	indexPrefix = strResponse.indexOf(strPrefix);
	indexPrefix = (indexPrefix == -1) ? 0 : indexPrefix;

	indexSuffix = strResponse.indexOf(strSuffix);
	indexSuffix = ( (indexSuffix == -1) || (indexSuffix == 0) ) ? strResponse.length : indexSuffix + strSuffix.length;

	strDisplay = strResponse.substring( indexPrefix, indexSuffix );

	document.getElementById(idResponseNode).innerHTML = strDisplay;

	return true;
}


function SendIFrameRequest(url, appendUniqueId, idResponseNode)
{
	var objIFrame = null;
	var docIFrame = null;
	var strIFrameID = "Hidden_IFrame_" + idResponseNode;
	var strHack = "";


	if ( !document.getElementById(idResponseNode) ) {
		if (ajax_debug) alert('Error: Response container ' + idResponseNode + ' was not found in the document.');
		return false;
	}


	if (appendUniqueId) {
		url += (url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime();
	}


	if ( !document.getElementById(strIFrameID) ) {
		try {
			var nodeIFrame = document.createElement('iframe');
			nodeIFrame.setAttribute('id', strIFrameID);
			nodeIFrame.setAttribute('name', strIFrameID);
			nodeIFrame.style.border = '0px';
			nodeIFrame.style.width = '0px';
			nodeIFrame.style.height = '0px';

			nodeIFrame.src = url;

			document.getElementsByTagName('body')[0].appendChild(nodeIFrame);

			nodeIFrame = null;
		} catch (e) {
			// For IE5
			strHack = '\<iframe id="' + strIFrameID + '" src="' + url + '" style="border:0px; width:0px; height:0px;"><\/iframe>';

			document.body.innerHTML += strHack;
		}
	} else {
		document.getElementById(strIFrameID).src = url;
	}

	return true;
}


function GetContentById(url, appendUniqueId, idResponseNode, waitMsg, errMsg, idRequestNode, callbackFunc)
{
	if ( !(document.createElement && document.getElementsByTagName && document.createTextNode) )
		return false;

	if ( idRequestNode == "" ) {
		if (ajax_debug) alert( 'Error: Id of requested node is not provided.' );
		return false;
	}

	if ( !ValidateInput(url, waitMsg, errMsg) )
		return false;


	if ( SendIFrameRequest(url, appendUniqueId, idResponseNode) ) {
		if (waitMsg) {
			document.getElementById(idResponseNode).innerHTML = waitMsg + document.getElementById(idResponseNode).innerHTML;
		}
		CheckIFrameContent(idRequestNode, idResponseNode, callbackFunc, 1);
	} else {
		return false;
	}

	return true;
}

function CheckIFrameContent(idReqNode, idRespNode, callbackFunc, timeoutCounter)
{
	var strError = "";

	if (timeoutCounter > 15) {
		strError = "Error: Unable to load the page or find the required node.";

		if (typeof callbackFunc == "function") {
			callbackFunc( null, strError, idRespNode );
		} else {
			document.getElementById(idRespNode).innerHTML = "Unable to load content";
		}

		document.getElementById("Hidden_IFrame_" + idRespNode).src = "";
		return false;
	}
	timeoutCounter++;


//	var docHiddenIFrame = document.getElementById("Hidden_IFrame_" + idRespNode).contentWindow.document;
	var docHiddenIFrame = window.frames["Hidden_IFrame_" + idRespNode].document;

	if ( docHiddenIFrame && docHiddenIFrame.getElementById(idReqNode) ) {

		if (typeof callbackFunc == "function") {
			callbackFunc( docHiddenIFrame.getElementById(idReqNode), strError, idRespNode );
		} else {
			document.getElementById(idRespNode).innerHTML = docHiddenIFrame.getElementById(idReqNode).innerHTML;
		}
		document.getElementById("Hidden_IFrame_" + idRespNode).src = "";

	} else {

		var strFuncCall = 'CheckIFrameContent("' + idReqNode + '","' + idRespNode + '",' + callbackFunc + ',' + timeoutCounter + ')';
		setTimeout( strFuncCall, 1000 );

	}
}


function mouseX(evt) {
	if (evt.pageX)
		return evt.pageX;
	else if (evt.clientX)
		return evt.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
	else
		return -100;
}

function mouseY(evt) {
	if (evt.pageY)
		return evt.pageY;
	else if (evt.clientY)
		return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	else
		return -100;
}

function ShowPopup(url, idPopup, topEdge, leftEdge, additionalStyles, e)
{
	if ( !(document.createElement && document.getElementsByTagName && document.createTextNode) )
		return false;

	if (idPopup == "") {
		if (ajax_debug) alert( 'Error: Unique ID for the popup is not provided.');
		return false;
	}


	topEdge = parseInt(topEdge);
	leftEdge = parseInt(leftEdge);

	if ( isNaN(topEdge) || isNaN(leftEdge) ) {
		if (typeof e != "object") {
			if (ajax_debug) alert( 'Error: Either top and left corners of the popup should be provided or the event object should be passed as an argument to this funciton.');
			return false;
		}
	}


	var strResponse = "";
	var nodePopup = null;

	nodePopup = document.getElementById(idPopup);
	if (!nodePopup) {
		nodePopup = document.createElement( "DIV" );
		nodePopup.setAttribute('id', idPopup);
		nodePopup.setAttribute('name', idPopup);

		nodePopup.style.cssText = additionalStyles;

		document.getElementsByTagName('body')[0].appendChild(nodePopup);
	}


	strResponse = SendHttpRequest(url, true, idPopup, false, "", "")


	nodePopup.innerHTML = strResponse;
	nodePopup.className = "popupBox";


	if ( isNaN(topEdge) || isNaN(leftEdge) ) {
		nodePopup.style.top = (mouseY(e) + 5) + "px";
		nodePopup.style.left = (mouseX(e) + 15) + "px";
	} else {
		nodePopup.style.top = topEdge + "px";
		nodePopup.style.left = leftEdge + "px";
	}

	nodePopup.style.visibility = "visible";

	nodePopup = null;
	return true;
}

function HidePopup(idPopup)
{
	if ( !(document.createElement && document.getElementsByTagName && document.createTextNode) )
		return false;

	if (idPopup == "") {
		if (ajax_debug) alert( 'Error: Unique ID for the popup is not provided.');
		return false;
	}

	if ( !document.getElementById(idPopup) )
		return false;


	document.getElementById(idPopup).style.visibility = "hidden";

	return true;
}

//20061122
