// alert("loading google maps");
    var map;
    var geocoder;
    var maploaded=false;
    var listings = new Array();
    var btowns = new Array();
    var markers = new Array();

    var iconBlue = new GIcon();
    iconBlue.image = 'http://gmaps-samples.googlecode.com/svn/trunk/markers/circular/bluecirclemarker.png';
    iconBlue.shadow = '';
    iconBlue.iconSize = new GSize(32, 32);
    iconBlue.iconSize = new GSize(32, 32);
    iconBlue.shadowSize = new GSize(22, 20);
    iconBlue.iconAnchor = new GPoint(16, 16);
    iconBlue.infoWindowAnchor = new GPoint(12, 20);

    var iconGreen = new GIcon();
    iconGreen.image = "http://lakesregionrealestate.com/images/mm_20_green.png";
    iconGreen.shadow = "http://lakesregionrealestate.com/images/mm_shadow.png";
    iconGreen.iconSize = new GSize(12, 20);
    iconGreen.shadowSize = new GSize(17, 25);
    iconGreen.iconAnchor = new GPoint(6, 10);
    iconGreen.infoWindowAnchor = new GPoint(5, 10);
    iconGreen.infoShadowAnchor = new GPoint(5, 5);

    var baseIcon = new GIcon();
    baseIcon.image = "http://lakesregionrealestate.com/images/mm_20_blue.png";
    baseIcon.shadow = "http://lakesregionrealestate.com/images/mm_shadow.png";
    baseIcon.iconSize = new GSize(12, 20);
    baseIcon.shadowSize = new GSize(17, 25);
    baseIcon.iconAnchor = new GPoint(6, 10);
    baseIcon.infoWindowAnchor = new GPoint(5, 10);
    baseIcon.infoShadowAnchor = new GPoint(5, 5);

function mkr() {
    var mlsno;
    var html;
    var marker;

}
function listing() {
    var mlsno;
    var lat;
    var lon;
    var town;
}

function btown() {
    var town;
    var name;
    var point;
    var html;
}

function showmarker(k) {
    markers[k].marker.openInfoWindowHtml(markers[k].html);
}

function createMarker(point, index,type,html) {
    if (type==0) {
        var myIcon = new GIcon(iconBlue);
        markerOptions = { icon:myIcon ,zIndexProcess:importanceOrder };
        var importanceorder=2;
    } else {
        var myIcon = new GIcon(baseIcon);
        markerOptions = { icon:myIcon,zIndexProcess:importanceOrder,draggable: true };
        var importanceorder=1;
    }


    var marker = new GMarker(point, markerOptions);
    marker.importance=importanceorder;

        GEvent.addListener(marker, "dragstart", function() {
          map.closeInfoWindow();
        });

        GEvent.addListener(marker, "dragend", function() {
          var point = marker.getLatLng()
          var lat = point.lat();
          var lon = point.lng();
          confirmplot(lat,lon,marker.getTitle());
          // html = "<p style='color: black;'>Latitude: " + lat + "<br>";
          // html += "Longitude: " + lon + "</p>";
          // marker.openInfoWindowHtml(html);
        });

    GEvent.addListener(marker, "mouseup", function() {
         marker.openInfoWindowHtml(html);
    });
    return marker;
}

function createMarker2(point, index,type,html,t) {
    // alert ("Type: X" + type + "X")
    switch (type) {
        case 0:
            var myIcon = new GIcon(iconBlue);
            markerOptions = { icon:myIcon ,zIndexProcess:importanceOrder };
            var importanceorder=2;
            break;
        case "2":
        case 2:
            var myIcon = new GIcon(iconGreen);
            markerOptions = { icon:myIcon,zIndexProcess:importanceOrder,draggable: false,title:t };
            var importanceorder=1;
            break;
        default:
            var myIcon = new GIcon(baseIcon);
            markerOptions = { icon:myIcon,zIndexProcess:importanceOrder,draggable: false,title:t };
            var importanceorder=1;
    }


    var marker = new GMarker(point, markerOptions);
    marker.importance=importanceorder;

        GEvent.addListener(marker, "dragstart", function() {
          map.closeInfoWindow();
        });

        GEvent.addListener(marker, "dragend", function() {
          var point = marker.getLatLng()
          var lat = point.lat();
          var lon = point.lng();
          // confirmplot(lat,lon,marker.getTitle());
          html = "<p style='color: black;'>Latitude: " + lat + "<br>";
          html += "Longitude: " + lon + "</p>";
          marker.openInfoWindowHtml(html);
        });

    GEvent.addListener(marker, "mouseup", function() {
         marker.openInfoWindowHtml(html);
    });
    return marker;
}

