﻿// Created by: Javier Castillo

//Variables declared here to allow scope access
//var geocoder = null; // = new GClientGeocoder();
//var map; 
//var kml;
//var geoXml;
//var mManager;
//var markerCount = 0;
//var gmarkers = new Array();
//var mapLevel = 8; //Current level
//var mapStreetLevel = 8; //Starting level
//var mapWidth = 640;
//var mapHeight = 310;

var currentMarker = null; //jcode 01/19/2009




//Default Marker Icon
var markerIcon = new GIcon(); 
    markerIcon.image = "http://www.riliving.com/Images/map/blue_pin.png";//'/Images/CommonImages/fpo_newlisting.gif'; //update this
    //markerIcon.shadow = '/Images/CommonImages/fpo_newlisting.gif'; //update this
    //markerIcon.iconSize = new GSize(12, 12);
    //markerIcon.shadowSize = new GSize(12, 12);
    markerIcon.iconAnchor = new GPoint(8, 41);
    markerIcon.infoWindowAnchor = new GPoint(11, 10);
    
   

	
//Adds marker to google map by address
function showAddress(address, html, PropId) {  
	if(geocoder == null){	
		geocoder = new GClientGeocoder();
	}
	//Geocoder retrieve addresss and caches for future calls.
	geocoder.getLatLng(address,    
		function(point) {//Doesn't executes until theres a response
				if (!point) {
					//alert(address + " not found");      
				} else {
					var marker = createMarker(point,address, html);
					marker.PropId = PropId; //Custom property created
					mManager.addMarker(marker, 1, 17); //map.addOverlay(marker);
					
					// save the info we need to use later
					gmarkers[mManager.getMarkerCount(mapLevel)-1] = marker;
					//markerCount++;
					
					//centerMapOnMarkers(); //Centers map relative to all existing points
				}
			} 
		);
}

function CreateInfoWindow(ID, Address, City, State, Zip, Thumb, Price, Beds, Baths, Type, Lat, Long)
{
    //var markerInfoHtml = "<table width=\"300\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr><td colspan=\"2\" valign=\"top\"> <a href=\"#\" onclick=\"LoadPropertyTab({0}, \\\'{1}\\\', \\\'\\\');return false;\"><b>{1} </b></a> {2} {3}</td></tr><tr><td width=\"150\" valign=\"top\"><div class=\"photo_frame\"><a href=\"#\"  onclick=\"LoadPropertyTab({0}, \\\'{1}\\\', \\\'\\\');return false;\"><img src=\"{4}\" alt=\"View Property Details\" height=\"75\" border=\"0\" /></a></div><div class=\"icons\">{5}</div></td><td valign=\"top\"><div><b class=\"hilite\">{6}</b></div><div>Bed: <span class=\"hilite\">{7}</span> | Bath: <span class=\"hilite\">{8}</span></div><div>Type: <span class=\"hilite\">{9}</span></div><div>MLS#: <span class=\"hilite\">{10}</span></div></td></tr></table>";
    
    var newHtml = "<table width=\"300\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr><td colspan=\"2\" valign=\"top\"> <a href=\"#\" onclick=\"LoadPropertyTab(" + ID + ",'" + Address + "', '','');return false;\"><b>" + Address + " </b></a> " + City + " " + State + " " + Zip + "</td></tr><tr><td width=\"150\" valign=\"top\"><div class=\"photo_frame\"><a href=\"#\"  onclick=\"LoadPropertyTab(" + ID + ", '" + Address + "', '');return false;\"><img src=\"" + Thumb + "\" alt=\"View Property Details\" height=\"75\" border=\"0\" /></a></div></td><td valign=\"top\"><div><b class=\"hilite\">" + Price + "</b></div><div>Bed: <span class=\"hilite\">" + Beds + "</span> | Bath: <span class=\"hilite\">" + Baths + "</span></div><div>Type: <span class=\"hilite\">" + Type + "</span></div><div>MLS#: <span class=\"hilite\">" + ID + "</span></div></td></tr></table>";
    
    addAddress(Lat, Long, newHtml, ID);
}

