function AjaxRequest($requestURL, $responseFunction, $responseArguments, $delayTime) {
	if($delayTime === undefined || $delayTime < 10) {
		$delayTime = 700;
	}
	
	this.requestURL = $requestURL;
	this.responseFunction = $responseFunction;
	this.responseArguments = $responseArguments;
	this.delayTime = $delayTime;
	
	this.timeoutObject = null;
	this.httpRequestObj = null;
	
	this.constructor = 'AjaxRequest';
}


AjaxRequest.prototype.getHTTPObject = function() {
	var ro;
	var browser = navigator.appName;
	
	if(browser == "Microsoft Internet Explorer") {
		ro = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		ro = new XMLHttpRequest();
	}
	
	//alert('test1' + this.constructor);
	
	//alert('test2' + ro.constructor);
	
	this.httpRequestObj = ro;
	
	//alert('test3' + this.httpRequestObj.constructor);
	
	//alert('test4' + this.constructor);
}


AjaxRequest.prototype.sendRequest = function() {
	if(this.httpRequestObj == null) {
		//this.httpRequestObj = this.getHTTPObject();
		this.getHTTPObject();
		
		this.httpRequestObj.open("GET", this.requestURL, true);
		this.httpRequestObj.send(null);
		//this.httpRequestObj.onreadystatechange = this.processResponse();
		this.httpRequestObj.onreadystatechange = (function(ajaxRequestObj) {
			return function() {
				if(ajaxRequestObj.httpRequestObj.readyState == 4) {
					//alert('test1' + ajaxRequestObj.responseFunction);
					ajaxRequestObj.responseFunction(ajaxRequestObj.httpRequestObj.responseXML, ajaxRequestObj.responseArguments);
					ajaxRequestObj.httpRequestObj = null;
				}
			}
		})(this);
	}
}

/*
AjaxRequest.prototype.processResponse = function() {
	return function() {
		if(this.httpRequestObj.readyState == 4) {
			alert(this.responseFunction);
			alert(this.responseArguments);
			alert(this.httpRequestObj.responseXML);
			this.responseFunction(this.httpRequestObj.responseXML, this.responseArguments);
			this.httpRequestObj = null;
		}
	}
}*/


AjaxRequest.prototype.start = function() {
	this.cancel();
	
	var requestObj = this;
	
	this.timeoutObject = setTimeout((function($ajaxRequestObj) {
		return function() {
			//alert($ajaxRequestObj);
			$ajaxRequestObj.sendRequest();
		}
	})(requestObj), this.delayTime);
}


AjaxRequest.prototype.cancel = function() {
	if(this.timeoutObject != null) {
		clearTimeout(this.timeoutObject);
	}
}


function proccessAjaxSearchResponse($xmlResponse, $requestArguments) {
	//alert($requestArguments.constructor);
	// RESULTS DIV ID
	var $resultsDivId = $requestArguments['ajaxSearchFieldId'] + "__ResultsDiv";
	var $resultsDiv = document.getElementById($resultsDivId);
	//alert($resultsDiv);
	// HIDDEN INPUT FIELD ID
	var $hiddenFieldId = $requestArguments['ajaxSearchFieldId'];
	//var $hiddenField = document.getElementById($hiddenFieldId);
	
	var $responseNode = $xmlResponse.getElementsByTagName('response')[0];
	
	//alert($responseNode.nodeName + ': ' + $responseNode.innerHTML);
	//alert($responseNode.childNodes.length);
	
	if($responseNode && $resultsDiv) {
		// IF THE XML RESPONSE HAS AN ERROR
	 	if($responseNode.getAttribute('error') != '') {
			alert('Warning: ' + $responseNode.getAttribute('error'));
		}
		else {
			var $xmlNodeArray = $xmlResponse.getElementsByTagName('row');
			
			if($xmlNodeArray && $xmlNodeArray.length > 0) {
				//alert('got this far.');
				//alert(print_r($responseNode.childNodes));
				// FOR EVERY ITEM
				for(var $i = 0; $i < $xmlNodeArray.length; $i++) {
					//alert(print_r($xmlNodeArray[$i].nodeName));
					var $tempDiv = document.createElement('div');
					$tempDiv.innerHTML = $xmlNodeArray[$i].getAttribute('name');
					$tempDiv.className = 'ajaxResultsItem';
					
					$tempDiv.onclick = (function(hidFieldId, newValue, newText) {
						return function() {
							document.getElementById(hidFieldId).value = newValue;
							document.getElementById(hidFieldId + '__SearchField').value = newText;
							
							this.parentNode.style.display = 'none';
							this.parentNode.innerHTML = '';
						}
					})($hiddenFieldId, $xmlNodeArray[$i].getAttribute('id'), $xmlNodeArray[$i].getAttribute('name'));
					
					$tempDiv.onmouseover = (function(divObj) {
						return function() {
							divObj.className = 'ajaxResultsItemOver';
						}
					})($tempDiv);
					
					$tempDiv.onmouseout = (function(divObj) {
						return function() {
							divObj.className = 'ajaxResultsItem';
						}
					})($tempDiv);
					
					$resultsDiv.appendChild($tempDiv);
				}
				
				$resultsDiv.style.display='block';
				//alert('visible: ' + $resultsDiv.style.display);
			}
		}
	}
}


