var map, bounds;

function makeIcon( image ) {
	var icon = new GIcon();
	icon.image = image;
	icon.iconSize = new GSize( 30, 30 );
	icon.iconAnchor = new GPoint( 15, 15 );
	icon.infoWindowAnchor = new GPoint( 15, 1 );
	return icon;
	}



// places marker according to geocoded address
function geocodeMarker( address, info, iconfile, title, rangeKM ) {
	var geocoder = new GClientGeocoder();
	if ( geocoder ) {
		geocoder.getLatLng( address,
			function( point ) {

				if ( !point ) {
					alert( address + " kunne ikke findes" );
					}
				else {

					bounds.extend( point );

					// no filename, use standard icon
					if( ! iconfile ) {
						var marker = new GMarker( point, {title:title} );
					}

					// filename is just a path, use standard icon
					else if( String( iconfile ).substr( String( iconfile ).length - 1, 1 ) == "/" ) {
						var marker = new GMarker( point, {title:title} );
					}

					// real filename, use custom icon
					else {
						var icon = makeIcon( iconfile );
						var marker = new GMarker( point, {icon:icon, title:title} );

						map.addOverlay( marker );
						GEvent.addListener( marker, "click",
							function() {
								marker.openInfoWindowHtml( show_info );
								}
							);

						place_database_markers( point.lat(), point.lng(), rangeKM );

						}
					}
				}
			);
		}
	}



// places marker according to coordinates
function placeMarker( latitude, longitude, info, iconfile, title, openmarker ) {

	var point = new GLatLng( parseFloat( latitude.replace( ',', '.' ) ), parseFloat( longitude.replace( ',', '.' ) ) );

	bounds.extend( point );

	// no filename, use standard icon
	if( !iconfile ) {
		var marker = new GMarker( point, {title:title} );
		}

	// filename is just a path, use standard icon
	else if( String( iconfile ).substr( String( iconfile ).length - 1, 1 ) == "/" ) {
		var marker = new GMarker( point, {title:title} );
		}

	// real filename, use custom icon
	else {
		var icon = makeIcon( iconfile );
		var marker = new GMarker( point, {icon:icon, title:title} );
		}

	map.addOverlay( marker );

	GEvent.addListener( marker, "click",
		function() {
			marker.openInfoWindowHtml( info );
			}
		);

	// open marker automatically
	if( openmarker == "true" ) { marker.openInfoWindowHtml( info ); }

	}



function place_out_of_range_markers() {
	while ( out_of_range_markers.length > 0 ) {
		openmarker = out_of_range_markers.pop();
		geocode = out_of_range_markers.pop();
		latitude = out_of_range_markers.pop();
		longitude = out_of_range_markers.pop();
		address = out_of_range_markers.pop();
		info = out_of_range_markers.pop();
		iconfile = out_of_range_markers.pop();
		title = out_of_range_markers.pop();
			placeMarker( latitude, longitude, info, iconfile, title, openmarker );
		}
	}



// by Chris Veness
// http://www.movable-type.co.uk/scripts/latlong.html
Number.prototype.toRad = function() {  // convert degrees to radians
  return this * Math.PI / 180;
}


var database_markers = [];
var out_of_range_markers = [];