function CreateInfoWindowRental(ID, Adress, City, State, Zip, Thumb, Price, Beds, Baths, Type, Lat, Long)
{
    //var markerInfoHtmlRental = "<table width=\"300\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr><td colspan=\"2\" valign=\"top\"> <a href=\"#\" onclick=\"LoadRentalTab({0}, \\\'{1}\\\', \\\'\\\');return false;\"><b>{1} </b></a> {2} {3}</td></tr><tr><td width=\"150\" valign=\"top\"><div class=\"photo_frame\"><a href=\"#\" onclick=\"LoadRentalTab({0}, \\\'{1}\\\', \\\'\\\');return false;\"><img src=\"{4}\" alt=\"View Property Details\" height=\"75\" border=\"0\" /></a></div><div class=\"icons\">{5}</div></td><td valign=\"top\"><div><b class=\"hilite\">{6}</b></div><div>Bed: <span class=\"hilite\">{7}</span> | Bath: <span class=\"hilite\">{8}</span></div><div><span class=\"hilite\">{9}</span></div></td></tr></table>";
    var newHtml = "<table width=\"300\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr><td colspan=\"2\" valign=\"top\"> <a href=\"#\" onclick=\"LoadRentalTab(" + ID + ",'" + Address + "', '');return false;\"><b>" + Address + " </b></a> " + City + " " + State + " " + Zip + "</td></tr><tr><td width=\"150\" valign=\"top\"><div class=\"photo_frame\"><a href=\"#\"  onclick=\"LoadRentalTab(" + ID + ", '" + Address + "', '');return false;\"><img src=\"" + Thumb + "\" alt=\"View Property Details\" height=\"75\" border=\"0\" /></a></div></td><td valign=\"top\"><div><b class=\"hilite\">" + Price + "</b></div><div>Bed: <span class=\"hilite\">" + Beds + "</span> | Bath: <span class=\"hilite\">" + Baths + "</span></div><div>Type: <span class=\"hilite\">" + Type + "</span></div><div>Rental#: <span class=\"hilite\">" + ID + "</span></div></td></tr></table>";
    
    addAddress(Lat, Long, newHtml, ID);
}

function showAddress2(point1, point2, html, PropId) 
{
    for(var i=0; i<gmarkers.length; i++)
	{
		if(PropId == gmarkers[i].PropId)
		{
		    var LatLng = gmarkers[i].getLatLng();
			//map.setCenter(LatLng, mapStreetLevel);
			gmarkers[i].openInfoWindowHtml(gmarkers[i].myhtml);
		    //map.panTo(gmarkers[i].getLatLng())
			return;
		}
	}
	var marker = createMarker2(point1, point2,PropId, html);
	marker.PropId = PropId; //Custom property created
	mManager.addMarker(marker, 1, 17); //map.addOverlay(marker;)
	//marker.openInfoWindowHtml(marker.myhtml);
	// save the info we need to use later
	gmarkers[mManager.getMarkerCount(mapLevel)-1] = marker;
	//markerCount++;
					
	//centerMapOnMarkers(); //Centers map relative to all existing points

}

function clearMap()
{
    //map.clearOverlays();
    //mManager = GMarkerManager(map);
    //gmarkers = new Array();
    
    //for(var i=0; i<gmarkers.length;i++) //mManager.getMarkerCount(mapLevel); i++)
	//{
	//	gmarkers[i].hide();
		
	//}
    //RemoveMarkers();
    //InitGMap();
    
    mManager.clearMarkers();
    gmarkers.length = 0;
}

