// AJAXEVENT CLASS START

//constructor
function AjaxEvent(id, url, callback, method, params, onError)
{
	if (!method)
		method = 'GET';
	
	this.id = id;
	this.method = method;
	this.url = url;
	this.HTTPObject = null;
	this.callback = callback;	
	this.isWorking = false;
	this.params = params;
	this.onError = onError;	
}


AjaxEvent.eventList = new Array();

AjaxEvent.trafficManager = function(eventObj) {
	
	// abort any existing outstanding duplicate requests
	if (eventObj.id  && AjaxEvent.eventList[eventObj.id] && AjaxEvent.eventList[eventObj.id].isWorking) {
		//alert("WARNING: aborting duplicate request " + eventObj.id);
		AjaxEvent.eventList[eventObj.id].HTTPObject.abort();
	}	

	// now save off current event, overwriting any duplicate
	AjaxEvent.eventList[eventObj.id] = eventObj;

	/*
	
	var count = 0;
	var u;
	for (u in AjaxEvent.eventList) {
		if (AjaxEvent.eventList[u].isWorking)
			count++;
	}
	

	if (count > 0)
		alert(count + ' AJAX calls currently in process');
	*/

}

AjaxEvent.formatQueryString = function (args)
{
	var requestParams = new Array();
	var queryString = "";

	if (args && args.length > 0) {
		for (var i=0; i < args.length; i++) {
			queryString += args[i] + '&';
		}	
		
		//chop off last ampersand;
		queryString = queryString.substring(0, queryString.length-1);

	}
	
	return queryString;
}


//
// class method -- creates the magic Ajax HTTP object.
//
AjaxEvent.getHTTPObject = function ()
{
  var xmlhttp;
  
  /*@cc_on
  
	@if (@_jscript_version >= 5)
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (E) {
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
		
  @end @*/
  
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
			xmlhttp.overrideMimeType("text/xml"); 
		} 
		catch (e) {
			xmlhttp = false;
			alert('ERROR: Browser not supported -- Server request failed to instatiate!');
		}
	}
	
	return xmlhttp;
}


//
// Set up new Ajax call here.
//
AjaxEvent.prototype.run = function(paramsArray) 
{
	//set new params if provided
	if (paramsArray)
		this.params = paramsArray;
		
	this.HTTPObject = AjaxEvent.getHTTPObject();
		
	var _this = this;
	
	// abort any duplicate requests
	AjaxEvent.trafficManager(this);
	
	if (this.HTTPObject && !this.isWorking) {
		this.HTTPObject.onreadystatechange = function() {_this.callback();};
		this.HTTPObject.open(this.method, this.url, true);
		this.isWorking = true;
		var queryString = '';
		if (this.params)
			queryString = AjaxEvent.formatQueryString(this.params);

		//VERY IMPORTANT for params to be passed properly!!!
		this.HTTPObject.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

		this.HTTPObject.send(queryString);
	}
}


//
// HTTP response handler. Resets
// semaphore so next call can be made.
//
AjaxEvent.prototype.isComplete = function () 
{

  try {
    if (this.HTTPObject.status == 200 && this.HTTPObject.readyState == 4){
      this.isWorking = false;
      return true;
    }
	}
	catch(e) {
    //do nothing
	}
	return false;
}





// AJAXEVENT CLASS END

//
// Useful routine to extract an XML tag value when parsing results.
//
function GetElementText(element, tag) 
{
	var result = element.getElementsByTagName(tag)[0];

	try {    
		if (!result || !result.childNodes || result.childNodes.length == 0)
			return '';
			
		if (result.childNodes.length > 1)
			return result.childNodes[1].nodeValue;

		return result.firstChild.nodeValue;    		
	}
	catch(e) {
		return '';
	}
}

