    var map = null;
    var geocoder = null;
    var mgr = null;
    var baseIcon = null;
    var batch = [];
    var marker = [];
    var currentcolor = "b";
    var region = null;
    var currentregion = readCookie('region');
    var gdir;

    var forprint = 0;

    function load(dobig) {

	if (dobig == 1) forprint = 1;

	document.forms['directions'].elements['address'].value=readCookie("address");
	document.forms['directions'].elements['city'].value=readCookie("city");
	document.forms['directions'].elements['state'].value=readCookie("state");
	document.forms['directions'].elements['postal'].value=readCookie("postal");


        if (GBrowserIsCompatible()) {

                // Create a base icon for all of our markers that specifies the
                // shadow, icon dimensions, etc.
                baseIcon = new GIcon();
                baseIcon.shadow = "http://www.bingobugle.ca/images/markers/shadow50.png";

//                baseIcon.iconSize = new GSize(20, 34);
                baseIcon.iconSize = new GSize(32, 32);

                baseIcon.shadowSize = new GSize(37, 34);
                baseIcon.iconAnchor = new GPoint(9, 34);
                baseIcon.infoWindowAnchor = new GPoint(9, 2);
                baseIcon.infoShadowAnchor = new GPoint(18, 25);

                // BIG MAP
                map = new GMap2(document.getElementById("hallcontentscroll")); 
                map.setCenter(new GLatLng(43.502020,-79.277494), 9); 
		if (forprint == 0) {
                	map.addControl(new GLargeMapControl());
			map.addControl(new GScaleControl());
		}
		if ((currentregion == null) || (currentregion == "")) currentregion = "BUFFALO";
		// directions
        	gdir = new GDirections(map, document.getElementById("directions"));
        	GEvent.addListener(gdir, "load", onGDirectionsLoad);
        	GEvent.addListener(gdir, "error", handleErrors);

                window.setTimeout(setupHallMarkers, 0);
        }
    }

    function setupHallMarkers() {


                // init marker manager
                mgr = new MarkerManager(map);

		var request = GXmlHttp.create();
                var filename = "bingohalls.xml"
                request.open("GET", filename, true);
                request.onreadystatechange = function() {
                        var batch = [];
                        var index = "<form name='index' method='post'  action='#'>";

index += "<table border=0 width=90%>"
+ "<tr>"
+ "<th class=subtable colspan=2>Session Schedules</th></tr>"
+ "<tr><td class=subtable width=50% align=center><a href='/-sessions.html#" + currentregion +"'>by Region</a></a></td>"
+ "<td class=subtable align=center><a href='-monday.html'>by Day</a></td>"
+ "</tr></table><br>";



                //        alert("readyState ="+request.readyState);
                        if (request.readyState == 4) {
                                if (request.status == 200) {
                                        var xmlDoc = request.responseXML;
                                        if (xmlDoc.documentElement) {
                                                var regions = xmlDoc.documentElement.getElementsByTagName("region");
						var zoom = 9;
						var rlat = "";
						var rlng = "";

                        			index += "<select id='regionselect' name='regionselect' style='width:90%' onChange='changeregion();'>";
						for (var j = 0; j < regions.length; j++) {
						        var r = regions[j].getAttribute("id");
							index += "<option value='" + r + "'>" + r + "</option>"; 
							if (r == currentregion) {
								zoom = parseInt(regions[j].getAttribute("zoom"));
								if (forprint == 1) zoom++;
                                                        	rlat = parseFloat(regions[j].getAttribute("lat"));
                                                        	rlng = parseFloat(regions[j].getAttribute("long"));
							}
						}
						index += "</select><br><br>";
                                                // obtain the array of markers and loop through it
                                                var markers = xmlDoc.documentElement.getElementsByTagName("hall");

//              alert("loading "+markers.length+" markers");

						index += "<table class=directory style='width:90%' border=0>";
						var ii = 0;
                                                for (var i = 0; i < markers.length; i++) {

							var region = markers[i].getAttribute("region");
							var adcode = markers[i].getAttribute("adcode");

							if ( (region == currentregion) && (adcode != "NOSHOW")) {


                                                        var lat = parseFloat(markers[i].getAttribute("lat"));
                                                        var lng = parseFloat(markers[i].getAttribute("lng"));
                                                        var point = new GPoint(lng,lat);

							var name = getInnerText(markers[i].getElementsByTagName("name")[0]);
							var address = getInnerText(markers[i].getElementsByTagName("address")[0]);


                                                        var phone = markers[i].getAttribute("phone");
                                                        var sessions = markers[i].getAttribute("sessions");
		
                                                        var html = name + "<br>" + address + "<br>" + phone + "<br>";
							html += "<div align=right><a href='/-sessions.html#" + region + "'><b>Session Schedule</b></a> :: <a href='javascript:toggledirectory(\"" + address +"\")'><b>Get Directions</b></a></div>";
							
							html += "<br>" + sessions;

                                                        marker[i] = createMarker(point,ii,html);

                                                        var letter = String.fromCharCode("A".charCodeAt(0) + (ii % 26));

							var bcolor = "ff6b5f";
							if (ii > 25) {
								bcolor = "5e87fc";
							}

                                                        // map.addOverlay(marker);

var nameText = "<span id='hall" + ii + "'"; 
nameText += "onmouseover='GEvent.trigger(marker["+i+"],\"mouseover\"); document.body.style.cursor=\"pointer\";'";
nameText += "onmouseout='GEvent.trigger(marker["+i+"],\"mouseout\"); document.body.style.cursor=\"auto\";'";

nameText += "onclick='GEvent.trigger(marker["+i+"],\"click\")' ";
nameText += ">";
nameText += "<b>" + name + "</b>";
if (forprint == 1) {
nameText += "<br>" + address;
nameText += "<br>" + phone;
}
nameText += "</span>";

index += "<tr><th class=directory style='background-color:" + bcolor + ";'>" + letter + "</td><td class=directory>" + nameText + "</td></tr>";

                                                        batch.push( marker[i] );
							ii++;
							}
                                                 }

				                if (ii>0) map.setCenter(new GLatLng(rlat,rlng), zoom); 
                                                mgr.addMarkers( batch ,6, 17);
                                                mgr.refresh();
				 		if (forprint == 0) {
							index += "<tr><td colspan=2 align=center class=directory><br><b>click bingo hall for details</b></td></tr>";
						}
                                                index += "</table></form>";
						
                                                var indexObj = document.getElementById("directoryscroll");
                                                indexObj.innerHTML = index;
						 
						document.forms['index'].elements['regionselect'].value=currentregion;

                                        } else {
                                                alert("invalid xml file:"+filename);
                                        }
                                } else {
                                        alert("file not found:"+filename);
                                }
                          }
                        }
//      alert("sending null");

                request.send(null);
    
    }

    // Creates a marker whose info window displays the letter corresponding
    // to the given index.
    function createMarker(point, index, html) {
                // Create a lettered icon for this point using our icon class
		var ii = index % 26;
                var letter = String.fromCharCode("A".charCodeAt(0) + ii);
                var letteredIcon = new GIcon(baseIcon);


		if (index > 25) {
			// flip to blue icons
			letter = letter + "-ugc";
		}

                letteredIcon.image = "http://www.bingobugle.ca/images/markers/" + letter + ".png";

                // Set up our GMarkerOptions object
                markerOptions = { icon:letteredIcon };
                var marker = new GMarker(point, markerOptions);

                GEvent.addListener(marker, "click", function() {
                        marker.openInfoWindowHtml(html); 
			GEvent.trigger(marker,"mouseout");
                       });
		GEvent.addListener(marker,'mouseover',function(){
			marker.setImage("http://www.bingobugle.ca/images/markers/markergreen.png");
			document.getElementById("hall"+index).style.background ="yellow";
		});
		GEvent.addListener(marker,'mouseout',function(){
			marker.setImage(letteredIcon.image);
			document.getElementById("hall"+index).style.background ="#D8F2B3";
		});

                return marker;
    }


    function setDirections(fromAddress, fromCity, fromState, fromPostal, toAddress, locale) {
      var address = fromAddress + ", " + fromCity + ", " + fromState + ", " + fromPostal;

	createCookie('address',fromAddress,99);
	createCookie('city',fromCity,99);
	createCookie('state',fromState,99);
	createCookie('postal',fromPostal,99);


      gdir.load("from: " + address + " to: " + toAddress,
                { "locale": locale });
    }


    function handleErrors(){
	   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code);
	   
	   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code);

	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
	     
	   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code);

	   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code);
	    
	   else alert("An unknown error occurred.");
	   
	}


	function onGDirectionsLoad(){ 
      // Use this function to access information about the latest load()
      // results.

      // e.g.
      // document.getElementById("getStatus").innerHTML = gdir.getStatus().code;
	  // and yada yada yada...
	}