function addAddress(point1, point2, html, PropId) 
{
    for(var i=0; i<gmarkers.length; i++)
	{
		if(PropId == gmarkers[i].PropId)
		{
		    gmarkers[i].show();
		    return;
		}
	}
	var marker = createMarker2(point1, point2,PropId, html);
	marker.PropId = PropId; //Custom property created
	mManager.addMarker(marker, 1, 17); //map.addOverlay(marker);
	// save the info we need to use later
	//gmarkers[mManager.getMarkerCount(mapLevel)-1] = marker;
	gmarkers[gmarkers.length] = marker;
	

}

function displayAddress(PropId)
{
    //alert(PropId);
    for(var i=0; i<gmarkers.length;i++) //mManager.getMarkerCount(mapLevel); i++)
	{
		if(PropId == gmarkers[i].PropId)
		{
		    //alert("trip");
		    gmarkers[i].openInfoWindowHtml(gmarkers[i].myhtml);
		    map.panTo(gmarkers[i].getLatLng())
			return;
		}
	}
	
}

//Closing the  HTML Window by passing mlsid
function CloseCurrentMarkerInfoWindow(Indx)
{
	 //alert("CloseCurrentMarkerInfoWindow" + Indx);
	for(var i=0; i<gmarkers.length; i++)
		{
			if(Indx == gmarkers[i].PropId)
			{
				var LatLng = gmarkers[i].getLatLng();
				gmarkers[i].closeInfoWindow();
			}
		}
}

function createMarker2(point1,point2,name,html) {
    point = new GLatLng(point1, point2);
    var marker = new GMarker(point, markerIcon, false);
    marker.myhtml = html; //Custom property created
    GEvent.addListener(marker, "click", function() {
      marker.openInfoWindowHtml(html);
     // currentMarker = marker; //jcode 01/19/2009
       
    });
    GEvent.addListener(marker, "infowindowclose", function(point, mapLevel) {
        map.panTo(marker.getLatLng());
    });
    
    return marker;
}

//Creates marker with info window
function createMarker(point,name,html) {
    //alert(point);
    var marker = new GMarker(point, markerIcon, false);
    marker.myhtml = html; //Custom property created
    GEvent.addListener(marker, "click", function() {
        //alert("trip");
        map.setCenter(point, mapLevel)
      marker.openInfoWindowHtml(html);
     
    });
    GEvent.addListener(marker, "infowindowclose", function(point, mapLevel) {
        map.setCenter(point, mapLevel);
    });
    
    return marker;
}

//Calculate the center as mid point between furthest Lat and Lng
function centerMapOnMarkers(){
    if(mManager.getMarkerCount(mapLevel) <= 0)
		return;
		
	mapLevel = 17;
	map.setCenter(new GLatLng(41.71188, -71.452332), mapLevel);
	
	var farLatLeft = 0;
	var farLatRight = 1000; //so this will get overwritten
	var farLngTop = 0;
	var farLngBottom = -1000; // so this will get overwritten
	var midLat = 0;
	var midLng = 0;
	
	//Loop through each point
	for(var i=0; i<mManager.getMarkerCount(mapLevel); i++)
	{
		var LatLng = gmarkers[i].getLatLng();
		if(LatLng.lat() > farLatLeft)
			farLatLeft = LatLng.lat(); //Set furthest Left
		if(LatLng.lat() < farLatRight)
			farLatRight = LatLng.lat(); //Set furthest Right
		if(LatLng.lng() < farLngTop)
			farLngTop = LatLng.lng(); //Set furthest Top
		if(LatLng.lng() > farLngBottom)
			farLngBottom = LatLng.lng(); //Set furthest Bottom
	}
	
	//Calculate midpoint between furthest right, left, top and bottom points
	midLat = farLatLeft - (farLatLeft - farLatRight)/2;
	midLng = farLngTop - (farLngTop - farLngBottom)/2;
	
	//Set Center
	var midpoint = new GLatLng(midLat, midLng);
	map.setCenter(midpoint, mapLevel);
	
	//Zoom Out so that all points are visible.
	for(var i=0; i<mManager.getMarkerCount(mapLevel); i++)
	{
		var LatLng = gmarkers[i].getLatLng();
		ZoomOutToFitPoint(LatLng);
	}
	
}