function confirmplot(lat,lon,title) {
    if (confirm(title + "\n" + "Set to " + lat + ", " + lon)) {
        //
    }
}


function loadmap() {
    // alert("loading map");
    if (maploaded==false) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("gmap"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());

        map.setCenter(new GLatLng(43.768163, -71.387202), 10);
        showlistingsonmap();
    }
    maploaded=true;
    }
}

function addAddressToMap(response) {
      // map.clearOverlays();
      if (!response || response.Status.code != 200) {
        alert("Sorry, we were unable to geocode that address");
      } else {
        place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1],
                            place.Point.coordinates[0]);
        marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(place.Point.coordinates[1] + ", " + place.Point.coordinates[0]);
      }
}

function showofficesonmap() {
    // first load the map
    var address

    document.getElementById("gmapdiv").style.display="block";
    if (maploaded==false) {
        if (GBrowserIsCompatible()) {
            map = new GMap2(document.getElementById("gmap"));
            map.addControl(new GLargeMapControl());
            map.addControl(new GMapTypeControl());

            map.setCenter(new GLatLng(43.768163, -71.387202), 10);
            // now show the offices....
            geocoder = new GClientGeocoder();

        }
        // now show the offices...
        // Moultonborough
        lat = 43.911901;
        lon = -71.35509;
        var point = new GLatLng(lat,lon);
        html="<div style='color: #000; font-size: 12px; width: 380px; padding-bottom: 30px;'>";
        html += "<img src='images/office_mou.png' style='float: left; padding: 5px; width: 150px;' />"
        html += "<p style='margin-left: 5px; color: #000;'>CENTURY 21 Lakes Region Realty<br/>";
        html += "60 Whittier Highway, Unit #3<br />";
        html += "Moultonborough, NH 03254<br />";
        html += "Tel: 603-253-7766 </p>";

        var marker = createMarker(point,0,2,html)
        map.addOverlay(marker);

        var m = new mkr

            m.mlsno = "0";
            m.html = html;
            m.marker = marker;

            markers.push(m);


        // Meredith
        lat = 43.652215
        lon = -71.49698
        var point = new GLatLng(lat,lon);
        html="<div style='color: #000; font-size: 12px; width: 380px; padding-bottom: 30px;'>";
        html += "<img src='images/office_mer.png'' style='float: left; padding: 5px; width: 150px;' />";
        html += "<p style='margin-left: 5px;'>CENTURY 21 Lakes Region Realty<br/>";
        html += "290 D.W. Highway<br />";
        html += "Meredith, NH 03253<br/>";
        html += "Tel: 603-279-6000</p>";
        html += "</div>";

        var marker = createMarker(point,0,2,html)
        map.addOverlay(marker);

                var m = new mkr

            m.mlsno = "1";
            m.html = html;
            m.marker = marker;

            markers.push(m);

    }

    maploaded=true;
    return false;
}

function closegmap() {
    document.getElementById("gmapdiv").style.display="none";
    return false;
}

