﻿var gcurrentState = 'FL';
var path;
var gStateMapInfo;
//var marker = new Array();
if (window.ActiveXObject) {
    var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
    var xmlAddress = new ActiveXObject("Msxml2.DOMDocument");
}
var smallLng = 0
var bigLng = -999
var smallLat = 999
var bigLat = 0
var maxAddressZoom = 11
var initialAddressZoom = 10
var sCurrentCategory = 'On the Market';

var map;
var ADDRESS_XML = null;
var FAVS_XML = null;
var AREA_XML = null;
var USER_ID;
var PROPERTY_ID;
var REGION;

function loadXMLDocSync(url)
{
    xmlhttp = null;
    
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    if (xmlhttp!=null) {
        xmlhttp.onreadystatechange = state_Change;
        xmlhttp.open("GET", url, false);
        xmlhttp.send(null);
        return xmlhttp.responseXML;
    } else {
        alert("Your browser does not support XMLHTTP.");
    }
}

function state_Change()
{
    // if xmlhttp shows "loaded"
    if (xmlhttp.readyState == 4) {
        // if "OK"
        if (xmlhttp.status == 200) {
            // ...some code here...
        } else {
            // ignore
        }
    }
}

function load() {
    if (GBrowserIsCompatible()) {
        init();
        if (REGION != "") {
            GetLocalMap(getMainCityOfRegion(REGION), REGION);
        } else if (PROPERTY_ID != "" && USER_ID != "-1") {
            showAddress(PROPERTY_ID, true);
        } else {
            //map.setCenter(new GLatLng(47.5, -122), 8);
            //map.setCenter(new GLatLng(37.4419, -122.1419), 6);
            GetUSMap();
            //GetCityMap("WA");
        }
    }
}

