
var maps = [];
var defaultSW = null;
var defaultNE = null;
var defaultCenter = null;
var defaultZoom = 5;
var aberration = 0.2;
var minRes = 5;
var maxRes = 13;
var allowedBounds = null;
var currentMarker = null;

//------------------------------------------------------------------------------
// Zoom Control
//------------------------------------------------------------------------------


//------------------------------------------------------------------------------
// Bounds
//------------------------------------------------------------------------------

function checkBounds() {
	// Perform the check and return if OK
	var currentBounds = map.getBounds();
	var cSpan = currentBounds.toSpan(); // width and height of the bounds
	var offsetX = cSpan.lng() / (2+aberration); // we need a little border
	var offsetY = cSpan.lat() / (2+aberration);
	var C = map.getCenter(); // current center coords
	var X = C.lng();
	var Y = C.lat();

	// now check if the current rectangle in the allowed area
	var checkSW = new GLatLng(C.lat()-offsetY,C.lng()-offsetX);
	var checkNE = new GLatLng(C.lat()+offsetY,C.lng()+offsetX);
	
	if (allowedBounds.containsLatLng(checkSW) &&
		allowedBounds.containsLatLng(checkNE)) {
		return; // nothing to do
	}

	var AmaxX = allowedBounds.getNorthEast().lng();
	var AmaxY = allowedBounds.getNorthEast().lat();
	var AminX = allowedBounds.getSouthWest().lng();
	var AminY = allowedBounds.getSouthWest().lat();

	if (X < (AminX+offsetX)) {X = AminX + offsetX;}
	if (X > (AmaxX-offsetX)) {X = AmaxX - offsetX;}
	if (Y < (AminY+offsetY)) {Y = AminY + offsetY;}
	if (Y > (AmaxY-offsetY)) {Y = AmaxY - offsetY;}

	map.setCenter(new GLatLng(Y,X));
	return;
}

function activateBounds() {
	var mt = map.getMapTypes();
	for (var i=0; i<mt.length; i++) {
		mt[i].getMinimumResolution = function() {return minRes;}
		mt[i].getMaximumResolution = function() {return maxRes;}
	}
	GEvent.addListener(map, "move", function() {
		checkBounds();
	});
}

//------------------------------------------------------------------------------
// Markers & overlays
//------------------------------------------------------------------------------

if (GBrowserIsCompatible()) {

	customMarker = function(point, el, options) {
		this.point = point;
		this.element = el;
		this.options = options;
		this.overlay = $(el.get('id').substring(0,el.get('id').indexOf('Marker'))+'Overlay');
		GMarker.apply(this, [point, options]);
	}
	customMarker.prototype = new GMarker(new GLatLng(0, 0));
	customMarker.prototype.initialize = function(map) {
		GMarker.prototype.initialize.call(this, map);
		if(!$('album')){
			GEvent.addListener(this, "click", function() {
				this.map = map;
				if(this.map.currentMarker) this.map.currentMarker.element.setStyle('display','none');
				this.element.setStyle('display','block');
				this.element.getFirst('.close').addEvent('click', function(event) {
					event.stop();
					this.map.currentMarker.element.setStyle('display','none');
					this.map.getContainer().set('opacity',1);
					this.map.getContainer().removeEvents('click');
					this.element.getFirst('.close').removeEvents('click');
				}.bindWithEvent(this));
				this.map.getContainer().set('opacity',.5);
				this.map.getContainer().addEvent('click', function() {
					this.map.currentMarker.element.setStyle('display','none');
					this.map.getContainer().set('opacity',1);
					this.map.getContainer().removeEvents('click');
				}.bindWithEvent(this));
				this.map.currentMarker = this;
			});
		}
	}
	
	/*
	customInfoOverlay = function(marker, element) {
		this.marker = marker;
		this.offset = this.marker.getIcon().infoWindowAnchor;
		this.element = element;
	}
	customInfoOverlay.prototype = new GOverlay();
	customInfoOverlay.prototype.initialize = function(map) {
		this.div = new Element("div", {'class':'mapInfo'});
		this.map = map;
		this.div.appendChild(this.element, 'top');
		this.map.getPane(G_MAP_FLOAT_PANE).appendChild(this.div);
		this.element.setStyle('display', 'block');
		
	}
	customInfoOverlay.prototype.remove = function() {
		this.div.parentNode.removeChild(this._div);
	}
	customInfoOverlay.prototype.hide = function() {
		this.div.setStyle('display','none');
	}
	customInfoOverlay.prototype.show = function() {
		this.div.setStyle('display','block');
	}
	customInfoOverlay.prototype.redraw = function() {
		//this.div.setStyle('top',(this.map.fromLatLngToDivPixel(this.marker.getPoint()).y - this.offset.y - this.div.getHeight()) + 'px');
		//this.div.setStyle('left',(this.map.fromLatLngToDivPixel(this.marker.getPoint()).x + this.offset.x) + 'px');
	}
	*/
	customZoomControl = function() {}
	customZoomControl.prototype = new GControl();
	customZoomControl.prototype.initialize = function(map) {
		var container = new Element("div",{'class':'mapZoom'});
		var zoomInDiv = new Element("div",{'class':'mapZoomIn', 'html':"&nbsp;"});
		container.appendChild(zoomInDiv);
		GEvent.addDomListener(zoomInDiv, "click", function() {
			map.zoomIn();
		});
		var zoomOutDiv = new Element("div",{'class':'mapZoomOut', 'html':"&nbsp;"});
		container.appendChild(zoomOutDiv);
		GEvent.addDomListener(zoomOutDiv, "click", function() {
			map.zoomOut();
		});
		map.getContainer().appendChild(container);
		return container;
	}
	customZoomControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
	}
	
}