function toggledirectory(address) {
                var d = document.getElementById('directoryscroll');
                if(d != null)
                        d.style.display = 'none';
                var d = document.getElementById('directionscroll');
                if(d != null)
                        d.style.display = 'block';
document.forms['directions'].elements['to'].value=address;

}

function toggledirection(i) {
                var d = document.getElementById('directoryscroll');
                if(d != null)
                        d.style.display = 'block';
                var d = document.getElementById('directionscroll');
                if(d != null)
                        d.style.display = 'none';
}

function changeregion() {
	currentregion = document.forms['index'].elements['regionselect'].value;
	createCookie('region',currentregion,99);
	location.reload(true);	
}


function createCookie(name,value,days) {
        if (days) {
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                var expires = "; expires="+date.toGMTString();
        }
        else var expires = "";
        document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length));
        }
        return "";
}

function eraseCookie(name) {
        createCookie(name,"",-1);
}

function getInnerText (node) {

        // should work on all browsers

        if (typeof node == 'undefined')             
                return '';

        if (typeof node.textContent != 'undefined') {
                return node.textContent;
        } else if (typeof node.innerText != 'undefined') {
                return node.innerText;
        } else if (typeof node.text != 'undefined') {
                return node.text;
        } else {
                switch (node.nodeType) {
                        case 3:
                        case 4:
                                return node.nodeValue;
                                break;
                        case 1:
                        case 11:
                                var innerText = '';
                                for (var i = 0; i < node.childNodes.length; i++) {
                                        innerText += getInnerText(node.childNodes[i]);
                                }
                                return innerText;
                                break;           
                        default:
                                return '';
                }
        }
}
