//Maps Functions
var map = null;
var markers = [];
var cluster = null;
var markers_attractions = [];
var markerGroups = {};

//To control click on map or marker
var clickOnMarker = false;
var zoomCenterMarks = null;

function calculateBounds(markers,checkHidden) {
  checkHidden = checkHidden || false;
  var minLat = 90, minLng = 180, maxLat = -90, maxLng = -180;	
  if (markers.length>0) {
    markers.each(function(element, index) {
        if (!checkHidden || !element.isHidden()) {
          var latlng = element.getLatLng();
          if (latlng.lat() < minLat) minLat=latlng.lat();
          if (latlng.lat() > maxLat) maxLat=latlng.lat();
          if (latlng.lng() < minLng) minLng=latlng.lng();
          if (latlng.lng() > maxLng) maxLng=latlng.lng();
        }
    });
    if ((typeof(newMarker)!="undefined")&&(newMarker!=null))  {
        var latlng = newMarker.getLatLng();
        if (latlng.lat() < minLat) minLat=latlng.lat();
        if (latlng.lat() > maxLat) maxLat=latlng.lat();
        if (latlng.lng() < minLng) minLng=latlng.lng();
        if (latlng.lng() > maxLng) maxLng=latlng.lng();
    }
    minLat -= 0.005; minLng -= 0.005;
    maxLat += 0.005; maxLng += 0.005;
    
  } else {
    minLat = 33.94335994657882, minLng = -15.468750000000002, maxLat = 45.706179285330855, maxLng = 6.50390625;	
  }
  return new GLatLngBounds(new GLatLng(minLat,minLng),  new GLatLng(maxLat,maxLng))
}	
function centerMarkersMap(markers,map,checkHidden) {
  checkHidden = checkHidden || false;
  map.closeInfoWindow();  
  var bounds = calculateBounds(markers,checkHidden);
  zoomCenterMarks = map.getBoundsZoomLevel(bounds);
  map.setCenter(bounds.getCenter(),zoomCenterMarks);
}
// A GControl
function MyMapTypeControl() {};
MyMapTypeControl.prototype = new GControl();
MyMapTypeControl.prototype.initialize = function(map) {
  var container = document.createElement("div");
  container.style.padding="4px";
  var normalMapDiv = document.createElement("div");
  this.setButtonStyle_(normalMapDiv,"Show street map");
  container.appendChild(normalMapDiv);
  normalMapDiv.appendChild(document.createTextNode("M"));
  GEvent.addDomListener(normalMapDiv, "click", function() {    
    map.setMapType(G_NORMAL_MAP);
  });
  var satelliteMapDiv = document.createElement("div");
  this.setButtonStyle_(satelliteMapDiv,"Show satellite imagery");
  container.appendChild(satelliteMapDiv);
  satelliteMapDiv.appendChild(document.createTextNode("S"));
  GEvent.addDomListener(satelliteMapDiv, "click", function() {    
    map.setMapType(G_SATELLITE_MAP);
  });
  var hybridMapDiv = document.createElement("div");
  this.setButtonStyle_(hybridMapDiv,"Show imagery with street map");
  container.appendChild(hybridMapDiv);
  hybridMapDiv.appendChild(document.createTextNode("H"));
  GEvent.addDomListener(hybridMapDiv, "click", function() {    
    map.setMapType(G_HYBRID_MAP);
  });
  map.getContainer().appendChild(container);
  return container;
}
MyMapTypeControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10));
}
// Sets the proper CSS for the given button element.
MyMapTypeControl.prototype.setButtonStyle_ = function(button,title) {
  button.style.textDecoration = "none";
  button.style.color = "#000000";
  button.style.backgroundColor = "white";
  button.style.font = "small Arial";
  button.style.border = "2px solid black";
  button.style.padding = "2px";
  button.style.marginRight = "3px";
  button.style.textAlign = "center";  
  button.style.cursor = "pointer";
  button.style.display = "inline";
  button.style.fontSize= "10px";
  button.title = title;  
}

var baseIcon = new GIcon(G_DEFAULT_ICON);
baseIcon.iconSize = new GSize(32, 32);
baseIcon.shadowSize = new GSize(56, 32);
baseIcon.iconAnchor = new GPoint(16, 32);
baseIcon.infoWindowAnchor = new GPoint(16, 0); 

var baseIconAttraction = new GIcon();
baseIconAttraction.iconSize = new GSize(32, 32);
baseIconAttraction.iconAnchor = new GPoint(16, 32);
baseIconAttraction.infoWindowAnchor = new GPoint(16, 5); 
        
var redIcon = new GIcon(baseIcon,"http://www.google.com/intl/en_us/mapfiles/ms/micons/red-dot.png");
var blueIcon = new GIcon(baseIcon,"http://www.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png");
var PROJECT = 10;

