// *******************************************************************************************************************
// ENTELLIGENCE AJAX.JS - VERSION 1.3.8
// *******************************************************************************************************************
// CREATED BY: Clive Munro
// DATE CREATED: 2007/06/24
// DATE UPDATED: 2008/08/20
// URL: http://wiki.dev.net/ow.asp?AjaxSourceCodeHiveEntelligenceInHouseAjaxFile
// *******************************************************************************************************************

// JavaScript Document
var blnDomReady = false;

function domReady() {
	blnDomReady = true;
}

window.onload = new function() {
	domReady();
}

var blnBusy = false;
function getAjaxObject() {
	var xmlhttp=false;
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	 try {
	  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	 } catch (e) {
	  try {
	   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	  } catch (E) {
	   xmlhttp = false;
	  }
	 }
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp=false;
		}
	}
	if (!xmlhttp && window.createRequest) {
		try {
			xmlhttp = window.createRequest();
		} catch (e) {
			xmlhttp=false;
		}
	}
	
	return xmlhttp;
}

function processResponse(objResponse, responseProcedure, status, checkResponseText, blnUseQueue, intWaiting) {
	try {
		if (checkResponseText && checkResponseText.indexOf('<!--LOGIN_PAGE-->') > 0){
			// Session Timed out
			top.document.location.reload();
		}
		else if (checkResponseText && checkResponseText.indexOf('<!--NO_PRIVILEGE-->') > 0){
			// No Privileges
			alert('You do not have the necessary privileges to access this area of the website!\nShould this be in error, please contact your administrator.');
		}
		else
			eval(responseProcedure + '(objResponse,status)');
	}
	catch(ex) {
		alert('An unknown error occurred.\nError: ' + ex.toString());
	}
	hideWaiting(intWaiting);
	if (blnUseQueue)
		blnBusy = false;
}

function makeAlertBoxFriendly(text) {
	var newText = text;
	newText = newText.replace(/&quot;/gi, '"');
	newText = newText.replace(/&gt;/gi, '>');
	newText = newText.replace(/&lt;/gi, '<');
	newText = newText.replace(/\s{2,}/g, ' ');
	newText = newText.replace(/<br>/gi, '\n');
	newText = newText.replace(/<br \/>/gi, '\n');
	return newText;
}

function processResponseObjects(request, response, responseProcedure, blnUseQueue, intWaiting) {
	try {
		if (response.text && response.text.indexOf('<!--LOGIN_PAGE-->') > 0){
			// Session Timed out
			top.document.location.reload();
		}
		else if (response.text && response.text.indexOf('<!--NO_PRIVILEGE-->') > 0){
			// No Privileges
			alert('You do not have the necessary privileges to access this area of the website!\nShould this be in error, please contact your administrator.');
		}
		else {
			var intPos = response.text.indexOf('textSection1');
			if (intPos >= 0) {
				intPos = response.text.indexOf('>', intPos) + 1;
				if (intPos >= 0) {
					var intEndPos = response.text.indexOf('</h1>', intPos) -1;
					if (intEndPos >= 0) {
						response.debugInfo = new Object();
						response.debugInfo.error = new Object();
						response.debugInfo.error.message = makeAlertBoxFriendly(response.text.substring(intPos, intEndPos));
						
						var intPos = response.text.indexOf('<td', intEndPos) + 4;
						if (intPos > 0) {
							intPos = response.text.indexOf('<font', intPos) + 5;
							if (intPos > 0)
								intPos = response.text.indexOf('>', intPos) + 1;
						}
						if (intPos >= 0) {
							var intEndPos = response.text.indexOf('</font>', intPos) -1;
							var strDetail = response.text.substring(intPos, intEndPos);
							strDetail = makeAlertBoxFriendly(strDetail);
							response.debugInfo.error.detail = strDetail;
						}

						var intPos = response.text.indexOf('The error occurred in', intEndPos);
						if (intPos >= 0) {
							var intEndPos = response.text.indexOf('</td>', intPos) -1;
							var strContext = makeAlertBoxFriendly(response.text.substring(intPos, intEndPos));
							strContext = strContext.replace(/<b>/g, '');
							strContext = strContext.replace(/<\/b>/g, '');
							response.debugInfo.error.context = strContext;
						}

						var intPos = response.text.indexOf('<pre>', intEndPos) + 5;
						if (intPos >= 0) {
							var intEndPos = response.text.indexOf('</pre>', intPos) -1;
							var strSnippet = response.text.substring(intPos, intEndPos);
							strSnippet = strSnippet.replace(/\n{1}/g, '<br>');
							strSnippet = makeAlertBoxFriendly(strSnippet);
							strSnippet = strSnippet.replace(/\n<b>/gi, '\n');
							strSnippet = strSnippet.replace(/<\/b>\n/gi, '\n');
							response.debugInfo.error.codeSnippet = strSnippet;
						}
					}
				}
			}
			else {
				var intPos = response.text.indexOf('_ERROR_MESSAGE_');
				if (intPos >= 0) {
					intPos = response.text.indexOf('>', intPos) + 1;
					if (intPos >= 0) {
						var intEndPos = response.text.indexOf('</td>', intPos);
						if (intEndPos >= 0) {
							response.debugInfo = new Object();
							response.debugInfo.error = new Object();
							response.debugInfo.error.message = makeAlertBoxFriendly(response.text.substring(intPos, intEndPos));
						}

						var intPos = response.text.indexOf('_ERROR_DESCRIPTION_');
						if (intPos >= 0) {
							intPos = response.text.indexOf('>', intPos) + 1;
							if (intPos >= 0) {
								var intEndPos = response.text.indexOf('</td>', intPos);
								if (intEndPos >= 0) {
									response.debugInfo.error.detail = makeAlertBoxFriendly(response.text.substring(intPos, intEndPos));
								}
							}
						}

						var intPos = response.text.indexOf('_ERROR_CONTEXT_');
						if (intPos >= 0) {
							intPos = response.text.indexOf('>', intPos) + 1;
							if (intPos >= 0) {
								var intEndPos = response.text.indexOf('</td>', intPos);
								if (intEndPos >= 0) {
									response.debugInfo.error.context = makeAlertBoxFriendly(response.text.substring(intPos, intEndPos));
								}
							}
						}

						var intPos = response.text.indexOf('_ERROR_SNIPPET_');
						if (intPos >= 0) {
							intPos = response.text.indexOf('>', intPos) + 1;
							if (intPos >= 0) {
								var intEndPos = response.text.indexOf('</td>', intPos);
								if (intEndPos >= 0) {
									response.debugInfo.error.codeSnippet = makeAlertBoxFriendly(response.text.substring(intPos, intEndPos));
								}
							}
						}
					}
				}
			}
			eval(responseProcedure + '(request,response)');
		}
	}
	catch(ex) {
		alert('An unknown error occurred.\nError: ' + ex.toString());
	}
	hideWaiting(intWaiting);
	if (blnUseQueue)
		blnBusy = false;
}

