/**
 * jQuery interactive map plugin file.
 */

;(function($) {

	$.interactivemap = {
		map: null,
		markers: {},
		infoUrl: '',
		iconUrl: '',
		lineWeight: 5,
		lineOpacity: .8,
		colors: ['#aa0000', '#00aa00', '#0000aa', '#aaaa00', '#aa00aa', '#00aaaa'],
		usedColors: [],
		polylines: [],
		lineMarkers: [],

		showPlaces: function(places,color) {
			if(places.lines!=undefined) {
				$.interactivemap.showRoute(places.id, places.lines, places.labels, places.places, color);
			}
			else {
				for(var i=0;i<places.length;++i) {
					if($.interactivemap.markers[places[i].cat]==undefined)
						$.interactivemap.markers[places[i].cat]={};
					if($.interactivemap.markers[places[i].cat][places[i].id]==undefined)
						$.interactivemap.markers[places[i].cat][places[i].id]=$.interactivemap.createMarker(places[i],color);
				}
			}
		},

		hidePlaces: function(places) {
			if(places.lines!=undefined) {
				$.interactivemap.hideRoute(places.id);
			}
			else {
				for(var i=0;i<places.length;++i) {
					if($.interactivemap.markers[places[i].cat]!=undefined && $.interactivemap.markers[places[i].cat][places[i].id]!=undefined) {
						$.interactivemap.map.removeOverlay($.interactivemap.markers[places[i].cat][places[i].id]);
						$.interactivemap.markers[places[i].cat][places[i].id]=undefined;
					}
				}
			}
		},

		createMarker: function(place,color) {
			var icon=new GIcon;
			icon.image=$.interactivemap.iconUrl+'/m'+color+'_24x24.png';
			icon.shadow=$.interactivemap.iconUrl+'/m'+color+'_24x24.png';
			icon.iconSize=new GSize(24,24);
			icon.iconAnchor=new GPoint(12, 24);
			icon.shadowSize = new GSize(24,24);
			icon.infoWindowAnchor = new GPoint(12, 24);
			var marker = new GMarker(new GLatLng(place.lat, place.lng), {'icon': icon});

			GEvent.addListener(marker, 'click',	function() {
				$.ajax({
					'url':$.interactivemap.infoUrl,
					'data':{cat:place.cat.replace(/\-\d+$/,''), 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'});
						}
					}
				});
			});
			$.interactivemap.map.addOverlay(marker);
			return marker;
		},

		hideRoute: function(id) {
			if($.interactivemap.polylines[id]!=undefined) {
				$.each($.interactivemap.polylines[id], function() {
					$.interactivemap.map.removeOverlay(this);
				});
			}
			if($.interactivemap.lineMarkers[id]!=undefined) {
				$.each($.interactivemap.lineMarkers[id], function() {
					$.interactivemap.map.removeOverlay(this);
				});
			}
			for(var i=0;i<6;++i) {
				if($.interactivemap.usedColors[i]==id) {
					$.interactivemap.usedColors[i]=undefined;
				}
			}
		},

		showRoute: function(id, lines, labels, places, color) {
			var markerColors=['#000000','#5781FC','#FC6355','#00E13C','#55D7D7','#FCF357','#7E55FC','#E14F9E'];

			$.interactivemap.polylines[id]=[];
			$.each(lines,function(n,val){
				var pts = val==null ? [] : val.split(',');
				if (pts.length==0) return;
				var points = [];
				for(var i=0;i<pts.length-1;i+=2) {
					points.push(new GLatLng(parseFloat(pts[i]),parseFloat(pts[i+1])));
				}
				var lineColor=0;
				for(var i=0;i<6;++i) {
					if($.interactivemap.usedColors[i]==undefined) {
						$.interactivemap.usedColors[i]=id;
						lineColor=i;
						break;
					}
				}
				//var poly=new GPolyline(points, $.interactivemap.colors[lineColor], $.interactivemap.lineWeight, $.interactivemap.lineOpacity);
				var poly=new GPolyline(points, markerColors[color], $.interactivemap.lineWeight, $.interactivemap.lineOpacity);
				$.interactivemap.map.addOverlay(poly);
				$.interactivemap.polylines[id][n]=poly;
				if(labels[n]!=null && labels[n].length) {
					var label=labels[n];
					GEvent.addListener(poly, 'mouseover', function() {
						this.overlay = new MapTooltip(this, label, {minWidth:'10px'});
						$.interactivemap.map.addOverlay(this.overlay);
					});
					GEvent.addListener(poly, 'mouseout', function() {
						$.interactivemap.map.removeOverlay(this.overlay);
					});
				}
			});

			$.interactivemap.lineMarkers[id]=[];
			$.each(places,function(i,place){
				var marker;
				var point=new GLatLng(place.lat, place.lng);
				if(place.label!='') {
					var iconOptions = {
						width: 24,
						height: 24,
						primaryColor: markerColors[color],
						cornerColor: '#FFFFFF',
						strokeColor: '#000000',
						label: place.label,
						labelColor: '#000000'
					};
					var icon = MapIconMaker.createLabeledMarkerIcon(iconOptions);
					marker = new GMarker(point, {'icon': icon});
				}
				else {  // city
					marker = new GMarker(point);
				}

				$.interactivemap.map.addOverlay(marker);
				$.interactivemap.lineMarkers[id].push(marker);

				GEvent.addListener(marker, "click", function() {
					$.ajax({
						'url':$.interactivemap.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'});
							}
						}
					});
				});
			});
		}
	};

	$.extend($.fn, {
		interactivemap: function(settings) {
			settings = $.extend({
					zoom: 9,
					lat: '45.397775',
					lng: '-72.420853'
				},
				settings || {}
			);

			var map = new google.maps.Map2($(this)[0]);

			map.addControl(new GLargeMapControl3D);
			map.addControl(new GMapTypeControl);
			map.setCenter(new GLatLng(parseFloat(settings.lat), parseFloat(settings.lng)), settings.zoom);

			$.interactivemap.map = map;
		}
	});

})(jQuery);

