﻿var __tileCache = {};
var __loadedListings = {};
var __geoCoder = new GClientGeocoder();
var __summaryRequest;
var __searchQuery;

var listingIcon =new GIcon();
listingIcon.image = "/Images/Icons/listing.png";
listingIcon.iconSize=new GSize(21,20);
listingIcon.iconAnchor=new GPoint(8,20);

var clusterIcon =new GIcon();
clusterIcon.image = "/Images/Icons/cluster.png";
clusterIcon.iconSize=new GSize(28,24);
clusterIcon.iconAnchor=new GPoint(12,27);

var pointerIcon =new GIcon();
pointerIcon.image = "/Images/Icons/arrow.png";
pointerIcon.shadow = "/Images/Icons/arrowshadow.png";
pointerIcon.iconSize=new GSize(39,34);
pointerIcon.iconAnchor=new GPoint(9,34);
pointerIcon.shadowSize=new GSize(39,34);
pointerIcon.shadowAnchor=new GPoint(18,34);

submitSearch =function(location) {
    if(window.event && window.event.keyCode == 13) {
        $('locationError').style.display = 'none';
        event.cancelBubble = true;
        getGeoLatLng(location); 
        __location = location;
        return false;
    }
}

toggleSearchButton = function(location) {
    if(!location) location = $('locationText').value;
    if(map.getZoom() <= 8) {
        if(location.length > 0) {
            $('searchButton').disabled = false;
        } else {
            $('searchButton').disabled = true;
        }
    } else {
        $('searchButton').disabled = false;
    }
}

showListingSummary = function(listingId) {
    if(__summaryRequest) __summaryRequest.cancel();
    $('summaryDetails').innerHTML = '<div class="Loading"></div>';
    var url = "/Listing/MapListingSummary.aspx?ListingID=" + listingId;
    if(!infoAccordian.summaryOpen) {
        infoAccordian.display(1);
        infoAccordian.summaryOpen = true;
    }
    var __summaryRequest = new Ajax(url,{method:'get',onComplete:function displayListingSummary(html){$('summaryDetails').innerHTML = html;$('saveButton').listingId = listingId}});
    __summaryRequest.request();
    urchinTracker('/ViewMapListingSummary.aspx?ListingID='+ listingId);
}

loadPins = function(response, zoom, key, clearOld) {
    var r = Json.evaluate(response);
    var pins = r.pins;
    if(clearOld) {
        mgr.clearMarkers();
        delete(__loadedListings);
        __loadedListings = {};
    }
    for(var ii = 0; ii < pins.length; ii++) {
        var pin = pins[ii];                               
        var posn = new GLatLng(pin.location.lat,pin.location.lng);
        if(pin.listingId){
            var cachedPin = __loadedListings[pin.listingId];
            var newPin = null;
            if(!cachedPin) {
                newPin = {listingId:pin.listingId,minZoom:zoom};
            } else if (zoom < cachedPin.minZoom) {
                newPin = {listingId:pin.listingId,minZoom:zoom,maxZoom:cachedPin.minZoom--};
            }
            if (newPin) {
                __loadedListings[newPin.listingId] = newPin; 
                var marker = new GMarker(posn,{title: pin.address + (pin.address && pin.price ? ", " : "")  + pin.price, icon:listingIcon});
                marker.listingId = newPin.listingId;
                GEvent.addListener(marker, "click", function() {
                                    showListingSummary(this.listingId);
                                  });
                if(newPin.maxZoom) {
                    mgr.addMarker(marker,newPin.minZoom,newPin.maxZoom);
                } else {
                    mgr.addMarker(marker,newPin.minZoom);
                }
            }
        }
        else if(!pin.listingId) {
            var cluster = new GMarker(posn,{title: "Click to view "+pin.count+" more listings",icon:clusterIcon});
            GEvent.addListener(cluster, "click", function(){
                    map.setCenter(this.getPoint(), map.getZoom()+1);
                });
            mgr.addMarker(cluster,zoom,zoom);
        }
    }        
}  