function getURL(URL, responseProcedure, blnReturnXML, blnReturnObjects, blnUseQueue) {
	if (typeof blnUseQueue == 'undefined')
		blnUseQueue = true;
		
	if (!blnBusy || !blnUseQueue) {
		if (blnUseQueue)
			blnBusy = true;
			
		var intWaiting = parseInt(Math.random() * 1000);
		
		showWaiting(intWaiting);
		var xmlhttp = getAjaxObject();
		
		if (!xmlhttp) {
			processResponse('<div class="alert">An unknown error occurred.</div>', responseProcedure);
			return false;	
		}
		
		var cachekiller = Math.random() * 2147483647;
		
		var request = new Object();
		request.page = parsePage(URL);
		request.queryData = parseQueryData(URL);
		var response = new Object();

		xmlhttp.open("GET", URL + '&' + cachekiller,true);
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				if (blnReturnXML)
					response.data = xmlhttp.responseXML;
				else
					response.data = xmlhttp.responseText;

				response.text = xmlhttp.responseText;
				response.status = new Object();
				response.status.code = xmlhttp.status;
				response.status.text = xmlhttp.statusText;

				if (blnReturnObjects)
					processResponseObjects(request, response, responseProcedure, blnUseQueue, intWaiting);
				else 
					processResponse(response.data, responseProcedure, response.status.code, response.text, blnUseQueue, intWaiting);
			}
		}
		xmlhttp.send(null)
	}
	else {
		if (typeof blnReturnXML == 'undefined')
			blnReturnXML = false;
			
		setTimeout('getURL(\'' + URL.replace(/'/g,'\'') + '\',\'' + responseProcedure + '\', ' + blnReturnXML + ', ' + blnReturnObjects + ');', 10);
	}
}

