var map;
var mapBound;
var mapCrosshair;
var mapIcons = {};

var mapZoomControl;

function mapInit(args) {
	if (GBrowserIsCompatible()) {
		map = new GMap2(eleId("map-canvas"));
		map.setCenter(new GLatLng(0, 0), 1);
        map.addControl(new GMapTypeControl());
		map.enableScrollWheelZoom();
		
		// Zoomcontrol
		mapZoomControl = new MapZoomControl();
		map.addControl(mapZoomControl);
	}
}

function mapToLatLng(lat, lng, lvl) {
	lvl = (lvl ? lvl : map.getZoom());
	map.setCenter(new GLatLng(parseFloat(lat), parseFloat(lng)), parseInt(lvl));
}

function mapUpdateBound() {
	mapBound = map.getBounds();
	mapBound.coord = {
		"swlat": mapBound.getSouthWest().lat(), 
		"swlng": mapBound.getSouthWest().lng(), 
		"nelat": mapBound.getNorthEast().lat(), 
		"nelng": mapBound.getNorthEast().lng()
	}
}
function mapAddCrosshair() {
	if (map && !mapCrosshair) {
		iconCrosshair = new GIcon();
		iconCrosshair.image = "/images/icon/crosshair.gif";
		iconCrosshair.iconSize = new GSize(13, 13);
		iconCrosshair.iconAnchor = new GPoint(5, 5);
		iconCrosshair.infoWindowAnchor = new GPoint(5, 0);
		
		mapCrosshair = new GMarker(map.getCenter(), {icon: iconCrosshair, clickable: false});
        map.addOverlay(mapCrosshair); 
	
		GEvent.addListener(map, "drag", function() {
			mapCrosshair.setPoint(map.getCenter());	//keep center mark in center
		});
		
		GEvent.addListener(map, "moveend", function() {
			mapCrosshair.setPoint(map.getCenter());	//keep center mark in center
		});
	}
}

/* BoundControl */
function BoundControl(padding) {
	this._padding = padding;
}
BoundControl.prototype.getSw = function(map) {
	return this._get('sw', map);
}
BoundControl.prototype.getNe = function(map) {
	return this._get('ne', map);
}
BoundControl.prototype._get = function(get, map) {
	var bound = map.getBounds();
	
	if (get == 'sw') {
		var sw = map.fromLatLngToContainerPixel(bound.getSouthWest());
		return map.fromContainerPixelToLatLng( new GPoint(sw.x - this._padding, sw.y + this._padding) );
	} else {
		var ne = map.fromLatLngToContainerPixel(bound.getNorthEast());
		return map.fromContainerPixelToLatLng( new GPoint(ne.x + this._padding, ne.y - this._padding) );
	}
}

/* MapZoomControl */
function MapZoomControl() {}
MapZoomControl.prototype = new GControl();
MapZoomControl.prototype.initialize = function(map) {
	this._updateZoomMinMax(map);
	
	var container = doc.createElement("div");
	container.id = 'gm-zoom';
	
	// Zoom in
	container.innerHTML += "<div id=\"gm-zoomin\"></div>";
	
	// Ladder
	var ladderHTML = '<div id="gm-ladder"><div id=\"gm-ladder-top\"></div><div id=\"gm-ladder-steps\">';
	ladderHTML += '</div><div id=\"gm-ladder-bottom\"></div>';
	ladderHTML += '<div id=\"gm-ladder-level\"></div></div>';
	container.innerHTML += ladderHTML;
	
	// Zoom out
	container.innerHTML += "<div id=\"gm-zoomout\"></div>";
	
	// Container aan de map toevoegen
	map.getContainer().appendChild(container);
	
	// PNG bestanden laden
	addTransparentPng(false, 'gm-zoomin', 'http://static.2k2fotografie.nl/images/icon/mapzoom-in.png');
	addTransparentPng(false, 'gm-zoomout', 'http://static.2k2fotografie.nl/images/icon/mapzoom-out.png');
	addTransparentPng(false, 'gm-ladder-top', 'http://static.2k2fotografie.nl/images/icon/mapzoom-ladder-top.png');
	addTransparentPng(false, 'gm-ladder-bottom', 'http://static.2k2fotografie.nl/images/icon/mapzoom-ladder-bottom.png');
	addTransparentPng(false, 'gm-ladder-level', 'http://static.2k2fotografie.nl/images/icon/mapzoom-ladder-level.png');
	
	// Events voor in en uitzoomen
	GEvent.addDomListener(eleId('gm-zoomin'), "click", function() {
		map.zoomIn();
	});
	GEvent.addDomListener(eleId('gm-zoomout'), "click", function() {
		map.zoomOut();
	});
	
	this.redrawLadder(map);
	mapZoomControl.updateLadder(map);
	
	GEvent.addListener(map, "zoomend", function() {	
		mapZoomControl.updateLadder(map);
	});
	
	GEvent.addListener(map, "maptypechanged", function() {
		mapZoomControl.redrawLadder(map);
	});
	
	return container;
}
MapZoomControl.prototype._updateZoomMinMax = function(map) {
	this.zoomMax = map.getCurrentMapType().getMaximumResolution();
	this.zoomMin = map.getCurrentMapType().getMinimumResolution();
}
MapZoomControl.prototype.redrawLadder = function(map) {
	this._updateZoomMinMax(map);
	
	var ladderHtml = '';
	for (var zoomLvl = this.zoomMax; zoomLvl >= this.zoomMin; zoomLvl--) {
		ladderHtml += '<div id="gm-ladder-'+zoomLvl+'"></div>';
	}
	eleId('gm-ladder-steps').innerHTML = ladderHtml;
	
	for (var zoomLvl = this.zoomMax; zoomLvl >= this.zoomMin; zoomLvl--) {
		addTransparentPng(false, 'gm-ladder-'+zoomLvl, '/images/icon/mapzoom-ladder-step.png');
		
		GEvent.addDomListener(eleId('gm-ladder-'+zoomLvl), "click", function() {
			var lvl = this.id.replace('gm-ladder-', '');
			lvl = parseInt(lvl);
			
			map.setZoom(lvl);
			mapZoomControl.updateLadder(map);
		});
	}
	
	this.updateLadder(map);
}	
MapZoomControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(14, 14));
}
MapZoomControl.prototype.updateLadder = function(map) {
	var styleTop = ( ((this.zoomMax - map.getZoom()) * 7) + 5);
	eleId('gm-ladder-level').style.top = styleTop+'px';
}