function ZoomOutToFitPoint(LatLng){

	var pixel = map.fromLatLngToDivPixel(LatLng); //Get x,y of current point
	
	//If current x or y point is off the map, zoom out
	if(pixel.x < 0 	|| pixel.y < 0 || pixel.x > mapWidth || pixel.y > mapHeight)
	{
		//Zoom out
		mapLevel--;
		map.zoomOut();
		
		//Recursive call to test for point
		ZoomOutToFitPoint(LatLng);
		
	}else
	{
		//Base Case
		return;
	}
}


/* JCODE: 03/17/2008
 Not tested Yet */
function centerMapOnMarkerMatchingPropId(PropId){
	for(var i=0; i<mManager.getMarkerCount(mapLevel); i++)
	{
		if(PropId == gmarkers[i].PropId)
		{
			var LatLng = gmarkers[i].getLatLng();
			map.setCenter(LatLng, mapStreetLevel);
			gmarkers[i].openInfoWindowHtml(gmarkers[i].myhtml);
			break;
		}
	}
}

function FinalMapCheck(){
	//If no address added, zoom out to region level
	if(mManager.getMarkerCount(mapLevel) == 0){
		while(mapLevel > 9){
			mapLevel--;
			map.zoomOut();
		}
	}
}

function RemoveMarkers(){
	
	for(var indx=0; indx<mManager.getMarkerCount(mapLevel); indx++)
	{
		map.removeOverlay(gmarkers[indx]);
	}
	//mManager.refresh();	
}

function InitGMap(){
	map = new GMap2(document.getElementById("map")); 
	map.addControl(new GLargeMapControl());    
	map.addControl(new GMapTypeControl());
	//map.addControl(new GOverviewMapControl());
	
	//Arbirary, update this to be dynamic depending on results.
	map.setCenter(new GLatLng(41.71188, -71.452332), mapLevel);
	mManager = new MarkerManager(map);

    
}

var geoCallback = function()
{
    if(features.length > 0){
		geoXml.gotoDefaultViewport(map);
		
		var elmGMapsCount = document.getElementById("divGMapsCount");
		if(elmGMapsCount){
			elmGMapsCount.innerHTML = "Displaying the first " + features.length + " properties found matching your criteria";
		}
	}
	
}

function AddAddressesByIdStr(geoXmlUrl){
	RemoveGeoXmlOverlay();
	geoXml = new GGeoXml(geoXmlUrl, geoCallback, SideBar); 
    map.addOverlay(geoXml);
    
    
	
}

var click = "click";
var features = [];
var PrevIndx = "";
      
function Side() {
	//Constructor
}
Side.prototype.addFeatureToFolder = function(a,b) {
	var i = features.length;
	features.push(a);
}
Side.prototype.folderByIndex = function(a) {}
Side.prototype.hasNotYetFinishedRendering = function() {}
Side.prototype.removeFeature = function(a) {}
Side.prototype.createFoldersFromEncoded = function(a,b) {}

// === Instantiate an object of that Class ===
var SideBar = new Side();

function OpenInfoWindowByIndex(indx){
	indx = indx + "";
	var trip = false;

	for(var i=0; i<features.length; i++){
		var featName = ""+features[i].id+"";
		if(indx == featName){
			GEvent.trigger(features[i], 'click');
			trip = true;
		}
	}
	if(PrevIndx != indx)
	{
		CloseCurrentMarkerInfoWindow(PrevIndx);
	}

	if (trip == false)
	{
	    //alert("543");
	}
	
	if (PrevIndx == "" || PrevIndx != indx)
	{
	PrevIndx = indx;
	PrevousIndex = indx;
	}
}

function RemoveGeoXmlOverlay(){
	if(geoXml){
		map.removeOverlay(geoXml);
	}
	
	features = [];
}