function place_database_markers( show_address_latitude, show_address_longitude, rangeKM ) {

	var openmarker, geocode, latitude, longitude, address, info, iconfile, title;
	var lat2, lng2;

	// loop through database_markers
	while ( database_markers.length > 0 ) {
		openmarker = database_markers.pop();
		geocode = database_markers.pop();
		latitude = database_markers.pop();
		longitude = database_markers.pop();
		address = database_markers.pop();
		info = database_markers.pop();
		iconfile = database_markers.pop();
		title = database_markers.pop();

		lat1 = Number( show_address_latitude );
		lon1 = Number( show_address_longitude );
		lat2 = Number( latitude.replace( ",", "." ) );
		lon2 = Number( longitude.replace( ",", "." ) );

		// haversine formula to calculate distance between two coordiantes
		// by Chris Veness
		// http://www.movable-type.co.uk/scripts/latlong.html
		var R = 6371; // earth mean radius (km)
		var dLat = ( lat2 - lat1 ).toRad();
		var dLon = ( lon2 - lon1 ).toRad(); 
		var a = Math.sin( dLat / 2 ) * Math.sin( dLat / 2 ) +
				Math.cos( lat1.toRad() ) * Math.cos( lat2.toRad() ) * 
				Math.sin( dLon / 2 ) * Math.sin( dLon / 2 ); 
		var c = 2 * Math.atan2( Math.sqrt( a ), Math.sqrt( 1 - a ) ); 
		var d = R * c;
		// end

		var distance = parseInt( d );

		if( distance < rangeKM ) { 
			placeMarker( latitude, longitude, info, iconfile, title, openmarker );
			}

		else {
			out_of_range_markers.push( title );
			out_of_range_markers.push( iconfile );
			out_of_range_markers.push( info );
			out_of_range_markers.push( address );
			out_of_range_markers.push( longitude );
			out_of_range_markers.push( latitude );
			out_of_range_markers.push( geocode );
			out_of_range_markers.push( openmarker );
			}

		}

	// when all markers have been measured, center/zoom and then place notinrange-markers
	map.setZoom( map.getBoundsZoomLevel( bounds ) );
	map.setCenter( bounds.getCenter() );
	GEvent.addListener( map, 'moveend', place_out_of_range_markers );
	}



// initialize map and place markers
function gmap_initialize( markers, rangeKM ) {

	var openmarker, geocode, latitude, longitude, address, info, iconfile, title;

	var geocodeUsed;

	bounds = new GLatLngBounds();

	if ( GBrowserIsCompatible() ) {
		map = new GMap2( document.getElementById( "gmd_canvas" ) );
		map.setCenter( new GLatLng( 56.26392, 9.501785 ), 6 ); // nice map of Denmark
		map.addControl( new GLargeMapControl() );
		map.addControl( new GMapTypeControl() );

		var show_address;		
		var show_info;
		if( markers ) {
			markers.reverse();

			// loop through markers
			while ( markers.length > 0 ) {
				openmarker = markers.pop();
				geocode = markers.pop();
				latitude = markers.pop();
				longitude = markers.pop();
				address = markers.pop();
				info = markers.pop();
				iconfile = markers.pop();
				title = markers.pop();

				// geocode address?
				if( geocode == "true" ) {
					show_address = address;
					show_info = info;
					geocodeMarker( address, info, iconfile, title, rangeKM );
					geocodeUsed = true;
					}

				else {
					database_markers.push( title );
					database_markers.push( iconfile );
					database_markers.push( info );
					database_markers.push( address );
					database_markers.push( longitude );
					database_markers.push( latitude );
					database_markers.push( geocode );
					database_markers.push( openmarker );
					}

				}

			}

		if( ! geocodeUsed ) {

			// loop through database_markers
			var markers_placed = false;
			while ( database_markers.length > 0 ) {
				openmarker = database_markers.pop();
				geocode = database_markers.pop();
				latitude = database_markers.pop();
				longitude = database_markers.pop();
				address = database_markers.pop();
				info = database_markers.pop();
				iconfile = database_markers.pop();
				title = database_markers.pop();

				if( latitude && longitude ) {
					placeMarker( latitude, longitude, info, iconfile, title, openmarker );
					markers_placed = true;
					}

				}

			if( markers_placed ) {
				map.setZoom( map.getBoundsZoomLevel( bounds ) );
				map.setCenter( bounds.getCenter() );
				}

			}

		}

	}



// deletes show_address form fields
function delete_address() {
	document.getElementById( "gmg2mn_street" ).value = '';
	document.getElementById( "gmg2mn_street_no" ).value = '';
	document.getElementById( "gmg2mn_zip" ).value = '';
	document.getElementById( "gmg2mn_city" ).value = '';
	}



