if (!GBrowserIsCompatible()) {
    document.getElementById("map").innerHTML = "<p style='text-color: #f00;'>Sorry, your browser doesn't seem to support Google Maps.</p>\n"
    
} else {
    if (reservedWidth == undefined) {
        reservedWidth = 0; 
    }

    //
    // getWindowHeight(), resizeMap() borrowed from Google
    //
    function getWindowWidth() {
        if (window.self && self.innerWidth) { return self.innerWidth; }
        if (document.documentElement && document.documentElement.clientWidth) { return document.documentElement.clientWidth; }
        return 0;
    }
    function getWindowHeight() {
        if (window.self && self.innerHeight) { return self.innerHeight; }
        if (document.documentElement && document.documentElement.clientHeight) { return document.documentElement.clientHeight; }
        return 0;
    }
    function resizeMap() {
        var offset = 0;
        for (var elem = document.getElementById("map"); elem != null; elem = elem.offsetParent) {
            offset += elem.offsetTop;
        }

        var windowHeight = getWindowHeight();
        var height = windowHeight - offset - 10;
        if (height >= 0) { document.getElementById("map").style.height = height + "px"; }


        var windowWidth = getWindowWidth();
        if ((windowWidth - reservedWidth - 40) > 350) {
            document.getElementById("map").style.width = (windowWidth - reservedWidth - 40)  + "px"; 
        } else {
            document.getElementById("map").style.width = "100%"; 
        }

        if (map) map.checkResize();
    }
    resizeMap();


    // attache resize event: borrowed from http://www.leapbeyond.com/ric/scuba/appletdemo/FullScreenMap.htm
    // Monitor the window resize event and let the map know when it occurs
    if (window.attachEvent) { 
        window.attachEvent("onresize", resizeMap );
    } else {
        window.addEventListener("resize", resizeMap, false);
    }




    function expandBoundsToIncludePoint(bounds, point) {
        if (bounds.minX == undefined) {
            bounds.minX = point.x;
            bounds.maxX = point.x;
            bounds.minY = point.y;
            bounds.maxY = point.y;
        } else {
            if (point.x < bounds.minX) { bounds.minX = point.x; }
            if (point.x > bounds.minX) { bounds.maxX = point.x; }
            if (point.y < bounds.minY) { bounds.minY = point.y; }
            if (point.y > bounds.minY) { bounds.maxY = point.y; }
        }

        /*
        document.getElementById("messages").innerHTML +=
              "bounds.minX = " + bounds.minX + "<br/>" +
              "bounds.maxX = " + bounds.maxX + "<br/>" +
              "bounds.minY = " + bounds.minY + "<br/>" +
              "bounds.maxY = " + bounds.maxY + "<br/><br/>" ;
        */
    }

    function getCenterLatLngOfBounds(bounds) {
        var span = bounds.toSpan();
        var sw = bounds.getSouthWest();
        return new GLatLng( sw.lat() + (span.lat()/2.0), sw.lng() + (span.lng()/2.0) );
    }


    function recenterAndFindZoomLevel(bounds) {
        var center = getCenterLatLngOfBounds(bounds);
        var zoom = map.getBoundsZoomLevel(bounds);
        map.setCenter(center, zoom);
    }
























    // array/register of the function-enclosures for showInfoWindowHtml; 
    var BMS_letteredMarkers = new Array(0); 
    var BMS_bounds = new GBounds();
    var map;





    // Create a marker whose info window displays the given number.
    var baseIcon = new GIcon();
    baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.shadowSize = new GSize(37, 34);
    baseIcon.iconAnchor = new GPoint(9, 34);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);
    baseIcon.infoShadowAnchor = new GPoint(18, 25);


    function BMS_createMarker(point, html, letter, useletter) {
        var marker;
        if (useletter == 1) {
            expandBoundsToIncludePoint(BMS_bounds,point);
            var icon = new GIcon(baseIcon);
            icon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
            marker = new GMarker(point,icon);
            BMS_letteredMarkers[letter] = function() { marker.openInfoWindowHtml(html); };
        } else {
            marker = new GMarker(point);
        }
        map.addOverlay(marker);
        GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(html); });
    }


    function BMS_toggleAddress(num) {
        var tr = 'address' + num;
        var link = 'link_address' + num;
        var showit = (document.getElementById(link).innerHTML != 'hide address');
        if (showit) {
            document.getElementById(tr).style.display = 'block';
            document.getElementById(link).innerHTML = 'hide address';
        } else {
            document.getElementById(tr).style.display = 'none';
            document.getElementById(link).innerHTML = 'show address';
        }
    }




    /*
     * xmlDoc - the response xml 
     * fromMoveMap - is this being called because the map was moved/dragged?
     *      - if so: use normal markers (not letters)
     *      - if not: recenter map to include all of these markers
     */
    function BMS_parseAddresses(xmlDoc, params, buildSideBar) {
        var fromMoveMap = params ? false : true;
        var letters = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" ];
        var letterIndex = 0;
        var msg = "";

        map.clearOverlays();

        var pageCount = parseInt(xmlDoc.documentElement.getAttribute("pageCount"));
        if (pageCount == 0) {
            msg = "Sorry, no entries found.";
            document.getElementById("addresses").innerHTML = msg;
            if (!fromMoveMap) {
                map.setCenter(new GLatLng(37.062500,-95.677068), 3);
            }
            return;
        }

        var buildingType = xmlDoc.documentElement.getAttribute("buildingType");
        var numresults = xmlDoc.documentElement.getAttribute("numresults");

        msg += buildingType + "s found: " + numresults + "<br/>\n";


        var page      = parseInt(xmlDoc.documentElement.getAttribute("page"));
        if (pageCount > 1) {
            msg += "Viewing page " + page + " of " + pageCount + ".\n";
            if (page > 1) { msg += "[<a href='javascript:BMS_gotoPage(1,\""+params+"\");'>first</a>]\n"; }
            if (page > 2) { msg += "[<a href='javascript:BMS_gotoPage("+(page-1)+",\""+params+"\");'>prev</a>]\n"; }
            if (page < (pageCount-1)) { msg += "[<a href='javascript:BMS_gotoPage("+(page+1)+",\""+params+"\");'>next</a>]\n"; }
            if (page < (pageCount)) { msg += "[<a href='javascript:BMS_gotoPage("+(pageCount)+",\""+params+"\");'>last</a>]\n"; }
            msg += "<br/>\n";
        } else {
            msg += "Viewing all.<br/>\n";
        }


        // do this now b/c when loading the page the first time, the map needs to
        // have been centered before adding a marker. This way, when we start, we dont 
        // have to center somewhere on the map, and then recenter on our search results
        if (!fromMoveMap) {
            // none of the results have longitude/latitude set
            if (xmlDoc.documentElement.getAttribute("minX") == "") {
                map.setCenter(new GLatLng(37.062500,-95.677068),3);
                
            } else {
                var sw = new GLatLng( parseFloat(xmlDoc.documentElement.getAttribute("minY")),
                                      parseFloat(xmlDoc.documentElement.getAttribute("minX")) );
                var ne = new GLatLng( parseFloat(xmlDoc.documentElement.getAttribute("maxY")),
                                      parseFloat(xmlDoc.documentElement.getAttribute("maxX")) );
                BMS_bounds = new GLatLngBounds( sw, ne );
                document.getElementById("addresses").innerHTML = "Recentering and rezooming map...";
                recenterAndFindZoomLevel(BMS_bounds);
            }
        }


        
        var bms = xmlDoc.documentElement.getElementsByTagName("bm");
        var assignLetters = fromMoveMap ? false : true;
        assignLetters = assignLetters && bms.length <= 10; // only if 10 results or less (e.g. not if 'show all' in affect)
        var bmid; var name; var addy; var infoHtml; var point;
        for (var i = 0; i < bms.length; i++) {
            //document.getElementById("addresses").innerHTML = "Processing " +(i+1)+ " of " + bms.length + "...";
            msg += "<div class='mixedaddress'>\n";

            bmid = bms[i].getAttribute("bmid");
            name = bms[i].firstChild.firstChild.nodeValue;
            addy = bms[i].firstChild.nextSibling.nodeValue;

            infoHtml = "<div style='white-space:nowrap;'>" +
                           "<b><a href='bmdetails.php?bmid="+bmid+"'>"+name+"</a></b><br/>"+
                           addy+
                           "</div>";

            point = false;

            // stoopid internet explorer - doesnt have 'hasAttribute'
            if ((bms[i].hasAttribute && bms[i].hasAttribute("longitude")) || (bms[i].getAttribute("longitude") != null))  {
                var l = (assignLetters) ? l = letters[letterIndex++] : ''; 
                point = new GLatLng(parseFloat(bms[i].getAttribute("latitude")), parseFloat(bms[i].getAttribute("longitude")));
                BMS_createMarker(point, infoHtml, l, assignLetters);
                if (buildSideBar) {
                    msg += "<a href='javascript:BMS_letteredMarkers[\""+l+"\"]()'>" +
                           "<img border='0' src='http://www.google.com/mapfiles/marker"+l+".png'>" +
                           "<b>" + name +  "</b></a><br/>\n"; 
                }
            } else {
                if (buildSideBar) {
                    msg += "<b>" + name + "</b><br/>\n" +
                           "<span style='font-size: small;'><i>(Not on map: longitude/latitude not set)</i></span><br/>\n";
                }
            }

            if (buildSideBar) {
                msg += "<span class='noprint' style='font-size: small;'>\n" +
                       "[<a href='bmdetails.php?bmid=" + bmid + "'>details</a>]\n" +
                       "[<a href='javascript:BMS_toggleAddress("+i+")' id='link_address"+i+"'>show address</a>]<br/>\n"  +
                       "</span>\n" +
                       "<div class='address' id='address"+i+"'>" + addy + "</div>\n" +
                       "</div>\n";
            }
        }

        msg += "<br/>\n";
        msg += "[<a id='quasilink' href='?" + params + '&page=' + page + "'>QuasiLink</a>]\n";

        if (pageCount > 1) {
            msg += "[<a href='javascript:BMS_gotoPage(1,\""+params+"&perpage=all\");'>show all</a> (warning: slow!)]\n"; 
        }

        if (buildSideBar) {
            document.getElementById("addresses").innerHTML = msg;
        }
    }


    function BMS_gotoPage( page, params ) {
        document.getElementById("addresses").innerHTML = "Loading...";

        var request = GXmlHttp.create();
        request.open('GET', 'points.php?page='+page+params, true);
        request.onreadystatechange = function() {
            if (request.readyState != 4) { return; }
            var xmlDoc = request.responseXML;
            BMS_parseAddresses(xmlDoc, params, 1);
        };
        request.send(null);
    }






    function Form_getParams(form) {
        var getstr = "";
        for (i=0; i < form.elements.length; i++) {
            if (form.elements[i].tagName == "INPUT") {
                if (form.elements[i].type == "text" || form.elements[i].type == "hidden") {
                    getstr += "&" + form.elements[i].name + "=" + encodeURI(form.elements[i].value);
                }
                if (form.elements[i].type == "checkbox") {
                    if (form.elements[i].checked) {
                        getstr += "&" + form.elements[i].name + "=" + encodeURI(form.elements[i].value);
                    }
                }
                if (form.elements[i].type == "radio") {
                    if (form.elements[i].checked) {
                        getstr += "&" + form.elements[i].name + "=" + encodeURI(form.elements[i].value);
                    }
                }
            }   
            if (form.elements[i].tagName == "SELECT") {
                var sel = form.elements[i];
                getstr += "&" + sel.name + "=" + encodeURI(sel.options[sel.selectedIndex].value);
            }
        }
        return getstr;
    }



    function BMS_searchFormSubmit(formId) {
        document.getElementById("addresses").innerHTML = "Loading...";
        params = Form_getParams(document.getElementById(formId));
        BMS_gotoPage( 1, params );
    }



    
}

