//All the AJAX functionality
function mtiAjax(_divResults, objGMaps ) {
//OPTIONS
	var _searchPageURL = "search.php"; 
	
//NODES TO PARSE FROM RESPONSE INTO A RESULT HASH
	var _arrParseNodes = new Array('facility_name','address','city','county','zipcode', 'lat', 'lon', 'services', 'website','email', 'contact_first', 'contact_last');


//Constructor
	setMaxSites(this);
//public:
	this.getCountyHits = function (elemTBODY) {
		var xmlHttp = createXmlHttp();
		if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {
			xmlHttp.open('GET',_searchPageURL+'?q="q1=1"&options="literal_query"');
			xmlHttp.onreadystatechange =
				function () {
					if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {

						var objXml = xmlHttp.responseXML;
						var countyXML = objXml.getElementsByTagName('county');
						var countyHash = new Array();	//holds number of hits in each county
						var countyNames = new Array();

						//create an array of county names, and a hash indexed by county w/ the number of hits
						for (var i=0; i < countyXML.length; i++) {
							try {
								//set 'county' to look like 'County'
								var sCounty = countyXML.item(i).firstChild.data.substr(0,1).toUpperCase() + countyXML.item(i).firstChild.data.substr(1).toLowerCase();
								if (isNaN(countyHash[sCounty])) {
									countyHash[sCounty] = 0;
								}
								countyHash[sCounty] = 1 + parseInt(countyHash[sCounty]);

							if (!strInArray(sCounty, countyNames)) {
									countyNames.push(sCounty);
								}
							} catch (e) {}
						}

						countyNames = countyNames.sort();	//alphabetize
						//append the results to the table
						var tbody = document.createElement("tbody");
						for(var i=0; i< countyNames.length; i++) {
							var nHits = countyHash[countyNames[i]];

							var tr = document.createElement("tr");
							var tdName = document.createElement("td");
							var aCountyLink = document.createElement("a");
							var tdHits = document.createElement("td");

							aCountyLink.setAttribute("href", "javascript:handleMenuSel('cnty_"+countyNames[i]+"')");
							aCountyLink.innerHTML = countyNames[i];
							tdName.appendChild(aCountyLink);

							tdHits.setAttribute("className", "hit");
							tdHits.setAttribute("align", "right");

							tdHits.setAttribute("class", "hit");
							tdHits.innerHTML = (nHits == 1) ? (nHits + " site."): (nHits + " sites.");

							tr.appendChild(tdName);
							tr.appendChild(tdHits);
							elemTBODY.appendChild(tr);
						}
					}
				}
			xmlHttp.send(null);
		}
	}
	this.getServiceHits = function (sService, elemTR)  {	//service hits are appended to elemTR
		var xmlHttp = createXmlHttp();
		if (xmlHttp.readyState == 4 || xmlHttp.readyState ==0 ) {
			xmlHttp.open('GET', _searchPageURL+"?q='" + sService + "=1'&options='literal_query'");	
			xmlHttp.onreadystatechange = 
				function () {	//RESPONSE HANDLER
					if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
						
						var objXml = xmlHttp.responseXML;
						var nHits = objXml.getElementsByTagName('site').length
						
						var tdServiceHits = document.createElement("td");
						tdServiceHits.setAttribute("className", "hit");
						tdServiceHits.setAttribute("class", "hit");
						tdServiceHits.innerHTML = (nHits ==1) ? (nHits + " site.") : (nHits + " sites.");
						elemTR.appendChild(tdServiceHits);
				}
			}
			xmlHttp.send(null);
		}
	}

	this.doSimpleQuery = function(sQuery) {
		var xmlHttp = createXmlHttp();
		if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {
			xmlHttp.open('GET', _searchPageURL+'?q="'+sQuery+'"&gc=1&options="literal_query"');
			objGMaps.mapLoading(true);
			showResultsLoading();
			m_bIsLoading = true;
			xmlHttp.onreadystatechange =
				function () {	//RESPONSE HANDLER
					if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
						var arrResults = createResultHash(xmlHttp.responseXML.documentElement, 'site');
						showResultsHash(arrResults);
						objGMaps.plotArray(arrResults);
						m_bIsLoading = false;
						objGMaps.mapLoading(false);
					}
				}
			xmlHttp.send(null);
		}
	};
	this.doTextQuery = function (sQuery, arrOptions)	{
		var xmlHttp = createXmlHttp();
		if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {
			xmlHttp.open('GET', _searchPageURL+'?q="'+sQuery+'"&gc=1&options="'+optionsArrToStr(arrOptions)+'"');
			objGMaps.mapLoading(true);
			showResultsLoading();
			m_bIsLoading = true;
			xmlHttp.onreadystatechange =
				function () {
					if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
						var arrResults = createResultHash(xmlHttp.responseXML.documentElement, 'site');
						showResultsHash(arrResults);
						objGMaps.plotArray(arrResults);
						m_bIsLoading = false;
						objGMaps.mapLoading(false);
					}
				}
			xmlHttp.send(null);
		}
	}

	this.getMaxSites = function() { return m_nMaxSites; }	//returns total number of sites using telemedicine = SQL 'where q1 = true'
	this.isLoading = function () { return m_bIsLoading;	}