function postURL(URL, FormVars, responseProcedure, blnReturnXML, blnReturnObjects, blnUseQueue) {
	if (typeof blnUseQueue == 'undefined')
		blnUseQueue = true;
		
	if (!blnBusy) {
		if (blnUseQueue)
			blnBusy = true;
		
		var intWaiting = parseInt(Math.random() * 1000);
		
		showWaiting(intWaiting);
		var xmlhttp = getAjaxObject();
		
		if (!xmlhttp) {
			processResponse('<div class="alert">An unknown error occurred.</div>', responseProcedure);
			return false;	
		}
		
		var cachekiller = Math.random() * 2147483647;
		
		var request = new Object();
		request.page = parsePage(URL);
		request.queryData = parseQueryData(URL);
		request.formData = FormVars;
		var response = new Object();

		xmlhttp.open("POST", URL + '&' + cachekiller,true);
	
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", FormVars.length);
		xmlhttp.setRequestHeader("Connection", "close");
	
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				if (blnReturnXML)
					response.data = xmlhttp.responseXML;
				else
					response.data = xmlhttp.responseText;

				response.text = xmlhttp.responseText;
				response.status = new Object();
				response.status.code = xmlhttp.status;
				response.status.text = xmlhttp.statusText;

				if (blnReturnObjects)
					processResponseObjects(request, response, responseProcedure, blnUseQueue, intWaiting);
				else 
					processResponse(response.data, responseProcedure, response.status.code, response.text, blnUseQueue, intWaiting);
			}
		}
		xmlhttp.send(FormVars)
	}
	else {
		if (typeof blnReturnXML == 'undefined')
			blnReturnXML = false;
			
		setTimeout('postURL(\'' + URL.replace(/'/g,'\'') + '\', \'' + FormVars.replace(/'/g,'\'') + '\',\'' + responseProcedure + '\', ' + blnReturnXML + ', ' + blnReturnObjects + ');', 10);
	}
}

var arrForms = new Array();
function postFORM(FORM, responseProcedure, blnReturnXML, blnReturnObjects, blnUseQueue) {
	if (typeof blnUseQueue == 'undefined')
		blnUseQueue = true;
		
	var i = arrForms.length;		
	if (typeof FORM != 'object') {
		i = FORM;
		FORM = arrForms[i];
	}

	if (!blnBusy) {
		if (blnUseQueue)
			blnBusy = true;
		
		var intWaiting = parseInt(Math.random() * 1000);
		
		showWaiting(intWaiting);
		var xmlhttp = getAjaxObject();
		
		if (!xmlhttp) {
			processResponse('<div class="alert">An unknown error occurred.</div>', responseProcedure);
			return false;	
		}
		
		var cachekiller = Math.random() * 2147483647;
		var FormVars = getFormVars(FORM);

		var request = new Object();
		request.page = parsePage(FORM.action);
		request.queryData = parseQueryData(FORM.action);
		request.formData = FormVars;
		var response = new Object();
		
		xmlhttp.open("POST", FORM.action + '&' + cachekiller,true);

		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", FormVars.length);
		xmlhttp.setRequestHeader("Connection", "close");
	
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				if (blnReturnXML)
					response.data = xmlhttp.responseXML;
				else
					response.data = xmlhttp.responseText;

				response.text = xmlhttp.responseText;
				response.status = new Object();
				response.status.code = xmlhttp.status;
				response.status.text = xmlhttp.statusText;

				if (blnReturnObjects)
					processResponseObjects(request, response, responseProcedure, blnUseQueue, intWaiting);
				else 
					processResponse(response.data, responseProcedure, response.status.code, response.text, blnUseQueue, intWaiting);
			}
		}
		xmlhttp.send(FormVars)
	}
	else {
		if (typeof blnReturnXML == 'undefined')
			blnReturnXML = false;
		
		arrForms[i] = FORM;
		setTimeout('postFORM(' + i + ',\'' + responseProcedure + '\', ' + blnReturnXML + ', ' + blnReturnObjects + ');', 10);
	}
}

function getVariableFromString(lstVariables, strVariable) {
	var arrVariables = lstVariables.split('&');
	var arrTemp;
	
	for (var i = 0; i < arrVariables.length; i++) {
		arrTemp = arrVariables[i].split('=');
		if (strVariable == arrTemp[0])
			return arrTemp[1];
	}

	return '';
}

//!!!!!!!!!!!!!!!!!! PRIVATE FUNCTIONS !!!!!!!!!!!!!!!!!!!!!!!!
function parsePage(URL) {
	var intPos = URL.indexOf('/');
	var intPos2 = URL.indexOf('?');
	if (intPos2 < intPos)

		intPos = intPos2;
	return URL.substring(intPos, intPos2);
}
function parseQueryData(URL) {
	var intPos = URL.indexOf('?');
	if (intPos >= 0)
		return URL.substring(intPos + 1, URL.length);
	else
		return '';
}