function init() {
	var currentTime = new Date();
	var dateStamp = currentTime.getFullYear() + currentTime.getMonth() + currentTime.getDate() + currentTime.getHours() + currentTime.getMinutes() + currentTime.getSeconds();

    USER_ID = document.getElementById("hdUserid").value;
    PROPERTY_ID = queryStringGetValue("PropertyID");
    REGION = queryStringGetValue("Region");
    ADDRESS_XML = loadXMLDocSync(getXMLDataUrl("address.xml?" + dateStamp));
    AREA_XML = loadXMLDocSync(getXMLDataUrl("areas.xml?"));
    if (USER_ID != "-1") {
        FAVS_XML = loadXMLDocSync(getUsersFavoritesPath());
    }
    
    map = new GMap2(document.getElementById("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    
    SetCategory();
}

function getPropertyID(xmlnode) {
    return xmlnode.getAttribute("ID");
}

function getPropertyName(xmlnode) {
    return xmlnode.getAttribute("propName");
}

function getPropertyMarkerHtml(xmlnode) {
    var pid = xmlnode.getAttribute("ID");
    var name = xmlnode.getAttribute("propName");
    var address = xmlnode.getAttribute("street") + "<br />" + xmlnode.getAttribute("city") + ", " + xmlnode.getAttribute("state") + " " + xmlnode.getAttribute("zip");
    var category = xmlnode.getAttribute("category");
    var url = xmlnode.getAttribute("URL");
    var region = xmlnode.getAttribute("region");
    var imagename = xmlnode.getAttribute("ImagePath");
    var contact_name	= xmlnode.getAttribute("contact_name");
    var contact_phone	= xmlnode.getAttribute("contact_phone");
    
    var content = '<table border=\"0\"><tr>';
    
    content += '<td><strong>' + name + '</strong><br />' + address;
    if (contact_name + contact_phone != "") {
		content += "<br /><br />" + contact_name + " ";
		if (contact_name.length > 27)
			content += "<br />";
		content += "<nobr>" + contact_phone + "</nobr>";
	}
    content	+= '<br /><br /><span style=\"color:red;\">' + category + 
                  '</span><br /><br />';
    content += '<a href="' + url + 
               '" target=\"_blank\">Website</a><br>';
    if (USER_ID == "-1") {
        content += '<a href="login.aspx?region=' + region + '&pid=' + pid + '&selected=' + getSelectedCategories() + '">Log in/Add to favorites</a>';
    } else if (!propertyInFavorites(pid)) {
        content += '<a href="javascript:{}" onclick="AddFav('
                 + USER_ID + ', ' + pid + '); toggleAddRemoveFav(this, ' + pid + ');"' +
                 '>Add this Property to My Favorites</a>';
    } else {
        content += '<a href="javascript:{}" onclick="RemoveFav(' 
                 + USER_ID + ', ' + pid + '); toggleAddRemoveFav(this, ' + pid + ');"' +
                 '>Remove this Property from My Favorites</a>';
    }
	content += '</td>';
	if (imagename != '') {
        content += '<td><img style=\"margin-right:8px;\" src=\"property_images/' + imagename + '\" /></td>'
    }
	content += '</tr></table>';
    
    return content;
}

function getSelectedCategories() {
    var arr = new Array(4)
    arr[0] = document.forms[0].chkForSale.checked;
    arr[1] = document.forms[0].chkResale.checked;
    arr[2] = document.forms[0].chkComingSoon.checked;
    arr[3] = document.forms[0].chkSold.checked;
    
    var r = "";
    
    for (var i = 0; i < arr.length; ++i) {
        if (arr[i]) {
            r += "1";
        } else {
            r += "0";
        }
    }
    
    return r;
}

function getMainCityOfRegion(region) {            
    var markers = AREA_XML.documentElement.getElementsByTagName("neighborhood");
    if (markers.length == 0) return "";

    for (var i = 0; i < markers.length; i++) {
        var sName = markers[i].getAttribute("name");
        if (sName == region) {
            return markers[i].getAttribute("mainCity");
        }
    }
    
    return "";
}

function getPropertyXml(pid) {
    var markers = ADDRESS_XML.documentElement.getElementsByTagName("address");
    
    for (var i = 0; i < markers.length; i++) {
        var sID = markers[i].getAttribute("ID");
        
        if (sID == pid) {
            return markers[i];
        }
    }
    
    return null;
}

function getXMLDataUrl(file) {
    var url = "http://" + location.host + location.pathname;
    url = url.substring(0, url.lastIndexOf("/")) + "/Data/" + file;
    return url;
}

function getUsersFavoritesPath() {
    var url = "http://" + location.host + location.pathname;
    url = url.substring(0, url.lastIndexOf("/")) + "/Favs/" + USER_ID + ".xml";
    return url;
}

function GetUSMap(){
    //Clear all
    map.clearOverlays();
    
    //Load states
    GDownloadUrl("Data/propStates.xml", 
        function(data, responseCode) 
        {
            //If file not found
            if (responseCode == "404")
            {
                return ;
            }
            
            //Loading information
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName("marker");
            if (markers.length == 0) return;
            
            var start = 0;
            if (markers.length <= 1)
                start = 0;
            var markercount = markers.length;
            
            for (var i = 0; i < markers.length; ++i) {
                if (markers[i].getAttribute("path") == "WA") {
                    GetRegionMap("WA");
                    return;
                }
            }
            
//            if (markercount > 1) {
//                // Show US map
//                map.setCenter(new GLatLng(42, -95), 3);
//                
//                for (var i = start; i < markercount; i++) 
//                {
//                    var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
//                    markers[i] = createStateMarker(point, markers[i].getAttribute("path"), markers[i].getAttribute("name"));
//                    map.addOverlay(markers[i]);
//                }
//            }
//            else
//            {
//                // Only one state, skip the first US map                    
//                GetRegionMap(markers[start].getAttribute("path"));
//            }
        }
    );
}    

function GetRegionMap(state) {
   //Clear all
    map.clearOverlays();

    //Load areas
    GDownloadUrl("Data/areas.xml",
        function(data, responseCode)
        {
            //If file not found
           
            if (responseCode == "404")
            {
                return ;
            }
            
            //Loading information
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName("neighborhood");
            if (markers.length == 0) return;
            
            map.setCenter(calculateCenter(xml, "neighborhood", "state", state), 8);
            document.getElementById("lblLegend").innerHTML = "";
            //map.setCenter(new GLatLng(47.5, -122), 7);
            
            var start = 0;
            var sName,sCity,sState,point;
            if (markers.length <= 1)
                start = 0;
            var markercount = markers.length;
            for (var i = start; i < markers.length; i++) 
            {
                sState = markers[i].getAttribute("state");                    
                if (sState == state){
                    sCity = markers[i].getAttribute("mainCity");
                    sName = markers[i].getAttribute("name");
                    point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
                    showRegionAddress(sCity,sName,point);
                }
            }
            generateLegend();
        }
    );
}

function generateLegend() {
    document.getElementById("lblLegend").innerHTML = "";
    var markers = AREA_XML.documentElement.getElementsByTagName("neighborhood");
    for (var i = 0; i < markers.length; ++i) {
        var region = markers[i].getAttribute("name");
        var mainCity = markers[i].getAttribute("mainCity");
        var sLetter;
        sLetter = region.substring(0,1);
        if (countProperties(region) != "" && region != "Other Areas") {
            document.getElementById("lblLegend").innerHTML = document.getElementById("lblLegend").innerHTML + "<a id=\"legend_" + region + "\" href=\"javascript:GetLocalMap('" + mainCity + "','" + region + "')\"><img src='http://www.google.com/mapfiles/marker" + sLetter + ".png' style='border:none;width:20px;height:34px;' />" + region + "</a><br/><span id=\"legend_" + region + "\"></span>";
        }
    }
}

function calculateCenter(xml, nodeName, filterAttrib, filterValue) {
    var markers = xml.documentElement.getElementsByTagName(nodeName);
    var minlat = 9999;
    var maxlat = -9999;
    var minlng = 9999;
    var maxlng = -9999;
    for (var i = 0; i < markers.length; i++) {
        if (filterAttrib == undefined || filterValue == undefined ||
            markers[i].getAttribute(filterAttrib) == filterValue) {
            if (markers[i].getAttribute("lat") < minlat)
                minlat = parseFloat(markers[i].getAttribute("lat"));
            if (markers[i].getAttribute("lat") > maxlat)
                maxlat = parseFloat(markers[i].getAttribute("lat"));
            if (markers[i].getAttribute("lng") < minlng)
                minlng = parseFloat(markers[i].getAttribute("lng"));
            if (markers[i].getAttribute("lng") > maxlng)
                maxlng = parseFloat(markers[i].getAttribute("lng"));
        }
    }
    //document.write((maxlat + minlat) / 2,(maxlng + minlng) / 2);
    //var center = new GLatLng((maxlng + minlng) / 2, (maxlat + minlat) / 2); 
    //var delta = new GSize(maxlng-minlng, maxlat-minlat); 
    //var minZoom = map.spec.getLowestZoomLevel(center, delta, map.viewSize);
    //map.centerAndZoom(center, minZoom);
    return (new GLatLng((maxlat + minlat) / 2, (maxlng + minlng) / 2));
}

// Creates a marker at the given point with the given number label
function createStateMarker(point, content, desc) {
  var marker = new GMarker(point);
  GEvent.addListener(marker, "mouseover", function() {
        marker.openInfoWindowHtml("<b><font color=black>" + desc + "</font></b>");});
  GEvent.addListener(marker, "click", function() {
    //marker.openInfoWindowHtml(content);
    GetRegionMap(content);
    //GetCityMap(content);
    //map.setCenter(point, 7);
  });
  return marker;
}

// Creates a marker at the given point with the given number label
function showRegionAddress(mainCity, region, point) {
    //document.getElementById("lblLegend").innerHTML = "";
//    var geocoder = new GClientGeocoder();
//    geocoder.getLatLng(mainCity,
//                       function(point) {
    if (!point) {
       alert(mainCity + " is not found!");
    } else {
       var propertyCountHTML = countProperties(region);
       if (propertyCountHTML == "") return;
       // Colors
       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);

       // var marker = new GMarker(point);
       var sLetter;
       sLetter = String(region).substring(0,1);
       baseIcon.image = "http://www.google.com/mapfiles/marker" + sLetter + ".png";  
       var marker = new GMarker(point, baseIcon);

       map.addOverlay(marker);
       GEvent.addListener(marker, "mouseover", function() {
                                                   //marker.openInfoWindowHtml("<b>" + address + "</b><br><br><a href=\"javascript:GetLocalMap('" + address + "')\">Go to this city</a>")});
                                                   marker.openInfoWindowHtml("<b><font color=black>" + region + "</font></b><br/>" + propertyCountHTML + "<br/><a href=\"javascript:GetLocalMap('" + mainCity + "','" + region + "')\">Go to this neighborhood</a>");
                                               });
       GEvent.addListener(marker, "click", function() {
                                                   //marker.openInfoWindowHtml("<b>" + address + "</b><br><br><a href=\"javascript:GetLocalMap('" + address + "')\">Go to this city</a>")});
                                                   //GetCityMap(region);});
                                                   GetLocalMap(mainCity, region);
                                           });
       //map.setCenter(point, 8);
    }
                       //});
}

function countProperties(region) {
    var result = "<p>";
    
    var bForSale = document.forms[0].chkForSale.checked;
    var bResale = document.forms[0].chkResale.checked;
    var bComingSoon = document.forms[0].chkComingSoon.checked;
    var bSold = document.forms[0].chkSold.checked;
    
    var sComingSoon2 = document.forms[0].sComingSoon.value;
    var sForSale2 = document.forms[0].sForSale.value;
    var sResale2 = document.forms[0].sResale.value;
    var sSold2 = document.forms[0].sSold.value;
    
    //GDownloadUrl("address.xml", function(data, responseCode) {
        //var xml = GXml.parse(ADDRESS_XML);
        var markers = ADDRESS_XML.documentElement.getElementsByTagName("address");
        if (markers.length == 0) return;
        
        var forSaleCount = 0;
        var comingSoonCount = 0;
        var resaleCount = 0;
        var soldCount = 0;
        var category;

        for (var i = 0; i < markers.length; i++) {
            category = markers[i].getAttribute("category");
            if (region == markers[i].getAttribute("region")) {
                if (category == sForSale2) {
                    ++forSaleCount;
                } else if (category == sComingSoon2) {
                    ++comingSoonCount;
                } else if (category == sSold2) {
                    ++soldCount;
                } else if (category == sResale2) {
                    ++resaleCount;
                } else {
                }
            }
        }
        
        var total = 0;

        if (bForSale) {
            total += forSaleCount;
            result += "<img src=\"../images/mm_20_green.png\" alt=\"green\" />" + "On the Market: " + forSaleCount + "<br/>";
        }
        if (bComingSoon) {
            total += comingSoonCount;
            result += "<img src=\"../images/mm_20_yellow.png\" alt=\"yellow\" />" + "Coming Soon: " + comingSoonCount + "<br/>";
        }
        if (bSold) {
            total += soldCount;
            result += "<img src=\"../images/mm_20_red.png\" alt=\"red\" />" + "Sold Out by WMI: " + soldCount + "<br/>";
        }
        if (bResale) {
            total += resaleCount;
            result += "<img src=\"../images/mm_20_blue.png\" alt=\"blue\" />" + "Resale: " + resaleCount + "<br/>";
        }
    //});

    if (total > 0) {
        return (result + "</p>");
    } else {
        return "";
    }
}
  
function GetCityMap(region){

  var myStateMapInfo = GetStateMapInfo(region);
  map.clearOverlays();    
  GDownloadUrl("Data/cities.xml", function(data, responseCode) {
    var xml = GXml.parse(data);
    var markers = xml.documentElement.getElementsByTagName("address");
    if (markers.length == 0) return;
    var sCity, sState;

    for (var i = 0; i < markers.length; i++) {        
       sRegion=markers[i].getAttribute("area");
       if (sRegion == region){
            sCity = markers[i].getAttribute("city");
            showCityAddress(sCity,region);                        
       }
    }
  });
  
  map.setCenter(new GLatLng(Number(myStateMapInfo.lat), Number(myStateMapInfo.lng)), Number(myStateMapInfo.zoomlevel));
}

function showCityAddress(sCity,region) {     
  var geocoder = new GClientGeocoder();
  geocoder.getLatLng(
    sCity,
    function(point) {
      if (!point) {
        //alert(address + " is not found!");
      } else {        
        // Colors
        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);

        // var marker = new GMarker(point);
        var sLetter;
        sLetter = String(sCity).substring(0,1);
        baseIcon.image="http://www.google.com/mapfiles/marker" + sLetter + ".png";  
        var marker = new GMarker(point, baseIcon);
        
        map.addOverlay(marker);
        GEvent.addListener(marker, "mouseover", function() {
        //marker.openInfoWindowHtml("<b>" + address + "</b><br><br><a href=\"javascript:GetLocalMap('" + address + "')\">Go to this city</a>")});
        marker.openInfoWindowHtml("<b><font color=black>" + sCity + "</font></b><br><br><a href=\"javascript:GetLocalMap('" + sCity + "','" + region + "')\">Go to this city</a>")});
        GEvent.addListener(marker, "click", function() {
        //marker.openInfoWindowHtml("<b>" + address + "</b><br><br><a href=\"javascript:GetLocalMap('" + address + "')\">Go to this city</a>")});
        GetLocalMap(sCity,region);});
        map.setCenter(point, 9);            
      }
    }
  );
}

