/*-------------------------GLOBALS-------------------------*/
var activeMap, timer;
var chosen = [];
var mgr;
var allmarkers = [];
 
/* Array of GLayers
 * The 'name' property is not being used here
*/
var layers = [
 { name: "Pano", obj: new GLayer("com.panoramio.all") },
 { name: "Tube", obj: new GLayer("com.youtube.all") },
 { name: "Wiki", obj: new GLayer("org.wikipedia.en") }
];

/*---------------------------------------------------------------*/
    function load(locName, lat, lng,zoom) {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map"));
		
        map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new ShowNearbyControl());
		 // Add the self created control
 		map.addControl(new MoreControl());
 		// Remove invisible box from its location and add it to the map
 		map.getContainer().appendChild(document.getElementById("box"));		
        var point = new GLatLng(lat, lng);
		
		
		var marker1 = new GMarker(point);
  		GEvent.addListener(marker1, "click", function() {
  			var balloonText ="<b>" + locName + "</b>";
			marker1.openInfoWindowHtml(balloonText);
  		});
		//map.addOverlay(marker);
		map.setCenter(point,zoom);
		map.enableDoubleClickZoom();
		map.enableScrollWheelZoom();
		mgr = new MarkerManager(map, {
                  trackMarkers: true
                });
		mgr.addMarker(marker1,zoom);
		mgr.show();
		setActiveMap(map);
		
}	 
	  }
function hideMap(){
	  	var mapDiv = document.getElementById("tabContent4");
	  	mapDiv.style.display = "none";
	  	// alert("hideMap fired");
 }
	  function checkResizeMap(){
	  	activeMap.checkResize();
	  }
	function updateMap(){
		var map = new GMap2(document.getElementById("map"));
		activeMap = map;
	}

function setActiveMap(map){
	activeMap = map;
}

function getHotelData(map){
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var maxLon = northEast.lng();
	var maxLat = northEast.lat();
	var minLon = southWest.lng();
	var minLat = southWest.lat();

	var myAjax = new Ajax.Request(
	'do/venereAction?dispatch=mapPoints'
	+ '&minlat=' + minLat
	+ '&maxlat=' + maxLat 
	+ '&minlon=' + minLon
	+ '&maxlon=' + maxLon 
	+ '&json=true',		
			{
				method: 'get', 
				parameters: '', 
				onComplete: function(response) {						
				hotelList = eval('(' + response.responseText + ')');
				if(hotelList.length <1){
					alert("No hotels found");
				}
				setHotels(hotelList);
				//makeMapPoints(hotels, map);
				//alert("in onComplete:  " + hotels );
				
				}
			});
			
}
function getLandmarkData(map){
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var maxLon = northEast.lng();
	var maxLat = northEast.lat();
	var minLon = southWest.lng();
	var minLat = southWest.lat();

	var myAjax = new Ajax.Request(
	'do/landmarkAction?dispatch=mapPoints'
	+ '&minlat=' + minLat
	+ '&maxlat=' + maxLat 
	+ '&minlon=' + minLon
	+ '&maxlon=' + maxLon 
	+ '&json=true',		
			{
				method: 'get', 
				parameters: '', 
				onComplete: function(response) {						
				landmarkList = eval('(' + response.responseText + ')');
				setLandmarks(landmarkList);
				//makeMapPoints(hotels, map);
				//alert("in onComplete:  " + hotels );
				
				}
			});
			
}

function showNearby(){	
	//alert(activeMap.getZoom());
	if(activeMap.getZoom()<13){
		alert("Please zoom in closer before searching for hotels. ");
	}else{
		//var tempMap = new GMap2(document.getElementById("map"));
		//activeMap = new GMap2(document.getElementById("map"));
		// activeMap.setCenter(tempMap.getCenter());
		var bounds = activeMap.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var maxLon = northEast.lng();
		var maxLat = northEast.lat();
		var minLon = southWest.lng();
		var minLat = southWest.lat();

	var myAjax = new Ajax.Request(
	'do/venereAction?dispatch=mapPoints'
	+ '&minlat=' + minLat
	+ '&maxlat=' + maxLat 
	+ '&minlon=' + minLon
	+ '&maxlon=' + maxLon 
	+ '&json=true',		
			{
				method: 'get', 
				parameters: '', 
				onComplete: function(response) {						
				hotelList = eval('(' + response.responseText + ')');
				makeMapPoints(hotelList);
				//alert("in onComplete:  " + hotels );
				
				}
			});	
			
}}
function setHotels(hotelList){
	hotels = hotelList;
}
function createMarker(point, hotel) {
  var marker = new GMarker(point);
  GEvent.addListener(marker, "click", function() {
  	//alert(escape(hotel['name']));
  	var encoded_url = escape("hotel/" + hotel['id'] + "/" + hotel['name'] + ".html");
  	var balloonText ="<b>" + hotel['name'] + "</b>"
  	+"<br> rooms from " + hotel['doublepricemin'] + "&nbsp;" + hotel['currency']
	+ "<br>" + hotel['address']
	+ "<br><a href ='" + escape(encoded_url) + "'>"
	+ "more info</a>";
    marker.openInfoWindowHtml(balloonText);
  });
  return marker;
}
function makeMapPoints(hotels){
	allmarkers.length = 0;
	var markers = [];
	for(i = 0; i < hotels['hotels'].length; i++) {
		var point = new GLatLng(hotels['hotels'][i]['lat'],
                          hotels['hotels'][i]['lon']);
  		//activeMap.addOverlay(createMarker(point, hotels['hotels'][i]));
  		var marker = createMarker(point, hotels['hotels'][i]);
		 markers.push(marker);	
		 allmarkers.push(marker);	
		}
		mgr.addMarkers(markers,activeMap.getZoom());
		mgr.refresh();
		//mgr.show();
		//alert(mgr.getMarkerCount(activeMap.getZoom()));
}
function showMarkers() {
              mgr.show();
}

