

//================================================================
// GetASPSession
//================================================================
function GetASPSession() {
	var session = { ID:'', path:'' };
	try {
		var cookies = document.cookie.split("; ");
		for (var item=0; item<cookies.length; item++) {
			var nameValuePair = cookies[item].split("=");
			if (nameValuePair[0].match( /ASPSESSIONID/i ))  session.ID = nameValuePair[1];
			if (nameValuePair[0].match( /path/i ))  session.path = nameValuePair[1];
			}
		}
	catch (error) {
		alert( "GetASPSession: " + error.description );
		}
	return session;
	}


//===========================================================
// EscapeReservedCharacters
// Escapes characters that are valid in a query string amd
// not converted by JS escape.
//===========================================================
function EscapeSpecialCharacters( data ) {
	try {
		if (!data) data = ""; 
		var reservedCharacters = "+,@,/".split(",");
		for (var item=0; item<reservedCharacters.length; item++) {
			var character = reservedCharacters[item];
			var code = "%" + character.charCodeAt(0).toString(16);
			var pattern = new RegExp( "\\" + character, "g");
			data = data.replace( pattern, code );
			}
		}
	catch( error ) {
		alert( "EscapeSpecialCharacters: " + error.description );
		}
	return data;
	}


//===========================================================
// GetXmlHTTP
// 24JUL2008 RFM - Added to support Firefox
//===========================================================
function GetXmlHTTP( ) {
	var request = {};
	try {
		if (document.all) {
			request = new ActiveXObject ("Microsoft.XMLHTTP");
			}
		else {
			request = new XMLHttpRequest();
			request.Open = request.open;
			request.Send = request.send;
			}
		}
	catch (error) {
		alert( "GetXmlHTTP: " + error.description  );
		}
	return request;
	}


//===========================================================
// SetRunAtServerCallback
// 18JUN2009 RFM - SHP
// Causes RunAtServer to run asyncronously when run calling
// functionPointer upon completion. functionPointer is passed
// text returned by call.
// PARAMETERS:
//	functionPointer:function	Callback function which is called upon completion of RunAtServer. Passed results from RunAtServer
//===========================================================
function SetRunAtServerCallback( functionPointer, timeout ) {
	RunAtServer.timeout = timeout || 2000;
	RunAtServer.callback = functionPointer;
	}


//================================================================
// RunAtServer
//================================================================
function RunAtServer( url, command, commandParameters ) {
	try {
		if (!url) url =  "/global/scripts/ClientSideASP/ProcessCommand.asp";
		var xmlhttp = GetXmlHTTP();
		var arguments = RunAtServer.arguments
		var command = arguments[1] + "( ";
		var firstParameter = 2;
		var formData = "";
		var session = GetASPSession();
		for (argument=firstParameter; argument<arguments.length; argument++) {
			if (argument > firstParameter) command += ",";
			switch (typeof arguments[argument]) {
				case "string":
				case "date":
					command += "\"" + arguments[argument].replace( /\"/g, "\\\"") + "\"";
					break;
				default:
					command += arguments[argument];
					}
			}
		command += " )";
		// 26SEP2008 RFM - Need to encode query string chasrcaters in data like +
		//formData = "execute=" + escape( command );
		formData = "execute=" + EncodeQueryStringCharacters( escape( command ) );
		// 18JUN2009 RFM - Added support for asynch callbacks - SHP
		if (RunAtServer.callback) {
			var timeout = window.setTimeout(function() { RunAtServer.callback("") }, RunAtServer.timeout );
			xmlhttp.onreadystatechange = function() {
				try {
					var kReadyStateLoaded = 4;
					if (xmlhttp.readyState == kReadyStateLoaded) {
						window.clearTimeout(timeout);
						RunAtServer.callback( xmlhttp.responseText );
						}
					}
				catch (error) {
					alert( "RunAtServer.callback: " + error.description );
					}
				}
			}
		//xmlhttp.Open( "POST", url, false, "", "" );
		xmlhttp.Open( "POST", url,  RunAtServer.callback ? true : false, "", "" );
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=US" );
		if (session.ID) {
			xmlhttp.setRequestHeader("ASPSESSIONID", session.ID );
			// 30AUG2004 RFM - XPSP2 fix 
			if (session.path) xmlhttp.setRequestHeader("path", session.path );
			} 
		xmlhttp.Send( formData );
		if (RunAtServer.callback) return "";
		if (parseInt(xmlhttp.status) > 200 ) {
			alert( "RunAtServer: " + xmlhttp.status + " : " + xmlhttp.responseText);
			var errorWindow = window.open( "about:blank", "Error" )
			errorWindow.document.body.innerHTML = xmlhttp.responseText;
			}
		return xmlhttp.responseText;
		}
	catch (error) {
		window.status = ( "RunAtServer: " + command + ": " + error.description );
		}
	return "";
	}