//------------------------------------------------------------------------------
// Init
//------------------------------------------------------------------------------

function initMap(el) {
	
	if(el.get('id') && maps.indexOf(el.get('id'))==-1) {
		if (GBrowserIsCompatible()) {
			
			maps.push(el.get('id'));
			
			var mapOverlay = new Element("div",{'id':el.get('id')+'Overlay','class':'mapOverlay'});
			mapOverlay.setStyle('display','none');
			mapOverlay.inject(el, 'after');
			mapOverlay.addEvent('click', function() {
				this.setStyle('display','none');
			});
			
			el.getChildren('.mapMarker').each(function (pMarkerElement, index) {
				pMarkerElement.set('id',el.get('id')+'Marker'+index);
				pMarkerElement.inject(mapOverlay, 'after');
			}.bind(this));
			
			var map = new GMap2(el);
			map.enableContinuousZoom();
			map.enableDoubleClickZoom();
			map.setMapType(G_SATELLITE_MAP);
			map.addControl(new customZoomControl());
			
			if(el.get('rev')) {
				var coordinates = el.get('rev').match(/[0-9\.\-]+/g);
				var lat = (coordinates && !isNaN(parseFloat(coordinates[0]))) ? parseFloat(coordinates[0]) : 0;
				var lng = (coordinates && !isNaN(parseFloat(coordinates[1]))) ? parseFloat(coordinates[1]) : 0;
				if(coordinates && isNaN(parseInt(coordinates[3]))) {
					var zoom = (coordinates && !isNaN(parseInt(coordinates[2]))) ? parseInt(coordinates[2]) : defaultZoom;
				} else if(coordinates && !isNaN(parseInt(coordinates[3]))) {
					var boundNorth = parseFloat(coordinates[2]);
					var boundEast = parseFloat(coordinates[3]);
					var boundSouth = parseFloat(coordinates[4]);
					var boundWest = parseFloat(coordinates[5]);
					var bounds = new GLatLngBounds(new GLatLng(boundSouth, boundWest),new GLatLng(boundNorth, boundEast));
					var zoom = map.getBoundsZoomLevel(bounds);
				}
				map.setCenter(new GLatLng(lat,lng), zoom);
			} else {
				defaultSW = new GLatLng(41.3646279, -5.1415925);
				defaultNE = new GLatLng(51.0887708, 9.5598311);
				defaultCenter = new GLatLng(defaultSW.lat()+(defaultNE.lat()-defaultSW.lat())/2, defaultSW.lng()+(defaultNE.lng()-defaultSW.lng())/2);
				allowedBounds = new GLatLngBounds(defaultSW,defaultNE);
				map.setCenter(defaultCenter, defaultZoom);
			}
			
			window.addEvent("unload",GUnload);
			
			$$('.mapMarker[id^="'+el.get('id')+'"]').each(function (pMarkerElement, index) {
				if(pMarkerElement.get('rev')) {
					
					var markerIcon = new GIcon(G_DEFAULT_ICON);
					if(!$('album')){
						markerIcon.iconSize = new GSize(60, 60);
						markerIcon.iconAnchor = new GPoint(30, 30);
						markerIcon.infoWindowAnchor = new GPoint(60, 0);
						markerIcon.shadowSize = new GSize(60, 60);
					} else {
						markerIcon.iconSize = new GSize(17, 11);
						markerIcon.iconAnchor = new GPoint(8, 5);
						markerIcon.infoWindowAnchor = new GPoint(17, 0);
						markerIcon.shadowSize = new GSize(17, 11);
					}
					var markerImage = pMarkerElement.getFirst('.mapMarkerImage');
					markerIcon.image = markerImage ? markerImage.get('src') : '';
					markerIcon.shadow = "/css/default/images/clear.gif";
					markerOptions = {icon:markerIcon};
					markerImage.destroy();
					var coordinates = pMarkerElement.get('rev').match(/[0-9\.\-]+/g);
					var lat = (coordinates && !isNaN(parseFloat(coordinates[0]))) ? parseFloat(coordinates[0]) : 0;
					var lng = (coordinates && !isNaN(parseFloat(coordinates[1]))) ? parseFloat(coordinates[1]) : 0;
					var point = new GLatLng(lat,lng);
					map.addOverlay(new customMarker(point, pMarkerElement, markerOptions));
					pMarkerElement.setStyle('display','none');
				}
			}.bind(this));
			
			$$('map[id^="gmimap"]').each(function (pElement, index) {
				if(area = pElement.getFirst('area')) {
					area.set('coords','0,0,60,60');
					area.set('shape','rect');
				}
			}.bind(this));
		}
	}
	
}
window.addEvent('load', function() {
	$$('.mapCanvas').each(function(el, index) {if(index==0) {initMap(el)};});
	$$('.mapMarker').each(function(el, index) {el.setStyle('display', 'none')});
});

