// JavaScript Document

var markerindex = 0;
var markers = new Array();
var markersHash = new Hash();

var map=null;

GEvent.addDomListener(window,"load",initGmap);
GEvent.addDomListener(window,"unload",GUnload);

function createMap(id) {
 var map = new GMap2(document.getElementById(id));
 //map.addControl(new GLargeMapControl());
 //map.addControl(new GMapTypeControl());
 map.setUIToDefault();
 
 GEvent.addListener(map, 'click', function(overlay,point) {
  if (overlay) {
  } else {
   stopAnimateMarkers();
  }
 });
 GEvent.addListener(map, 'dragstart', function() {
   stopAnimateMarkers();
 });
 
 return map;
}

function createMarker(point,html,id) {
 var marker = new GMarker(point);
 map.addOverlay(marker);
 GEvent.addListener(marker, "click", function() {
  marker.openInfoWindowHtml(html);
  stopAnimateMarkers();
 });
 markers.push(marker);
 markers[markers.length-1].lat=point.lat();
 markers[markers.length-1].lng=point.lng();
 markers[markers.length-1].html=html;
 markersHash.setItem(id,marker);
 
 //accumulateBounds(point);
 return marker;
}

function accumulateBounds(point){
  if(point.x < markers.minlat || markers.minlat == 0) markers.minlat = point.x;
  if(point.x > markers.maxlat || markers.maxlat == 0) markers.maxlat = point.x;
  if(point.y < markers.minlng || markers.minlng == 0) markers.minlng = point.y;
  if(point.y > markers.maxlng || markers.maxlng == 0) markers.maxlng = point.y;
}

function animateMarkers() {
 if (markerindex<0) return false;
 var marker=markers[markerindex];
 marker.openInfoWindowHtml(marker.html);
 markerindex++;
 if (markerindex==markers.length) markerindex=0;
 if (markers.length>1) setTimeout(animateMarkers, 4000);
}

function stopAnimateMarkers() {
 markerindex=-1;
}

function clickMarker(id) {
 if (markersHash.hasItem(id)) GEvent.trigger(markersHash.items[id], "click");
}

function parseJson (doc) {
 if (doc) {
  var jsonData = eval('(' + doc + ')');
  for (var i = 0; i < jsonData.response.length; i++) {
   var point=new GLatLng(jsonData.response[i][1],jsonData.response[i][2]);
   createMarker(point,"<strong>" + jsonData.response[i][3] + "</strong><br />" + jsonData.response[i][4],jsonData.response[i][0]);
  }
 } else {
   markerindex = -1;
 }
}

function zoomToMarkers() {
 if (markers.length>0) {
  var markersLat=markers.map(function(el){return el.lat;});
  var markersLng=markers.map(function(el){return el.lng;});
  var b1 = new GLatLng(markersLat.max(),markersLng.max());
  var b2 = new GLatLng(markersLat.min(),markersLng.min());
  var lat_center = (markersLat.max() + markersLat.min())/2;
  var lng_center = (markersLng.max() + markersLng.min())/2;
  bounds = new GLatLngBounds;
  bounds.extend(b1);
  bounds.extend(b2);
  map.setCenter(new GLatLng(lat_center,lng_center),Math.min(map.getBoundsZoomLevel(bounds)-1,7));
 }
}

if (!Array.prototype.max) {
 Array.prototype.max = function(){
   return Math.max.apply({},this)
}}

if (!Array.prototype.min) {
 Array.prototype.min = function(){
  return Math.min.apply({},this)
}}

if (!Array.prototype.map) {
 Array.prototype.map = function(fn, thisObj) {
     var scope = thisObj || window;
     var a = [];
     for (var i=0, j=this.length; i < j; ++i) a.push(fn.call(scope, this[i], i, this));
     return a;
 };
}

function Hash() {
 this.length = 0;
 this.items = new Array();
 for (var i = 0; i < arguments.length; i += 2) {
  if (typeof(arguments[i + 1]) != 'undefined') {
   this.items[arguments[i]] = arguments[i + 1];
   this.length++;
  }
 }
   
 this.removeItem = function(in_key) {
  var tmp_value;
  if (typeof(this.items[in_key]) != 'undefined') {
   this.length--;
   var tmp_value = this.items[in_key];
   delete this.items[in_key];
  }  
  return tmp_value;
 }

 this.getItem = function(in_key) {
  return this.items[in_key];
 }

 this.setItem = function(in_key, in_value) {
  if (typeof(in_value) != 'undefined') {
   if (typeof(this.items[in_key]) == 'undefined') {
    this.length++;
   }
   this.items[in_key] = in_value;
  }
  return in_value;
 }

 this.hasItem = function(in_key) {
  return typeof(this.items[in_key]) != 'undefined';
 }
}
