var oMap = Base.extend({

	constructor: function()
	{
    	iMap = this;
    	iMap.class_name = 'oMap';
		manager			 = new Array();
		markerZoom		 = new Array();
		markerUnZoom	 = new Array();
		polylineManager  = new Array();
		polylineInfo	 = new Array();
		polylineContener = new Array();

    },

	CreateMap: function (MapCenterX, MapCenterY, Zoom, id, custom)
	{
    	
      if (GBrowserIsCompatible())
    	{
	    	var GoogleMapObj = document.getElementById(id);
			GoogleMap = new GMap2(GoogleMapObj);

	    	if(custom=="disabled")//Map par defaut
	    	{
				GoogleMap.addControl(new GLargeMapControl());
				GoogleMap.addControl(new GMapTypeControl());
				function wheelZoom(a) {
					if ((a.detail || -a.wheelDelta) < 0)
					GoogleMap.zoomIn();
					else
					GoogleMap.zoomOut();
				}

				MapName = "NavitiaMap";
	    	}
	    	else//Map custom
	    	{

	    		GoogleMap.addControl(new CustomGLargeMapControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5,5)));
	    		GoogleMap.addControl(new CustomMapControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(5,5)));
	    		//GoogleMap.addControl(new GLargeMapControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(100,5)));
	    		//GoogleMap.addMapType(G_PHYSICAL_MAP);

	    	}
	    	
        //GoogleMap = new GMap2(GoogleMapObj);
	    	
	    	GoogleMap.addControl(new GOverviewMapControl());
	    	Geocoder = new GClientGeocoder();
	    	GoogleMap.enableDoubleClickZoom();
			GoogleMap.enableContinuousZoom();
		  	this.MapCenter(MapCenterX, MapCenterY, Zoom);

		  	mgr = new GMarkerManager(GoogleMap);
    	}
	},

	//?
	CreateAdminMap: function (MapCenterX, MapCenterY, Zoom, id)
	{
		alert(id);
		var GoogleMapObj = document.getElementById(id);
		GoogleMap = new GMap2(GoogleMapObj);
		GoogleMap.enableDoubleClickZoom();
		GoogleMap.enableContinuousZoom();
		this.MapCenter(MapCenterX, MapCenterY, Zoom);
	},

	MapCenter: function (pf_LamberX, pf_LamberY, pi_scale)
	{
      la_Result = Lamb_WGS84(pf_LamberX, pf_LamberY);
      GoogleMap.setCenter(new GLatLng(la_Result[1], la_Result[0]), pi_scale);
	},

	/* Construit une etiquette en fonction du nom d'arret, de ville et d'un tableau de ligne*/
	InfoContentBuilder: function(Name,CName,LineArray)
	{
		var etiquette = "";
		etiquette +="<h2>"+Name;
		if(CName != "")
			etiquette += " ("+CName+")";
		etiquette +="</h2>";

		etiquette +="<p class='para_trafic'>Rechercher un itin&eacute;raire :<br/><a href=\""+urlSite+"/route/vuesearch/?rappelDeparture="+encodeURIComponent(Name)+"\" class='rouge' title='&Agrave; partir de cet arr&ecirc;t'>&Agrave; partir de cet arr&ecirc;t</a><br/><a href=\""+urlSite+"/route/vuesearch/?rappelDestination="+encodeURIComponent(Name)+"\" class='rouge' title='Vers cet arr&ecirc;t'>Vers cet arr&ecirc;t</a><br/><br/><a href=\""+urlSite+"/route/vueHoraire?stopAreaLibelle="+encodeURIComponent(Name)+"\" class='rouge' title='Voir les horaires'>Voir les horaires</a></p>";
		for(var i=0;i<LineArray.length;i++)
		{
			etiquette += "<p class='para_trafic'><span class='linecolor' style='font-weight:bold;background-color:#"+LineArray[i]['LColor']+";'>"+LineArray[i]['LCode']+"</span><span class='map_item'>Ligne "+LineArray[i]['LCode']+"</span> : "+LineArray[i]['LName']+"</p>";
		}

		return etiquette;
	},

	/* Bind une infobulle sur un marqueur de depart ou d'arrivee */
	InfoBindContent: function(content,id,adresse)
	{
		var etiquette = "";
			etiquette += "<h3>"+adresse+"</h3>";
		if(content == 'Departure')
		{
			etiquette += "<p>Ce point correspond \xE0 votre point de d\xE9part.</p>";
		}
		else if(content == 'Destination')
		{
			etiquette += "<p>Ce point correspond \xE0 votre point d'arriv\xE9e.</p>";
		}
		//*manager[id].bindInfoWindow(etiquette);
		iMap.BindInfoWindowCustom(manager[id],etiquette);
	},

	/* Cree une etiquette pour le depart arrivee laissant a� l'utilisateur le choix de son point */
	InfoContentBuilderDepartureArrival: function(Link,id,adresse,codePoint)
	{
		var etiquette = "";

		if(id=="error")
		{
			etiquette += "<p>Il est impossible de faire une recherche d'itin&eacute;raire &agrave; partir ou vers ce point.</p>";
		}
		else
		{
			etiquette += "<h2>"+adresse+"</h2>";

			for(var i=0;i<Link.length;i++)
			{
				if(Link[i]=="Departure")
					etiquette +="<a title='Choisissez ce point comme d\xE9part' class='rouge' id='markerDepart' onclick='map.MarkerSelected(\"Departure\",\""+id+"\",\""+adresse+"\",\""+codePoint+"\"); return false;' href='#'>A partir de cet arr\xEAt</a><br/>";
				if(Link[i]=="Destination")
					etiquette +="<a title='Choisissez ce point comme destination' class='rouge' id='markerDestination' onclick='map.MarkerSelected(\"Destination\",\""+id+"\",\""+adresse+"\",\""+codePoint+"\"); return false;' href='#'>Vers cet arr\xEAt</a><br/>";
			}
		}

		return etiquette;
	},

	/* Fonction gerant les deux clic de depart et d'arrivee */
	InitMarkerListener: function()
	{
		msw = new MswStreetNetwork();
		manager['X1']=iMap.CreateMarkerSelection(0,0,''); manager['X1'].hide();
		manager['X2']=iMap.CreateMarkerSelection(0,0,''); manager['X2'].hide();
		manager['error']=iMap.CreateMarkerSelection(0,0,''); manager['error'].hide();

		GEvent.addListener(GoogleMap,'click',function(overlay,latlng){
			if($('#IsClick').val() =="1")
			{
				if(latlng != null)
				{
					var lat = latlng.lat();
					var lon = latlng.lng();
					var point = new GLatLng(lat,lon);

					var iTp = new oTp();

					var result = WGS_ED50(lon,lat);
					msw.getAdressByXY(parseFloat(result[0]),parseFloat(result[1]),

						function(objet_retourne,param)
						{
							//var codePoint = typePoint+"|"+idx+"|"+adresse+"|"+cityName+"|"+result[0]+"|"+result[1];
							var codePoint = result[0]+"-"+result[1];

							var lat = latlng.lat();
							var lon = latlng.lng();
							var point = new GLatLng(lat,lon);

							if(objet_retourne.status == 'error')
							{
								manager['error'].setLatLng(point);
								manager['error'].show();
								//manager['error'].openInfoWindow(iMap.InfoContentBuilderDepartureArrival([],'error','','',codePoint));
								manager['error'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival([],'error','',codePoint));
							}
							else
							{
								var adresse = iTp.htmlentities(objet_retourne.adress.trim());
								var cityName = iTp.htmlentities(objet_retourne.place.city.trim());
								var idx = iTp.htmlentities(objet_retourne.place.idx);
								var typePoint = iTp.htmlentities(objet_retourne.place.type);
								var fullAddress = '';

								if (adresse != '' && cityName != '')
									fullAddress = adresse + ', ' + cityName;
								else if (adresse != '' && cityName == '')
									fullAddress = adresse;
								else if (adresse == '' && cityName != '')
									fullAddress = cityName;

								manager['error'].hide();

								if($('#Departure').val() == "" && $('#Destination').val() == "" )
								{
									tab = new Array('Departure','Destination');

									manager['X1'].setLatLng(point);
									manager['X1'].show();
									manager['X1'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival(tab,'X1',fullAddress,codePoint));
								}
								else if($('#Departure').val() != "" ^ $('#Destination').val() != "" )
								{
									if($('#Depature').val() !="")
										tab = new Array('Destination');
									if($('#Destination').val() !="")
										tab = new Array('Departure');

									if(manager['X1'].isHidden())
									{
										manager['X1'].setLatLng(point);
										manager['X1'].show();
										manager['X1'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival(tab,'X1',fullAddress,codePoint));
									}
									else
									{
										manager['X2'].setLatLng(point);
										manager['X2'].show();
										manager['X2'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival(tab,'X2',fullAddress,codePoint));
									}
								}
							}
						},'json'
					);
				}
			}
		});
	},

	/* ------------ InitClusterMarkerListener via StopAreaExternalCode ----------- */
	InitClusterMarkerListener: function(marker,ExternalCode)
	{
		if($('#IsClick').val() == "1")
		{
			if(marker != null && ExternalCode != null)
			{
				var latlng = marker.getPoint();
				var lat = latlng.lat();
				var lon = latlng.lng();
				var point = new GLatLng(lat,lon);
				var result = WGS_ED50(lon,lat);
				var codePoint = result[0]+"-"+result[1];

				$.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:ExternalCode},
					function(data)
					{
						if(data == '')
						{
							manager['error'].setLatLng(point);
							manager['error'].show();
							manager['error'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival([],'error','','',codePoint));
						}
						else
						{

							//InfoStoparea
							var Idx = "" ;
							var Id = "";
							var ExternalCode = "";
							var Name = "";
							var CoordX = "";
							var CoordY = "";
							//InfoCity
							var CIdx = "";
							var CId= "" ;
							var CName= "" ;
							var CCityCode = "";
							var CExternalCode = "";
							var CCode = "";

							var k=0;
				 			//==> Parseur JSON
				 			$.each(data,function(i,item){
					 			if(i!='LineArray')
					 			{
					 				/* InfoStopAea */
					 				Idx = item[k].Idx;
					 				Id = item[k].Id;
					 				ExternalCode = item[k].ExternalCode;
					 				Name = item[k].Name;
					 				CoordX = item[k].Coord.CoordX;
					 				CoordY = item[k].Coord.CoordY;

					 				/* InfoCity */
					 				CIdx = item[k].City.Idx;
					 				CId= item[k].City.Id;
					 				CName= item[k].City.Name;
					 				CCityCode = item[k].City.CityCode;
					 				CExternalCode = item[k].City.ExternalCode;
					 				CCode = item[k].City.Idx;

					 			}
					 			k++;
				 			});

				 			var iTp = new oTp();
				 			var cityName = iTp.htmlentities(CName);
							var adresse = iTp.htmlentities(Name);

							manager['error'].hide();


							if($('#Departure').val() == "" && $('#Destination').val() == "" )
							{
								tab = new Array('Departure','Destination');

								manager['X1'].setLatLng(point);
								manager['X1'].show();
								manager['X1'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
							}
							else if($('#Departure').val() != "" ^ $('#Destination').val() != "" )
							{
								if($('#Depature').val() != "")
									tab = new Array('Destination');
								if($('#Destination').val() != "")
									tab = new Array('Departure');

								if(manager['X1'].isHidden())
								{
									manager['X1'].setLatLng(point);
									manager['X1'].show();
									manager['X1'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
								}
								else
								{
									manager['X2'].setLatLng(point);
									manager['X2'].show();
									manager['X2'].openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilderDepartureArrival(tab,'X2',adresse,cityName,codePoint));
								}
							}
						}
					},'json'
				);
			}
		}
	},

	MarkerSelected: function(rappelMarker,id,adresse,codePoint)
	{
		$('#'+rappelMarker+'Libelle').attr('rel',$('#'+rappelMarker+'Libelle').val());
		$('#'+rappelMarker+'Libelle').val(adresse); //On remplis le champ du formulaire
		$('#'+rappelMarker+'Selected').append('<a href="#" id="'+rappelMarker+'LinkSelected" class="grisSmall" onclick="map.DeleteMarker(\''+rappelMarker+'\',\''+id+'\');return false;" title="Modifier ce point">Modifier ce point</a>')//On crée le liens pour supprimer le point
		map.InfoBindContent(rappelMarker,id,adresse);//Et on modifie l'info bulle

		if(rappelMarker == "Departure")
			manager[id].setImage(urlImage+'pin_depart.png');
		else if(rappelMarker == "Destination")
			manager[id].setImage(urlImage+'pin_arrivee.png');

		manager[id].closeExtInfoWindow(GoogleMap);
		$('#'+rappelMarker).val(codePoint);
	},

	/* Efface un Marker depart arrivee */
	DeleteMarker: function(rappelMarker,id)
	{
		manager[id].closeExtInfoWindow(GoogleMap);
		//manager[id].closeInfoWindow();
		manager[id].hide();
		manager[id].setImage(urlImage+'pin_selection.png');
		$('#'+rappelMarker+'Libelle').val($('#'+rappelMarker+'Libelle').attr('rel'));
		$('#'+rappelMarker+'Libelle').attr('rel','0');
		$('#'+rappelMarker).val('');
		$('#'+rappelMarker+'LinkSelected').remove();
	},

	/* Initialise un marker */
	CreateMarkerSelection: function(CoordX,CoordY,etiquette)
	{
		var point = new GLatLng(CoordX,CoordY);
		var icon  = new GIcon();
			icon.image 			  = urlImage+'pin_selection.png';
			icon.iconSize 		  = new GSize(36,43);
			icon.iconAnchor 	  = new GPoint(13,43);
			icon.infoWindowAnchor = new GPoint(13,0);
		var marker = new GMarker(point,{icon:icon});
		GoogleMap.addOverlay(marker);
		marker.bindInfoWindow(etiquette);
		//iMap.BindInfoWindowCustom(marker,etiquette);
		return marker;
	},

	//Plan Du réseau
	GetInfoWindowPlan: function(externalCode,marker)
	{
		//InfoStoparea
		var Idx = "" ;
		var Id = "";
		var ExternalCode = "";
		var Name = "";
		var CoordX = "";
		var CoordY = "";
		//InfoCity
		var CIdx = "";
		var CId= "" ;
		var CName= "" ;
		var CCityCode = "";
		var CExternalCode = "";
		var CCode = "";
		//InfoLines
		LineArray = new Array();
		Line = new Array();
		var LExternalCode = "";
		var LName = "";
		var LIdx = "";
		var LId= "";
		var LCode = "";
		var LNetworkExternalCode = "";
		var LNetwork = "";
		var Local = "http://vitalis.lan/";

 		$.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:externalCode},function(data){
 			var k=0;
 			//==> Parseur JSON
 			$.each(data,function(i,item){
	 			if(i=='LineArray')
	 			{
	 				var longueur = item.length;
	 				/* InfoLines */
	 				for(var j=0;j<longueur;j++)
	 				{
	 					LineArray[j]=new Array();
	 					LineArray[j]["LExternalCode"] = item[j].ExternalCode;
	 					LineArray[j]["LName"] = item[j].Name;
	 					LineArray[j]["LIdx"] = item[j].Idx;
	 					LineArray[j]["LId"] = item[j].Id;
	 					LineArray[j]["LCode"] = item[j].Code;
	 					LineArray[j]["LColor"] = item[j].Color;
	 					LineArray[j]["LNetworkExternalCode"] = item[j].NetworkExternalCode;
	 					LineArray[j]["LNetwork"] = item[j].Network;
	 				}
	 				/**/
	 			}
	 			else
	 			{
	 				/* InfoStopAea */
	 				Idx = item[k].Idx;
	 				Id = item[k].Id;
	 				ExternalCode = item[k].ExternalCode;
	 				Name = item[k].Name;
	 				CoordX = item[k].Coord.CoordX;
	 				CoordY = item[k].Coord.CoordY;

	 				/* InfoCity */
	 				CIdx = item[k].City.Idx;
	 				CId= item[k].City.Id;
	 				CName= item[k].City.Name;
	 				CCityCode = item[k].City.CityCode;
	 				CExternalCode = item[k].City.ExternalCode;
	 				CCode = item[k].City.Idx;
	 				//console.log(Idx+" "+Id+" "+ExternalCode+" "+Name+" "+CoordX+" "+CoordY);
	 			}
	 			k++;
 			});// ==> Fin parseur JSON
 			marker.openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",iMap.InfoContentBuilder(Name,CName,LineArray));
 		});
	},
	
	//Plan du réseau, avec affichage des lignes par choix.
	GetInfoWindowPlanExtended: function(externalCode,marker){
		$.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:externalCode},function(data){
			marker.openExtInfoWindow(GoogleMap,"custom_info_window_vitalis",data);
		});
	},
	
	GetKmlForLineExternalCode: function(lineExternalCode){
		var url = urlSite+'/route/vueMap?&output=1&options={"requestedtype":"linelist","lineexternalcode":"'+lineExternalCode+'"}';
		var contenu = clientAjaxGetXML(url);
		cleanPolylines(gpolylines);
		exmlPolylines = new EGeoXml('exmlPolylines', GoogleMap, null , {nozoom:true});
		exmlPolylines.parseString([contenu]);
		gpolylines = exmlPolylines.gpolylines;
	},

	BindInfoWindowCustom: function(marker,content)
	{
		GEvent.addListener(marker, 'click', function(){
            marker.openExtInfoWindow(
              GoogleMap,
              "custom_info_window_vitalis",
              content);
          });
	},

	/** FEUILLE DE ROUTE DETAIL ITINERAIRES **/
	/* Organise les markers custom avec markermanagers */
	DrawMarkerStopArea: function(detailMarker,tabToAdd)
	{
		var tab = detailMarker.split('=>');
		var type = tab[0];
		var cx = tab[2];
		var cy = tab[1];

		var point = new GLatLng(cx,cy);
		var icon = new GIcon();
		switch(type.toLowerCase())
		{
			case 'departure':
				icon.image = urlImage+"pin_depart.png";
				icon.iconSize = new GSize(36,43);
				icon.iconAnchor = new GPoint(13,43);
				icon.infoWindowAnchor = new GPoint(13,0);
			break;

			case 'arrival':
				icon.image = urlImage+"pin_arrivee.png";
				icon.iconSize = new GSize(36,43);
				icon.iconAnchor = new GPoint(13,43);
				icon.infoWindowAnchor = new GPoint(13,0);
			break;

			case 'car':
				icon.image = urlImage+"picto_bus.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;

			case 'bus':
				icon.image = urlImage+"picto_bus.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;

			case 'pieton':
				icon.image = urlImage+"picto_pieton.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;

			case 'correspondance':
				icon.image = urlImage+"pin_correspondance.png";
				icon.iconSize = new GSize(36,43);
				icon.iconAnchor = new GPoint(13,43);
				icon.infoWindowAnchor = new GPoint(13,0);
			break;

			case 'trains':
				icon.image = urlImage+"picto_train.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;

			case 'velo':
				icon.image = urlImage+"picto_velo.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;

			case 'voiture':
				icon.image = urlImage+"picto_voiture.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;

			default:
				icon.image = urlImage+"picto_bus.jpg";
				icon.iconSize = new GSize(28,32);
				icon.iconAnchor = new GPoint(14,32);
				icon.infoWindowAnchor = new GPoint(14,0);
			break;
		}
			var marker = new GMarker(point,{icon:icon});
			//var marker = new GMarker(point);

		if(tabToAdd == "zoom" && type != "correspondance")
		{
			markerZoom.push(marker);
		}
		else if(tabToAdd == "unzoom")
		{
			markerUnZoom.push(marker);
		}
	},

	/* encode les polylines */
	DrawPolylines: function(detailPolyline)
	{
		var tab = detailPolyline.split('=>');

		var num = parseInt(tab[0]);
		var type = tab[1];
		var cx = parseFloat(tab[3]);
		var cy = parseFloat(tab[2]);

		if(polylineManager[num] == null || polylineManager[num] == undefined || polylineManager[num] == false)
		{
			polylineManager[num] = new Array();
		}

		polylineManager[num].push(new GLatLng(cx,cy));
		polylineInfo[num] = type;
	},

	/* affiche les markers et les polylines */
	DrawResult: function()
	{
		var couleur;

		mgr.addMarkers(markerZoom,15,17);
		mgr.addMarkers(markerUnZoom,1,14);
		mgr.refresh();

		var polylineEncoder = new PolylineEncoder();

		for(var i=0;i<polylineManager.length;i++)
		{
			if(polylineManager[i].length>1)
			{
				var polyReturn = polylineEncoder.dpEncode(polylineManager[i]);

				switch(polylineInfo[i].toLowerCase())
				{
					case 'bus':
						couleur="#12BA12";
					break;

					case 'car':
						couleur="#12BA12";
					break;

					case 'm&#233;tro':
						couleur="#12BA12";
					break;

					case 'tramway':
						couleur="#12BA12";
					break;

					case 'trains':
						couleur="#12BA12";
					break;

					default:
						couleur="#6FA4CE";
					break;
				}

				polylineContener[i] = new GPolyline.fromEncoded({
									color:couleur,
									weight: 4,
									opacity: 1,
									points: polyReturn.encodedPoints,
									levels: polyReturn.encodedLevels,
									zoomFactor: 2,
									numLevels: 18
									});

				GoogleMap.addOverlay(polylineContener[i]);
			}
		}
	},

	/* bind une infobulle a un marker */
	BindMarkerInfoWindow: function(detailMarker,opt)
	{
		var tab = detailMarker.split('=>');
		var indice = parseInt(tab[0]);
		var text = tab[1];

		if(opt != 'zoom')
		{
			iMap.BindInfoWindowCustom(markerUnZoom[indice],text);
		}
		else if(opt == 'zoom')
		{

			iMap.BindInfoWindowCustom(markerZoom[indice],text);
		}
	}
});
