﻿//var submitted = false;
var mgr;
var refresh = true;
var selected_marker = null;
var global_markers = [];
var events = "";
var lastswlat = 0;
var lastswlng = 0;
var lastnelat = 0;
var lastnelng = 0;
var abortExecutor;
var currentRequest;

function loadProperties()
{
    //_message.style.visibility = 'visible';  
    openModalPopup();
    
    var top = getddlValue(_ddlTop);
    var sortColumn = _gridView.get_sortColumn();
    var sortOrder = (_gridView.get_sortOrder() == AjaxDataControls.GridViewSortOrder.Descending) ? 'DESC' : 'ASC';
    var bounds = map.getBounds();
    var mapsw = bounds.getSouthWest();
    var mapne = bounds.getNorthEast();
    var mapswlat = mapsw.lat();
    var mapswlng = mapsw.lng();
    var mapnelat = mapne.lat();
    var mapnelng = mapne.lng();
    
    //getPropertyType();
    // Check if there is already a web request is active -- if true, abort other request
    if (currentRequest != null)
    {
        abortExecutor.abort();
    }
    Sys.Net.WebRequestManager.add_invokingRequest(On_InvokingRequest);
    var _request = wsListing.GetListingForMap(getddlValue(_ddlMinPrice),getddlValue(_ddlMaxPrice), getddlValue(_ddlBeds),getddlValue(_ddlBaths),getddlValue(_ddlMinSqft),getddlValue(_ddlMaxSqft), "RES", "MUL", "LND", sortColumn, sortOrder, top, mapswlat, mapswlng, mapnelat, mapnelng, onLoadSuccess_Map, onFailureLoad_Map);
    Sys.Net.WebRequestManager.remove_invokingRequest(On_InvokingRequest); 
    
}

// called for WebRequestManager
function On_InvokingRequest(executor, eventArgs)
{
   currentRequest = eventArgs.get_webRequest();
   abortExecutor = currentRequest.get_executor();
}

/* ------------------------------------
      GridView List Functions
   ------------------------------------ */ 
function gvMap_RowDataBound(sender, e)
{
    var row = e.get_row();
    var prop = row.get_dataItem();
    
    if (row.get_isDataRowType())
    {
        var prop = row.get_dataItem();
        var tr = row.get_container();
        // add id to each row, to be called 
        var uid = _gridView.get_dataKeys()[e.get_row().get_rowIndex()];
        tr.id = uid;
        // add onclick event to each row - activate marker on map
        var prevClass;
        //tr.onmouseover=function onMouseOver() { this.className = 'gvMapRowHover';};
        tr.onmouseover=function onMouseOver() {
                                                prevClass=this.className;
                                                this.className = 'row-over';
                                               };
        tr.onmouseout=function onMouseOut() { this.className = prevClass;};
        tr.onclick=function onRowClicked() { 
                                               window.scrollTo(0,0);
                                                activate_marker(this);
                                            };
                                            
        // Give each row a # - correspond to marker labels on map
        var divMarkerNum = row.findControl('divMarkerNum');
        setText(divMarkerNum, _markerCount);
        _markerCount++;
        
        // add address data
        var spnAddress = row.findControl('spnAddress');
        setAddress(spnAddress, prop.StreetNum, prop.StreetName);
        
        // clear for memory leaks
        tr = null;
    }
}

/*
function getPropertyType()
{
    _pRes = null;
    _pMul = null;
    _pLnd = null;
    if (document.getElementById("chkRes").checked){_pRes="RES";}
    if (document.getElementById("chkMul").checked){_pMul="MUL";}
    if (document.getElementById("chkLnd").checked){_pLnd="LND";}
}
*/

function onSortCommand(sender, e)
{
    _gridView.set_sortColumn(e.get_sortColumn());
    _gridView.set_sortOrder(e.get_sortOrder());
    loadProperties();
}

/* ------------------------------------
          Mapping Functions
   ------------------------------------ */
