var TomsMap = {
	menu: undefined,
	search: undefined,
	searchFilterCountryIso3166: undefined,
	searchResult: undefined,
	fromDesc: undefined,
	map: undefined,
	myPano: undefined,
	panoClient: undefined,
	geocoder: undefined,
	markerHome: undefined,
    searchSalespointResult: [],
	gdir: undefined,
	start: 0,
	initialize: function() {
		if (!GBrowserIsCompatible()) return;
		TomsMap.geocoder 	= new google.maps.ClientGeocoder();
		TomsMap.map			= new google.maps.Map2($('map'));
		
		google.maps.Event.addListener(TomsMap.map,"load",function(){
			TomsMap.menu = new accordion('menuControl');
			Element.show('menuControl');
			TomsMap.menu.list[0]();
			$('searchAddress').focus();
			new Draggable('menuControl', {handle: 'menuControl-handler', starteffect: null, endeffect: null});
        });

		TomsMap.gdir = new GDirections(TomsMap.map, $('searchDirectionsResult'));
		// TomsMap.gdir = new GDirections(TomsMap.map);
		GEvent.addListener(TomsMap.gdir, "load", TomsMap.onGDirectionsLoad);
		GEvent.addListener(TomsMap.gdir, "error", TomsMap.handleErrors);

		TomsMap.map.addControl( new google.maps.ScaleControl() );
		TomsMap.map.addControl(	new google.maps.MapTypeControl() );
		TomsMap.map.addMapType(G_PHYSICAL_MAP);
		TomsMap.map.addMapType(G_SATELLITE_3D_MAP);
		 
		TomsMap.map.addControl(	new google.maps.LargeMapControl3D(), new google.maps.ControlPosition(google.maps.ANCHOR_TOP_RIGHT, new google.maps.Size(10, 40)));
		TomsMap.map.addControl( new google.maps.OverviewMapControl());
		
        // TomsMap.map.disableDoubleClickZoom();
        TomsMap.map.enableContinuousZoom();
       // TomsMap.map.enableScrollWheelZoom();

        TomsMap.map.setCenter(new google.maps.LatLng(46.2274865, 2.21430301), 6	);
		
        // Street
        panoClient = new google.maps.StreetviewClient();      
        
		// google.maps.Event.addListener(TomsMap.map,"dblclick",function(oMarker,oPoint){ 
		// 			var desc = "";
		 //			TomsMap.setHome(oPoint, desc); 
		 //		});
		// Filter 
		TomsMap.searchFilterCountryIso3166 =($F('searchAddressFilterFR'));
		Event.observe($('searchAddressFilterFR'), 'click', function(e) {
			TomsMap.searchFilterCountryIso3166 =($F('searchAddressFilterFR'));
			TomsMap.showAddressGeocode($F('searchAddress'));
		}); 
		// Search Button
		Event.observe($('searchLauncher'), 'click', function(e) {
			TomsMap.showAddressGeocode($F('searchAddress'));
		});
		Event.observe($('searchBestLauncher'), 'click', function(e) {
			TomsMap.searchBestOffer();
			Event.stop(e);
		});
		// Clean Memory
		Event.observe(window, 'unload', function(e) {
			GUnload();
		});
		if ($F('searchAddress').strip() != '') {
			TomsMap.showAddressGeocode($F('searchAddress'));
		} else {
			TomsMap.searchBestOffer();	
		}
	},
	showAddress: function(value) {
		TomsMap.search = value; 
		TomsMap.searchResult = document.getElementById("searchAddressResult");
		TomsMap.searchResult.innerHTML='&nbsp;';
		
		TomsMap.geocoder.setBaseCountryCode("FR");
		TomsMap.geocoder.getLocations(TomsMap.search, function (result) {  

				if (result && result.Status.code == 200) {							
					var places = result.Placemark;		
					Element.hide(TomsMap.searchResult);
					if (places.length > 1) {
						var stout  = Builder.node('ul', {className: 'itemList'}); 				
						for (var i=0, item; item = places[i]; i++) {
							var lat = item.Point.coordinates[1];
							var lng = item.Point.coordinates[0];
							var point =	new google.maps.LatLng(lat, lng);
							var desc = item.address;
							
							var line = Builder.node('li');
							var link = Builder.node('a', {href: "#", onclick: "TomsMap.setHome(new google.maps.LatLng(" + lat + ", " + lng + "), '" + escape(desc) + "' ); return false"},  desc );
														
							line.appendChild(link);
							stout.appendChild(line);
						}
						TomsMap.searchResult.appendChild(Builder.node('div', 'Précisez votre adresse :'));
						TomsMap.searchResult.appendChild(stout);
						Effect.Appear(TomsMap.searchResult);
					} else {
						var point = new google.maps.LatLng(places[0].Point.coordinates[1], places[0].Point.coordinates[0]);
						var desc  = places[0].address;
						TomsMap.setHome(point, escape(desc));
					}
				} else {
					TomsMap.searchResult.appendChild(Builder.node('div', 'Adresse inconnue'));
					Effect.Appear(TomsMap.searchResult);
				}
					
			} 
		);
	},
getAddressFromPoint: function(gLatLng) { 
		var lat = gLatLng.lat();
		var lng = gLatLng.lng();
		var searchCoor = lat+', '+lng;
		var searchResult = '(' + searchCoor + ')';
		TomsMap.geocoder.setBaseCountryCode("FR"); 
		TomsMap.geocoder.getLocations(searchCoor, function (result) {  
				if (result && result.Status.code == 200) {							
					var places = result.Placemark;		 
					if (places.length == 1) {
							var desc  = places[0].address; 
							searchResult = desc + ' @' + searchResult
					}
				} 
		});
		return searchResult;
	},	
showAddressGeocode: function(value) {
		TomsMap.search = value; 
		TomsMap.searchResult = document.getElementById("searchAddressResult");
		TomsMap.searchResult.innerHTML='&nbsp;';
		
		//TomsMap.geocoder.setBaseCountryCode("FR");

		GeocodeFilterManager.geocodeAddressByCountryIsoFilter(TomsMap.search, TomsMap.searchFilterCountryIso3166, function (result) {  
				if (result && result.locations && result.locations.length>0 ) {							
					//	alert("Geocode Status : " + result.status.name + " size " + result.locations.length );
					var places = result.locations;		
					Element.hide(TomsMap.searchResult);
					if (places.length > 1) {
						var stout  = Builder.node('ul', {className: 'itemList'}); 				
						for (var i=0, item; item = places[i]; i++) {
							var lat = item.geoCoordinate.latitude;
							var lng = item.geoCoordinate.longitude;
							var point =	new google.maps.LatLng(lat, lng);
							var desc = item.addressAsString;
							
				  
							var line = Builder.node('li');
							var link = Builder.node('a', {href: "#", onclick: "TomsMap.setHome(new google.maps.LatLng(" + lat + ", " + lng + "), '" + escape(desc) + "' ); return false"},  desc );
														
							line.appendChild(link);
							stout.appendChild(line);
						}
						TomsMap.searchResult.appendChild(Builder.node('div', 'Précisez votre adresse :'));
						TomsMap.searchResult.appendChild(stout);
						Effect.Appear(TomsMap.searchResult);
					} else {
						var item = places[0];
							var lat = item.geoCoordinate.latitude;
							var lng = item.geoCoordinate.longitude;
							var point =	new google.maps.LatLng(lat, lng);
							var desc = item.addressAsString;
						TomsMap.setHome(point, escape(desc));
					}
				} else {
					TomsMap.searchResult.appendChild(Builder.node('div', 'Adresse inconnue'));
					Effect.Appear(TomsMap.searchResult);
				}
					
			} 
		);
	},	
	searchBestOffer: function() {
	  	  TomsMap.cleanMap(); 
		  TomsMap.fromDesc = undefined;
	  	  if (TomsMap.markerHome) {
	  	  	//map.clearOverlays( );
	  	  	TomsMap.map.removeOverlay(TomsMap.markerHome);
	  	  	TomsMap.markerHome = null;
	  	  }
	  	  var resellerCallback= TomsMap.getSearchDisplayerCallBack();
	  	  var maxResult = 30;
	  	  var productId = document.getElementById("productId").value;
	  	  OfferProductAjaxService.getPoiByBestOfferByProduct(productId, maxResult,  resellerCallback);
  	},
	cleanMap: function() {
	  // -----> Direction
  	  if (TomsMap.gdir) {
  	  	TomsMap.gdir.clear();
  	  } 

	  // Clean Marker result
  	  for (  i=0; i<TomsMap.searchSalespointResult.length; i++) {
  	   TomsMap.map.removeOverlay(TomsMap.searchSalespointResult[i]);
  	  }

	 TomsMap.searchSalespointResult = [];
	 // map.clearOverlays();
	},
	createMarker: function(oPoint, oIcon, desc) { 
   	 var poiMarker = new google.maps.Marker(oPoint, oIcon);
   	 GEvent.addListener(poiMarker, 'click', function() {
				poiMarker.openInfoWindow(desc);
	 		});
   	 return poiMarker;
   	},
	createMarkerHomeIcon: function() {
		var icon = new google.maps.Icon();  
	    icon.image = "http://img.bestofmedia.com/img/commun/map/picto-home.png";
	    icon.iconSize = new google.maps.Size(32, 32);
	    icon.iconAnchor = new google.maps.Point(13, 32);
	    icon.infoWindowAnchor = new google.maps.Point(20, 20);
	    return icon;
	},
	createMarkerHome: function(oPoint, description ) { 
          var icon = TomsMap.createMarkerHomeIcon();
          var descCoord = "<br/>(" + oPoint.toUrlValue(6) + ")";
          var desc;
          if (description) {
          	desc = description;
			desc += "<br /><br />Pour s&eacute;lectionnez une autre adresse, <a href=\"#\" onclick=\"TomsMap.menu.list[0](); $('searchAddress').focus();return false\">cliquez ici</a>"
          } else {
	          desc = descCoord; 
          }

          // Add marker    
	  	  if (!TomsMap.markerHome) {
		  	    	TomsMap.markerHome=TomsMap.createMarker(oPoint,{icon:icon, draggable:true, bouncy:true, bounceGravity:0.3},desc);
  	     			// Add Dragable Event
        			GEvent.addListener(TomsMap.markerHome, "dragstart", function() {
        			   TomsMap.map.closeInfoWindow();
        			});
        			GEvent.addListener(TomsMap.markerHome, "dragend", function( ) {
								var point = TomsMap.markerHome.getLatLng();
        				var desc = TomsMap.getAddressFromPoint(point);
        				TomsMap.setHome(point, desc);
        			}); 
			        // Add To Map
					TomsMap.map.addOverlay(TomsMap.markerHome); 
		  	  } else {
	    			TomsMap.markerHome.setPoint(oPoint);
	    			GEvent.clearListeners(TomsMap.markerHome,  'click');
	    			GEvent.addListener(TomsMap.markerHome, 'click', function() {
						TomsMap.markerHome.openInfoWindow(desc);
					});
		  	  }            


          return TomsMap.markerHome;
  	},
    createMarkerResult: function(oPoint, desc, index) {
          var icon = TomsMap.createMarkerResultIcon(index);
          var description = desc;
          var isDirection = (TomsMap.gdir)&&(TomsMap.markerHome);
          if (isDirection)  {
          	//description += "<br/><br/><a href='javascript:createDirection(" + oPoint.toUrlValue(11)   +  ");'>Direction</a>";
          	description += "<a href=\"javascript:TomsMap.createDirectionIdx(" + index   +  ");\" class=\"showItineraire noVisited\" >Afficher l'itin&eacute;raire</a>";
          } 
         // alert(oPoint.toUrlValue(11));
          var marker = TomsMap.createMarker(oPoint, {icon:icon } , description);
					// Event 
					if (isDirection)  {
	 					GEvent.addListener(marker, 'dblclick', function() {
	 							createDirection(  marker.getLatLng() );   
						});
					};
          return marker;
  	},
	createMarkerResultIcon: function( index) {
   		var icon = new google.maps.Icon();
       	// Create a base icon for all of our markers that specifies the
        // shadow, icon dimensions, etc.
       	icon.iconSize = new google.maps.Size(26, 36);
       	icon.iconAnchor = new google.maps.Point(13, 36);
       	icon.infoWindowAnchor = new google.maps.Point(13, 36);
        // Create a lettered icon
        if (index<49) { 
        	icon.image = "http://img.bestofmedia.com/img/commun/map/picto-"+ (index+1) + ".png";
        } else { 
        	icon.image = "http://img.bestofmedia.com/img/commun/map/picto-blank.png";
		}        		
        return icon;
   	},
	openResultMarker: function(idx) {
			var marker = TomsMap.searchSalespointResult[idx];
			if (marker) { 
				GEvent.trigger(marker,  'click'); 
			}  
	},
        buildURL: function(poi) {
		return "http://www.bestofmicro.com/shopping/clic.php?id_site=" + trackingSite + "&amp;m=359&amp;zone=" + trackingZone + "&amp;e=cartepr&amp;go="+ encodeURI(poi.resellerUrl);
        },
	getSearchDisplayerCallBack: function() {
		return function(result)	 {
			var latLngBounds  = new GLatLngBounds(); 
			if (TomsMap.markerHome) {
					latLngBounds.extend(TomsMap.markerHome.getPoint());
			}
			var resultList = "";
			if (typeof TomsMap.fromDesc != 'undefined') {
				resultList += "<p>Les " + result.length + " meilleures offres autour de : <div id='addressSearch'>"+ TomsMap.fromDesc +"</div></p>"
				resultList += "<a href='#' class='changeAddress' onclick=\"TomsMap.menu.list[0](); $('searchAddress').focus();return false\">( Modifier l'adresse de recherche )</a>";
			} else {
				 resultList += "<p>Les " + result.length + " meilleures offres en France :</p>"
				resultList += "<a href='#' class='changeAddress' onclick=\"TomsMap.menu.list[0](); $('searchAddress').focus();return false\">( Spécifier une adresse de recherche )</a>";
			}

						
			var resultListBlock = "</ol>";
    		for(i = result.length-1; i >= 0; i--) {
    			var poi = result[i];
			var url = TomsMap.buildURL(poi);
    			var desc = "<span class='productPrice'>"+ Math.floor(poi.price) +"&euro;</span> - " + "<a href='" + url +"' target='_blank' class='productName noVisited'>" + poi.product.name + "</a>";
	 				desc += "<div class='productSalespoint'><span>chez</span> " + poi.salespoint.name;
					desc += "<div>"+ poi.salespoint.addressStreet +"</div>";
					desc += "<div>"+ poi.salespoint.addressPostalCode + ' ' + poi.salespoint.addressCityName +"</div>";
					desc += "</div>";
					desc += "<a href='" + url + "' class='showOffer noVisited' target='_blank'>Voir l'offre</a>";
					desc += "<div id='pano'></div>";
					
					// Create Marker
  				var point = new google.maps.LatLng(poi.salespoint.latitude, poi.salespoint.longitude);
  				latLngBounds.extend(point);
    			var marker = TomsMap.createMarkerResult(point,  desc, i);
    			TomsMap.searchSalespointResult[i] = marker;
	  			TomsMap.map.addOverlay(marker);
  			  	
  			  	// Create List Result
  			  	var line = "<li>";
  			  	line += "<a href='javascript:TomsMap.openResultMarker(" + i + ");' class='boutiqueLink clearfix'>";
						line += "<img src='http://img.bestofmedia.com/img/commun/map/small/picto-"+ (i+1) +".png' alt='' class='smallPicto' />";
						line += "<b>" + Math.floor(poi.price) + "&euro;</b> - ";
  			  	line += poi.salespoint.name + " ("+ poi.salespoint.addressPostalCode +")";
  			  	line += "</a>";
  			  	line += "</li>";
  			  	resultListBlock =  line+resultListBlock; 
    		} 
    			resultListBlock = "<ol>"+resultListBlock;
    			resultList +=resultListBlock;
    			// Apply Zoom
    			var latLngCenter = latLngBounds.getCenter();
    			var zoomLevel = TomsMap.map.getBoundsZoomLevel(latLngBounds);
    			if (TomsMap.map.getZoom()==zoomLevel) {
	    		   TomsMap.map.panTo(latLngCenter  ); 
	    		} else {
	    			TomsMap.map.setCenter(latLngCenter,zoomLevel ); 
	    		}
    			var contenerResult = document.getElementById("searchResultTopHits");
    			if (contenerResult) {
    				document.getElementById("searchResultTopHits").innerHTML = resultList;
					if ($('TomsMap').getElementsByClassName('accordion_content')[1].style.display == 'none' && TomsMap.start != 0) {
						TomsMap.menu.list[1]();
					}
    			}
				TomsMap.start = 1;
    		}
	},
	setHome: function(oPoint, descUnescape) {
		var desc =  unescape(descUnescape);
	  TomsMap.fromDesc =desc;
	  TomsMap.cleanMap(); 
	  
	 	TomsMap.createMarkerHome(oPoint, desc); 
		TomsMap.map.panTo(oPoint);

		// Do the Search
		var resellerCallback= TomsMap.getSearchDisplayerCallBack();
		var maxResult = 30;
		var productId = document.getElementById("productId").value;


		OfferProductAjaxService.getPoiByNearestOfferByProduct(productId, oPoint.lat(),  oPoint.lng(),maxResult,  resellerCallback);
 	},
	onGDirectionsLoad: function() { 
			      // Use this function to access information about the latest load() results.
			      // e.g.
			      // document.getElementById("getStatus").innerHTML = gdir.getStatus().code;
		if (TomsMap.gdir) { 
  	        G_START_ICON.iconSize = new GSize(0, 0);
		    G_END_ICON.iconSize = new GSize(0, 0);
		 }
	},
	handleErrors: function(){
	   if (TomsMap.gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + TomsMap.gdir.getStatus().code);
	   else if (TomsMap.gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + TomsMap.gdir.getStatus().code);

	   else if (TomsMap.gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + TomsMap.gdir.getStatus().code);

	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);

	   else if (TomsMap.gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + TomsMap.gdir.getStatus().code);

	   else if (TomsMap.gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("A directions request could not be successfully parsed.\n Error code: " + TomsMap.gdir.getStatus().code);

	   else alert("An unknown error occurred.");

		},
		createDirectionIdx: function(idx) {
	   		var marker = TomsMap.searchSalespointResult[idx];
	   		if (marker) {
	   			TomsMap.createDirection(marker.getLatLng());
	   	 	}
	   	},
		createDirection: function(point) {
	  		var isDirection = (TomsMap.gdir)&&(TomsMap.markerHome);
	  		if (isDirection) {
	  				var waypoints=new Array(TomsMap.markerHome.getLatLng(),  point ); 
	  				TomsMap.gdir.loadFromWaypoints(waypoints,{"locale":"fr", preserveViewport:false});
					if ($('TomsMap').getElementsByClassName('accordion_content')[2].style.display == 'none') {
						TomsMap.menu.list[2]();
					}
	  		} 
	  	}
}

