// 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());
	
	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) {
 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]);
 }
}

function zoomToMarkers() {
	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),map.getBoundsZoomLevel(bounds)-1);
}

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';
	}
}