//================================================================
// RunInFrame
//================================================================
function RunInFrame( frame, callback, command, commandParameters ) {
	var arguments = RunInFrame.arguments;
	var command = arguments[2] + "( ";
	var firstParameter = 3;
	var pageURL = top[frame].document.location.href;
	pageURL = (pageURL.indexOf("?") > -1 ? pageURL.substring( 0, pageURL.indexOf("?")) : pageURL);
	for (argument=firstParameter; argument<arguments.length; argument++) {
		if (argument > firstParameter) command += ",";
		switch (typeof arguments[argument]) {
			case "string":
			case "date":
				command += "\"" + arguments[argument].replace( /\"/g, "\\\"") + "\"";
				break;
			default:
				command += arguments[argument];
			}
		}
	command += " )";
	pageURL += "?execute=" + escape( command  ) + "&callback=" + callback;
	top[frame].document.location.href = pageURL;
	}


//================================================================
// AddElementToForm
//================================================================
function AddElementToForm( form, elementName, elementValue ) {
	if (!form) form = document.forms[0];
	var newElement = document.createElement("INPUT");
	if (newElement) {
		newElement.type = "HIDDEN";
		newElement.value = elementValue;
		newElement.name = elementName;
		form.elements.appendChild(newElement);
		}	
	}


//================================================================
// EncodeQueryStringCharacters
// Must encode all special query string characters as HTML
// before sending over the wire otherwise they get stripped!!!
//================================================================
function EncodeQueryStringCharacters(text) {
	text = text.replace( /\+/g, "%2B" );
	//text = text.replace( /\=/g, "%3D" );
	//text = text.replace( /\(/g, "%28" );
	//text = text.replace( /\)/g, "%29" );
	//text = text.replace( /\&/g, "%26" );
	//text = text.replace( /\?/g, "%3F" );
	return text;
	}



//================================================================
// FormDataToQueryString
//================================================================
function FormDataToQueryString( form ) {
	try {
		var formData = "";
		if (!form) form = document.forms[0];
		for (var element=0; element< form.elements.length; element++) {
			if (form.elements[element].name) {
				var dataValue = "";
				var includeItem = true;
				var formElement = form.elements[element];
				// Check required for Netscape since tagName isn't valid
				if (formElement.type.indexOf( "select" ) == 0) {
					if (formElement.selectedIndex > -1) { 
						dataValue = formElement.options[ formElement.selectedIndex ].value;
						}
					}
				else {
					if (formElement.type == "checkbox" || formElement.type == "radio") includeItem = formElement.checked;
					dataValue = formElement.value;
					}
				if (includeItem) {
					if (formData.indexOf(formElement.name + "=") == -1) { 
						if (formData.length > 0) formData += "&";		
						formData += formElement.name + "=" + EncodeQueryStringCharacters( escape( dataValue ) );
						}
					else {
						formData = formData.replace( formElement.name + "=",  formElement.name + "=" + EncodeQueryStringCharacters( escape( dataValue ) + "," ) );
						}
					}
				}
			}
		return formData;
		}
	catch (error) {
		alert( "FormDataToQueryString: " + error.description  );
		}
	return "";
	}


//================================================================
// PostForm
// To Post thr form data to page within a frame set, pass url as
// frame:<url>:<name>:<callback> where "callback" is teh name of a routine
// to execute once the frame has completed loading. It will be passed
// the data loaded into the frame.
//================================================================
function PostForm( form, url, command ) {
	try {
		var formData = "";
		if (!form) form = document.forms[0];
		if (!url) url = form.action;
		if (form.onsubmit) form.onsubmit();
		formData = FormDataToQueryString( form );
		if (command) {
			var arguments = PostForm.arguments
			var firstParameter = 3;
			var command = arguments[firstParameter-1] + "( ";
			for (argument=firstParameter; argument<arguments.length; argument++) {
				if (argument > firstParameter) command += ",";
				switch (typeof arguments[argument]) {
					case "string":
					case "date":
						command += "\"" + arguments[argument] + "\"";
						break;
					default:
						command += arguments[argument];
						}
				}
			command += " )";
			formData += "&execute=" + escape( command );
			}
		if (url.match( /frame:/gi) ) {
			var frameInfo = url.split( ":");
			var pageURL = "http:" + frameInfo[2] + "?callback=" + frameInfo[4] + "&" + formData;
			top[frameInfo[3]].document.location.href = pageURL;
			}
		else {
			// 13JUN2009 RFM - Cross-platform 
			//var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			var xmlhttp = GetXmlHTTP();
			xmlhttp.Open( "POST", url, false, "", "" );
			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=US" );
			xmlhttp.Send(formData);
			if (parseInt(xmlhttp.status) > 200 ) {
				alert(xmlhttp.responseText);
				}
			return xmlhttp.responseText;
			}
		}
	catch (error) {
		alert( "PostForm: " + error.description  );
		}
	}