function queryStringGetValue(lookup) {
    var query = location.search.substring(1);
    var pairs = query.split("&");
    var i = 0;
    for (i = 0; i < pairs.length; ++i) {
        var keyvalue = pairs[i].split("=");
        var key = keyvalue[0];
        var value = keyvalue[1];
        if (key == lookup) {
            return value.replace(/%20/, " ");
        }
    }
    return "";
}

function GetLocalMap(cityState, region) {    
    var sComingSoon2 = document.forms[0].sComingSoon.value;
    var sForSale2 = document.forms[0].sForSale.value;
    var sResale2 = document.forms[0].sResale.value;
    var sSold2 = document.forms[0].sSold.value;

    var bForSale = document.getElementById("chkForSale").checked;
    var bResale = document.forms[0].chkResale.checked;
    var bComingSoon = document.forms[0].chkComingSoon.checked;
    var bSold = document.forms[0].chkSold.checked;

    var myStateMapInfo = GetStateMapInfo(region);
    map.clearOverlays();
    var iCount = 0;

    map.setCenter(calculateCenter(ADDRESS_XML, "address", "region", region), calculateZoom(region));
    var markers = ADDRESS_XML.documentElement.getElementsByTagName("address");
    if (markers.length == 0) return;
    
    generateLegend();

    var propertyList = "<ul class='legendList'>";

    for (var i = 0; i < markers.length; i++) {
        var sRegion = markers[i].getAttribute("region");
        
        if (sRegion == region) {
            var pid = markers[i].getAttribute("ID");
            var category = markers[i].getAttribute("category");

            if (category == sForSale2 && bForSale == true) {
                var point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
                iCount = iCount + 1;
                propertyList += "<li><a href=\"javascript:PROPERTY_ID = " + pid + "; GetLocalMap('" + cityState + "', '" + region + "');\">" + showAddress1(pid, point) + "</a></li>";
            } else if (category == sComingSoon2 && bComingSoon == true) {
                var point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
                iCount = iCount + 1;
                propertyList += "<li><a href=\"javascript:PROPERTY_ID = " + pid + "; GetLocalMap('" + cityState + "', '" + region + "');\">" + showAddress1(pid, point) + "</a></li>";
            } else if (category == sSold2 && bSold == true) {
                var point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
                iCount = iCount + 1;
                propertyList += "<li><a href=\"javascript:PROPERTY_ID = " + pid + "; GetLocalMap('" + cityState + "', '" + region + "');\">" + showAddress1(pid, point) + "</a></li>";
            } else if (category == sResale2 && bResale == true) {
                var point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
                iCount = iCount + 1;
                propertyList += "<li><a href=\"javascript:PROPERTY_ID = " + pid + "; GetLocalMap('" + cityState + "', '" + region + "');\">" + showAddress1(pid, point) + "</a></li>";
            } else {
            }
        }
    }
    
    propertyList += "</ul>";
    insertListInLegend(propertyList, region);

    if (iCount == 0) {
        alert("No property is found in " + cityState + ", " + region);
    }
}

