﻿// Requires data path in data_url variable!
// Data Format 
// <base>
// <origin lat="1" long="1"></origin>
// </base>
var KILL_TIME = 16000;
var map = null;
var STD_ICON_WIDTH = 128;
var STD_ICON_HEIGHT = 128;

// GMarker fix
  GMarker.prototype.hide = function ()
  {
    if (this.getPoint().lat() < 90)
      try {
        this.savePoint = this.getPoint();
        this.setPoint(new GLatLng(90, 0));
      } catch(e) {}
  }
  
  GMarker.prototype.show = function ()
  {
    if (this.getPoint().lat() == 90)
    if (this.savePoint)
      try {
        this.setPoint(this.savePoint);
        this.savePoint = null;
      } catch(e) {}
  } 


// Zoom level Display Ctrl

function DZoomControl() {
}
DZoomControl.prototype = new GControl();

DZoomControl.prototype.initialize = function(map) {
  var container = document.createElement("div");

  map.getContainer().appendChild(container);
  
  GEvent.addDomListener(map, "zoomend", function() {
        container.innerHTML = map.getZoom();
  });

  
  return container;
}

// By default, the control will appear in the top left corner of the
// map with 7 pixels of padding.
DZoomControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(1, 1));
}

/////////////

// Quick info class//
function DQuickInfo()
{
}

DQuickInfo.prototype = new GControl();

DQuickInfo.prototype.initialize = function(map) 
{
  var container = document.createElement("div");
  container.className = "quickinfo";
  container.style.visibility = "hidden";
  
  this.out = container;
  map.getContainer().appendChild(container);
  
  return container;
}

DQuickInfo.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
}


DQuickInfo.prototype.Show = function(message)
{
    this.out.innerHTML = message;
    this.out.style.visibility = "visible";
    
}

DQuickInfo.prototype.Hide = function()
{
    this.out.style.visibility = "hidden";
    this.out.innerHTML = "";
}

var quickinfo =null;
////



function addCommas(nStr,cnt)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' +  x[1].substr(0,(cnt>-1)?cnt:x[1].length) : '';
	if(cnt==0) x2="";
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}







var infownd2 = null;
var lastpoint = null;
// simple marker with info window //
function createMarker2(point, text,icon)
{
    var marker = new GMarker(point,icon);
  
    
 GEvent.addListener(marker, "mouseover", function() {
       lastpoint = point;
       showInfo2( point, text );
      });
      
      GEvent.addListener(marker, "mouseout", function() {
       hideInfo2(point);
     
      });
      
      
    return marker;    
}


var map_message;
var items_params = "";
var isMapSearch = 0;

function ReDescription(uid)
{
    //
    document.getElementById("re_id").value= uid;
    
   HideMiniMap();
    
    eval(RePostback);
    document.getElementById("searchrect").style.display = "none";
    
}

function HideMiniMap()
{
    $(".gm-overview-map").hide();
}

function RestoreMiniMap()
{
    $(".gm-overview-map").show();
    
    document.getElementById("searchrect").style.display = "block";
    return;
   
    
}


function createDescription(item)
{
    
    var image_url = "image.ashx?type=3&width=100&height=70&path="+sharedImagesUrl+item.getAttribute("PictureImage");
    if( typeof isSlave == "undefined" ) 
    {
    }else
    {
        if( isSlave ) 
        {
            image_url = masterUrl+image_url;
        }
    }
    var price = "$"+addCommas(item.getAttribute("AskingPrice"),0);
    var etype = item.getAttribute("Type");
    var beds = addCommas(item.getAttribute("NumberofBedrooms"),0);
    var wash = addCommas(item.getAttribute("Washrooms"),0);
    var btn = "<a href='javascript:ReDescription("+item.getAttribute("uid")+")' ><img border='0' src='images/public/featuresheet.png' width='92' height='18' /></a>"
    
    var img = "<img style='float:left;margin:6px;height:70px;width:100px;border:solid 1px #425095;' src='"+image_url+"' />";
    
    var res = "<div style='height:auto !important;_height:100px;min-height:100px;width:220px;'>"+img+"<div style='float:left;'><div style='margin-top:10px;color:black;font-weight:bold;'>"+price+"</div><div style='margin-top:5px;color:black;width:100px;height:auto;overflow:hidden;'>"+etype+"</div><div style='margin-top:5px;margin-botton:5px;color:black;font-weight:normal;'>Beds:"+beds+" Baths:"+wash+"</div><div style='margin-top:10px;'>"+btn+"</div></div><div style='clear:both;'>&nbsp;</div></div>";
    
    return res;
}