function loadMap() {
    if (GBrowserIsCompatible())
    {
        map = new google.maps.Map2(document.getElementById("gmap"));
        map.enableDoubleClickZoom();
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());	
        
        // Default latitude and longitude for map search page
        var lat = "+32.7387";
        var lon = "-97.391385";
        
        // Set the center of the map to our default location
        map.setCenter(new GLatLng(lat, lon), 13);
        map.setMapType(G_HYBRID_MAP);
        
        // Get the values of the latitude and longitude based on the zip code entered by the user
        var latLon = document.getElementById("latAndLong").getElementsByTagName("span");
        
        // If the user has entered a zipcode and we have the latitude and longitude of that zipcode
        if ((latLon != "") && (latLon[0].innerHTML != null)) {
            lat = latLon[0].innerHTML;
            lon = latLon[1].innerHTML;
            document.getElementById("chkAuto").checked = true;
        }
        
        // Reset the center of the map 
        map.setCenter(new GLatLng(lat, lon), 13);
        map.setMapType(G_HYBRID_MAP);
	    
	    mgr = new MarkerManager(map);
	    
	    //Set event listeners moving and clicking
        GEvent.addListener(map, "moveend", function(){
            
            // Check if a marker is selected -- if true don't show info_window
            /*
            if (selected_marker != null)
            {	          
	            //reposition window
	            show_custom_info_window(selected_marker); 
	            refresh = false;
            }
            else
            {
                close_window();
                refresh = true;
            }
            */
            // Check if bounds are crossed -- if true getPoints
            if (_chkAuto.checked)
            {
                getPoints(map);
            }           
       
        });
        
        GEvent.addListener(map, "zoomend", function(){
            /*
            if (selected_marker != null)
            {	          
	            //reposition window
	            show_custom_info_window(selected_marker); 
            }
            else
            {
                close_window();
            }
            
            refresh = true;
            getPoints(map);
            */
            close_window();
            
        });
        
        if (document.getElementById("chkAuto").checked) loadProperties();
    }
    else 
    {
      alert("Sorry, Google Map is not compatible with your browser");
    }
}
/*
function chkAutoMap()
{
    if (!_chkAuto.checked)
    {
        alert("checked");
    }
    else
    {
        alert("nocheck");
    }
}
*/
function getPoints(map) {

    
    var bounds = map.getBounds();
    var mapsw = bounds.getSouthWest();
    var mapne = bounds.getNorthEast();
    var mapswlat = mapsw.lat();
    var mapswlng = mapsw.lng();
    var mapnelat = mapne.lat();
    var mapnelng = mapne.lng();
    var dataswlat = mapswlat - ((mapnelat-mapswlat)*2)/2;
    var dataswlng = mapswlng - ((mapnelng-mapswlng)*2)/2;
    var datanelat = mapnelat + ((mapnelat-mapswlat)*2)/2;
    var datanelng = mapnelng + ((mapnelng-mapswlng)*2)/2;
    
    if (refresh || mapswlat < lastswlat || mapswlng < lastswlng || mapnelat > lastnelat || mapnelng > lastnelng) 
    {
        //_message.style.visibility = 'visible';
        openModalPopup();
        lastswlat = dataswlat;
        lastswlng = dataswlng;
        lastnelat = datanelat;
        lastnelng = datanelng;
        
        var top = getddlValue(_ddlTop);
        var sortColumn = _gridView.get_sortColumn();
        var sortOrder = (_gridView.get_sortOrder() == AjaxDataControls.GridViewSortOrder.Descending) ? 'DESC' : 'ASC';
        
        // If web request currently running - abort it
        if (currentRequest != null)
        {
            abortExecutor.abort();
        }
        Sys.Net.WebRequestManager.add_invokingRequest(On_InvokingRequest);
        var _request = wsListing.GetListingForMap(getddlValue(_ddlMinPrice),getddlValue(_ddlMaxPrice), getddlValue(_ddlBeds),getddlValue(_ddlBaths),getddlValue(_ddlMinSqft),getddlValue(_ddlMaxSqft), "RES", "MUL", "LND", sortColumn, sortOrder, top, mapswlat, mapswlng, mapnelat, mapnelng, onLoadSuccess_Map, onFailureLoad_Map)
        Sys.Net.WebRequestManager.remove_invokingRequest(On_InvokingRequest);
        
        refresh = false;
    }
}

function onLoadSuccess_Map(result)
{
    if ((result != null) && (result != '')) 
    { 
        // Set _markerCount to 1
        _markerCount = 1
        // Bind data to grid
        _gridView.set_dataSource(result);
        _gridView.dataBind();
        // Move default header row created by gridview to above div in order to 
        
        //createHeader();
        //_header.style.display = 'block';
        
        clearMarkers();
        global_markers.length = 0;
        //var zoom = map.getZoom();
        var markers = [];
        for (var i = 0; i < result.length; i++) 
        {
            var point = new GLatLng(parseFloat(result[i].Lat), parseFloat(result[i].Lng));
            var marker = createMarker(point, result[i], i+1);
            markers.push(marker);         
        }
        mgr.addMarkers(markers, 0, 17);
        mgr.refresh();    
    }
    else
    {
       _gridView.set_dataSource(null);
       _gridView.dataBind();
       _header.style.display = 'none';
       clearMarkers();
       global_markers.length = 0;
       mgr.refresh();
    }
    //_message.style.visibility = 'hidden';
    closeModalPopup();
    // Set current Web Request to null - to be able to check
    currentRequest = null;    
}

