var map;
var bubble;
var clic_opt = {action:'bubble'};
var bounds = {};

function map_init(map_id,addrs) {
	var myLatlng = new google.maps.LatLng(46.79, -71.27);
	var zoom = 5;
	var scrollwheel = true;
	var mapTypeControl = true;
	var streetViewControl = true;
	addrs = addrs ? addrs : [];
	bounds = new google.maps.LatLngBounds();
	switch( map_id ) {
		case 'profile_map_canvas':
			if( parseFloat(addrs[0].lat) ) {
				var lat = parseFloat(addrs[0].lat);
				var lng = parseFloat(addrs[0].lng);
				myLatlng = new google.maps.LatLng(lat,lng);
				zoom = 12;
				mapTypeControl = false;
				streetViewControl = true;
			}
			clic_opt = { action: '' };
			break;
		case 'km_map_canvas':
			if( addrs[0] && addrs[0].lat ) {
				var lat = parseFloat(addrs[0].lat);
				var lng = parseFloat(addrs[0].lng);
				var myLatlng = new google.maps.LatLng(lat,lng);
			}
			zoom = 12;
			break;
		case 'map_canvas':
			mapTypeControl = false;
			streetViewControl = false;
			break;
	}
	var myOptions = {
	  zoom: zoom,
	  center: myLatlng,
	  mapTypeId: google.maps.MapTypeId.ROADMAP,
	  scrollwheel: scrollwheel,
	  mapTypeControl: mapTypeControl,
	  streetViewControl: streetViewControl
	}
	map = new google.maps.Map(document.getElementById(map_id), myOptions);
	// load points
	for( var e in addrs ) {
		var v = addrs[e];
		var lat = parseFloat(v.lat);
		var lng = parseFloat(v.lng);
		if( lat && lng ) {
			//console.log([lat,lng]);
			v.lat = lat;
			v.lng = lng;
			add_marker(v);
			bounds.extend(new google.maps.LatLng(lat,lng));
		}
	}

	if( addrs.length > 1 ) {
		map.fitBounds(bounds);
	}
}

function add_marker(v) {
	var latlng = new google.maps.LatLng( v.lat, v.lng);
	var marker = new google.maps.Marker({
		map: map, 
		position: latlng,
		wsid: v.id
		//icon: get_icon()
	});
	if( clic_opt.action ) {
		google.maps.event.addListener(marker, 'click', function() {
			if( clic_opt.action == 'bubble' ) {
				show_bubble( marker , v );
			} else {
				window.location.href = clic_opt.url.replace('{id}',v.id);
			}
		});		
	}
}

/*
function get_icon() {
	var image = null;
	image = new google.maps.MarkerImage('images/map/pin_red.png',
		new google.maps.Size(18, 28),
		new google.maps.Point(0,0),
		new google.maps.Point(0, 28)
	);
	
	return image;
}

function get_shadow( sel ) {
	var shadow = null;
	shadow = new google.maps.MarkerImage('ico/fshadow.png',
	new google.maps.Size(26, 12),
	new google.maps.Point(0,0),
	new google.maps.Point(0,11));
	
	return shadow;
}
*/

function show_bubble( marker , v ){
	var html = '<table><tr>';

	if( v.photo && v.photo != 'default.jpg' ) {
		html += '<td><a href="/profil/'+v.id+'/"><img src="/photos/'+v.photo+'" width="55" border="1" /></a></td>';
	}
	html += '<td width="155" height="80" style="text-align: left; padding-left: 15px;">';
	if( v.name ) html += '<b>'+v.name+'</b><br/>';
	if( v.company ) html += ''+v.company+'<br/>';
	if( v.occupation ) html += '<i>'+v.occupation+'</i><br/>';
	html += '<a href="/profil/'+v.id+'/">Voir le profil &gt;&gt;</a><br/>';
	html += '<a href="/ucontact.php?id='+v.id+'/">Contacter &gt;&gt;</a>';
	html += '<br/></td>';
	html += '</tr></table>';
	
	if( bubble ) {
		bubble.close();
		bubble.setContent(html);
	} else {
		bubble = new google.maps.InfoWindow({content: html});		
	}
	bubble.open(map,marker);
}

function city_focus( city ){
	var lat, lng, zoom;
	switch( city ) {	
		case 'trois-rivieres':
			lat = 46.28;
			lng = -72.57;
			zoom = 10;
			break;
		case 'sherbrooke':
			lat = 45.27;
			lng = -71.87;
			zoom = 10;
			break;
		case 'montreal':
			lat = 45.52;
			lng = -73.64;
			zoom = 10;
			break;
		default:
			lat = 46.79;
			lng = -71.27;
			zoom = 10;
			break;
	}
	map.setCenter( new google.maps.LatLng(lat,lng) );
	map.setZoom( 10 );
	
	return {lat:lat,lng:lng};
}



