/**
 * jQuery route map plugin file.
 */

;(function($) {
	$.extend($.fn, {
		tourmap: function(settings) {
			settings = $.extend({
					places: [],  // {type, name, url, lat, lng}
					lines: [],
					labels: [],
					lineWeight: 5,
					lineOpacity: .8,
					colors: ['#aa0000', '#00aa00', '#0000aa', '#aaaa00'],
					colorNames: ['red', 'green', 'blue', 'yellow']
				},
				settings || {}
			);

			var map = new google.maps.Map2($(this)[0], {draggableCursor:"auto", draggingCursor:"move"});
			var icons = [];
			for(var i=0;i<4;++i) {
				var icon = new GIcon();
				icon.image = "http://labs.google.com/ridefinder/images/mm_20_"+settings.colorNames[i]+".png";
				icon.shadow= "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
				icon.iconSize = new GSize(12, 20);
				icon.shadowSize = new GSize(22, 20);
				icon.iconAnchor = new GPoint(6, 20);
				icon.infoWindowAnchor = new GPoint(5, 1);
				icons.push(icon);
			}

			var lines=[];
			$.each(settings.lines,function(n,val){
				var pts = val==null ? [] : val.split(',');
				var points = [];
				for(var i=0;i<pts.length-1;i+=2) {
					points.push(new GLatLng(parseFloat(pts[i]),parseFloat(pts[i+1])));
				}
				lines[n]=points;
			});

			var bounds = new GLatLngBounds;
			var hasInput = false;
			$.each(lines,function(i,points){
				$.each(points,function(){
					bounds.extend(this);
					hasInput = true;
				});
			});
			if(hasInput)
				map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
			else
				map.setCenter(new GLatLng(45.397775, -71.920853), 8);
			map.addControl(new GLargeMapControl3D); // Zoom control
			map.addControl(new GMapTypeControl);
			map.addMapType(G_PHYSICAL_MAP);
			map.addControl(new GScaleControl()); // Scale bar
			map.disableDoubleClickZoom();

			var polylines=[];
			var markers=[];
			drawLines();

			$(settings.infoTrigger).click(function(){
				var rel=$(this).attr('rel');
				$.each(settings.places,function(i,place){
					if(place.cat+place.id==rel) {
						showInfoWindow(place,markers[i]);
						return false;
					}
				});
				return false;
			});

			$.each(settings.places,function(i,place){
				var marker;
				var point=new GLatLng(place.lat, place.lng);
				if(place.label!='') {
					var iconOptions = {};
					iconOptions.primaryColor = "#66FF66";
					iconOptions.strokeColor = "#000000";
					iconOptions.label = place.label;
					iconOptions.labelColor = "#000000";
					iconOptions.addStar = false;
					iconOptions.starPrimaryColor = "#FFFF00";
					iconOptions.starStrokeColor = "#0000FF";
					var icon = MapIconMaker.createLabeledMarkerIcon(iconOptions);
					marker = new GMarker(point, {'icon': icon});
				}
				else {  // city
					marker = new GMarker(point);
				}

				map.addOverlay(marker);
				markers.push(marker);
				GEvent.addListener(marker, "click", function() {
					showInfoWindow(place,marker);
				});
			});

			function showInfoWindow(place, marker) {
				$.ajax({
					'url':settings.infoUrl,
					'data':{cat:place.cat, id:place.id},
					'dataType':'text',
					'success':function(data,status) {
						// build DOM tree first so that we can use superbox
						var dom=$(data);
						var a=$('#tool-detail',dom);
						marker.openInfoWindowTabsHtml([
							new GInfoWindowTab('Info', $('.map-place',dom)[0]),
							new GInfoWindowTab(tce.lang=='en' ? 'Directions' : 'Itinéraire', $('.map-directions',dom)[0])
						]);
						if(a.length) {
							// this is a hack of superbox
							a[0]._relSettings=a.attr('rel');
							a.superbox('ajax',{boxId: 'superbox', boxClasses: ' php'});
						}
					}
				});
			}

			function drawLines() {
				$.each(polylines,function(){
					map.removeOverlay(this);
				})
				polylines=[];
				$.each(lines,function(i,line){
					var poly=new GPolyline(line, settings.colors[i], settings.lineWeight, settings.lineOpacity);
					map.addOverlay(poly);
					polylines[i]=poly;
					if(settings.labels[i]!=null && settings.labels[i].length) {
						var label=settings.labels[i];
						GEvent.addListener(poly, 'mouseover', function() {
							this.overlay = new MapTooltip(this, label, {minWidth:'10px'});
							map.addOverlay(this.overlay);
						});
						GEvent.addListener(poly, 'mouseout', function() {
							 map.removeOverlay(this.overlay);
						});
					}
				});
			}
		}
	});

})(jQuery);