function CreateIcon( item , zoom )
{
    var p_icon = new GIcon();
    if(zoom > 1) 
    {
        p_icon = G_DEFAULT_ICON;
    }else
    {
        p_icon.image = "images/public/remarkers/"+item.getAttribute("MarkerFileName");
        p_icon.iconSize = new GSize(STD_ICON_WIDTH*zoom, STD_ICON_HEIGHT*zoom);
        p_icon.iconAnchor = new GPoint(STD_ICON_WIDTH*zoom/2, STD_ICON_HEIGHT*zoom-15);
        p_icon.infoWindowAnchor = new GPoint(STD_ICON_WIDTH*zoom/2, STD_ICON_HEIGHT-1);
    }
    return p_icon;
}



var mgr = null;

var markers = [];

var ReData = new Array();

var SearchingNow = false;

var overlays = new Array();

var cluster = null;

function showMarkers(isSearch,first)
{
    // Info before download //
    
    //
    if( first || isSearch)
    {
        quickinfo.Show("Listings are being populated to the map. Please stand by.");
        map.clearOverlays();    
        
    }
    

    SearchingNow = isSearch;

    var icon = new GIcon();
    if(icon_url!="")
    {
    icon.image = icon_url;
    icon.iconSize = new GSize(24, 24);
    icon.iconAnchor = new GPoint(12, 12);
    icon.infoWindowAnchor = new GPoint(12, 0);
    }else icon = G_DEFAULT_ICON;
    //
    var centerPoint = map.getCenter();
    var download_url = items_url+"?type="+ReRequest+items_params+"&lat="+centerPoint.lat()+"&long="+centerPoint.lng()+"&range="+GetRangeForCurrentZoom();
   
    GDownloadUrl(download_url, function(data, responseCode) 
            {
                var bounds = new GLatLngBounds();
                bounds.extend( map.getCenter());
                var xml = GXml.parse(data);
                var markers = xml.documentElement.getElementsByTagName("item");
                var newOverlays = new Array();
                  for (var i = 0; i < markers.length; i++) 
                                {
                                    if( typeof( ReData[markers[i].getAttribute("uid")] ) == "undefined" ) {
                                    ReData[markers[i].getAttribute("uid")] = markers[i];
                                    }
                                    var point = new GLatLng(parseFloat(markers[i].getAttribute("Lat")),
                                    parseFloat(markers[i].getAttribute("Long")));
                                   
                                    if(bounds.getCenter().distanceFrom(point) < 10000)
                                    {
                                        bounds.extend(point);
                                    }
                                    var text = createDescription(markers[i]);
                                    var addr = markers[i].getAttribute("Address");
                                    var title = String( addr ).length >25 ? String(addr).substr(0,25)+"...":addr;
                                    var zoom = map.getZoom();
                                    var zoomK = 10;
                                    switch(zoom)
                                    {
                                        case 11: { zoomK = 11; break;}
                                        case 12: { zoomK = 12; break;}
                                        case 13: { zoomK = 0.65; break;}
                                        case 14: { zoomK = 0.75; break;}
                                        case 15: { zoomK = 0.85; break;}
                                        case 16: { zoomK = 0.95; break;}
                                        case 17: { zoomK = 1; break;}
                                        case 18: { zoomK = 1; break;}
                                        case 19: { zoomK = 1; break;}
                                    }
                                                            
                                    var overlay = createMarkerBalloon(point,title,text,CreateIcon(markers[i],zoomK,false));
                                 //   map.addOverlay( overlay  );
                                    if( typeof( overlays[markers[i].getAttribute("uid")] ) != "undefined" ) {
                                      
                                  //          map.removeOverlay(overlays[markers[i].getAttribute("uid")]); // remove old //
                                      
                                    }
                                    overlays[markers[i].getAttribute("uid")] = overlay;
                                }
                                
                                //cluster //
                                if( cluster == null )
                                 {
                                cluster=new ClusterMarker(map, { markers:overlays } );                                } else                                 {                                    cluster.removeMarkers();                                    cluster.addMarkers(overlays);                                }                                                                cluster.refresh(true);                                
                                //
                                
                                var map_markers_count = markers.length;
                                var map_message = map_markers_count+" found" ;
                                if( map_markers_count == 0) map_message="Not found";
                                quickinfo.Hide();
                                if(isSearch) { 
                                document.getElementById("message_span").innerHTML = map_message;                           
                                }else
                                {
                                
                                    if((map_markers_count == 0)&&first)
                                    {
                                        quickinfo.Show("Coming Soon, Local Listings...");
                                        
                                    }
                                }
                                
            });
            
}