function onFailureLoad_Map(exception) {
    // If request not aborted - critical failure
    if (!currentRequest.get_executor().get_aborted())
    {
        alert(exception.get_message());
    }    
}

function createMarker(point, markerData, markerNum){
    var icon = new GIcon();
    /*
    icon.image="/images/google/marker1.png";
    icon.shadow="/images/google/marker_shadow.png";
    icon.iconSize = new GSize(32, 49);
    icon.shadowSize = new GSize(50, 49);
    icon.iconAnchor = new GPoint(16, 49);
    icon.infoWindowAnchor = new GPoint(20, 49);
    */
    icon.image="/images/google/blue.gif";
    icon.iconSize = new GSize(25, 21);
    icon.iconAnchor = new GPoint(12, 21);
    icon.infoWindowAnchor = new GPoint(20, 21);
    
    opts = {
        "icon": icon,
        "clickable": true,
        "labelText": markerNum,
        "labelOffset": new GSize(-6, -14)
    };
      
    var marker = new LabeledMarker(point, opts);
    var id = markerData.UID;    

    // Give the marker all of it's information
    marker.tabContent = new Object();
    
    //marker.tabContent.location = markerData.StreetNum + " " + markerData.StreetName + "<br/>" + markerData.City + ", " + markerData.state + " " + markerData.ZipCode;
    if (markerData.LowResPicURL != null)
    {
        marker.tabContent.location = "<table><tr><td><img width=\"110px\" height=\"74px\" src=\"image.wt?thumb=" + markerData.LowResPicURL + "\"></img></td><td>" + markerData.StreetNum + " " + markerData.StreetName + "<br/>" +  markerData.City + ", TX " + markerData.ZipCode + "<br/><span>" + markerData.Subdivision + "</span></td></tr></table>";
    }
    else
    {
        marker.tabContent.location = "<table><tr><td><img width=\"110px\" height=\"74px\" src=\"/images/layout/photo/nophoto_80x60.jpg\"></img></td><td>" + markerData.StreetNum + " " + markerData.StreetName + "<br/>" +  markerData.City + ", TX " + markerData.ZipCode + "<br/><span>" + markerData.Subdivision + "</span></td></tr></table>";
    }
    
    marker.tabContent.prop_details = "<div class=\"mDetails\">List Price: " + formatCurrency(markerData.ListPrice) + "<br/>Beds: " + markerData.Beds + "<br/>Baths: " + markerData.BathsTotal + "<br/>SqFt: " + markerData.SqFtTotal + "</div>";
    
    marker.tabContent.location = marker.tabContent.location + "<br/><a href=\"/listings/default.aspx?uid=" + id + "\" target=\"_blank\">Details Page</a>";
  
    marker.internal_id = markerData.UID;
    marker.id = markerData.UID;
    
    // Add marker event
    GEvent.addListener(marker, "click", function() {
        show_custom_info_window(marker);
    });
    GEvent.addListener(marker, "click_action", function() {
        show_custom_info_window(marker);
    });
    GEvent.addListener(marker, "mouseover", function() {
        marker.setImage('/images/google/blue_over.gif');
    });
    GEvent.addListener(marker, "mouseout", function() {
        marker.setImage('/images/google/blue.gif');
    });
        
    // Return marker for gmaps
    global_markers[marker.internal_id] = marker;
	return marker;
}

function clearMarkers() {
  mgr.clearMarkers();
}
  
function change_tab(element, type){
	var my_window = $('overlay');
	var my_tab = $('overlay_tab');
	var alltabs = my_window.getElementsByTagName('ul')[0];
	// Unselect tabs
	var marker_tabs = element.parentNode.parentNode.getElementsByTagName("a");
	for(var v=0;v<marker_tabs.length;v++){
		tab = marker_tabs[v];
		Element.removeClassName(tab, 'selected');
	}
	// Select tab
	Element.addClassName(element, 'selected');
	if (type == 'prop_details'){
		//bring second tab forward
		Element.removeClassName(alltabs,'tabs');
		Element.addClassName(alltabs,'tabs2');
		my_tab.innerHTML = my_window.marker.tabContent.prop_details;

	}else{
		//bring first tab forward
		Element.removeClassName(alltabs,'tabs2');
		Element.addClassName(alltabs,'tabs');
	    my_tab.innerHTML = my_window.marker.tabContent.location;
	}
	position_window(my_window, my_window.marker);
	return false;
}

