/**
 * Copyright (c) 2008, Keith Burke
 * All rights reserved.
 */
function mapMarker(price, city, baths, beds, rawMarker){
    this.price = price;
    this.city = city;
    this.baths = baths;
    this.beds = beds;
    this.rawMarker = rawMarker;
    this.displayed = true;
}

function controlPanelValues(){
	this.city = "All Cities";
	this.bathsRange = new valueRange();
	this.bedsRange = new valueRange();
	this.priceRanges = new Array();
	this.priceRanges['price-red'] = new valueRange(400000, 99999999);
	this.priceRanges['price-orange'] = new valueRange(300000, 399999);
	this.priceRanges['price-yellow'] = new valueRange(200000, 299999);
	this.priceRanges['price-green'] = new valueRange(0, 199999);
	this.priceRangesEnabled = new Array();	
}

function valueRange(min,max) {
	this.min = min ? min : 0;
	this.max = max ? max : 0;
}

function initControls(){
    var minBeds = 1;
    var maxBeds = 1;
    var minBaths = 1;
    var maxBaths = 1;
    var cities = new Array();
    
    for (var i = 0; i < HOUSE_DATA.length; i++) {
        var pd = HOUSE_DATA[i].property_detail;
        if (pd.bedroom_count > maxBeds) 
            maxBeds = pd.bedroom_count;
        if (pd.bath_count > maxBaths) 
            maxBaths = pd.bath_count;
        
        if (cities[pd.geocode.city] > 0) 
            cities[pd.geocode.city]++;
        else 
            cities[pd.geocode.city] = 1;
    }
    
    
    var sortedCities = new Array();
    for (var city in cities) {
        sortedCities.push(city);
    }
    sortedCities.sort();
    for (var i = 0; i < sortedCities.length; i++) {
        city = sortedCities[i];
        $("#select-city").append("<option value='" + city + "'>" + city + " (" + cities[city] + ")</option>");
    }
    
    var selectWidth = $("#select-city").width();
    if (selectWidth < 120) {
        selectWidth = 120;
        $("#select-city").width(selectWidth);
    }

	// some formatting
    $("#expand_controls").width(selectWidth);
	// kmb: need to deduct the pixel width of the slider handle (why?)
    $("#handle-beds-2").css("left", selectWidth - 12);
    $("#handle-baths-2").css("left", selectWidth - 12);
    
	// some default values
	CONTROL_PANEL_VALUES = new controlPanelValues();
	CONTROL_PANEL_VALUES.bedsRange = new valueRange(minBeds, maxBeds);
	CONTROL_PANEL_VALUES.bathsRange = new valueRange(minBaths, maxBaths);
	CONTROL_PANEL_VALUES.priceRangesEnabled['price-red'] = true;
	CONTROL_PANEL_VALUES.priceRangesEnabled['price-orange'] = true;
	CONTROL_PANEL_VALUES.priceRangesEnabled['price-yellow'] = true;
	CONTROL_PANEL_VALUES.priceRangesEnabled['price-green'] = true;
	
	// some default text
    $("#range-beds").text(minBeds + " - " + maxBeds);
    $("#range-baths").text(minBaths + " - " + maxBaths);

    $("#slider-beds").slider({
        steps: maxBeds - 1,
        min: minBeds,
        max: maxBeds,
        range: true,
        stepping: 1,
        startValue: [minBeds, maxBeds],
        slide: function(e, ui){
            $("#range-beds").text($("#slider-beds").slider("value", 0) +
            " - " +
            $("#slider-beds").slider("value", 1));
        },
		change: function() {
			CONTROL_PANEL_VALUES.bedsRange.min = $("#slider-beds").slider("value", 0);
			CONTROL_PANEL_VALUES.bedsRange.max = $("#slider-beds").slider("value", 1);
			filterMarkers();
		}
    });
    
    $("#slider-baths").slider({
        steps: maxBaths - 1,
        min: minBaths,
        max: maxBaths,
        range: true,
        stepping: 1,
        startValue: [minBaths, maxBaths],
        slide: function(e, ui){
            $("#range-baths").text($("#slider-baths").slider("value", 0) +
            " - " +
            $("#slider-baths").slider("value", 1));
        },
		change: function() {
			CONTROL_PANEL_VALUES.bathsRange.min = $("#slider-baths").slider("value", 0);
			CONTROL_PANEL_VALUES.bathsRange.max = $("#slider-baths").slider("value", 1);
			filterMarkers();
		}
    });

	// many events follow
	    
    $("#select-city").change(function(){
        $("#select-city option:selected").each(function(){
			CONTROL_PANEL_VALUES.city = $(this).val();
            filterMarkers();
        });
    });


		$("#price_range_red").click(function(){
			if ($("#price_range_red > img").attr("src").indexOf("-on.") > 0) {
				$("#price_range_red > img").attr("src", MARKER_OFF);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-red'] = false;
			} else {
				$("#price_range_red > img").attr("src", MARKER_RED);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-red'] = true;
			}
			filterMarkers();
		});
		$("#price_range_orange").click(function(){
			if ($("#price_range_orange > img").attr("src").indexOf("-on.") > 0) {
				$("#price_range_orange > img").attr("src", MARKER_OFF);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-orange'] = false;
			} else {
				$("#price_range_orange > img").attr("src", MARKER_ORANGE);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-orange'] = true;
			}
			filterMarkers();
		});
		$("#price_range_yellow").click(function(){
			if ($("#price_range_yellow > img").attr("src").indexOf("-on.") > 0) {
				$("#price_range_yellow > img").attr("src", MARKER_OFF);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-yellow'] = false;
			} else {
				$("#price_range_yellow > img").attr("src", MARKER_YELLOW);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-yellow'] = true;
			}
			filterMarkers();
		});
    
		$("#price_range_green").click(function(){
			if ($("#price_range_green > img").attr("src").indexOf("-on.") > 0) {
				$("#price_range_green > img").attr("src", MARKER_OFF);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-green'] = false;
			} else {
				$("#price_range_green > img").attr("src", MARKER_GREEN);
				CONTROL_PANEL_VALUES.priceRangesEnabled['price-green'] = true;
			}
			filterMarkers();
		});
    
		$("#expand_controls_a").click(function(){
			// are we visible?
			if ($('#more_controls').attr("style").indexOf("none") > 0) {
				$("#expand_controls").html("less &#9660;");
			} else {
				$("#expand_controls").html("more &#9650;");
			}
			$('#more_controls').slideToggle();
		});
}