CustomGetTileUrl = function(point,zoom) {  
    var ulp = new GPoint(point.x*256,point.y*256);
    var ul = G_NORMAL_MAP.getProjection().fromPixelToLatLng(ulp,zoom);
    var lrp = new GPoint((point.x*256)+255,(point.y*256)+255);
    var lr = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lrp,zoom);
    var url = "" ;
    var tileUrl = "";
    
    if(map.getZoom() > 8) {
        var url = "/Origin/Listing/MapSearch.ashx?";
        var queryString = "nLat=" + Math.round(ul.lat() * 1000000)/1000000 + "&wLng=" + Math.round(ul.lng() * 1000000)/1000000 + "&ZOOM=" + zoom + "&sLat=" + Math.round(lr.lat() * 1000000)/1000000 + "&eLng=" + Math.round(lr.lng() * 1000000)/1000000 + "&" + __searchQuery;
        if(!__tileCache[queryString])
        { 
            queueAjax(url + queryString,zoom,queryString);
        }
    }
    return tileUrl;
}

var interval = -1;
var requestQueue = [];
var inProgress = 0;
var maxConcurrentRequests = 2;

queueAjax = function(_url, _zoom, _key) {
    var a = {};
    a.url = _url;
    a.zoom = _zoom;
    a.key = _key;
    requestQueue.push(a);
    if(interval == -1){
        interval = setInterval("executeAjax()",50);
    }
}

executeAjax = function() {
    if(requestQueue.length == 0){
        clearInterval(interval);
        interval = -1;
        return;
    }
    if(inProgress < maxConcurrentRequests){
        var a = requestQueue.pop();
        if(a){
            //discard requests at non-current zoom level
            if(a.zoom == map.getZoom()){
                var b = new Ajax(a.url,{
                                        method:'get',
                                        onComplete:function(response){
                                                    inProgress--;
                                                    loadPins(response,a.zoom,a.key);
                                                   }
                                       });
                __tileCache[a.key] = a.key;
                b.request();
                inProgress++;
            }
        }
    }    
}

var __location = '';
search = function() {
    $('locationError').style.display = 'none';
    var newLocation = $('locationText').value.trim();
    var zoom = map.getZoom();
    if((!newLocation || __location == newLocation) && zoom > 8) {
        filterListingByViewableArea();
    } else {
        getGeoLatLng(newLocation);
        __location = newLocation;
    }
}

getGeoLatLng = function(locationString) {
    __geoCoder.getLocations(locationString,function(response){
        if(!response || response.Status.code != 200) {
            $('locationError').style.display = 'inline';
        } else {
            var location = response.Placemark[0];
            var point = new GLatLng(location.Point.coordinates[1], location.Point.coordinates[0]);
            var geoAccurayZoomLevel = [0,4,7,9,11,14,15,16,17];
            var accuracy = location.AddressDetails.Accuracy;
            var zoom = geoAccurayZoomLevel[location.AddressDetails.Accuracy];
            map.addOverlay(new GMarker(point,{icon:pointerIcon}));
            map.setCenter(point,geoAccurayZoomLevel[location.AddressDetails.Accuracy]);
        }
    });
}

filterListingByViewableArea = function() {
    $('listingCount').innerHTML = '<img src="/Images/Icons/searchingListings.gif"/>';
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();
    var queryString = "VA=true&nLat=" + Math.round(ne.lat() * 1000000)/1000000 + "&wLng=" + Math.round(sw.lng() * 1000000)/1000000 + "&ZOOM=" + map.getZoom() + "&sLat=" + Math.round(sw.lat() * 1000000)/1000000 + "&eLng=" + Math.round(ne.lng() * 1000000)/1000000 + "&" + __searchQuery; 
    var url = "/Origin/Listing/MapSearch.ashx?" + queryString;
    var ajax = new Ajax(url,{method:'get',onComplete:function(response){loadPins(response,map.getZoom(),queryString,true);}});
    ajax.request();
    listingCountByViewableArea();
}