//  ======== A function to adjust the positioning of the overview ========
function positionOverview(x,y,omap) {
        //var omap=document.getElementById(omapid);
        omap.style.left = x+"px";
        omap.style.top = y+"px";
        omap.style.right = "";
        omap.style.bottom = "";
            // == restyling ==
        omap.firstChild.style.border = "1px solid gray";

        omap.firstChild.firstChild.style.left="0px";
        omap.firstChild.firstChild.style.top="0px";
        omap.firstChild.style.width="154px";
        omap.firstChild.firstChild.style.width="152px";
        omap.firstChild.firstChild.style.height="120px";
        // Destroy arrow //
        for(i=0;i<omap.children.length;i++)
        {
            if(omap.children[i].tagName == "IMG") 
            {
               omap.children[i].style.visibility = "hidden";
            }
        }
      }

var overview;

function FixMinimap(quick)
{
    
    setTimeout(function() {positionOverview(770,65,$(".gm-overview-map")[0]);}, quick?500:1000);
}

var globMapId;

function StartMap(map_id,makeOverview)
{
    globMapId  = map_id;

    if(GBrowserIsCompatible())
    {
        var div_obj = document.getElementById(map_id);
        map = new GMap2(div_obj);
        //map.addControl(new GLargeMapControl());
        map.addControl(new GSmallMapControl());
        
        // quick info //
        quickinfo = new DQuickInfo();
        map.addControl(quickinfo);
        //
        
        try{
        GEvent.addDomListener(document.getElementById("button_map"),"click",
            function()
            {   
                map.setMapType(G_NORMAL_MAP); 
            }
         );
        
        GEvent.addDomListener(document.getElementById("button_sat"),"click",
            function()
            {   
                map.setMapType(G_SATELLITE_MAP); 
            }
         );
        
        GEvent.addDomListener(document.getElementById("button_hybrid"),"click",
            function()
            {   
                map.setMapType(G_HYBRID_MAP); 
            }
         );
        }catch(err){};
      
        // DZoom
       // map.addControl(new DZoomControl());
        // DZoom
       
        // Map Event
        GEvent.addDomListener(map, "click", function(overlay,point) {
        killInfo2();
        });
        //
        if(makeOverview)
        {
            var overviewcontrol = new GOverviewMapControl( new GSize(164,122) );
            map.addControl(overviewcontrol);
            overview = overviewcontrol;
            GEvent.addListener( map, "tilesloaded", function() {
            FixMinimap(false); 
              } );
        }
        map.enableDoubleClickZoom();



        GDownloadUrl(data_url, function(data, responseCode) {
          var xml = GXml.parse(data);
          
          var origin = xml.documentElement.childNodes.item(0);
          var point = new GLatLng(parseFloat(origin.getAttribute("lat")),
                                    parseFloat(origin.getAttribute("long")) );
          map.setCenter(point,parseInt(origin.getAttribute("zoom")));
          
          
          
            // Can show markers //
          if((items_url!="")&&(data_type=="estate"))
          {
                 dinfo2_margin = 10;
                    
                    GEvent.addListener(map, "moveend", function() {
                        if(!SearchingNow) showMarkers(false,false); 
                      });
    
                        GEvent.addListener(map, "zoomend", function(oldLevel,  newLevel) {
                        if(!SearchingNow) { if(newLevel<oldLevel)showMarkers(false,false);  }
                        });
                 showMarkers(false,true); 
          }else if((items_url!="")&&(data_type=="garage"))
          {
                ShowGarage("");
          }else if((items_url!="")&&(data_type=="LocalMap"))
          {
            map.setZoom(11);
          }else if((items_url!="")&&(data_type=="Biz"))
            {
            ShowBizItems();
            }else if((items_url!="")&&(data_type=="ApRent"))
            {
            ShowApRentItems();
            }else if((items_url!="")&&(data_type=="cinema"))
            {
            ShowCinemaItems();
            }else if(data_type=="selector")
            {
                ShowSelector();
            }else if(data_type=="areaselector")
            {
                ShowAreaSelector();
            }
            else if(data_type=="smo")
            {
                ShowSMO();
            }  else if(data_type=="settings")
            {
                StartMapSettings();
            }else if(data_type=="attractions")
            {
                StartAttractions(true);
            }else if(data_type=="loyalty")
            {
                map.setZoom(12);
                StartLoyalty();
            }
            
            //
        });
        
      
        document.onunload = function()
        {
            GUnload();
        }
    }else
    {
        document.getElementById("map").innerHTML = "<h1>We are sorry, but your browser can't display Google Maps.</h1>";
    }
}

function createMarkerBalloon(point,title, text,icon)
{
    var marker = new GMarker(point,icon);
  
    
 GEvent.addListener(marker, "click", function() {
       lastpoint = point;
       showInfoBalloon( point,title ,text );
      });
    return marker;    
}

function GetRangeForCurrentZoom()
{
    var bnds = map.getBounds();
    var sw = bnds.getSouthWest();
    var center = bnds.getCenter();
    var res = sw.distanceFrom(center)/1000;
    
    return res;
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded(); 