function map_edit_coor( map_id , lat , lng , callback , options ){
	if( ! options ) {
		options = {};
	}
	
	if( lat && lng ) {
		
		var myLatlng = new google.maps.LatLng( parseFloat(lat) , parseFloat(lng) );
		
	} else {
		
		// set default to quebec city
		var myLatlng = new google.maps.LatLng(46.79 , -71.27 );
		
	}
	
	var myOptions = {
	  zoom: 12,
	  center: myLatlng,
	  mapTypeId: google.maps.MapTypeId.ROADMAP,
	  scrollwheel: true,
	  mapTypeControl: true,
	  streetViewControl: true
	}
	map = new google.maps.Map(document.getElementById(map_id), myOptions);

	var marker = new google.maps.Marker({
		map: map, 
		position: myLatlng,
		draggable: true
	});
	
	google.maps.event.addListener(marker, 'dragend', function() {
		var pos = marker.getPosition();
		callback( pos.lat() , pos.lng() );
	});
	
	// no coor but we have the city
	// try to find using geocoding
	if( ! lat && options.city ) {
		
		// find default place from city	
		var geocoder = new google.maps.Geocoder();	
		geocoder.geocode( { 'address': options.city+', Québec, Canada'}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				var lat = results[0].geometry.location.lat();
				var lng = results[0].geometry.location.lng();
				var pos = new google.maps.LatLng( lat , lng );
				marker.setPosition( pos );
				map.setCenter( pos );
				callback( pos.lat() , pos.lng() );
			} else {				
				try { console.log("Geocode was not successful for the following reason: " + status); } catch(err) {}
			}
		});
		
	}
}

function save_position( lat , lng ) {
	$.post( 'savex.php?a=coor' , {lat:lat,lng:lng} );
}

var km_gservice;
var km_gdisplay;
var km_markerA;
var km_markerB;
function map_km( point1 , point2 ) {
	
	var posA = new google.maps.LatLng( point1.lat , point1.lng );
	var posB = new google.maps.LatLng( point2.lat , point2.lng );
	
	map.setCenter( posA );
	
	var icoA = new google.maps.MarkerImage('http://www.google.com/mapfiles/markerA.png',
		// This marker is 20 pixels wide by 32 pixels tall.
		new google.maps.Size(20, 34),
		// The origin for this image is 0,0.
		new google.maps.Point(0,0),
		// The anchor for this image is the base of the flagpole at 0,32.
		new google.maps.Point(9, 34));
	var icoB = new google.maps.MarkerImage('http://www.google.com/mapfiles/markerB.png',
		// This marker is 20 pixels wide by 32 pixels tall.
		new google.maps.Size(20, 34),
		// The origin for this image is 0,0.
		new google.maps.Point(0,0),
		// The anchor for this image is the base of the flagpole at 0,32.
		new google.maps.Point(9, 34));
	var shadow = new google.maps.MarkerImage('http://www.google.com/mapfiles/shadow50.png',
		// The shadow image is larger in the horizontal dimension
		// while the position and offset are the same as for the main image.
		new google.maps.Size(37, 34),
		new google.maps.Point(0,0),
		new google.maps.Point(9, 34));

	var markerA = new google.maps.Marker({
		map: map, 
		position: posA,
		icon: icoA,
		shadow: shadow,
		draggable: true
	});

	var markerB = new google.maps.Marker({
		map: map, 
		position: posB,
		icon: icoB,
		shadow: shadow,
		draggable: true
	});
	
	google.maps.event.addListener(markerA, 'dragend', function() {
		km_update( markerA , markerB );
	});
	
	google.maps.event.addListener(markerB, 'dragend', function() {
		km_update( markerA , markerB );
	});
	
	km_gservice = new google.maps.DirectionsService();
	km_gdisplay = new google.maps.DirectionsRenderer({
		map: map,
		preserveViewport: true,
		suppressMarkers: true
	});
	
	km_markerA = markerA;
	km_markerB = markerB;
	//km_gdisplay.setMap( map );

}

function km_update( markerA , markerB ){
	var request = {
		origin: markerA.getPosition(), 
		destination: markerB.getPosition(),
		waypoints: [],
		optimizeWaypoints: true,
		travelMode: google.maps.DirectionsTravelMode.DRIVING
	};
	km_gservice.route(request, function(response, status) {
	  if (status == google.maps.DirectionsStatus.OK) {
		km_gdisplay.setDirections(response);
        var route = response.routes[0];
		var dist = 0;
        // For each route, display summary information.
        for (var i = 0; i < route.legs.length; i++) {
			dist += route.legs[i].distance.value;
        }
	  }
	  var distance = (Math.round(dist/100) /10);
	  var distance_text = distance.toString()+' km';
	  $('#result').hide().html(distance_text).slideDown('slow');
		// alert( distance_text );
	});
	
}

function km_city_focus( city ) {
	var point = city_focus( city );
	km_markerA.setPosition(
			new google.maps.LatLng( point.lat , point.lng )
		);
	km_markerB.setPosition(
			new google.maps.LatLng(point.lat-0.02 , point.lng+0.02 )
		);
}