function showlistingsonmap() {
    // alert("showing listings" + listings.length);
    var maxlat = 0;
    var minlon = 0;
    var minlat = 90;
    var maxlon = 180;
    var bounds = new GLatLngBounds();
    var ct=0;
    for (lst in listings) {
        ct++;
        var lat = parseFloat(listings[lst].lat);
        var lon = parseFloat(listings[lst].lon);

        if (lat > maxlat) maxlat = lat;
        if (lon < minlon) minlon = lon;
        if (lat < minlat) minlat = lat;
        if (lon > maxlon) maxlon = lon;

        var point = new GLatLng(lat,lon);
        var name="name";
        var label=listings[lst].id;
        var address=listings[lst].address;
        var type=listings[lst].status;
        var town=listings[lst].town;
        var pictureurl=listings[lst].picture;
        var price=listings[lst].price;
        var bedrooms=listings[lst].bedrooms;
        var baths=listings[lst].baths;


        if (type>=2) {
            html='<div style="width:260px; height: 190px; overflow: auto; color: #000;">';
            html+='<h3>MLS #:' + label + '</h3>';
            html+='<img src="';
            html+=pictureurl;
            html+='" style="float: left;"/>';
            // alert ("Picture URL: " + pictureurl);
            html+='<div class="listingmarker">';
            html+='<p>Price: ' + price + '</p>';
            html+='<p>Bedrooms: ' + bedrooms + '</p>';
            html+='<p>Baths: ' + baths + '</p>';
            html+='<div class="listingmarkerlink">';
            html+='<a href="#nogo" onclick="showdetail(' + label + ',' + ct + ');">View Details</a>';
            html+='</div>';
            html+='</div>';
            html+='<p style="clear: both;">' + address + '</p>';
            html+='<p>' + town + '</p>';
            html+='</div>';

            var marker = createMarker(point,lst,type,html)
            map.addOverlay(marker);

            var m = new mkr

            m.mlsno = label;
            m.html = html;
            m.marker = marker;

            markers.push(m);

            // ==== Each time a point is found, extent the bounds ato include it =====
            bounds.extend(point);

        } else {
            // in order to keep the markers array in order, we need to create a pseudo marker
            html='<div style="width:260px; height: 190px; overflow: auto; color: #000;">';
            html+='<h3>MLS #:' + label + '</h3>';
            html+='<img src="';
            html+=pictureurl;
            html+='" style="float: left;"/>';
            // alert ("Picture URL: " + pictureurl);
            html+='<div style="float: left; font-size: 10px; margin-left: 4px;">';
            html+='<p>Price: ' + price + '</p>';
            html+='<p>Bedrooms: ' + bedrooms + '</p>';
            html+='<p>Baths: ' + baths + '</p>';
            html+='<div style="margin-top: 15px; width: 100%; text-align: center;"';
            html+='<a href="#nogo" onclick="showdetail();" style="font-size: 12px; color: #000;">View Details</a>';
            html+='</div>';
            html+='</div>';
            html+='<p style="clear: both;">' + address + '</p>';
            html+='<p>' + town + '</p>';
            html+='<p style="color: #900;">This address could not be geocoded</p>';
            html+='</div>';
            var marker = createMarker(point,lst,type,html)
            map.addOverlay(marker);

            var m = new mkr

            m.mlsno = label;
            m.html = html;
            m.marker = marker;

            markers.push(m);

            haveit=false;
            for (b in btowns) {
                if (btowns[b].name == town) {
                    haveit=true;
                    btowns[b].html += "<p>MLS # " + label + "</p>";
                }
            }

            if (!haveit) {
                var b = new btown;
                b.name = town;
                b.html='<div style="width:240px; height: 190px; overflow: auto; color: #000;">';
                b.html += "<h2>" + town + "</h2>";
                b.html += "<h3>Could not geocode these listings</h3>";
                b.html += "<p>MLS # " + label + "</p>";
                // b.html += "</div>";
                b.point = point;
                btowns.push(b);
            }
        }
    }

    // now, we need to put out a marker for the bad listings...
    for (t in btowns) {
        html=btowns[t].html
        html +=  "</div>";

        var zmarker = createMarker(btowns[t].point,t,0,html);
        map.addOverlay(zmarker);
        bounds.extend(btowns[t].point);

    }

    map.setCenter(new GLatLng(maxlat, minlon), 10);

    // ===== initialize the map based on the zoom level from the bounds =====
    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
    var output = "All Numbers\n";
    for (i in markers) {
        output += markers[i].mlsno + "\n";
    }
     // alert(output);
}

function importanceOrder (marker,b) {
    return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
}