listingCountByViewableArea = function() {
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();
    var queryString = "VA=true&nLat=" + Math.round(ne.lat() * 1000000)/1000000 + "&wLng=" + Math.round(sw.lng() * 1000000)/1000000 + "&ZOOM=" + map.getZoom() + "&sLat=" + Math.round(sw.lat() * 1000000)/1000000 + "&eLng=" + Math.round(ne.lng() * 1000000)/1000000 + "&" + __searchQuery; 
    var url = "/Origin/Listing/MapListingCount.ashx?" + queryString;
    var ajax = new Ajax(url,{method:'get',onComplete:function(response){updateCount(response);}});
    ajax.request();
}

updateCount = function(response) {
    $('listingCount').innerHTML = "<span>Showing " + response.trim() + " listings</span>";
}

updateSearchCriteria = function() {    
    var form = $('form1');
    __searchQuery = form.toQueryString();
    var minPrice = form.MinPrice.options[form.MinPrice.selectedIndex].text;
    var maxPrice = form.MaxPrice.options[form.MaxPrice.selectedIndex].text;
    var beds = form.MinBedroomCount.options[form.MinBedroomCount.selectedIndex].text;
    var baths = form.MinBathroomCount.options[form.MinBathroomCount.selectedIndex].text;
    var status = form.Status;
    var allChecked = true;
    var statusString = '';
    for(var ii=0;ii<status.length;ii++) {
        if(status[ii].checked) {
            statusString = statusString + status[ii].parentNode.getElementsByTagName('span')[0].innerHTML + ',';
        } else {
            allChecked = false;
        }
    }
    statusString = (!allChecked) ? statusString.substring(0,statusString.lastIndexOf(',')) : 'Any';
    var typeid = form.TypeID;
    var typeidString = '';
    allChecked = true;
    for(var ii=0;ii<typeid.length;ii++) {
        if(typeid[ii].checked) {
            typeidString = typeidString + typeid[ii].parentNode.getElementsByTagName('span')[0].innerHTML + ',';
        } else {
            allChecked = false;
        }
    }
    typeidString = (!allChecked) ? typeidString.substring(0,typeidString.lastIndexOf(',')) : 'Any';
    
    $('searchPriceL').innerHTML = minPrice;
    $('searchPriceH').innerHTML = maxPrice;
    $('searchBeds').innerHTML = beds;
    $('searchBaths').innerHTML = baths;
    $('shortStatus').innerHTML = statusString; 
    $('longStatus').innerHTML = ''; 
    $('shortType').innerHTML = typeidString;
    $('longType').innerHTML = '';

    $('searchCriteria').style.width = '1500px';//expand width so IE doesn't break lines before summing width
    var width = 0;
    for(var ii=0;ii<$('searchCriteria').childNodes.length;ii++){
        if($type($('searchCriteria').childNodes[ii]) == 'element'){
            width = width + $('searchCriteria').childNodes[ii].offsetWidth;
        }
    }
    if(width > 950) {
        $('shortStatus').innerHTML = statusString.substring(0,16) + '...';
        $('longStatus').innerHTML = statusString; 
        $('searchStatus').addEvent('mouseover', function() {$('longStatus').style.display = 'block';});
        $('searchStatus').addEvent('mouseout', function() {$('longStatus').style.display = 'none';});
        
        $('shortType').innerHTML = typeidString.substring(0,16) + '...';
        $('longType').innerHTML = typeidString; 
        $('searchType').addEvent('mouseover', function() {$('longType').style.display='block';});
        $('searchType').addEvent('mouseout', function() {$('longType').style.display='none';});
        
        width = 0;
        for(var ii=0;ii<$('searchCriteria').childNodes.length;ii++){
            if($type($('searchCriteria').childNodes[ii]) == 'element'){
                width = width + $('searchCriteria').childNodes[ii].offsetWidth;
            }
        }
    }
    $('searchCriteria').style.width = width+'px';
}

initMapCenterZoom = function() {
    if(arguments.length > 1){
        map.setCenter(new GLatLng(arguments[0], arguments[1]),arguments[2]);
    } else {
        if(arguments[0]){
            getGeoLatLng(arguments[0]);
            $('locationText').value = arguments[0];
        }
        //center North America, geocoder callback will update if successful
        map.setCenter(new GLatLng(48.341646, -100.019531),3); 
        
    }
}



