	var XHR = new xHttpRequest();
	
	function dataContainer(id, callbackFunction) {
		this.id = id;
		if (callbackFunction) {
			this.callbackFunction = callbackFunction;
		}
	}


	function ajaxCall(url, destinationId, callbackFunction) {
		ajaxCallPost(url, destinationId, callbackFunction);
	}
	
	function ajaxCallGet(url, destinationId, callbackFunction) {
		try {
			var dataObj = new dataContainer(destinationId, callbackFunction);
			var XHRinstance = new xHttpRequest();
			XHRinstance.send('GET', url, '', 30000, 'rnd', false, dataObj, afterAjaxDefault);
			XHRinstance = null;
		} catch (err) {
			showError(destinationId);
			throw err;
		}
	}

	function ajaxCallPost(url, destinationId, callbackFunction) {
		try {
			var dataObj = new dataContainer(destinationId, callbackFunction);
			var XHRinstance = new xHttpRequest();
			XHRinstance.send('POST', url, '', 30000, 'rnd', false, dataObj, afterAjaxDefault);
			XHRinstance = null;
		} catch (err) {
			showError(destinationId);
			throw err;
		}
	}
	
	function ajaxPostForm(id, destinationId, callbackFunction, query) {
		try {
			var params = '';
			if (query) {
				params = query;
			}
			
			var formElement = xGetElementById(id);
			var inputElements = xGetElementsByTagName('input', formElement);
			for (i = 0; i < inputElements.length; i = i + 1) {
				var inputElement = inputElements[i];
				if (inputElement.type) {
					if (inputElement.type == 'radio' || inputElement.type == 'checkbox') {
						if (inputElement.checked) {
							params = addElementToQuery(params, inputElement);
						}
					}
					else if (inputElement.type == 'button' || inputElement.type == 'submit') {
						// Ignore the buttons
					}
					else {
						params = addElementToQuery(params, inputElement);
					}
				}
			}
			
			var textareas = xGetElementsByTagName('textarea', formElement);
			for (i = 0; i < textareas.length; i = i + 1) {
				var textarea = textareas[i];
				params = addElementToQuery(params, textarea);
			}
			var selectElements = xGetElementsByTagName('select', formElement);
			for (i = 0; i < selectElements.length; i = i + 1) {
				var selectElement = selectElements[i];
				params = addElementToQuery(params, selectElement);
			}
			// alert("Query: " + params);
			
			var dataObj = new dataContainer(destinationId, callbackFunction);
			var XHRinstance = new xHttpRequest();
			XHRinstance.send('POST', formElement.action, params, 30000, 'rnd', false, dataObj, afterAjaxDefault);
			XHRinstance = null;
		} catch (err) {
			showError(destinationId);
			throw err;
		}
	}

   	function afterAjaxDefault(req, status, obj) {
   		onResponse(req, status, obj);
		executeJavascript(obj.id);
		if (obj.callbackFunction) {
			obj.callbackFunction();
		}
   	}
	
	function showError(destinationId) {
		var destination = xGetElementById(destinationId);
		destination.innerHTML = 'Data temporarily not available';
	}
			
	function addElementToQuery(params, element) {
		if (element.id || element.name) {
			if (params.length > 0) {
				params += "&";
			}
			if (element.name) {
				params += element.name;
			}
			else {
				params += element.id;
			}
			params += "=";
			params += escape(element.value);
		}
		return params;
	}
	
	function onResponse(req, status, obj) {
		// 401 is the HTTP Status Code for UNAUTHORIZED access.
		var s = '';
		if (status == XHR.OK) {
			s = req.responseText;
		}
		else {
			if (status & XHR.TIMEOUT) {
				s = '<p>Timeout Error<\/p>';
			}
			if (status & XHR.NOXMLCT) {
				s = '<p>XML content-type expected but received: ' + req.getResponseHeader('Content-Type') + '<\/p>';
			}
			if (status & XHR.RSPERR) {
				s = req.responseText;
			}
		}
		
		if (xGetElementById(obj.id)) {
			xGetElementById(obj.id).innerHTML = s;
		}
	}
	
	function executeJavascript(elementId) {
		var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
		var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
		var bMoz = (navigator.appName == 'Netscape');

		var scriptFiles = xGetElementsByTagName("script", xGetElementById(elementId));
		if (scriptFiles) {
			for (var scriptKey in scriptFiles) {
				if (scriptFiles[scriptKey] && scriptFiles[scriptKey].innerHTML) {
					// Evaluates ad hoc scripting (IE only does this part.
					try {
						eval(scriptFiles[scriptKey].innerHTML);
					} catch( err ) {
						// Fix for Norton Internet Security. NIS tries to insert some javascript code with SymError or SymOnLoad in it. We ignore errors from that code.
						if (scriptFiles[scriptKey].innerHTML.indexOf('SymError') == -1 && scriptFiles[scriptKey].innerHTML.indexOf('SymOnLoad') == -1) {
							throw err;
						}
					}
					
					// Process function definitions and ad hoc scripting
					var newScript = document.createElement('script');
					newScript.type = 'text/javascript';
					if ((bSaf) || (bOpera) || (bMoz)) {
						newScript.innerHTML = scriptFiles[scriptKey].innerHTML;
					}
					else {
						/* In IE we must use .text! */
						newScript.text = scriptFiles[scriptKey].innerHTML;
					}
					var headID = xGetElementsByTagName("head")[0];
					headID.appendChild(newScript);
				}
			}
		}
	}


	