function calculateZoom(region) {
    switch (region.toLowerCase()) {
        case "seattle":
            return 11;
        case "eastside":
            return 11;
        default:
            return 10;
    }
}

function insertListInLegend(propertyList, region) {
    var elems = getObjectsByPrefixAndTagName("legend", "span");
    for (var i = 0; i < elems.length; ++i) {
        elems[i].innerHTML = "";
        if (elems[i].id == "legend_" + region)
            elems[i].innerHTML = propertyList;
    }
}

function getObjectsByPrefixAndTagName(prefix, type) {
    var elems = document.documentElement.getElementsByTagName(type);
    var array = new Array();
    for (var i = 0; i < elems.length; ++i) {
        if (elems[i].id.indexOf(prefix) != -1) {
            array.push(elems[i]);
        }
    }
    return array;
}

function showAddress1(pid, point) {
    if (PROPERTY_ID == pid) {
        PROPERTY_ID = "";
        return showAddress(pid, true, point);
    } else {
        return showAddress(pid, false, point);
    }
}

function showAddress(pid, displayMarker, point) {
    var geocoder = new GClientGeocoder();
    var midLat;
    var midLng;
    
    var sComingSoon2 = document.forms[0].sComingSoon.value;
    var sForSale2 = document.forms[0].sForSale.value;
    var sResale2 = document.forms[0].sResale.value;
    var sSold2 = document.forms[0].sSold.value;

    var xmlnode = getPropertyXml(pid);
    var sCityState = xmlnode.getAttribute("cityState");
    var sRegion = xmlnode.getAttribute("region");
    var propName = xmlnode.getAttribute("propName");
    var address = xmlnode.getAttribute("street") + ", " + xmlnode.getAttribute("city") + ", " + xmlnode.getAttribute("state") + " " + xmlnode.getAttribute("zip");
    var sCategory = xmlnode.getAttribute("category");
    var sURL = xmlnode.getAttribute("URL");
        
    var icon = new GIcon();
    
    if (sCategory == sForSale2) {
        icon.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
    } else if (sCategory == sComingSoon2) {
        icon.image = "http://labs.google.com/ridefinder/images/mm_20_yellow.png";
    } else if (sCategory == sSold2) {
        icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
    } else {
        icon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
    }
    
    icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(12, 20);
    icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(6, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var marker = new GMarker(point,icon);
    map.addOverlay(marker);
    GEvent.addListener(marker, "click", function() { window.location = sURL; });
    GEvent.addListener(marker, "mouseover", function() { marker.openInfoWindowHtml(getPropertyMarkerHtml(xmlnode)); });
    if (displayMarker) {
        marker.openInfoWindow(getPropertyMarkerHtml(xmlnode));
    }
    return getPropertyName(xmlnode);
}

function toggleAddRemoveFav(tag, propid) {
    if (tag.innerHTML == "Add this Property to My Favorites") {
        tag.innerHTML = "Remove this Property from My Favorites";
        tag.onclick = function() { RemoveFav(USER_ID, propid); toggleAddRemoveFav(tag, propid); };
    } else {
        tag.innerHTML = "Add this Property to My Favorites";
        tag.onclick = function() { AddFav(USER_ID, propid); toggleAddRemoveFav(tag, propid); };
    }
}

function propertyInFavorites(pID) {
    if (!FAVS_XML.documentElement) return false;

    var markers = FAVS_XML.documentElement.getElementsByTagName("address");
    if (markers.length == 0) return false;
    
    var i = 0;
    for (i = 0; i < markers.length; i++) {
        if (pID == markers[i].getAttribute("ID")) {
            return true;
        }
    }
    return false;
}

function createRectangle(objBound,bgcolor)
{    
    var Rect = new Rectangle(objBound);
    GEvent.addListener(map, "click", function() {
    Rect.backgroundColor_ = bgcolor;
    Rect.color_ = bgcolor;
    });
    return Rect;
}



//CUSTOM FUNCTIONS (KT)
function GetDynamicZoomLevel(midLat,midLng){
    var zoomlevel = 10;
    var lsmallLng = smallLng;
    var lbigLng = bigLng;
    var lsmallLat = smallLat;
    var lbigLat = bigLat;
             
    map.setCenter(new GLatLng(midLat,midLng), zoomlevel);
    
    var bounds = map.getBounds();
    var mapbigLng = bounds.getNorthEast().x;
    var mapsmallLng = bounds.getSouthWest().x;
    var mapbigLat = bounds.getNorthEast().y;
    var mapsmallLat = bounds.getSouthWest().y;
    var blncontinue = true;
    while (blncontinue){                  
        if (Number(lsmallLat) > Number(mapsmallLat) && Number(lbigLat) < Number(mapbigLat) && Number(lsmallLng) > Number(mapsmallLng)&& Number(lbigLng) < Number(mapbigLng) ){
            zoomlevel = zoomlevel + 1;
            map.setCenter(new GLatLng(midLat,midLng), zoomlevel);
            bounds = map.getBounds();
            mapbigLng = bounds.getNorthEast().x;
            mapsmallLng = bounds.getSouthWest().x;
            mapbigLat = bounds.getNorthEast().y;
            mapsmallLat = bounds.getSouthWest().y;
            if (zoomlevel > maxAddressZoom){
                zoomlevel = maxAddressZoom;
                blncontinue = false;
            }
        }
        else{
            zoomlevel = zoomlevel - 1;
            blncontinue = false;
        }          
//KT: TESTING
//            var myString = "Zoom: " + zoomlevel + " *** " + lsmallLng + " >? " + mapsmallLng + "*** " + lbigLng + " <? " + mapbigLng
//            alert(myString);             

    }
          
    return (zoomlevel);
}

function StateMapInfo(path, lat, lng, zoomlevel) 
{ 
    this.path = path;
    this.lat = lat;
    this.lng = lng;
    this.zoomlevel = zoomlevel;
}

function AddressInfo(stateID, lat, lng, zoomlevel) 
{ 
    this.stateID = stateID;
    this.lat = lat;
    this.lng = lng;
    this.zoomlevel = zoomlevel;
}

function verify()
{
    // 0 Object is not initialized
    // 1 Loading object is loading data
    // 2 Loaded object has loaded data
    // 3 Data from object can be worked with
    // 4 Object completely initialized
    if (xmlDoc.readyState != 4) {
        return false;
    }
}

function verifyAddress()
{
    // 0 Object is not initialized
    // 1 Loading object is loading data
    // 2 Loaded object has loaded data
    // 3 Data from object can be worked with
    // 4 Object completely initialized
    if (xmlAddress.readyState != 4) {
        return false;
    }
}
    
function GetStateMapInfo(state)      
{
    XMLUrl = "states.xml";
    gcurrentState = state;

    // branch for IE/Windows ActiveX version
   if (window.ActiveXObject) {
        return GetIEStateXML(XMLUrl,state);            
   } 
    // branch for native XMLHttpRequest object
    else if (window.XMLHttpRequest) {
        return GetFirefoxStateXML(XMLUrl, state);      
    }
}

function GetAddressInfo(ID){
    XMLUrl = "Data/address.xml";
          
    // branch for IE/Windows ActiveX version
    if (window.ActiveXObject) {
        return GetIEAddressXML(XMLUrl,ID);        
    } 
    // branch for native XMLHttpRequest object                
    else if (window.XMLHttpRequest) {
        return GetFirefoxAddressXML(XMLUrl, ID);             
    }
}  

function GetIEAddressXML(XMLUrl, ID) {
    xmlDoc.async="false";
    xmlDoc.onreadystatechange=verify;
    xmlDoc.load(XMLUrl);
    xmlAddressObj=xmlDoc.documentElement;
    
    var zoomlevel="";
    var lat="";
    var lng="";
    
    myAddress = new AddressInfo("","","","");
    for (var i = 0; i < xmlAddressObj.childNodes.length; i++) {
        if (xmlAddressObj.childNodes(i).getAttribute("ID") == ID) {
            lat = xmlAddressObj.childNodes(i).getAttribute("lat");
            lng = xmlAddressObj.childNodes(i).getAttribute("lng");
            myAddress = new AddressInfo(ID,lat,lng,zoomlevel);
            break;
        }
    }
    return myAddress;
}

 function GetFirefoxAddressXML(XMLUrl, ID) {
    myXMLHTTPRequest = new XMLHttpRequest();
    myXMLHTTPRequest.open("GET", XMLUrl, false);
    myXMLHTTPRequest.send(null);
    var xmlSource = myXMLHTTPRequest.responseXML;
    var serializer = new XMLSerializer();
    var xml = serializer.serializeToString(xmlSource);
    var marker = xmlSource.getElementsByTagName('address');
    
    var zoomlevel=initialAddressZoom;
    var lat="";
    var lng="";
    
    myAddress = new StateMapInfo("","","","");
    
    for (i=0; i < marker.length; i++) {     
        if (marker[i].getAttribute('ID') == ID) {
            lat = marker[i].getAttribute('lat');
            lng = marker[i].getAttribute('lng');
            myAddress = new StateMapInfo(ID,lat,lng,zoomlevel);
        }            
    }
    return myAddress;
} 
    
function GetIEStateXML(XMLUrl, state) {
    xmlDoc.async="false";
    xmlDoc.onreadystatechange=verify;
    xmlDoc.load(XMLUrl);
    xmlObj=xmlDoc.documentElement;
   
    var zoomlevel="";
    var path="";
    var lat="";
    var lng="";
    
    myState = new StateMapInfo("","","","");
    
    for (var i = 0; i < xmlObj.childNodes.length; i++) {
        if (xmlObj.childNodes(i).getAttribute("path") == state) {
            path = xmlObj.childNodes(i).getAttribute("path");
            lat = xmlObj.childNodes(i).getAttribute("lat");
            lng = xmlObj.childNodes(i).getAttribute("lng");
            zoomlevel = xmlObj.childNodes(i).getAttribute("zoomLevel");
            myState = new StateMapInfo(path,lat,lng,zoomlevel);
            i = xmlObj.childNodes.length;
        }
    }
   
    return myState;    
}

function GetFirefoxStateXML(XMLUrl, state)
{
    myXMLHTTPRequest = new XMLHttpRequest();
    myXMLHTTPRequest.open("GET", XMLUrl, false);
    myXMLHTTPRequest.send(null);
    var xmlSource = myXMLHTTPRequest.responseXML;
    var serializer = new XMLSerializer();
    var xml = serializer.serializeToString(xmlSource);
    var marker = xmlSource.getElementsByTagName('marker');
    
    myState = new StateMapInfo("","","","");
    
    for (i=0; i < marker.length; i++) {     
        if (marker[i].getAttribute('path') == gcurrentState) {
            path = marker[i].getAttribute('path');
            lat = marker[i].getAttribute('lat');
            lng = marker[i].getAttribute('lng');
            zoomlevel = marker[i].getAttribute('zoomLevel');
            myState = new StateMapInfo(path,lat,lng,zoomlevel);
        }            
    }
    return myState;
} 

// These functions are only used for testing    
function LookupAddress()
{     
    xmlAddress.async="false";
    xmlAddress.onreadystatechange=verifyAddress;
    xmlAddress.load("Data/address.xml");
    xmlAddressObj=xmlAddress.documentElement;      
         
    for (var i = 0; i < xmlAddressObj.childNodes.length; i++) {
        var propName = xmlAddressObj.childNodes(i).getAttribute("propName");
        var street = xmlAddressObj.childNodes(i).getAttribute("street");
        var ID = xmlAddressObj.childNodes(i).getAttribute("ID");
        SearchGoogle(propName,street,ID);
    }
}
 
function SearchGoogle(title,address,ID) {
    var geocoder = new GClientGeocoder();
  
    geocoder.getLatLng(
        address,
        function(point) {       
          if (!point) {
            //Address not found
            alert("Property not found - ID: " + ID);
          }
          else{
            //Address found
          }
        }
      );
}


// addAddressToMap() is called when the geocoder returns an
// answer.  It adds a marker to the map with an open info window
// showing the nicely formatted version of the address and the country code.
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.address + '<br>' +
      '<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode);
  }
}

