Event.observe( window, 'load', init );
Event.observe( window, 'unload', unload );

var map = null;
var manager = [];
var mapDimensions = new GLatLngBounds( new GLatLng(47,6), new GLatLng(55,15) );
var minZoom = 7;
var maxZoom = 17;
var currentPosition = 0;
var startMarker;
var currentStartPosition = 0;
var imageToggleResults = "typo3conf/ext/mms_automat_search/res/toggle.gif";
var imageToggleResultsEnlarge = "typo3conf/ext/mms_automat_search/res/toggle_enlarge.gif";
var iconStartFilename = "typo3conf/ext/mms_automat_search/res/start.gif";
var iconStart;
var iconFilenames = new Array(	"typo3conf/ext/mms_automat_search/res/icon0.gif",
			"typo3conf/ext/mms_automat_search/res/icon1.gif",
			"typo3conf/ext/mms_automat_search/res/icon2.gif",
			"typo3conf/ext/mms_automat_search/res/icon3.gif",
			"typo3conf/ext/mms_automat_search/res/icon4.gif" );

var iconClass = new Array(	"icon0",
			"icon1",
			"icon2",
			"icon3",
			"icon4" );
var icons = $A();
var placeModified = false;
//alert('functions.js line 30 URI change before delivery');
var uri = '/index.php?eID=tx_mmsautomatsearch_pi1';
var selectedCity = geoip_city();
var selectedType = 0;
var selectedMark = 0;
var isAlreadyToggling = false;
var isMarkerClicked = false;
var searchInProgress = false;

	
function init()
{
	var isType = $('automatTypeButton');
	Event.observe( 'placeSearchButton', 'click',  startPlaceSearch );
	Event.observe( 'markSearchButton', 	'click',  startMarkSearch );
	
	if (isType) Event.observe( 'automatTypeButton', 'click',  startAutomatTypeSearch );
	if (isType) Event.observe( 'automatType', 		'change', updateMarks );

	$('automatSearch').onsubmit = function(){ startPlaceSearch();return false; }
	$('automatSearch').selectedIndex=1;

	$('place').value=geoip_city();
//	$('place').value=selectedCity;
	if (isType) $('automatTypeButton').hide();
	$('markSearchButton').hide();
	
	if (GBrowserIsCompatible()) 
	{
		
		map = new GMap( $("map") );
		map.centerAndZoom( new GPoint( geoip_longitude(), geoip_latitude() ), 5 );
		map.enableScrollWheelZoom();
//		map.centerAndZoom( new GPoint( longitude, latitude ), 5 );
		currentPosition = map.getCenter();
		map.addControl( new GMapTypeControl() );
		map.addControl( new GLargeMapControl() );
		map.addControl( new ResultToggleControl() );
	
		var maptype = map.getMapTypes();
	      	for (var i=0; i<maptype.length; i++) 
	      	{
			maptype[i].getMinimumResolution = function() {return minZoom;}
			maptype[i].getMaximumResolution = function() {return maxZoom;}
		}

		GEvent.addListener( map, "move", checkPosition );
		GEvent.addListener( map, "infowindowclose", function(){isMarkerClicked=false;} );
		GEvent.addListener( map, "infowindowopen", function(){isMarkerClicked=true;} );
		Event.observe( $('place'), 'change', function(){placeModified=true;} );
	};
	
	initIcons();
	initSizes();
                updateMarks();
}


function unload()
{
	GUnload();
}

function initIcons()
{
	icons.push( new GIcon() );
	icons[0].image = iconFilenames[0];
	icons[0].iconSize = new GSize(12, 20);
	icons[0].iconAnchor = new GPoint(6, 20);
	icons[0].infoWindowAnchor = new GPoint(5, 1);
	
	icons.push( new GIcon( icons[0] ));
	icons[1].image = iconFilenames[1];
	
	icons.push( new GIcon( icons[0] ));
	icons[2].image = iconFilenames[2];
	
	icons.push( new GIcon( icons[0] ));
	icons[3].image = iconFilenames[3];
	
	icons.push( new GIcon( icons[0] ));
	icons[4].image = iconFilenames[4];

	iconStart = new GIcon( icons[0] );
	iconStart.image = iconStartFilename;
}

function initSizes()
{
	$('map').style.width = "573px";
	$('results').style.width = "0px";
	map.checkResize();
}
	
function startPlaceSearch()
{
	searchInProgress = true;
	selectedCity = $F('place');
	selectedMark = $F('mark');
	selectedType = $F('automatType');
	var geocoder = new GClientGeocoder();
	var address = "Deutschland, " + selectedCity;

	geocoder.getLatLng( address, updateLocation );
	searchInProgress = false;
}