function zoomSandwich(ref,gLatLng) {
    var maxZoom = 17;
    if (map.getZoom()==maxZoom) {
      map.setCenter(gLatLng,(zoomCenterMarks!=null)?zoomCenterMarks:map.getZoom());
    } else {
      map.setCenter(gLatLng,maxZoom);
    }
}
function createMarker(element,draggable) {
  draggable = draggable || false; 
  var typeIcon;  
  if (element.getType()==PROJECT) {
      typeIcon = redIcon;
  }   
  var marker = new GMarker(element.getLatLng(), { icon:typeIcon,draggable: draggable,title:element.getTitle()});
  marker.element = element;
  frameSandwich(marker,element.getInfoSandwich());
  GEvent.addListener(marker, "click", function() {
    openInfoMarker(marker);
  });
  return marker;
}
function frameSandwich(marker,content) {
  marker.myHtml = "<div class='sandwich-text'>" + content + "<br/>" +
                  "<a href='#' onClick='zoomSandwich(this,new GLatLng("+marker.getLatLng().lat()+","+marker.getLatLng().lng()+"));return false;'>Zoom</a></div>";
}
function openInfoMarker(marker) {
  map.openInfoWindowHtml(marker.getLatLng(), marker.myHtml);
  if (typeof(marker.project)=="undefined") {
    new Ajax.Request('/maps/sandwich/'+marker.element.id, {asynchronous:true, evalScripts:true});
  } else {
    showExtendedInfo(marker);
  }
}
function createMarkers(elements,type_element) {
    var markers = [];
    for(var i=0;i<elements.length;i++) {
      //Control type_element
      if (type_element == PROJECT) {
        var element = new Project(elements[i].project);
        var marker = createMarker(element);            
        markers.push(marker);
      }       
    }
    return markers;
}
//function showMarkers(elements,type_element) {
//  markers = markers.concat(createMarkers(elements,type_element));
//  centerMarkersMap(markers,map); 
//  for (var m=0;m<markers.length;m++) {
//    map.addOverlay(markers[m]);
//  }  
//}
function showMarkers(elements,type_element) {
  
  map.closeInfoWindow();
  markers = createMarkers(elements,type_element);
  if (cluster) {
    cluster.removeMarkers();
    cluster = null;
  }
  if (markers.size()>0) {        
    cluster = new ClusterMarker(map, { markers:markers,clusterMarkerIcon: blueIcon,clusterMarkerTitle: "Click para ver %count proyectos"} );
    cluster.fitMapToMarkers();
    cluster.refresh();
  }
  zoomCenterMarks = map.getZoom();
}
function checkStringNull(value) {
  if (value == null) {
    return ""; 
  } else {
    return value;
  }
}
//Project Object
function Project(object) {
  this.id = object.id;  
  this.title = object.t;
  this.address = object.a;
  this.latlng = new GLatLng(object.lt,object.lg);   
}	
Project.prototype.getId = function() {return this.id};
Project.prototype.getTitle = function() {return this.title};
Project.prototype.getInfoSandwich = function() {
  var sandwich ="<div id='sandwich_"+this.getId()+"' class='type-normal'><img alt='please wait' src='/images/indicator.gif'/> "+dictionary.pleaseWait+"</div>";  
  return sandwich;
};
Project.prototype.getAddress = function() {return checkStringNull(this.address)};
Project.prototype.getLatLng = function() {return this.latlng};

Project.prototype.getType = function() {return PROJECT};
// End Project object

//To select option
function getOptionIdx(select, value) {
  if(!select.options) return -1;
  for(var oNum = 0; oNum != select.options.length; oNum++) {
    if(select.options[oNum].value == value) return oNum;
  }
  return -1;
}
//To select element from list
function getObjByIdFromList(id,list) {
    var obj = null;
    for(var i=0;i<list.length;i++) {
        if (list[i].id==id) {
            obj = list[i];
            break; 
        }
    }
    return obj;
}
//Specific functions of page 'members'
function selectMarkerByProject(element) {
    for(var i=0;i<markers.length;i++) {
        if (markers[i].element == element)
            return i;
    }
    return -1;
} 
function selectMarkerByProjectId(id) {
    for(var i=0;i<markers.length;i++) {
        if (markers[i].element.getId() == id)
            return i;
    }
    return -1;
}

//To control toggle (map|list)
var normal_status = true;

function microTab(project) {
  project = eval('(' + project + ')');
  project = project.project
  var microtab = "<div style='width:200px'><h3><a href='"+project.name_url+"'>"+ project.title+"</a></h3><h5>"+project.description+"</h5>";
  microtab += "</div>";
  idSandwich = 'sandwich_'+project.id;
  var idxMarker = selectMarkerByProjectId(project.id);
  frameSandwich(markers[idxMarker],microtab);
  markers[idxMarker].organisation = project;
  
  Try.these(
    function() { map.openInfoWindowHtml(markers[idxMarker].getLatLng(), markers[idxMarker].myHtml); },
    function() { setTimeout("map.openInfoWindowHtml(markers["+idxMarker+"].getLatLng(), markers["+idxMarker+"].myHtml);showExtendedInfo(markers["+idxMarker+"])",1000) }
  )
}