function close_window(){
    if ($('overlay')) {
	    $('overlay').style.display = 'none';
	    //deactivate_marker( $("location_" + $('overlay').marker.internal_id) );
	    selected_marker = null;
	    selected_location = false;
	}	
	return false;
}

function show_custom_info_window(marker){
	selected_marker = marker;
	//map_point = map.fromLatLngToDivPixel(marker.getPoint());

	if (!$('overlay')){ // need to create the overlay inside the map pane
		var new_obj = document.createElement("div");
		new_obj.style.display = 'none';
		new_obj.innerHTML = $('overlay_temp').innerHTML;
		new_obj.getElementsByTagName('div')[0].id = 'overlay_tab';
		new_obj.id = 'overlay';
		document.body.appendChild(new_obj);
	}
	var my_window = $('overlay');	
	// Attach the marker
	my_window.marker = marker;
	// make sure the first tab is in front
	var alltabs = my_window.getElementsByTagName('ul')[0];
	Element.removeClassName(alltabs,'tabs2');
	Element.addClassName(alltabs,'tabs');
	// Unselect tabs
	var tabs = alltabs.getElementsByTagName("a");
	for(i=0;i<tabs.length;i++){
		tab = tabs[i];
		Element.removeClassName(tab, 'selected');
	}
	// Select tab
	Element.addClassName(tabs[0], 'selected');
	// Populate content
	var my_tab = $('overlay_tab');	
	my_tab.innerHTML = marker.tabContent.location;
	// Stick it to the map
	map.getPane(G_MAP_MARKER_PANE).appendChild(my_window);
	my_window.style.display = 'block';
	position_window(my_window, marker);
}	

function activate_marker(element){
	if (selected_location == element){ return false; }
	if (global_markers[element.id] == undefined){     
	   //alert("Address cannot be found");
	}
	//Element.addClassName(element, 'selLocation'); 
    GEvent.trigger(global_markers[element.id], "click_action");
    //if (selected_location){ 
        //Element.removeClassName(selected_location, 'selLocation'); 
    //} 
    selected_location = element; 
}		

function deactivate_marker(element){
	//Element.removeClassName(element, 'selLocation');
	selected_location = false;
}

selected_location = false;

function position_window(my_window, marker){
    // Move map
	var pan_to = new GLatLng( marker.getPoint().lat(), marker.getPoint().lng() )	
	var gPoint = map.fromLatLngToDivPixel(pan_to);
	gPoint.x = gPoint.x + 30;
	gPoint.y = gPoint.y - 85; 
	var new_point = map.fromDivPixelToLatLng(gPoint);
	map.panTo( new_point );
	map_point = map.fromLatLngToDivPixel(marker.getPoint());
	// Positions overlay
	//var vert_loc = parseInt(map_point.y) - my_window.offsetHeight - 42;
	var vert_loc = parseInt(map_point.y) - my_window.offsetHeight - 15;
	my_window.style.top = vert_loc  + "px";
	var horiz_loc = parseInt(map_point.x) - 55;
	my_window.style.left = horiz_loc + "px";
}

/* Utility Functions */
function setText(element, text)
{
    if (typeof element.innerText != 'undefined' && text != null)
    {
        element.innerText = text;
    }
    else if (typeof element.textContent != 'undefined' && text != null)
    {
        element.textContent = text;
    }
}
function setAddress(element, stNum, stName)
{
    if (typeof element.innerText != 'undefined' && stNum != null && stName != null)
    {
        element.innerText = stNum + " " + stName;
    }
    else if (typeof element.textContent != 'undefined' && stNum != null && stName != null)
    {
        element.textContent = stNum + " " + stName;
    }
}
function getddlValue(ddl)
{
    var val = parseInt(ddl.options[ddl.selectedIndex].value);
    if (val < 0)
    {
        return null;
    }
    else
    {
        return val;
    }
}
function createHeader()
{
    var tr = _gridView.get_headerRow().get_container();
    var table = document.getElementById("gvMap_Header");
    table.deleteRow(0);    
    var row = table.insertRow(0);
    var len = tr.childNodes.length;
    //alert(tr.childNodes[0].style.width);
    for(var x=0;x<len;x++)
    {
        row.appendChild(tr.childNodes[0]);
    }
    tr = null;
}
function getQueryString( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}
function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');
    if(isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    num = Math.floor(num/100).toString();
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        num = num.substring(0,num.length-(4*i+3))+ ','+ num.substring(num.length-(4*i+3));
    return (((sign)?'':'-') + '$' + num);
}
function closeModalPopup()
{
    $find("mpeGmapB").hide();
}
function openModalPopup()
{
    $find("mpeGmapB").show();
    
}
