var settings;
var GloadedStatus;
var mapObject;
var markerObjects = new Object();
var markers = new Object();
var gdir;

function initializeMap( mapContainer, settingsParam )
{
	settings = settingsParam;
	GloadedStatus = window.setInterval( _isMapLoaded, 200 );
}

function toggleMap()
{
	Effect.toggle( mapContainer, 'blind', { duration: 1.0, onFinish:mapResized } );
}

function mapResized()
{
	if( mapContainer.style.display == '' )
	{
		mapObject.checkResize();
	}
}

function toggleDirections( control )
{
	var directionsContainer = document.getElementById('directions');
	Effect.toggle( directionsContainer, 'blind', { duration: 0.3 } );

	if( control.src )
	{
		if( directionsContainer.style.display == 'none' )
		{

			control.src = '/images/up.gif';
		}
		else
		{
			control.src = '/images/down.gif';
		}
	}
}

function fetchMarkers( num )
{
	mapObject.setCenter( new GLatLng( settings.center.lat, settings.center.lng ), settings.zoomlevel );

	var fetchNum = '';
	if( num > 0 )
	{
		fetchNum = '&fetchNum=' + num;
	}
	new Ajax.Request( settings.marker.source + fetchNum , {
			onSuccess: settings.marker.onFetchSuccess,
			onLoaded: function() {
				if( mapContainer.style.display == 'none' ) {
					settings.marker.onFetchFinish();
				}
			}
	});
}

function zoomMap( entryId, zoom )
{
	if( mapContainer.style.display == 'none' )
	{
		mapContainer.style.display = '';
	}

	mapObject.setCenter( markers[entryId].getLatLng(), zoom );
	markers[entryId].openInfoWindowHtml( markers[entryId].infoHtml );
}

function _isMapLoaded()
{
	try
	{
		mapContainer = document.getElementById('mapContainer');
		mapObject = new GMap2( mapContainer );
	}
	catch( e )
	{
		return false;
	}

	window.clearInterval( GloadedStatus );
	_loadMap();
}

function _createListener( marker, text, event ) {
	GEvent.addListener( marker, event, function()
	{
		marker.openInfoWindowHtml( text );
	});
}

function _wheelEvent(e)
{
	if (!e) e = window.event;
	if (e.preventDefault) e.preventDefault();
	e.returnValue = false;
}

function _loadMap()
{
	if( settings.directionsControl )
	{
		gdir = new GDirections( mapObject );

		function directionControl() {}

		directionControl.prototype = new GControl();

		directionControl.prototype.initialize = function( map )
		{
			var container = document.createElement('div');
			container.style.background = '#FFFFFF';
			container.style.borderBottom = '1px solid #979797';
			container.style.padding = '5px';
			container.style.width = '393px';
			container.style.opacity = '0.9';

			container.innerHTML = '<h6 style="float: left;">Routenplaner</h6><div style="float: right;"><img id="closeButton" src="/images/' + ( settings.directionsControl == 'visible' ? 'up' : 'down' ) + '.gif" border="0" onclick="toggleDirections(this);" style="cursor: pointer;"/></div><div style="clear: left;"></div>'
			+ '<div id="directions" style="display:' + ( settings.directionsControl == 'visible' ? 'block' : 'none' ) + ';">'
			+ '<br/><div style="float: left; width: 120px;"><b>Zieladresse</b><br/> ' + settings.center.address + '</div>'
			+ '<div style="background: #979797; float: left; width: 1px; height: 80px; margin-left: 5px; margin-right: 5px;"></div>'
			+ '<div style="float: left; width: 260px;"><b>Ihre Startadresse</b><br/><textarea style="border: 1px solid #979797; width: 260px;" id="address"></textarea><br/> <input type="submit" onclick="calcRoute(document.getElementById(\'address\').value); return false;" value="Route berechnen" style="border: 1px solid #333333;" /></div><div style="clear: left;"></div>'
			+ '</div>';

			map.getContainer().appendChild( container );
			return container;
		}

		directionControl.prototype.getDefaultPosition = function()
		{
			return new GControlPosition( G_ANCHOR_TOP_LEFT, new GSize(0, 0) );
		}

		directionControl.prototype.setButtonStyle = function(button)
		{

		}

		mapObject.addControl( new directionControl() );
	}

	GEvent.addDomListener( mapContainer , "DOMMouseScroll", _wheelEvent);
	mapContainer.onmousewheel = _wheelEvent;

	if( settings.mapControl )
	{
			mapObject.addControl( new GSmallZoomControl() );
			mapObject.addControl( new GMapTypeControl() );
	}

	if ( settings.overview )
	{
		mapObject.addControl( new GOverviewMapControl() );
	}

	mapObject.enableScrollWheelZoom();
	mapObject.enableContinuousZoom();

	for( var i=0; i<settings.marker.markerImages.length; i++ )
	{
		var marker = settings.marker.markerImages[i];

		markerObjects[i]		= new GIcon();
		markerObjects[i].image		= marker.image;
		markerObjects[i].iconSize	= new GSize( marker.size[0], marker.size[1] );
		markerObjects[i].iconAnchor	= new GPoint( marker.anchor[0], marker.anchor[1] );

		if( settings.marker.infoWindowAnchor )
		{
			markerObjects[i].infoWindowAnchor = new GPoint( settings.marker.infoWindowAnchor[0], settings.marker.infoWindowAnchor[1] );
		}

		if( settings.marker.markerImages[i].shadow )
		{
			markerObjects[i].shadow 		= marker.shadow;
			markerObjects[i].shadowSize	 	= new GSize( marker.shadowSize[0], marker.shadowSize[1] );
			//markerObjects[i].infoShadowAnchor 	= new GPoint( settings.marker.shadowAnchor.x, settings.marker.shadowAnchor.y );
		}
	}

	if( settings.marker.sourceType == 'ajax' )
	{
		fetchMarkers();
		window.onload = toggleMap;
	}
	else
	{
		if( settings.center.lat > 0 && settings.center.lng > 0 )
		{
			var geoObject = new GLatLng( settings.center.lat, settings.center.lng );

			mapObject.setCenter( geoObject , settings.zoomlevel );
			mapObject.addOverlay( new GMarker( geoObject, markerObjects[0] ) );
		}
		else
		{
			var geoCoder = new GClientGeocoder();
			geoCoder.getLatLng( settings.center.address,
				function( geoObject )
				{
					mapObject.setCenter( geoObject , settings.zoomlevel );
					mapObject.addOverlay( new GMarker( geoObject, markerObjects[0] ) );
				}
			);
		}


	}

	window.onunload = GUnload;
}

function _priorityOrder( marker,b )
{
	return GOverlay.getZIndex( marker.getPoint().lat() ) + marker.importance*1000000;
}

function calcRoute( address )
{
	gdir.clear();
	gdir.load("from: " + settings.center.address + " to: " + address,
                { "locale": "de_DE" });

}