/*	=======================================================================	*/
/// <remarks>
///		Copyright:	umlungu consulting (pty) ltd
///		Author:		Alan Benington	
///		Started:	2006-09-19
///		Status:		release
///		Version:	0.0.12
///		Build:		20070910
///		License:	GNU General Public License
/// </remarks>
/*	=======================================================================	*/
/// <remarks>
/// Global Variables
/// </remarks>
	var DEF_MAP = "iBurst";
	try {
		var x_mapdisplay= "off";
		var x_maptyp = DEF_MAP;
		var x_debug = false;
		var x_coverage = new ClassCoverageX(x_debug);
	} catch(e){
		alert("Error creating x_coverage: " + e.description);
	}
	
/*	=======================================================================	*/
/// <remarks>
/// Class: ClassCoverageX
/// The ClassCoverageX object class has the following purpose/function:
///	- 
/// </remarks>
/*	-----------------------------------------------------------------------	*/
/// <summary>
/// The ClassCoverageX object class is constructed as follows:
///		var thisobj = new ClassCoverageX(dbg);
/// - where:
///		- dbg:	debugging switch
/// </summary>
function ClassCoverageX(dbg) {
	/*	-------------------------------------------	*/
	/// <remarks>Region: Inherits</remarks>
	/*	-------------------------------------------	*/
	var _base = new ClassBase(dbg);	// _base allows pseudo base class
	var _RaiseError = _base.RaiseError;
	var _Debug = _base.Debug;
	/*	-------------------------------------------	*/
	/// <remarks>Region: Public properties</remarks>
	/*	-------------------------------------------	*/
	/*	-------------------------------------------	*/
	/// <remarks>Region: Private properties</remarks>
	/*	-------------------------------------------	*/
	// self allows for internal acces to property/method
	var _self = this;
	var _id = "ClassCoverageX";
	var _urlbase = "http://";
	var _href = document.location.href;
	var _host = document.location.hostname;
	var _path = document.location.pathname;
	var _srch = document.location.search;
	var _port = document.location.port;
	var _msgnrm, _msgerr, _msgtxt;
	var _mapfrm, _mapcty, _mapsub, _mapbtn, _mapfme, _map, _mapnav, _mapimg, _newimg;
	var _panup, _panrt, _pandn, _panlf, _point, _zoom_o, _zoom_i, _resett;
	var _selfrm, _selcty, _selsub, _selbtn;
	var _bot, _sch, _schfrm, _schcty, _schsub, _schbtn, _schrgn, _schstr, _schres;
	var _currid, _currscl, _currlat, _currlng;
	var _html_sch_again = "<a href='http://iburst.getwirelessinternet.co.za/coverage'>click here to search again</a>";
	var _errors = new Array (
		["error_general", "Oops", "General application error", true],
		["error_none", "Oops", "We can't find an address that matches your information. Check your spelling and try again.", true],
		["error_valid", "Please note", "We need your street address.", false],
		["error_qukvalid", "Please note", "We need your suburb name.", false]);
	var _actions = new Array ([""], 
		[485, 600, true, "https://signup.iburst.co.za/customer_retailprovisioning.aspx"], 
		[720, 600, true, "http://www.iburst.co.za/default.aspx?link=site_contact&device=screen"], 
		[720, 600, true, "http://www.iburst.co.za/default.aspx?link=site_maillist&device=screen"]);
	var _pop, _pop_name = "xPop";
	var ERR_HTTP_STATUS	= 1;
	var ERR_CUSTOM		= 2;
	var MSG_ADDRESS		= "Street address";
	var MSG_SUBURB		= "Suburb";
	var MAPIMAGE_WIDTH	= 950;
	var MAPIMAGE_HEIGHT	= 570;
	var RESIZE_WIDTH	= 32;
	var RESIZE_HEIGHT	= 110;
	var RESIZE_SCROLL	= 24;	// allowance for scrollbar width
	var RESIZE_WIDTH_MAX	= MAPIMAGE_WIDTH + RESIZE_SCROLL;
	var RESIZE_HEIGHT_MAX	= MAPIMAGE_HEIGHT + RESIZE_SCROLL;
	var DEF_MAP_SCALE	= 8000;
	var DEF_SUB_SCALE	= 10000;
	var PAN_VERTICAL	= 0.000001;
	var PAN_HORIZONTAL	= 0.000002;
	var ZOOM_FACTOR	= 2.5;
	var ACTION_APPLY = 1;
	var ACTION_CONTACT = 2;
	var ACTION_UPDATES = 3;
	var _confirmAddress = false;
	/*	-------------------------------------------	*/
	/// <remarks>Region: Accessor methods</remarks>
	/*	-------------------------------------------	*/
	this.GetID = function() { return(_id); }
	this.SetConfirm = function(confirm) { _confirmAddress = confirm; }
	/*	-------------------------------------------	*/
	/// <remarks>Region: Public methods</remarks>
	/*	-------------------------------------------	*/
	this.OnLoad = _OnLoad;
	this.Resize = _Resize;
	this.Popup = _Popup;
	this.GetRegions = _GetRegions;
	this.GetRegion = _GetRegion;
	this.GetSuburb = _GetSuburb;
	this.GetSuburbs = _GetSuburbs;
	this.GetCity = _GetCity;
	this.GetCities = _GetCities;
	this.GetAddress = _GetAddress;
	this.GetMap = _GetMap;
	this.GetSuburbMap = _GetSuburbMap;
	this.ResetSearch = _ResetSearch;
	this.Zoom = _Zoom;
	this.Pan = _Pan;
	this.Change_logo = _Change_logo;
	this.SetContact = _SetContact;
	this.SetAction = _SetAction;
	this.Action = _Action;
	this.Go = _Go;
	this.DisplayMap = _DisplayMap;
	this.UnDisplayMap = _UnDisplayMap;
	this.ResetSelect = _ResetSelect;
	this.ResetLoader = _ResetLoader;
	this.GetQukAddress	= _GetQukAddress;
	this.HideQukSearchResult  = _HideQukSearchResult;
	this.PopScroll = function(ul,wd,ht) { _popup(ul,_popset(true,false,false,true,wd,ht,false,true,true)); }
	
	/// <summary>Method:_OnLoad</summary>
	function _OnLoad(set,ula,ulc,wd,ht) {
		x_maptyp = _queryParam("maptype");
		x_maptyp = (x_maptyp)? x_maptyp : DEF_MAP;
		if (set) {
			_SetAction(ACTION_APPLY, ula, wd, ht);
			_SetAction(ACTION_CONTACT, ulc, wd, ht);
		}
		_setHover();
		_tabClick();
		getMapEls();
		setMap();
		_Resize(true);
		window.onresize = _self.Resize;
		_urlbase = _urlbase.concat(_host, (_port=="")?"":":", _port, _path.substr(0,_path.lastIndexOf("/")+1));
		_GetRegions();
	}
	/// <summary>Method:_Resize</summary>
	function _Resize(setscroll) {
		var ht = getPageWH(false) - RESIZE_HEIGHT;
		var wd = getPageWH(true) - RESIZE_WIDTH;
		ht = (ht > RESIZE_HEIGHT_MAX)? RESIZE_HEIGHT_MAX : ht;
		wd = (wd > RESIZE_WIDTH_MAX)? RESIZE_WIDTH_MAX : wd;
		_map.style.height = ht+"px";
		_map.style.width = wd+"px";
		_mapfme.style.height = (ht+20)+"px";
		_mapfme.style.width = (wd+28)+"px";
		if (setscroll) {
			_map.scrollTop = Math.round((_map.scrollHeight - ht)/2);
			_map.scrollLeft = Math.round((_map.scrollWidth - wd)/2);
		}
		setPan(ht, wd);
		
		function getPageWH(isW){
			var pw, ph;
			try {
				if(_base.Sniffer.IE || _base.Sniffer.Geko) {
					pw = document.documentElement.clientWidth;
					ph = document.documentElement.clientHeight;
				} else if (typeof(window.innerWidth)  == 'number' ) {
					pw = window.innerWidth;
					ph = window.innerHeight;
				} else {
					pw = document.body.clientWidth;
					ph = document.body.clientHeight;
				}
			} catch (e) {
				pw = document.body.clientWidth;
				ph = document.body.clientHeight;
			}
			return (isW)? parseInt(pw) : parseInt(ph);
		}
	}
	/// <summary>Method:_Popup</summary>
	function _Popup(ul) {
		_popup(ul, "");
	}
	/// <summary>Method:_GetRegions</summary>
	function _GetRegions() {
		var url = "iBurstRegions.aspx";
		url = _urlbase.concat(url);
		_Debug("_GetRegions", "url", url);
		_base.GetUrl(url, _regionsCallback);
		initSelect();
	}
	function _GetRegion(el) {
		_Debug("_GetRegion", "value", el.value);
		if (el.value == "0") {
			_ResetSearch(1);
			return;
		}
		var values = el.value.split(":");
		var id = values[0];
		var lvls = values[1];
		(lvls == "2")? _GetCities(true, id) : _GetSuburbs(true, id, "*");
	}
	/// <summary>Method:_GetSuburbs</summary>
	function _GetSuburbs(isS, id, cty) {
		_Debug("_GetSuburbs", "id", id);
		setSelect(isS);
		resetSelect(2);
		var url = "iBurstSuburbs.aspx?id=";
		url = _urlbase.concat(url, id, "&city=", cty);
		_base.GetUrl(url, _suburbCallback);
		setFocus(_selsub);
	}
	/// <summary>Method:_GetSuburb</summary>
	function _GetSuburb(isS, el) {
		setSelect(isS);
		(el.value != "0")? showElem(_selbtn) : hideElem(_selbtn);;
	}
	
	/// <summary>Method:_GetCity</summary>
	function _GetCity(isS, el) {
		setSelect(isS);
		setLoading(_selsub);
		if (el.value == "0")
			return;
		var url = "iBurstSuburbs.aspx?id=";
		url = _urlbase.concat(url, _currid, "&city=", el.value);
		_Debug("_GetCity", "url", url);
		_base.GetUrl(url, _suburbCallback);
		setFocus(_selsub);
	}
	/// <summary>Method:_GetCities</summary>
	function _GetCities(isS, id) {
		_Debug("_GetCities", "id", id);
		setSelect(isS);
		resetSelect(1);
		_currid = id;
		var url = "iBurstCities.aspx?id=";
		url = _urlbase.concat(url, id);
		_base.GetUrl(url, _cityCallback);
		setFocus(_selcty);
	}
	/// <summary>Method:_GetQukAddress</summary>
	function _GetQukAddress() {
		if (_qukstr.value == "" || _qukstr.value == MSG_ADDRESS) {
			_QukError(ERR_CUSTOM, "error_valid");
			setFocus(_qukstr);
			return;
		}else if (_quksub.value == "" || _quksub.value == MSG_SUBURB) {
			_QukError(ERR_CUSTOM, "error_qukvalid");
			setFocus(_quksub);
			return;
		} else {
			var citysub = _quksub.value.split("(");
			var url = "iBurstAddress.aspx?str=";
			if (citysub[1]){
				var sub = citysub[0].substring(0, citysub[0].length-1);
				var city = citysub[1].substring(0, citysub[1].length-1);
				url = url.concat(_qukstr.value, "&sub=", sub, "&city=", city);
			}else{
				url = url.concat(_qukstr.value, "&sub=", _quksub.value);
			}
			_Debug("_GetQukAddress", "url", url);
			_base.GetUrl(url, _qukAddressCallback);
		}
	}
	/// <summary>Method:_GetAddress</summary>
	function _GetAddress() {
		if (_schstr.value == "" || _schstr.value == MSG_ADDRESS) {
			_Error(ERR_CUSTOM, "error_valid");
			setFocus(_schstr);
			return;
		} else {
			var url = "iBurstAddress.aspx?str=";
			url = url.concat(_schstr.value, "&sub=", _schsub.value, "&city=", _schcty.value);
			_Debug("_GetAddress", "url", url);
			_base.GetUrl(url, _addressCallback);
		}
	}
	/// <summary>Method:_GetMap</summary>
	function _GetMap(latlong, scl, resetpt) {
		if (x_mapdisplay=="on"){
			var bar=document.getElementById("bar");
			if (bar) {
				var bar_type=bar.getElementsByTagName("ul");
				for (var i=0; i<bar_type.length; i++)  {
					bar_type[0].className="taboff";
					bar_type[6].className="taboff";
					bar_type[7].className="taboff";
					bar_type[8].className="taboff";
					bar_type[9].className="taboff";
					}
			}
			document.getElementById("lgd_"+x_maptyp).className="tabon";
		}
		//alert("_GetMap:"+x_maptyp);
		_Debug("_GetMap", "latlong", latlong);
		var ll = setCurr(latlong, (scl)? scl : DEF_MAP_SCALE);
		var url = "iBurstMap.aspx?lat="
		url = url.concat(ll[0], "&long=", ll[1], "&scale=", _currscl, "&type=", x_maptyp);
		_Debug("_GetMap", "url", url);
		getMapSrc(url);
	}
	/// <summary>Method:_GetSuburbMap</summary>
	function _GetSuburbMap() {
		//alert("_GetMap:"+x_maptyp);
		if (x_mapdisplay=="on"){
			var bar=document.getElementById("bar");
			if (bar) {
				var bar_type=bar.getElementsByTagName("ul");
				for (var i=0; i<bar_type.length; i++)  {
					bar_type[0].className="taboff";
					bar_type[6].className="taboff";
					bar_type[7].className="taboff";
					bar_type[8].className="taboff";
					bar_type[9].className="taboff";
					}
			}
			document.getElementById("lgd_"+x_maptyp).className="tabon";
		}
			
		try {
			_setWait(_map);
			_Debug("_GetSuburbMap");
			var url = "iBurstSuburbMap.aspx?sub=";
			url = url.concat(escape(_selsub.value), "&city=", _selcty.value, "&scale=", DEF_SUB_SCALE, "&type=", x_maptyp);
			_Debug("_GetSuburbMap", "url", url);
			getMapSrc(url)
			url = url.concat("&map=no");
			_base.GetUrl(url, _suburbMapCallback);
			
			
		} catch (e) {
			_Debug("_GetSuburbMap", "error", (typeof(e)=="string")? e : e.description);
		} finally {
			_clearWait(_map);
		}
	}
	/// <summary>Method:_QukError</summary>
	function _QukError(typ, cde) {
		var msg = "An error ocurred.";
		var hed = "Oops ..."
		var rst = true;
		if (typ == ERR_HTTP_STATUS) {
			msg = msg.concat(" The web server says '", _base.XmlHttp.statusText, "'.<br/>Please try again later.");
		} else if (typ == ERR_CUSTOM) {
			for (var i=0; i<_errors.length; i++) {
				if (cde == _errors[i][0]){
					hed = _errors[i][1];
					msg = _errors[i][2];
					rst = _errors[i][3];
					break;
				}
			}
		} else {
			msg = msg.concat("unknown error, code: ", cde);
		}
		setQukError(msg, hed, rst);
	}
	/// <summary>Method:_Error</summary>
	function _Error(typ, cde) {
		var msg = "An error ocurred.";
		var hed = "Oops ..."
		var rst = true;
		if (typ == ERR_HTTP_STATUS) {
			msg = msg.concat(" The web server says '", _base.XmlHttp.statusText, "'.<br/>Please try again later.");
		} else if (typ == ERR_CUSTOM) {
			for (var i=0; i<_errors.length; i++) {
				if (cde == _errors[i][0]){
					hed = _errors[i][1];
					msg = _errors[i][2];
					rst = _errors[i][3];
					break;
				}
			}
		} else {
			msg = msg.concat("unknown error, code: ", cde);
		}
		setError(msg, hed, rst);
	}
	/// <summary>Method:_UnDisplayMap</summary>
	function _UnDisplayMap() {
		x_mapdisplay="off";
		var logo_off=document.getElementById("logos");
			if (logo_off) {
				var logo=logo_off.getElementsByTagName("li");
				for (var i=0; i<logo.length; i++)  {
					logo[0].className="logo_off";
					logo[1].className="logo_off";
					logo[2].className="logo_off";
					logo[3].className="logo_off";
					logo[4].className="logo_off";
					}
			}	
		var bar=document.getElementById("bar");
			if (bar) {
				var bar_type=bar.getElementsByTagName("ul");
				for (var i=0; i<bar_type.length; i++)  {
					bar_type[0].className="taboff";
					bar_type[6].className="taboff";
					bar_type[7].className="taboff";
					bar_type[8].className="taboff";
					bar_type[9].className="taboff";
					}
			}	
	}
	/// <summary>Method:_ResetQukSearch</summary>
	function _ResetQukSearch(resetaddr) {
		_UnDisplayMap();
		if (resetaddr) {
			hideSearch();
			if (resetaddr == 2)
				_schstr.value = MSG_ADDRESS;
			showSearch();
			setFocus(_quksub);
		} else {
			hideElems(_panup, _panrt, _pandn, _panlf, _point, _zoom_o, _zoom_i, _mapfme, _resetSearch);
			showElems(_bot, _sch, _mapnav);
		}
	}
	/// <summary>Method:_ResetSearch</summary>
	function _ResetSearch(resetaddr) {
		_UnDisplayMap();
		if (resetaddr) {
			hideSearch();
			_schcty.options.length = 0;
			_schcty.options[0] = new Option("Please select ...", 0);
			_schsub.options.length = 0;
			_schsub.options[0] = new Option("Please select ...", 0);
			_schrgn.value = "0";
			if (resetaddr == 2)
				_schstr.value = MSG_ADDRESS;
			showSearch();
			setFocus(_schrgn);
		} else {
			hideElems(_panup, _panrt, _pandn, _panlf, _point, _zoom_o, _zoom_i, _mapfme, _resetSearch, _qukerr, _msgerr);
			showElems(_bot, _sch, _mapnav);
		}
	}
	/// <summary>Method:_Zoom</summary>
	function _Zoom(isout) {
		var latlng = "";
		latlng = latlng.concat(_currlat.toString(), ":", _currlng.toString())
		_GetMap(latlng, (isout)? _currscl*ZOOM_FACTOR : _currscl/ZOOM_FACTOR, false);
	}
	/// <summary>Method:_Pan</summary>
	function _Pan(dirtn) {
		_Debug("_Pan", "_currscl", _currscl);
		var lt = new Number(_currlat);
		var lg = new Number(_currlng);
		var vt = new Number(_currscl)*PAN_VERTICAL;
		var hz = new Number(_currscl)*PAN_HORIZONTAL;
		switch (dirtn) {
			case "up":	lt += vt;	break;
			case "dn":	lt -= vt;	break;
			case "rt":	lg += hz;	break;
			case "lf":	lg -= hz;	break;
		}
		var latlng = "";
		latlng = latlng.concat(lt.toString(), ":", lg.toString())
		_GetMap(latlng, _currscl, false);
		hideElem(_point);
	}
	/// <summary>Method:_SetContact</summary>
	function _SetContact() {
	}
	/// <summary>Method:_SetAction</summary>
	function _SetAction(ix, ul, wd, ht) {
		var ndx;
		if (typeof(ix) == "number")
			ndx = ix;
		else if (typeof(ix) == "string") {
			switch (ix.toLowerCase()) {
				case "apply":	ndx = ACTION_APPLY;		break;
				case "contact":	ndx = ACTION_CONTACT;	break;
				case "updates":	ndx = ACTION_UPDATES;	break;
			}
		} else
			return
		if (window.opener) {
			var pth = document.location.href;
			pth = pth.substr(pth.lastIndexOf("&root=")+6);
			ul = pth.concat(ul);
		}
		_actions[ndx][3] = ul;
		if (wd) _actions[ndx][0] = wd;
		if (ht) _actions[ndx][1] = ht;
	}
	/// <summary>Method:_Action</summary>
	function _Action(sl) {
		var sel = _getEl(sl);
		if (sel.value == "4") {
			_tabChange("iBurst");
			return;
		} else if (sel.value == "5") {
			_tabChange("hsdpa");
			return;
		} else if (sel.value == "6") {
			_tabChange("Wimax");
			return;
		} else if (sel.value == "7") {
			_tabChange("metronet");
			return;
		}else if (sel.value == "8") {
			_tabChange("dialanerd");
			return;
		}
		var url = _actions[sel.value][3];
		_popup(url,_popset(true,false,false,_actions[sel.value][2],_actions[sel.value][0],_actions[sel.value][1],false,true,true));
	}
	/// <summary>Method:_Go</summary>
	function _Go(vl) {
		var url = _actions[vl][3];
		_popup(url,_popset(true,false,false,_actions[vl][2],_actions[vl][0],_actions[vl][1],false,true,true));
	}
	/// <summary>Method:_ResetSelect</summary>
	function _ResetSelect(isS) {
		if (window.event.srcElement.id != "mapnav") {
			_stop();
		} else {
			setSelect(isS);
			hideSelect();
		}
	}
	function _ResetLoader() {
		_Debug("_ResetLoader");
		_mapimg.style.visibility = "visible";
	}

	
	/*	-------------------------------------------	*/
	/// <remarks>Region: Private methods</remarks>
	/*	-------------------------------------------	*/
	function _stop(){window.event.cancelBubble = true;}
	function _getEl(id){return document.getElementById(id);}
	/// <summary>Method: _pop: open a new window</summary>
	function _popup(url, setting) {
		_Debug("_popup", "url", url);
		_pop = window.open(url,_pop_name, setting);
		try { _pop.focus(); }
		catch (e) { _pop.focus(); }
	}
	/// <summary>Method:_popset</summary>
	function _popset(set, tlb, loc, scr, wid, hgt, mnu, stt, rsz) {
		var ret = "";
		if (set) {
			ret = "status=";
			var tl = (tlb)? "yes" : "no";
			var lc = (loc)? "yes" : "no";
			var mn = (mnu)? "yes" : "no";
			var sc = (scr)? "yes" : "no";
			var wd = (wid)? wid : "463";
			var ht = (hgt)? hgt : "400";
			var st = (stt)? "yes" : "no";
			var rz = (rsz)? "yes" : "no";
			ret = ret.concat(st,",toolbar=",tl,",location=",lc,",menubar=",mn,",scrollbars=",sc,",width=",wd,",height=",ht,",resizable=",rz);
		}
		return ret;
	}
	/// <summary>Method:_setHover - adds a class name to the li element onmouseover and replace with an empty string onmouseout</summary>
	function _setHover() {
		var mnu = _getEl("lgd_iBurst");
		if (mnu) {
			var sfEls = mnu.getElementsByTagName("li");
			for (var i=0; i<sfEls.length; i++) {
				sfEls[i].onmouseover=function() {
					this.className+=" jshover";
					this.style.cursor="help";
				}
				sfEls[i].onmouseout=function() {
					this.className=this.className.replace(new RegExp(" jshover\\b"), "");
				}
			}
		}
	}
	
	/// <summary>Method:_tell() - changes the telephone number span in far right hand top corner for Wimax</summary>
	function _tell() {
		var tell = document.getElementById("tell");
		if (tell) {
			tell.innerHTML = "Call us " + TELNO;
		}
	}
	/// <summary>Method:_tellBack() - changes tel no back to default</summary>
	function _tellBack() {
		var tell = document.getElementById("tell");
		if (tell) {
			tell.innerHTML = "Call us " + TELNO;
		}
	}
	/// <summary>Method:_wimaxApply() - changes href of apply for Wimax</summary>
	function _wimaxApply() {
		var apply = document.getElementById("apply").getAttributeNode("href");
		apply.value="http://www.iburst.co.za/default.aspx?link=wimax_contact&device=screen";
	}
	/// <summary>Method:_applyBack() - changes href of apply for Wimax</summary>
	function _applyBack() {
		var apply = document.getElementById("apply").getAttributeNode("href");
		apply.value="javascript:x_coverage.Go(1)";
	}
	/// <summary>Method:_tabClick - changes class on menu tabs on mouseclick</summary>
	function _tabClick() {
		var mnu = document.getElementById("tabs");
		if (mnu) {
			if(x_maptyp){
				mnu.value = x_maptyp;
				_valueChange(x_maptyp);
			}; 
			mnu.onchange=function()  {
				_valueChange(this.value);
			}
		}
	}
	/// <summary>Method:_valueChange</summary>
	function _valueChange(maptype) {
		if (maptype == "Wimax"){
			_tell();
			_wimaxApply();
		} else if (maptype == "metronet"){
			_tell();	
			_applyBack();
		} else {
			_tellBack();
			_applyBack();
		}
		x_maptyp = maptype;
		if (x_mapdisplay=="on"){
			var latlng = "";
			latlng = latlng.concat(_currlat.toString(), ":", _currlng.toString())
			_GetMap(latlng,  _currscl, false);
			_Change_logo();
		}
	}
	/// <summary>Method:_tabChange - changes class on menu tabs on field 'SelectAction' selection</summary>
	function _tabChange(id) {
		var mnu = document.getElementById("tabs");
		if (mnu) {
			mnu.value = id;
			_valueChange(id);
		}
	}
	
	/// <summary>Method:_DisplayMap - sets the variable to be "on" to display the logo and key</summary>
	function _DisplayMap() {
		x_mapdisplay="on"
	}
	
	/// <summary>Method:_Change_logo - changes the logo that will appear at the top of the map</summary>
	function _Change_logo() {
		var logo_on=document.getElementById(x_maptyp+"_display");
		var logo_off=document.getElementById("logos");
		if (logo_off) {
			var logo=logo_off.getElementsByTagName("li");
			for (var i=0; i<logo.length; i++)  {
				logo[0].className="logo_off";
				logo[1].className="logo_off";
				logo[2].className="logo_off";
				logo[3].className="logo_off";
				logo[4].className="logo_off";
				}
		}
		logo_on.className="logo_on";
	}
	/// <summary>Method:_regions</summary>
	function _regionsCallback() {
		//_Debug("_regionsCallback", "readyState", _base.XmlHttp.readyState);
        if (_base.XmlHttp.readyState == 4) {	// ie completed
            if (_base.XmlHttp.status == 200) {
				try {
					var mapstr = "";
					_schrgn = document.getElementById("SearchRegion");
					var cnt = _schrgn.options.length;
					var nde, mapnde, nodeList = _base.SelectNodes("region");
					for (var i=0; i<nodeList.length; i++) {
						try {
							nde = nodeList.item(i);
							mapnde = _base.SelectSingleNode(nde, "map");
							mapstr = mapstr.concat(addregion(nde, mapnde));
						} catch (e) {
							_Debug("_regionsCallback:nodes", "error", (typeof(e)=="string")? e : e.description);
						}
						_schrgn.options[cnt] = new Option(_base.NodeValue(mapnde), _base.GetAttribute(nde, "id") + ":" + _base.GetAttribute(nde, "levels"));
						cnt++;
					}
					_schrgn.options.length = cnt;
					var mapel = document.getElementById("mapnav");
					mapel.innerHTML = mapel.innerHTML.concat(mapstr);
				} catch (e) {
					_Debug("_regionsCallback", "error", (typeof(e)=="string")? e : e.description);
				}
			} else
                _Error(ERR_HTTP_STATUS, _base.XmlHttp.status);
		}
	}
	function addregion(nde, mapnde) {
		var lvls = _base.GetAttribute(nde, "levels");
		var retstr = "<div class='lbl' style='cursor:hand;position:absolute;top:";
		var rgnid = _base.GetAttribute(nde, "id");
		retstr = retstr.concat(_base.GetAttribute(mapnde, "top"), "px;left:", _base.GetAttribute(mapnde, "left"), "px'>");
		var fnstr = (lvls == "2")? "GetCities(false, '"+rgnid+"')" : "GetSuburbs(false, '"+rgnid+"', '*')";
		retstr = retstr.concat("<a href=\"javascript:x_coverage.", fnstr, "\">", _base.NodeValue(mapnde), "</a></div>");
		return retstr;
	}
	/// <summary>Method:_suburbCallback</summary>
	function _suburbCallback() {
        if (_base.XmlHttp.readyState == 4) {	// ie completed
            if (_base.XmlHttp.status == 200) {
				_selsub.options.length = 0;
				_selsub.options[0] = new Option("Please select ...", 0);
				hideElems(_selsub, _selbtn);
				var cnt = _selsub.options.length;
				var cty = _base.SelectNode("suburbs");
				var ccnt = _selcty.options.length;
				var nme = _base.GetAttribute(cty, "name");
				_Debug("_suburbCallback", "cty", nme, "_selcty", _selcty.value, "ccnt", ccnt);
				if (ccnt <= 1) {	// only if lvl == 1
					_selcty.options[ccnt] = new Option(nme, nme);
					_selcty.value = nme;
				}
				var nde, nme, nodeList = _base.SelectNodes("suburb");
				for (var i=0; i<nodeList.length; i++) {
					try {
						nde = nodeList.item(i);
						nme = _base.GetAttribute(nde, "name");
						_selsub.options[cnt] = new Option(nme, nme);
						cnt++;
					} catch (e) {
						_Debug("_suburbCallback", "error", e.description);
					}
				}
				_selsub.options.length = cnt;
				
				// display and poisition the select div
				var selrgn = _base.SelectNode("region");
				var selnde = _base.SelectSingleNode(selrgn, "sel");
				showSelectForm(2, _base.GetAttribute(selnde, "top"), _base.GetAttribute(selnde, "left"))
			} else
                _Error(ERR_HTTP_STATUS, _base.XmlHttp.status);
		}
	}
	/// <summary>Method:_cityCallback</summary>
	function _cityCallback() {
        if (_base.XmlHttp.readyState == 4) {	// ie completed
            if (_base.XmlHttp.status == 200) {
				var cnt = _selcty.options.length;
				var nde, nme, nodeList = _base.SelectNodes("suburbs");
				for (var i=0; i<nodeList.length; i++) {
					try {
						nde = nodeList.item(i);
						nme = _base.GetAttribute(nde, "name");
						_selcty.options[cnt] = new Option(nme, nme);
						cnt++;
					} catch (e) {
						_Debug("_cityCallback", "error", e.description);
					}
				}
				_selcty.options.length = cnt;
				var selrgn = _base.SelectNode("region");
				var selnde = _base.SelectSingleNode(selrgn, "sel");
				showSelectForm(1, _base.GetAttribute(selnde, "top"), _base.GetAttribute(selnde, "left"))
			} else
				_Error(ERR_HTTP_STATUS, _base.XmlHttp.status);
		}
	}
	/// <summary>Method:_qukAddressCallback</summary>
	function _qukAddressCallback() {
        if (_base.XmlHttp.readyState == 4) {	// ie completed
            if (_base.XmlHttp.status == 200) {
				var html = "";
				var addrs = _base.SelectNode("addresses");
				var count = _base.GetAttribute(addrs, "count");
				if (count == "0") {
					_QukError(ERR_CUSTOM, "error_none");
				} else if (count == "1" && !_confirmAddress) {	// go directly
					var node = _base.SelectNode("address");
					_GetMap(_base.GetAttribute(node, "latlong"), DEF_MAP_SCALE, true);
				} else {
					var nde, nodeList = _base.SelectNodes("address");
					for (var i=0; i<nodeList.length; i++) {
						try {
							nde = nodeList.item(i)
							html = html.concat("<div ><a href='javascript:x_coverage.GetMap(\"", _base.GetAttribute(nde, "latlong"), "\", false, true)' onclick='javascript:x_coverage.HideQukSearchResult()'>", _base.NodeValue(nde), "</a></div>")
						} catch (e) {
							_Debug("_addressCallback", "error", e.description);
						}
					}
					_result.innerHTML = html;
					showQukSearchResult();
				}
			} else
				_QukError(ERR_HTTP_STATUS, _base.XmlHttp.status);
		}
	}
	/// <summary>Method:_addressCallback</summary>
	function _addressCallback() {
        if (_base.XmlHttp.readyState == 4) {	// ie completed
            if (_base.XmlHttp.status == 200) {
				var html = "";
				var addrs = _base.SelectNode("addresses");
				var count = _base.GetAttribute(addrs, "count");
				if (count == "0") {
					_Error(ERR_CUSTOM, "error_none");
				} else if (count == "1" && !_confirmAddress) {	// go directly
					var node = _base.SelectNode("address");
					_GetMap(_base.GetAttribute(node, "latlong"), DEF_MAP_SCALE, true);
				} else {
					var nde, nodeList = _base.SelectNodes("address");
					for (var i=0; i<nodeList.length; i++) {
						try {
							nde = nodeList.item(i)
							html = html.concat("<div><a href='javascript:x_coverage.GetMap(\"", _base.GetAttribute(nde, "latlong"), "\", false, true)' onclick='javascript:x_coverage.HideQukSearchResult()'>", _base.NodeValue(nde), "</a></div>")
						} catch (e) {
							_Debug("_addressCallback", "error", e.description);
						}
					}
					_result.innerHTML = html;
					showQukSearchResult();
				}
			} else
				_Error(ERR_HTTP_STATUS, _base.XmlHttp.status);
		}
	}
	/// <summary>Method:_suburbMapCallback</summary>
	function _suburbMapCallback() {
        if (_base.XmlHttp.readyState == 4) {	// ie completed
            if (_base.XmlHttp.status == 200) {
				var feat = _base.SelectNode("feature");
				if (feat)
					setCurr(_base.GetAttribute(feat, "Centroid"), DEF_SUB_SCALE);;
			} else
				_Error(ERR_HTTP_STATUS, _base.XmlHttp.status);
		}
	}
	function resetSelect(lvl) {
		hideSelect();
		_selcty.options.length = 0;
		_selcty.options[0] = new Option((lvl==1)? "Please select ..." : "All", (lvl==1)? 0 : "*");
		_selsub.options.length = 0;
		_selsub.options[0] = new Option("Please select ...", 0);
	}
	function setLoading(el) {
		el.options.length = 0;
		el.options[0] = new Option("Loading ...", 0);
		showElem(el);
	}
	function resetQukMessage() {
		showElem(_quknrm);
	}
	function resetMessage() {
		hideElem(_msgerr);
	}
	function initSelect() {
		if (!_selfrm) {
			_msgnrm = _getEl("MsgNormal");
			_msgerr = _getEl("MsgError");
			_msgtxt = _getEl("MsgText");
			_msghed = _getEl("MsgHead");
			_mapfrm = _getEl("SelectForm");
			_mapcty = _getEl("SelectCity");
			_mapsub = _getEl("SelectSuburb");
			_mapbtn = _getEl("SelectButton");
			_schfrm = _getEl("SearchForm");
			_schcty = _getEl("SearchCity");
			_schsub = _getEl("SearchSuburb");
			_schbtn = _getEl("SearchButton");
			_schrgn = _getEl("SearchRegion");
			_schstr = _getEl("SearchStreet");
			_schres = _getEl("SearchResult");
			_qukstr = _getEl("QukSearchStreet");
			_quksub = _getEl("QukSearchSuburb");
			_quknrm = _getEl("qukMsgNormal");
			_qukerr = _getEl("qukMsgError");
			_quktxt = _getEl("qukMsgText");
			_qukhed = _getEl("qukMsgHead");
			_qukres = _getEl("qukSearchResult");
			_result = _getEl("result");
			_qukfrm = _getEl("qukSearchForm");
			_tabs	= _getEl("tabs");
		}
	}
	function setSelect(isS) {
		initSelect();
		_selfrm = (isS)? _schfrm : _mapfrm;
		_selcty = (isS)? _schcty : _mapcty;
		_selsub = (isS)? _schsub : _mapsub;
		_selbtn = (isS)? _schbtn : _mapbtn;
		resetMessage();
		resetQukMessage();
	}
	function hideSelect() {
		hideElem(_selfrm);
		hideElem(_selcty);
		hideElem(_selsub);
		hideElem(_selbtn);
	}
	function hideSearch() {
		hideElems(_panup, _panrt, _pandn, _panlf, _point, _zoom_o, _zoom_i);
		hideElems(_schcty, _schsub, _schbtn, _schres);
	}
	function showSearch() {
		hideElem(_mapfme, _resetSearch);
		showElems(_bot, _sch, _mapnav, _schfrm, _schrgn);
	}
	function showSelectForm(lvl, top, lft) {
		showElem(_selfrm);
		if (_selfrm.id == "SelectForm")
			pstnElem(_selfrm, top, lft);
		if (lvl == 1)
			showElem(_selcty);
		else
			showElem(_selsub);
	}
	function hideElems(arg) {
		for(var i=0; i<arguments.length; i++)
			hideElem(arguments[i]);
	}
	function hideElem(el) { 
		if (el) 
			el.style.display = "none";
		else 
			_Debug("hide", "el", typeof(el));
	}
	function showElems(arg) {
		for(var i=0; i<arguments.length; i++)
			showElem(arguments[i]);
	}
	function showElem(el) {
		if (el) 
			el.style.display = "block";
		else
			_Debug("show", "el", typeof(el));
	}
	function pstnElem(el, tp, lf) {
		if (el) { 
			el.style.top = tp + "px"; 
			el.style.left = lf + "px";
		}
	}
	function setQukError(ms, hd, reset) {
		_quktxt.innerHTML = ms;
		_qukhed.innerHTML = hd;
		showElem(_qukerr);
		if (reset)
			_ResetQukSearch(true);
	}
	function setError(ms, hd, reset) {
		_msgtxt.innerHTML = ms;
		_msghed.innerHTML = hd;
		showElem(_msgerr);
		if (reset)
			_ResetSearch(true);
	}
	function _HideQukSearchResult() {
		hideElem(_qukres);
		showElem(_schfrm);
		showElem(_tabs);
		showElem(_mapnav);
	}
	function showQukSearchResult() {
		showElem(_qukres);
		hideElem(_schfrm);
		hideElem(_tabs);
		hideElem(_mapnav);
	}
	function showMap(pt) {
		
		_Debug("showMap", "pt", pt);
		hideElems(_bot, _sch, _mapnav, _map);
		showElems(_resetSearch);
//		showElems(_mapfme, _panup, _panrt, _pandn, _panlf, _zoom_o, _zoom_i);
		$("#mapframe").animate({opacity: 'show'}, 'slow');
		$("#zoom_i").animate({ opacity: 'show'}, 2000);
		$("#zoom_o").animate({ opacity: 'show'}, 2000);
		$("#panup").animate({ opacity: 'show'}, 'slow');
		$("#panrt").animate({ opacity: 'show'}, 'slow');
		$("#pandn").animate({ opacity: 'show'}, 'slow');
		$("#panlf").animate({ opacity: 'show'}, 'slow');
		$("#mapimg").load(function (){
			$("#mapimg").animate({ opacity: 'show'}, 1000);
			$("#map").animate({ opacity: 'show'}, 1000);
		});
		if (pt)
			showElem(_point);
		_Resize(true);
	}
	function setFocus(el) {
		if (el.style.display != "none")
			el.focus();
	}
	function getMapEls() {
		_bot = _getEl("bot");
		_sch = _getEl("sch");
		_mapfme = _getEl("mapframe");
		_mapnav = _getEl("mapnav");
		_map = _getEl("map");
		_mapimg = _getEl("mapimg");
		_panup = _getEl("panup");
		_panrt = _getEl("panrt");
		_pandn = _getEl("pandn");
		_panlf = _getEl("panlf");
		_point = _getEl("point");
		_zoom_o = _getEl("zoom_o");
		_zoom_i = _getEl("zoom_i");
		_resett = _getEl("resett");
		_resetSearch = _getEl("resettSearch");
	}
	function setPan(h,w) {
		var w2 = Math.round(w/2);
		var h2 = Math.round(h/2);
		_panup.style.left = _pandn.style.left = w2+"px";
		_zoom_o.style.left = (w2 - 80)+"px";
		_zoom_i.style.left = (w2 + 40)+"px";
		_panrt.style.top = _panlf.style.top = h2+"px";
		_panlf.style.left = "0px";
		var s = Math.round(RESIZE_SCROLL/2)+2;
		var so = s-4;
		var wlt = (w < (RESIZE_WIDTH_MAX)-s);
		var hlt = (h < (RESIZE_HEIGHT_MAX)-s);
		var	wd = (w+s)+"px";
		var oth = (_base.Sniffer.Gecko || _base.Sniffer.Opera)
		var	ht = (oth)? (h+s-14)+"px" : (h+s)+"px";
		if (!wlt && !hlt) {
			wd = (w-so)+"px";
			ht = (oth)? (h-so-14)+"px" : (h-so)+"px";
		}
		_panrt.style.left = wd;
		_zoom_o.style.top = _zoom_i.style.top = _pandn.style.top = ht;
		if (oth)
			_panup.style.top = "-14px";
	}
	function setCurr(latlng, scl) {
		var ll = latlng.split(":");
		_currlat = ll[0];
		_currlng = ll[1];
		_currscl = scl;
		return ll;
	}
	function _setWait(el) {
		el.style.cursor = "wait";
	}
	function _clearWait(el) {
		el.style.cursor = "auto";
	}
	function setMap() {
		_mapimg.style.width = MAPIMAGE_WIDTH + "px";
		_mapimg.style.height = MAPIMAGE_HEIGHT + "px";
		_point.style.top = parseInt(MAPIMAGE_HEIGHT/2) + "px";
		_point.style.left = parseInt(MAPIMAGE_WIDTH/2) + "px";
	}
	function getMapSrc(url) {
		_mapimg.style.visibility = "hidden";
		_mapimg.src = url;
		showMap(true);
	}
	function _queryParam(nme) {
		var q = window.location.search.substring(1); 
		var ps = q.split("&"); 
		for (var i=0;i<ps.length;i++) { 
			var pr = ps[i].split("="); 
			if (pr[0] == nme) { 
				return pr[1]; 
			} 
		} 
	} 
}
