var geocoder;
var search_info;

function init_coder( )
{
	search_info = new Array( );

	search_info[ 'fr' ] = new Array( );
	search_info[ 'to' ] = new Array( );

	search_info[ 'fr' ][ 'id' ] = -1;
	search_info[ 'to' ][ 'id' ] = -1;

	geocoder = new google.maps.Geocoder( );
}

function dist( lat1, lon1, lat2, lon2 )
{
	var R = 6371; // km
	var dLat = (lat2-lat1)*Math.PI/180;
	var dLon = (lon2-lon1)*Math.PI/180; 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1*Math.PI/180) * Math.cos(lat2*Math.PI/180) * Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;

	return d;
}

function update_dist( )
{
	if( document.getElementById( 'suggested_comp_cont' ) ) {
		var fr = document.getElementById( 'select_fr' );
		var to = document.getElementById( 'select_to' );

		if( -1 != fr.selectedIndex && -1 != to.selectedIndex ) {
			var fr_comp = fr[ fr.selectedIndex ].value.split( ';' );
			var to_comp = to[ to.selectedIndex ].value.split( ';' );

			// Just take the center
			var fr_lat = ( parseFloat( fr_comp[ 0 ] ) + parseFloat( fr_comp[ 1 ] ) ) / 2;
			var fr_lng = ( parseFloat( fr_comp[ 2 ] ) + parseFloat( fr_comp[ 3 ] ) ) / 2;

			// Just take the center
			var to_lat = ( parseFloat( to_comp[ 0 ] ) + parseFloat( to_comp[ 1 ] ) ) / 2;
			var to_lng = ( parseFloat( to_comp[ 2 ] ) + parseFloat( to_comp[ 3 ] ) ) / 2;

			var d = dist( fr_lat, fr_lng, to_lat, to_lng );

			var l_per_km = 0.08;
			var price_per_l = 12;
			var responsibility = 0.33;

			document.getElementById( 'suggested_comp_cont' ).style.display = '';
			document.getElementById( 'suggested_comp' ).innerHTML = Math.round( responsibility * d * l_per_km * price_per_l );
		}
	}
}

function appendOptionLast( selecter, val, text )
{
	var elOptNew = document.createElement('option');
	elOptNew.text = text;
	elOptNew.value = val;
	var elSel = document.getElementById( selecter );

	try {
		elSel.add(elOptNew, null); // standards compliant; doesn't work in IE
	}
	catch(ex) {
		elSel.add(elOptNew); // IE only
	}

	return elOptNew;
}

function extract_info( result )
{
	var name = '';

	for( var j in result.address_components ) {
		var found = false;
		var unallowed = 'street_number/route/postal_code/postal_town/administrative_area_level_1/';
		var addr_comp = result.address_components[ j ];

		for( var k in addr_comp.types )
			if( ( 'sublocality' == addr_comp.types[ k ] && j > 0 ) ||
				-1 != unallowed.indexOf( addr_comp.types[ k ] ) ) {
				found = true;
				break;
			}

		if( !found )
			name += addr_comp.long_name+', ';
	}

	name = name.replace( new RegExp( ', $' ), '' );
	name = name.replace( new RegExp( ', Sverige$' ), '' );

	return [ name, result.geometry ];
}

function code_address( selecter, address, type )
{
	if( geocoder )
		geocoder.geocode( { 'address': address },
			function( results, status )
			{
				clearTimeout( search_info[ type ][ 'id' ] );
				document.getElementById( 'search_' + type + '_status' ).innerHTML = '';

				if( google.maps.GeocoderStatus.OK == status ) {
					document.getElementById( selecter ).options.length = 0;

					for( var i in results ) {
						var a = extract_info( results[ i ] );
						name = a[ 0 ];
						geom = a[ 1 ];

						prefix = '';

						if( 'undefined' == typeof geom.bounds )
							prefix =
								geom.location.lat( ) + ';' +
								geom.location.lat( ) + ';' +
								geom.location.lng( ) + ';' +
								geom.location.lng( ) + ';' +
								'';
						else
							prefix =
								geom.bounds.getNorthEast( ).lat( ) + ';' +
								geom.bounds.getSouthWest( ).lat( ) + ';' +
								geom.bounds.getSouthWest( ).lng( ) + ';' +
								geom.bounds.getNorthEast( ).lng( ) + ';' +
							'';

						var opt = appendOptionLast( selecter, prefix + name, name );

						if( 1 == results.length ) {
							opt.selected = 1;
							update_dist( );
						}
					}
				}

				else
					document.getElementById( 'search_' + type + '_status' ).innerHTML =
						translate( 'Ett fel har inträffat: ' ) + status;
			}
		);
}

var directionDisplay;
var directionsService = new google.maps.DirectionsService();
var map;

function init_dirs( )
{
	directionsDisplay = new google.maps.DirectionsRenderer();
	var myOptions = {
		zoom: 14,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		center: get_start( )
	}
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	directionsDisplay.setMap(map);
}

function calc_route( )
{
	var selectedMode = 'DRIVING';
	var request = {
		origin: get_start( ), 
		destination: get_end( ),
		travelMode: google.maps.DirectionsTravelMode[selectedMode]
	};
	directionsService.route(request, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			directionsDisplay.setDirections(response);
		}
	});
}

function init_date_chooser( element, field_id )
{
	var field = document.getElementById( field_id );

	if( field ) {
		var start_date = new Date( );
		var components = field.value.split( '-' );

		start_date.setYear( components[ 0 ] );
		start_date.setMonth( components[ 1 ] - 1 );
		start_date.setDate( components[ 2 ] );

		var div = document.getElementById( element );

		div.DateChooser = new DateChooser( );
		div.DateChooser.setXOffset( 5 );
		div.DateChooser.setYOffset( -5 );
		div.DateChooser.setStartDate( start_date );
		div.DateChooser.setUpdateField( field_id, 'Y-m-d' );
		div.DateChooser.setIcon( '/datechooser.png', field_id );
	}
}

function init_date_chooser_search( )
{
	init_date_chooser( 'div_date_lo', 'date_lo' );
	init_date_chooser( 'div_date_hi', 'date_hi' );
}

function redir_enter( event, field, button )
{
	if( 'undefined' == typeof event )
		event = window.event;
	
	if( 13 == event.keyCode || 10 == event.keyCode ) {
		document.getElementById( button ).click( );
		return false;
	}
	
	return true;
}

function update_indicator( type )
{
	var str = translate( 'Söker' );

	for( j=0; j<search_info[ type ][ 'periods' ]; ++j )
		str += '.';

	document.getElementById( 'search_' + type + '_status' ).innerHTML = str;

	if( 3 == search_info[ type ][ 'periods' ]++ )
		search_info[ type ][ 'periods' ] = 0;

	search_info[ type ][ 'id' ] = setTimeout( 'update_indicator( "' + type + '" )', 250 );
}

function show_status( type )
{
	if( -1 == search_info[ type ][ 'id' ] )
		search_info[ type ][ 'id' ] = setTimeout( 'update_indicator( "' + type + '" )', 250 );

	document.getElementById( 'search_' + type + '_status' ).innerHTML = translate( 'Söker' );
	search_info[ type ][ 'periods' ] = 0;
}