// my custom hotel search control
function ShowNearbyControl(){
	
}
ShowNearbyControl.prototype = new GControl();
ShowNearbyControl.prototype.initialize = function(map) {
  var container = document.createElement("div");

  var showNearbyDiv = document.createElement("div");
  this.setButtonStyle_(showNearbyDiv);
  container.appendChild(showNearbyDiv);
  showNearbyDiv.appendChild(document.createTextNode("Hotels Nearby"));
  GEvent.addDomListener(showNearbyDiv, "click", function() {
    showNearby();
  });


  map.getContainer().appendChild(container);
  return container;
}
ShowNearbyControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(7, 12));
}

// Sets the proper CSS for the given button element.
ShowNearbyControl.prototype.setButtonStyle_ = function(button) {
  button.style.textDecoration = "underline";
  button.style.color = "#0000cc";
  button.style.backgroundColor = "white";
  button.style.font = "small Arial";
  button.style.border = "1px solid black";
  button.style.padding = "1px";
  button.style.marginBottom = "3px";
  button.style.textAlign = "center";
  button.style.width = "10em";
  button.style.cursor = "pointer";
}

function hideAll() {

 var boxes = document.getElementsByName("mark");
 for(var i = 0; i < boxes.length; i++) {
  if(boxes[i].checked) {
   boxes[i].checked = false;
   switchLayer(false, layers[i].obj);
   chosen.push(i);
  }
 }
}


function checkChecked() {

 /* Returns true if a checkbox is still checked
 *  otherwise false
 */
 var boxes = document.getElementsByName("mark");
 for(var i = 0; i < boxes.length; i++) {
  if(boxes[i].checked) return true;
 }
 return false;
}


function switchLayer(checked, layer) {

 /* Function was originally borrowed from Esa:
 *  http://esa.ilmari.googlepages.com/dropdownmenu.htm
 */
 var layerbox = document.getElementById("box");
 var boxlink = document.getElementById("boxlink");
 var button = document.getElementById("more_inner");

 if(checked) {
   activeMap.addOverlay(layer);
   // Reset chosen array
   chosen.length = 0;
   /* Highlight the link and
   *  make the button font bold.
   */
   boxlink.className ="highlight";
   layerbox.className ="highlight";
   button.className ="highlight";
 }
 else {
   activeMap.removeOverlay(layer);
   /*  Reset the link and the button
    * if all checkboxes were unchecked.
   */
   if(!checkChecked()) {
    boxlink.blur();
    boxlink.className ="";
    layerbox.className ="";
    button.className ="";
   }
 }
}


function showLayerbox() {

 var layerbox = document.getElementById("box");
 // Left size of more control
 var offsetX = 105;
 // Top size of more control plus more button height
 var offsetY = 7 + 18;

 var lpos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offsetX, offsetY));
 lpos.apply(layerbox);
 if(window.timer) clearTimeout(timer);
 layerbox.style.display = "block";
}


function setClose(e) {

 if(!e) e = window.event;
 var layerbox = document.getElementById("box");

 if(checkMouseLeave(layerbox, e))
  timer = window.setTimeout(function() {
   layerbox.style.display = "none"; }, 400);
}


function checkMouseLeave(element, evt) {

 /* Avoid firing a mouseout event
 *  when the mouse moves over a child element.
 *  Borrowed from:
 *  http://www.faqts.com/knowledge_base/view.phtml/aid/1606/fid/145
 */
 if(element.contains && evt.toElement) {
   return !element.contains(evt.toElement);
 }
 else if(evt.relatedTarget) {
   return !containsDOM(element, evt.relatedTarget);
 }
}


function containsDOM(container, containee) {

 var isParent = false;
 do {
  if((isParent = container == containee))
   break;
   containee = containee.parentNode;
 }
 while(containee != null);
 return isParent;
}


function toggleLayers() {

 if(chosen.length > 0 ) {
   /* Make an independent copy of chosen array since switchLayer()
   *  resets the chosen array, which may not be useful here.
   */
   var copy = chosen.slice();
   for(var i = 0; i < copy.length; i++) {
    var index = parseInt(copy[i]);
    switchLayer(true, layers[index].obj);
    document.getElementsByName("mark")[index].checked = true;
   }
 }
 else {
  hideAll();
 }
}


function MoreControl() {};
MoreControl.prototype = new GControl();
MoreControl.prototype.initialize = function(map) {

 var more = document.createElement("div");
 more.style.border = "1px solid black";
 more.title = "Show/Hide Layers";
 var inner = document.createElement("div");
 inner.id = "more_inner";
 inner.appendChild(document.createTextNode("More..."));
 more.appendChild(inner);
 more.onmouseover = showLayerbox;
 more.onmouseout = setClose;
 more.onclick = toggleLayers;
 map.getContainer().appendChild(more);
 return more;
}


MoreControl.prototype.getDefaultPosition = function() {
 return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(105, 7));
}


function showAddress(address) {

 var geocoder = new GClientGeocoder();
 geocoder.getLatLng(address, function(point) {

  if(!point) {
   alert(address + " not found.");
  }
  else {
   activeMap.setCenter(point, 14);
  }
 });
}