// showLocation() is called when you click on the Search button
// in the form.  It geocodes the address entered into the form
// and adds a marker to the map at that location.
function SetCategory() {
    var bForSale;
    var bResale;
    var bComingSoon;
    var bSold;
    
    bForSale = document.getElementById("chkForSale").checked;
    bResale = document.forms[0].chkResale.checked;
    bComingSoon = document.forms[0].chkComingSoon.checked;
    bSold = document.forms[0].chkSold.checked;
    
    var i = 0;
    var e = document.getElementById("categoryText");
    
    if (bForSale) {
        e.innerHTML = txtForSale;
        ++i;
    }
    if (bComingSoon) {
        e.innerHTML = txtComingSoon;
        ++i;
    }
    if (bResale) {
        e.innerHTML = txtResale;
        ++i;
    }
    if (bSold) {
        e.innerHTML = txtSold;
        ++i;
    }
    
    if (i == 0 || i > 1) {
        e.innerHTML = txtDefault;
    }
}

function showLocation() {
  var address = document.forms[0].q.value;
  geocoder.getLocations(address, addAddressToMap);
}

// findLocation() is used to enter the sample addresses into the form.
function findLocation(address) {
  document.forms[0].q.value = address;
  showLocation();
}

//    function GetStateMapInfo(state){
//        xmlDoc.async="false";
//        xmlDoc.onreadystatechange=verify;
//        xmlDoc.load("states.xml");
//        xmlObj=xmlDoc.documentElement;
//       
//        var zoomlevel="";
//        var path="";
//        var lat="";
//        var lng="";
//        
//        myState = new StateMapInfo("","","","");
//        
//        for (var i = 0; i < xmlObj.childNodes.length; i++) {
//            if (xmlObj.childNodes(i).getAttribute("path") == state){
//                path = xmlObj.childNodes(i).getAttribute("path");
//                lat = xmlObj.childNodes(i).getAttribute("lat");
//                lng = xmlObj.childNodes(i).getAttribute("lng");
//                zoomlevel = xmlObj.childNodes(i).getAttribute("zoomLevel");
//                 myState = new StateMapInfo(path,lat,lng,zoomlevel);
//                i = xmlObj.childNodes.length;
//            }
//        }
//       
//        return myState;
//    }    