function addFormVariable(arrFormVars, name, value) { 
	//var blnFound = false;
	if (arrFormVars[0])
		var i = arrFormVars.length;
	else
		var i = 0;
		
	/*
	for (var k = 0; k < arrFormVars.length; k++) {
		if (arrFormVars[k])
			if (arrFormVars[k].substring(0, name.length + 1) == name + '=')
				blnFound = true;
	}
	if (!blnFound) {*/
		arrFormVars[i] = name + '=' + escape(value).replace(/\//g,'%2F');
	//}
}

function processFormVariable(arrFormVars, objFormField) {
	if (objFormField.tagName == 'INPUT' || objFormField.tagName == 'SELECT' || objFormField.tagName == 'TEXTAREA') {
		switch (objFormField.type) {
			case 'radio': {
				if (objFormField.checked)
					addFormVariable(arrFormVars, objFormField.name, objFormField.value);
				break;
			}
			case 'checkbox': {
				if (objFormField.checked)
					addFormVariable(arrFormVars, objFormField.name, objFormField.value);
				break;
			}
			case 'select-multiple': {
				for (var i = 0; i < objFormField.options.length; i++) {
					if (objFormField.options[i].selected)
						addFormVariable(arrFormVars, objFormField.name, objFormField.options[i].value);
				}
				break;
			}
			default: {
				addFormVariable(arrFormVars, objFormField.name, objFormField.value);
				break;
			}
		}
	}
}

function getFormVars(objForm) {
	var arrFormVars = new Array(1);
	var strExtraURLVars = '';
	for (var l = 0; l < objForm.elements.length; l++) {
		if (objForm.elements[l]) {
			objField = objForm.elements[l];
			if (typeof objField != 'undefined' && typeof objField != 'function' && objField != null)
				if (typeof objField.tagName != 'undefined') 
					processFormVariable(arrFormVars, objField);
				else if (typeof objField.length != 'undefined') {
					if (typeof objField.nodeName == 'undefined')
						for (j = 0; j < objField.length; j++) {
							if (typeof objField[j].tagName != 'undefined')
								processFormVariable(arrFormVars, objField[j]);
						}
				}
		}
	}
	
	return arrFormVars.join('&');
}

var objImgPreload = new Image();
objImgPreload.src = "images/aniwait.gif";

var ypos=0; var xpos=0;
ns=(!document.all); 
ie=(document.all); 

function Mouse(evnt) {
	ypos = (!document.all)?evnt.pageY:event.y;
	xpos = (!document.all)?evnt.pageX:event.x; 
} 

if (ns)
	document.captureEvents(Event.MOUSEMOVE);
if (ns)
	window.onmousemove=Mouse; 
if (ie)
	document.onmousemove=Mouse; 

function MoveTheDiv(objDiv){
	if (document.all) {
		objDiv.style.top=document.documentElement.scrollTop + ypos + 15 + 'px';
		objDiv.style.left=document.documentElement.scrollLeft + xpos + 15 + 'px'; 
	}
	else {
		objDiv.style.top=ypos + 15 + 'px';
		objDiv.style.left=xpos + 15 + 'px'; 
	}
} 

function followCursor(id) {
	var objWaitingDiv = document.getElementById('divWaiting' + id);
	if (objWaitingDiv) {
		MoveTheDiv(objWaitingDiv);
		if (objWaitingDiv.style.display != 'none')
			setTimeout('followCursor(' + id + ');', 10);
	}
}

//var process = '';
function showWaiting(id) {
	//process += 'show_' + id + '\n';
	if (navigator.platform != 'WinCE') {
		var objDiv = document.createElement('div');
		objDiv.id = 'divWaiting' + id;
		objDiv.style.position = 'absolute';
		objDiv.style.top = '0px';
		objDiv.style.left = '0px';
		objDiv.style.width = '100px';
		objDiv.style.height = '30px';
		objDiv.style.display = 'block';
		objDiv.style.fontSize = '10px';
		objDiv.style.color = '#555555';
		objDiv.style.fontFamily = 'Arial';
		objDiv.innerHTML = '<img src="images/aniwait.gif" width="16" height="16" align="absmiddle" hspace="1" />Please wait!!';
		objDiv.onfocus = Mouse;
		if (blnDomReady) {
			var objParentDiv = document.getElementById('ajaxWaitingLogo');
			if (objParentDiv)
				objParentDiv.appendChild(objDiv);
			else
				document.getElementsByTagName('body').item(0).appendChild(objDiv);

			setTimeout('followCursor(' + id + ');', 10);
		}
	}
}

function hideWaiting(id) {
	if (navigator.platform != 'WinCE') {
		//process += 'hide_' + id + '\n';
		var objWaitingDiv = document.getElementById('divWaiting' + id);
		while (objWaitingDiv) {
			var objParentDiv = document.getElementById('ajaxWaitingLogo');
			if (objParentDiv)
				objParentDiv.removeChild(objWaitingDiv);
			else
				document.body.removeChild(objWaitingDiv);
				
			var objParentDiv = document.getElementById('ajaxWaitingLogo');
			objWaitingDiv = document.getElementById('divWaiting' + id);
		}
		/*objDebug = document.getElementById('divDebug');
		if (objDebug)
			objDebug.innerHTML = '<textarea cols="50" rows="4">' + process + '</textarea>';*/
	}
}

function getErrorTextFromStatus(status) {
	switch (status) {
		case '500': {
			return 'Internal Server Error';
		}
		case '404': {
			return 'Not Found';
		}
	}
}
