function SuburbAPIClass() {
	var StateList = new Array();
	var SL = new Array();

	StateList[1] = "VIC" ;
	StateList[2] = "NSW" ;
	StateList[3] = "WA" ;
	StateList[4] = "QLD" ;
	StateList[5] = "TAS" ;
	StateList[6] = "SA" ;
	StateList[7] = "ACT" ;
	StateList[8] = "NT" ;

	for (var i = 1; i <= 8; i++)
	{
		SL[i] = new Array() ;
	}


	this.SaveSuburbData = SaveSuburbData ;
	function SaveSuburbData(StID,Data) {
		SL[StID] = new Array() ;
		var D = Data.split("\n");
		for (var i in D) {
			var A = D[i].split("\t");
			SL[StID].push(Trim(A[1])) ;
		}
		SL[StID].sort() ;
	}

	this.MatchSuburb = MatchSuburb ;
	function MatchSuburb(StID,Str,Numbers) {
		Numbers = (Numbers)?Numbers:100;
		var Result = new Array() ;
		if (Str.length > 1)
		{
			if (StID) {
				if (SL[StID].length<=0)
				{
					GetSuburbSelectedList(StID);
				}
			} else {
				for (var i = 1; i <= 8; i++)
				{
					var Load = false ;
					if (SL[i].length<=0)
					{
						Load = true ;
					}
				}
				if (Load)
				{
					GetSuburbAllList();
				}
			}
			var Reg = eval("/^"+Str+"/i"); 
			var Start = (StID)?StID:1;
			var End = (StID)?StID:8;
			for (var i=Start; i<=End; i++)
			{
				for (var j=0; j<SL[i].length; j++)
				{
					if (SL[i][j].match(Reg))
					{
						Result.push(SL[i][j].toUpperCase()+", "+StateList[i]+"\t"+SL[i][j].toUpperCase()+"\t"+StateList[i]+"\t"+i);
						if (Result.length >= Numbers)
						{
							return Result.sort() ;
						}
					}
				}
			}
		}
		return Result.sort() ;
	}

	this.GetSuburbSelectedList = GetSuburbSelectedList ;
	function GetSuburbSelectedList(StID) {
		if (SL[StID].length<=0)
		{
			Req('GetSuburb',StID,'/sd_new/QuickFind/MasterSuburb_'+StID+'.txt');
		}
	}

	this.GetSuburbAllList = GetSuburbAllList ;
	function GetSuburbAllList() {
		for (var i=1; i<=8; i++)
		{
			if (SL[i].length<=0)
			{
				Req('GetSuburb',i,'/sd_new/QuickFind/MasterSuburb_'+i+'.txt');
			}
		}
	}
	

	this.Req = Req ;
	function Req(ID,StID,url) {
		var url_post = url;
		var url_send = null;
		if (url.indexOf('?')>0)
		{
			url_post = url.substring(0,url.indexOf('?'));
			url_send = url.substring(url.indexOf('?')+1);
		} else {
			url_post = url ;
			url_send = null ;
		}

		var HtReq = false;

		if (window.XMLHttpRequest) { // Mozilla, Safari,...
			HtReq = new XMLHttpRequest();
			if (HtReq.overrideMimeType) {
				HtReq.overrideMimeType('text/xml');
				// See note below about this line
			}
		} else if (window.ActiveXObject) { // IE
			try {
				HtReq = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					HtReq = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		if (!HtReq) {
			alert('Giving up :( Cannot create an XMLHTTP instance');
			return false;
		}

		HtReq.onreadystatechange = function() { 
			if (HtReq.readyState == 4) {
				if (HtReq.status == 200) {
					ReqDone(ID,StID,HtReq) ;
				} else {
					//alert('There was a problem with the data request. please refresh the page.');
				}
			}

		}
		if (url_send != null)
		{
			HtReq.open('POST', url_post, true);
			HtReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			HtReq.setRequestHeader("Content-length", url_send.length);
			HtReq.setRequestHeader("Connection", "close");
			HtReq.send(url_send);
		} else {
			HtReq.open('GET', url_post, true);
			HtReq.send(url_send);
		}
	}

	this.ReqDone = ReqDone ;
	function ReqDone(ID,StID,HtReq) {
		var Data = Trim(HtReq.responseText) ;
		if (Data) {
			if (ID == 'GetSuburb') {
				if (SL[StID].length<=0)
				{
					SaveSuburbData(StID,Data);
				}
			}
		}
	}

	this.Trim = Trim ;
	function Trim(D) {
		if (D)
		{
			var Regex ;
			Regex = /\s*$/ ;
			D = D.replace(Regex,"");
			Regex = /^\s*/ ;
			D = D.replace(Regex,"");
		}
		return D ;
	}

}