function Rectangle(bounds, opt_weight, opt_color, opt_backgroundColor) {
this.bounds_ = bounds;
this.weight_ = opt_weight || 2;  
this.color_ = opt_color || "#888888";
this.backgroundColor_ = opt_backgroundColor || "#888888";
}
Rectangle.prototype = new GOverlay();
// Creates the DIV representing this rectangle.
Rectangle.prototype.initialize = function(map) {  
// Create the DIV representing our rectangle  
var div = document.createElement("div");  
div.style.border = this.weight_ + "px solid " + this.color_;  
div.style.backgroundColor = this.backgroundColor_;

div.style.opacity = "1";
div.style.position = "absolute";  
// Our rectangle is flat against the map, so we add our selves to the  
// MAP_PANE pane, which is at the same z-index as the map itself (i.e.,  
// below the marker shadows)  
map.getPane(G_MAP_MAP_PANE).appendChild(div);  
this.map_ = map;  
this.div_ = div;
}
// Remove the main DIV from the map pane
Rectangle.prototype.remove = function() {
this.div_.parentNode.removeChild(this.div_);
}
// Copy our data to a new Rectangle
Rectangle.prototype.copy = function() {
return new Rectangle(this.bounds_, this.weight_, this.color_,
                   this.backgroundColor_, this.opacity_);
}
// Redraw the rectangle based on the current projection and zoom level
Rectangle.prototype.redraw = function(force) {
// We only need to redraw if the coordinate system has changed
if (!force) return;
// Calculate the DIV coordinates of two opposite corners of our bounds to
// get the size and position of our rectangle
var c1 = this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
var c2 = this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());
// Now position our DIV based on the DIV coordinates of our bounds
this.div_.style.width = Math.abs(c2.x - c1.x) + "px";  
this.div_.style.height = Math.abs(c2.y - c1.y) + "px";  
this.div_.style.left = (Math.min(c2.x, c1.x) - this.weight_) + "px";  
this.div_.style.top = (Math.min(c2.y, c1.y) - this.weight_) + "px";  
}


function AddFav(userid, propid) {
    MyFavs.AddFavorite(userid, propid, AddComplete, OnTimeOut, OnError);
}

function RemoveFav(userid, propid) {
    MyFavs.RemoveFavorite(userid, propid, RemoveComplete, OnTimeOut, OnError);
}

function AddComplete() {
    FAVS_XML = loadXMLDocSync(getUsersFavoritesPath());
}

function RemoveComplete() {
    FAVS_XML = loadXMLDocSync(getUsersFavoritesPath());
}

function OnTimeOut() {
    alert("Network timeout.");
}

function OnError() {
    alert("Error: Failed to add/remove property.");
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();