function startMarkSearch()
{
	if (placeModified)
	{
		startPlaceSearch();
		return;
	}
	selectedMark = $F('mark');
	selectedType = $F('automatType');
	map.clearOverlays();
	updateMarker();
}

function startAutomatTypeSearch()
{
	if (placeModified)
	{
		startPlaceSearch();
		return;
	}
	selectedMark = $F('mark');
	selectedType = $F('automatType');
	map.clearOverlays();
	updateMarker();
}

function updateMarks()
{
	if ($F('automatType') == 0)
	{
                $('mark').selectedIndex = 0;
		$('markLine').hide();
		$('mark').hide();
	}
	else
	{
		var current_pos = map.getCenter();
		var params = $H( {"cmd":"refresh", "list":($F('automatType') == 1 ? "marks" : "eloader"), "automattype":$F('automatType')} );

		$('labelMark').innerHTML = ($F('automatType') == 1 ? "Marke:" : "Karte:");
		
		new Ajax.Request( uri, {method:"get", parameters:params, onSuccess:function(response)
		{
			var data = response.responseText;
			var fields = data.split("\n");
			
			debug( data );

			$('mark').innerHTML = "";

			fields.each( function(field)
				{
					field_parts = field.split('|');
					$('mark').options[ $('mark').options.length ] = new Option( field_parts[1], field_parts[0], false, false );
				});

			$('markLine').show();
			$('mark').show();

			map.checkResize();
		}} ); 

	}
}

function updateLocation(point)
{
	if (!point)
	{
		alert( selectedCity + " wurde leider nicht gefunden.");
		return;
	}

	map.clearOverlays();

	if ($('automatTypeButton')) $('automatTypeButton').show();
	$('markSearchButton').show();
	placeModified = false;

	currentStartPosition = currentPosition = point;
        renewStartMarker();

        updateMarker();
}

function checkPosition()
{
	if (mapDimensions.contains( map.getCenter() )) {
		return;
	}
        
	var current = map.getCenter();
	var lng = current.lng();
	var lat = current.lat();

	var aMaxX = mapDimensions.getNorthEast().lng();
	var aMaxY = mapDimensions.getNorthEast().lat();
	var aMinX = mapDimensions.getSouthWest().lng();
	var aMinY = mapDimensions.getSouthWest().lat();

	if (lng < aMinX) {lng = aMinX;}
	if (lng > aMaxX) {lng = aMaxX;}
	if (lat < aMinY) {lat = aMinY;}
	if (lat > aMaxY) {lat = aMaxY;}
        
	map.setCenter( new GLatLng(lat,lng) );
	
}

function updateMarker()
{
	if (isMarkerClicked) return;

	$('loadingInfo').show();
	var params = $H( { "cmd":"update", "lat":currentStartPosition.lat(), "lng":currentStartPosition.lng(), "zoom":map.getZoom(), "automattype":selectedType, "mark":selectedMark } );
	new Ajax.Request( uri, {method:"get", parameters:params, onSuccess:function(resp){if (startMarker) {processMarkerData(resp);}}} ); 
} 

function processMarkerData( response )
{
	var data = response.responseText;
	var index = 0;
	clearMarkers();
	clearSearchResults();

	debug(data);

	renewStartMarker();

	lines = data.split("\n");

	if (!data || lines.length == 0)
	{
		showNoSearchResults();
		$('loadingInfo').hide();
		return;
	}

	if (data.substring(0,2)=='!|')
	{
		showNoAccess(data.substring( 2, data.length ));
		$('loadingInfo').hide();
		return;
	}

	var bounds = new GLatLngBounds();
	lines.each(
		function(item)
		{
			automatParts = item.split( "|" );
			var marker_point = new GLatLng( automatParts[1], automatParts[2] );
			var marker_icon = automatParts[6]=='1' && automatParts[7]!='1' ? icons[0] : icons[automatParts[6]];
			var marker = placeMarker( marker_point, marker_icon, automatParts[0] );

			bounds.extend( marker_point );
			manager[index]= marker;
			addSearchResult( automatParts, index++ );
		}
	);
	
	bounds.extend( startMarker.getPoint() );

	map.setZoom( map.getBoundsZoomLevel( bounds ) );
                map.setCenter( bounds.getCenter() );
                currentPosition = map.getCenter();

	$('loadingInfo').hide();
        showResults();
}

function placeMarker( point, icon, id ) 
{
	var marker = new GMarker( point, {icon:icon} );
	GEvent.addListener( marker, "click", function()
		{
			onMarkerClick(marker, id);
		} 
	);
	
	map.addOverlay(marker);
	
	return marker;
}