/*--------------------------------------------*/
//private:
var m_nMaxSites=0;
var m_bIsLoading = false;

function createResultHash(docElement, sTopNode) {
	var	arrResults = new Array;
	var arrChildNodeNames = new Array;

	nFound = docElement.getElementsByTagName(sTopNode).length;	//TOPNODE

	if (nFound == 0) {
		return 0;
	} else {
		for (var i=0; i < nFound; i++) {
			var hash = new Object();
			for (var n=0; n < _arrParseNodes.length; n++) {

				var tagArr = docElement.getElementsByTagName(_arrParseNodes[n]);

				try { hash[_arrParseNodes[n]] = tagArr.item(i).firstChild.data; }
				catch (e) { hash[_arrParseNodes[n]] = '';}	//assign null if no data received
			}
			arrResults[i] = hash;	//write all leaf values to main array
		}
	}

	//results can now be accessed like arrResults[14]['facility_name'] where 14 is record index, index starts at 0
	return arrResults;
}

function createXmlHttp() {
		var objRequest = null;
		if (window.XMLHttpRequest) {
			objRequest = new XMLHttpRequest();
		}
		else {
			//IE
			try {objRequest = new ActiveXObject('Msxml2.XMLHTTP'); }
			catch (e) {
				try {objRequest = new ActiveXObject('Microsoft.XMLHTTP'); }
					catch (e) {objRequest = false;}
			}
		}
		return objRequest;
	}
function optionsArrToStr(arrOptions) {
		var sOptions="";
		if (arrOptions.length > 1) {
			for (var i=0; i<arrOptions.length; i++) {
				sOptions = sOptions + arrOptions[i] + ",";
			}
			//trim trailing comma
			sOptions = sOptions.substring(0,(sOptions.length-1));
		} else {
			sOptions = arrOptions[0];
		}
		return sOptions;
	}
function setMaxSites(obj) {
		var xmlHttp = createXmlHttp();
		if (xmlHttp.readyState == 4 || xmlHttp.readyState ==0 ) {
			xmlHttp.open('GET', _searchPageURL+'?q=1&options="q1"');
			xmlHttp.onreadystatechange =
				function () {	//RESPONSE HANDLER
					if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
						var objXML = xmlHttp.responseXML;
						m_nMaxSites = objXML.getElementsByTagName('site').length;
					}
				}
			xmlHttp.send(null);
		}
	}
function showResultsHash(arrResults) {
		_divResults.innerHTML = "";
		
		if (!arrResults) {
			_divResults.innerHTML = "Your Search Returned No Results";
		}
		for (var i=0; i < arrResults.length; i++) {
			try {
				var resultLink = document.createElement("a");
				resultLink.setAttribute("href", "javascript:showInfo("+i+")");
				resultLink.style.display = "block";
				resultLink.style.marginTop = "10px";
				resultLink.innerHTML = arrResults[i]['facility_name'];
				_divResults.appendChild(resultLink);
			} catch (e) {}
		}
	}
function showResultsLoading() {
	_divResults.innerHTML = "<h3 class='results_loading_text'>Loading...</h3>";
}

function strInArray(sStr, arrArray) {
	var bFound = false;
	for (var i=0; i < arrArray.length; i++) {
		if (sStr == arrArray[i]) {
			bFound = true;
		}
	}
	return bFound;
}

//END mtiAJAX CLASS
}