/**
 * addCommas() function copied from:
 * http://www.mredkj.com/javascript/numberFormat.html
 */
function addCommas(nStr){
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

function filterMarkers(which,display){
    MAP.getInfoWindow().hide();

	var lngRange = new valueRange();
	var latRange = new valueRange();
	var oneMarkerVisible = false;
	var markersDisplayed = false;

    for (var i = 0; i < MAP_MARKERS.length; i++) {
        var m = MAP_MARKERS[i];

		var displayFromPriceFilter = false;
		for(var range in CONTROL_PANEL_VALUES.priceRangesEnabled) {
			if (CONTROL_PANEL_VALUES.priceRangesEnabled[range]) {
				if (m.price >= CONTROL_PANEL_VALUES.priceRanges[range].min && m.price <= CONTROL_PANEL_VALUES.priceRanges[range].max)
					displayFromPriceFilter = true;
			}
		}

	    var displayFromBedsFilter = (m.beds >= CONTROL_PANEL_VALUES.bedsRange.min && m.beds <= CONTROL_PANEL_VALUES.bedsRange.max);
	    var displayFromBathsFilter = (m.baths >= CONTROL_PANEL_VALUES.bathsRange.min && m.baths <= CONTROL_PANEL_VALUES.bathsRange.max);

		var displayFromCityFilter = false;
		if (CONTROL_PANEL_VALUES.city == "All Cities")
			displayFromCityFilter = true;
		else
			displayFromCityFilter = (m.city == CONTROL_PANEL_VALUES.city);

		var display = (displayFromBathsFilter && displayFromBedsFilter && displayFromCityFilter && displayFromPriceFilter);
		
		if(display) {
			// not worried about the 0,0 (lat,lng) defaults -- they're off the coast of Africa
			var lng = m.rawMarker.getLatLng().lng();
			if(lngRange.min == 0 || lng < lngRange.min)
				lngRange.min = lng;
			if(lngRange.max == 0 || lng > lngRange.max)
				lngRange.max = lng;
	
			var lat = m.rawMarker.getLatLng().lat();
			if(latRange.min == 0 || lat < latRange.min)
				latRange.min = lat;
			if(latRange.max == 0 || lat > latRange.max)
				latRange.max = lat;
		}

		if (display == true && m.displayed == false) {
			MAP.addOverlay(m.rawMarker);
			m.displayed = true;
		} else if (display == false && m.displayed == true) {
			MAP.removeOverlay(m.rawMarker);
			m.displayed = false;
		}
		
		if (display == true) {
			markersDisplayed = true;
			if (MAP.getBounds().contains(m.rawMarker.getLatLng())) 
				oneMarkerVisible = true;
		}
    }
	
	var latCenter = latRange.min + (latRange.max - latRange.min)/2;
	var lngCenter = lngRange.min + (lngRange.max - lngRange.min)/2;
	
	if(latCenter == 0 || lngCenter == 0) {
		latCenter = DEFAULT_LAT;
		lngCenter = DEFAULT_LNG;
	}
	
	if(markersDisplayed && !oneMarkerVisible)
		MAP.panTo(new GLatLng(latCenter, lngCenter));
}

function initMap(){
    if (GBrowserIsCompatible()) {

        $(window).unload(function(){
            GUnload();
        });
		
        function getMapIcon(price){
            var mapIcon = new GIcon(G_DEFAULT_ICON);
            if (price >= 400000)
                mapIcon.image = MARKER_RED;
            else if (price >= 300000) 
            	mapIcon.image = MARKER_ORANGE;
            else if (price >= 200000) 
                mapIcon.image = MARKER_YELLOW;
            else 
                mapIcon.image = MARKER_GREEN;
            
            return mapIcon;
        }
        
        function createMarker(point, html, mapIcon) {
            var marker = new GMarker(point, mapIcon);
            GEvent.addListener(marker, "click", function(){
                marker.openInfoWindowHtml(html);
            });
            return marker;
        }
        
        MAP = new GMap2(document.getElementById("map"));
        MAP.enableScrollWheelZoom();
        var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10));
        var topRight2 = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 40));
        MAP.addControl(new GMapTypeControl(), topRight);
        MAP.addControl(new GLargeMapControl(), topRight2);
        MAP.setCenter(new GLatLng(DEFAULT_LAT, DEFAULT_LNG), 13);
        for (var i = 0; i < HOUSE_DATA.length; i++) {
			if (!HOUSE_DATA || !HOUSE_DATA[i] || !HOUSE_DATA[i].property_detail) // hmm?
				continue;
            var pd = HOUSE_DATA[i].property_detail;
            var gc = pd.geocode;
            var point = new GLatLng(gc.latitude, gc.longitude);
            var html = "<a href='" + pd.info_url + "' target='_blank'><strong>" + gc.street + "<\/strong><\/a><br>" +
            'Price: $' +
            addCommas(pd.requested_price) +
            "<br>" +
            "Sq Ft: " +
            pd.sq_ft +
            ", Beds: " +
            pd.bedroom_count +
            ", Baths: " +
            pd.bath_count;
            var marker = createMarker(point, html, getMapIcon(pd.requested_price));
            MAP.addOverlay(marker);
            MAP_MARKERS.push(new mapMarker(pd.requested_price, gc.city, pd.bath_count, pd.bedroom_count, marker));
        }
    }
}
