
// Original JavaScript code by Chirp Internet: www.chirp.com.au
// Please acknowledge use of this code by including this header.
//	http://www.the-art-of-web.com/javascript/ajax-race-condition/

function nop() { ; }

function AjaxRequest() {
var req;
var method = "GET";
var nocache = false;

// define public methods

this.loadXMLDoc = function(url, params) {
	if ( window.XMLHttpRequest ) {
		try {
			req = new XMLHttpRequest();
			} 
		catch(e) {
			req = false;
			}
		}
	else
	if ( window.ActiveXObject ) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
			}
		catch(e) {
			try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
				} 
			catch(e) {
				req = false;
				}
			}
		}

	if ( req ) {
		req.onreadystatechange = processReqChange;
		if ( nocache ) 
			params += (params != '') ? '&amp;'+(new Date()).getTime() : (new Date()).getTime();

		if( method == "POST") {
			req.open("POST", url, true);
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.overrideMimeType('text/xml');
			req.send(params);
			}
		else {
			req.open(method, url + '?' + params, true);
			req.overrideMimeType('text/xml');
			req.send(null);
   			}
		return true;
		}
	return false;
	}

this.setMethod = function(newmethod) { 
	method = newmethod.toUpperCase(); 
	}

this.nocache = function() { 
	nocache = true; 
	}

this.endfunction = function($funch) {
	if ( $funch ) 
		endfunction = $funch;
	else
		endfunction = nop;
	}

this.endfunction_arg = function($this) {
	if ( $this ) 
		endfunction_arg = $this;
	else
		endfunction_arg = false;
	}

// define private methods

var getNodeValue = function(parent, tagName) {
	var node = parent.getElementsByTagName(tagName)[0];
	return (node && node.firstChild) ? node.firstChild.nodeValue : null;
	}

var processReqChange = function() {

	if ( req.readyState == 4 && req.status == 200 ) {	
		var response  = req.responseXML.documentElement;
		var commands = response.getElementsByTagName('command');
		for( var i=0; i < commands.length; i++) {
			method = commands[i].getAttribute('method');
			switch ( method ) {
			case 'alert':
				var message = getNodeValue(commands[i], 'message');
				window.alert(message);
			break;
			case 'setvalue':
				var target = getNodeValue(commands[i], 'target');
				var value = getNodeValue(commands[i], 'value');
//	if ( !document.getElementById(target) )	alert(" setvalue target " + target + " == null value = "+value);
//	if ( target == "msg" ) alert(" msg size "+value.length );
				if ( document.getElementById(target) )
					document.getElementById(target).value = (value != null) ? value : '';
			break;
			case 'setdefault':
				var target = getNodeValue(commands[i], 'target');
//	if ( !document.getElementById(target) ) alert(" setdefault target " + target + " == null ");
				if ( document.getElementById(target) )
					document.getElementById(target).value = document.getElementById(target).defaultValue;
			break;
			case 'focus':
				var target = getNodeValue(commands[i], 'target');
//	if ( !document.getElementById(target) ) alert(" focus target " + target + " == null ");
				if ( document.getElementById(target) )
					document.getElementById(target).focus();
			break;
			case 'blur':
				var target = getNodeValue(commands[i], 'target');
//	if ( !document.getElementById(target) ) alert(" blur target " + target + " == null ");
				if ( document.getElementById(target) )
					document.getElementById(target).blur();
			break;
			case 'setcontent':
				var target = getNodeValue(commands[i], 'target');
				var content = getNodeValue(commands[i], 'content');
//	if ( !document.getElementById(target) ) alert(" setcontent target " + target + " == null content = "+content);
				if ( document.getElementById(target) )
					document.getElementById(target).innerHTML = (content != null) ? content : '';
			break;
			case 'setstyle':
				var target = getNodeValue(commands[i], 'target');
				var property = getNodeValue(commands[i], 'property');
				var value = getNodeValue(commands[i], 'value');
//	if ( !document.getElementById(target) ) alert(" setstyle target " + target + " == null property = "+property);
				if ( document.getElementById(target) && property && value )
					document.getElementById(target).style[property] = value;
				break;
			case 'setproperty':
				var target = getNodeValue(commands[i], 'target');
				var property = getNodeValue(commands[i], 'property');
				var value = getNodeValue(commands[i], 'value');
//	if ( !document.getElementById(target) ) alert(" setproperty target " + target + " == null ");
				if ( value == "true" ) value = true;
				if ( value == "false" ) value = false;
				if ( document.getElementById(target) )
					document.getElementById(target)[property] = value;
			break;
			case 'reload':
				window.location.reload();
			break;
			default:
				alert(" - Error: unrecognised method '" + method + "' in processReqChange()");
			break;
				}	//	switch ( method )
			}	//	for( var i=0; i < commands.length; i++)
		//	Do next function.??
		if ( !(endfunction===undefined) ) endfunction(endfunction_arg);
		}	//	if ( req.readyState == 4 && req.status == 200 )
	}	//	var processReqChange = function()

}	//	function AjaxRequest()