function placeStartMarker()
{
                var point = currentStartPosition;
                var marker = new GMarker( point, {icon:iconStart, draggable: true} );

                GEvent.addListener(marker, "dragstart", function() {  map.closeInfoWindow();  });
                GEvent.addListener(marker, "dragend", function() {  
			currentStartPosition = currentPosition = marker.getPoint(); 
			map.panTo( currentPosition ); 
			selectedMark = $F('mark');
			selectedType = $F('automatType');
			updateMarker(); });

	map.addOverlay(marker);
	return marker;

}

function renewStartMarker()
{
	var position = currentStartPosition;
	
	if (startMarker) map.removeOverlay(startMarker);
	startMarker = placeStartMarker( position );
}

function onMarkerClick(marker, id)
{
	var point = marker.getPoint();
	var params = $H( { "cmd":"detail", "id":id } );

	new Ajax.Request( uri, {parameters:params, method:"get", onSuccess:function(response) 
	{
		var data = response.responseText;
		//alert(data);
		var automatParts = data.split( "|" );

		debug(data);

		var tabs = [
		new GInfoWindowTab( automatParts[0], automatParts[1].replace(/DEST_ADDR/g, currentPosition.toUrlValue()) ),  
		new GInfoWindowTab( automatParts[2], automatParts[3]),
		new GInfoWindowTab( automatParts[4], automatParts[5])
		];

		if (automatParts.length > 6)
			tabs.push( new GInfoWindowTab( automatParts[6], automatParts[7] ));

		hideResults();
		isMarkerClicked = true;
		marker.openInfoWindowTabsHtml( tabs );
	}
	});
}

function onSearchClick(index, id)
{
	onMarkerClick( manager[index], id );
}

function clearMarkers()
{
	
	for (var i=0,length=manager.length; i<length; i++)
	{
		map.removeOverlay( manager[i] );
	}
	
	manager = null;
	manager = [];
}

function clearSearchResults()
{
	$('resultList').update('');
}

function addSearchResult( automatParts, index )
{
	var img_icon = automatParts[6]=='1' && automatParts[7]!='1' ? iconFilenames[0] : iconFilenames[ automatParts[6] ];
	var img_class = automatParts[6]=='1' && automatParts[7]!='1' ? iconClass[0] : iconClass[ automatParts[6] ];

	var result_row = '<div class="resultLine"><a href="javascript:onSearchClick(' + index + ', \'' + automatParts[0] + '\')" class="' + img_class + '">' + automatParts[3] + ',<br />' + automatParts[4] + ' ' + automatParts[5] + '</a></div>';

	if (automatParts[8])
	{
		result_row += '<div class="locationLine">' + automatParts[8] + '</div>';
	}
	
	new Insertion.Bottom( 'resultList', result_row );
}

function showNoSearchResults()
{
	$('resultList').update('<div class="resultLine" style="white-space:normal;">Diese Ansicht enthält keine Automaten.</div>');
}

function showNoAccess(message)
{
	$('resultList').update('<div class="resultLine" style="white-space:normal;">' + message + '</div>');
}

function toggleResults()
{
	if (isAlreadyToggling)
		return;
	
	isAlreadyToggling = true;
		
	var map_scale = 68;
	var result_scale = 17500;
                var mapPoint = currentPosition;

	if ($('map').getWidth() < 400)
	{
		map_scale = 147;
		result_scale = 0;
		$('toggleImage').src = imageToggleResultsEnlarge;
	}
	else
	{
		$('results').style.width = '1px';
		$('toggleImage').src = imageToggleResults;
	}

	new Effect.Parallel(
    [
		new Effect.Scale('map', map_scale, {scaleContent:false, scaleY:false, scaleFrom:100, sync:true, beforeStart:function(){mapPoint = currentPosition;}, afterFinish:function(){isAlreadyToggling=false;map.checkResize(); if (!isMarkerClicked) map.setCenter(mapPoint);}} ), 
		new Effect.Scale('results', result_scale, {scaleContent:false, scaleY:false, scaleFrom:100, sync:true} )
    ] );
}

function showResults()
{
	if ($('map').getWidth() >= 400)
		toggleResults();
}

function hideResults()
{
	if ($('map').getWidth() < 400)
		toggleResults();
}

function ResultToggleControl() {}

ResultToggleControl.prototype = new GControl();

ResultToggleControl.prototype.initialize = function(map) 
{
	var container = document.createElement("div");
	container.innerHTML = '<a href="javascript:toggleResults()" title="Suchergebnisse ein-/ausblenden"><img id="toggleImage" src="' + imageToggleResultsEnlarge + '" alt="" style="border:0px" /></a>'
	map.getContainer().appendChild(container);
	return container;
}

ResultToggleControl.prototype.getDefaultPosition = function() 
{
	return new GControlPosition( G_ANCHOR_TOP_RIGHT, new GSize(7, 33));
}

function debug(data)
{
//	$('debug').update( data );
}

