var map = null;
var geocoder = null;
var manager = null;
var trackersXs = new Array();
var markerSearch =null;
var centerPoint = null;
var iconXML = null;
var iconSearch = null;
var polyOver = new Array();
var pointDist = new Array();
window.addEvent('load',function() {
	if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map"));
			centerPoint =new GLatLng(46.3, 2.3);
			iconXML = new GIcon();
			iconSearch = new GIcon();
			// ====== Restricting the range of Zoom Levels =====
			 var mt = map.getMapTypes();
			 for (var i=0; i<mt.length; i++) {
			 mt[i].getMinimumResolution = function() {return 6;};
			 mt[i].getMaximumResolution = function() {return 12;};
			 }
			// Add a move listener to restrict the bounds range
			 GEvent.addListener(map, "move", function() {
				 checkBounds();
			 });
			 // The allowed region which the whole map must be within
			 var allowedBounds = new GLatLngBounds(new GLatLng(41.3874,-4.4869), new GLatLng(51.0343,11.1594));
			 // If the map position is out of range, move it back
			 function checkBounds() {
			 if (allowedBounds.contains(map.getCenter())) {
			 return;
			 }
			 // It`s not OK, so find the nearest allowed point and move there
			 var C = map.getCenter();
			 var X = C.lng();
			 var Y = C.lat();
			 var AmaxX = allowedBounds.getNorthEast().lng();
			 var AmaxY = allowedBounds.getNorthEast().lat();
			 var AminX = allowedBounds.getSouthWest().lng();
			 var AminY = allowedBounds.getSouthWest().lat();
			 if (X < AminX) {X = AminX;}
			 if (X > AmaxX) {X = AmaxX;}
			 if (Y < AminY) {Y = AminY;}
			 if (Y > AmaxY) {Y = AmaxY;}
			 map.setCenter(new GLatLng(Y,X));
			 }
	    map.addControl(new GLargeMapControl());
		map.setCenter(centerPoint, 6);			
		geocoder = new GClientGeocoder();
		geocoder.setBaseCountryCode('fr');
		var mgrOptions = {maxZoom: 11, trackMarkers: false };
		manager = new GMarkerManager(map,mgrOptions);
		GEvent.addListener(manager, 'changed', function() {});

		iconXML.image =baseUrl+'img/map_spot.png';
		iconXML.shadow =null;
		iconXML.iconAnchor= new GPoint(5,5);
		iconXML.iconSize=new GSize(10,10);
		iconXML.infoWindowAnchor = new GPoint(5,5);
		
		iconSearch.image =baseUrl+'img/map_search.png';
		iconSearch.shadow =null;
		iconSearch.iconAnchor= new GPoint(20,20);
		iconSearch.iconSize=new GSize(40,40);
		iconSearch.infoWindowAnchor = new GPoint(20,20);		
	    
	     function creerMarker(point, onglet1, onglet2) {
	       var marker = new GMarker(point,{'icon':iconXML, 'title':onglet1+'. fréquence : '+onglet2});
	       var infoTabs = [
	         new GInfoWindowTab("Infos", "<br/>"+onglet1+" : <b style='color:#000'>"+onglet2+"</b> FM")
	         ];
	       GEvent.addListener(marker, "click", function() {
	         marker.openInfoWindowTabsHtml(infoTabs);
	         });
	       return marker;
	       }
         GDownloadUrl(xmlFreq, function(data) {
           var xml = GXml.parse(data);
           var markers = xml.documentElement.getElementsByTagName("marker");
           for (var i = 0; i < markers.length; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), 9);
			trackersXs[i]= creerMarker(point, markers[i].getAttribute("info"),markers[i].getAttribute("details"));
			trackersXs[i]._ville = 	markers[i].getAttribute("info");
			trackersXs[i]._freq = 	markers[i].getAttribute("details");					
           }
			if(Browser.Engine.trident4) {
				manager.addMarkers(trackersXs,7);
			} else {
				manager.addMarkers(trackersXs,6);
			}
			manager.refresh();	
         });			
	}

});
window.addEvent('unload',function() {
	GUnload();
});

function afficherSearch(address){
	if(markerSearch!=null){
		markerSearch.remove();
	}	
	if(!$defined($('multipleresult'))){
		var _multiDiv = new Element('div',{'id':'multipleresult'});
		_multiDiv.inject($('map'),'after');
	}
	var _multi = $("multipleresult");
	var _placeMarks =[];
	var infoTabs = [new GInfoWindowTab("Infos", "<br/>Votre recherche ne trouve pas de résultat correspondant à une localité")];
	_multi.set('HTML',"Merci de préciser votre recherche<br/><br/>");
	_multi.setStyle("display","none");
	if (geocoder) {
		geocoder.getLocations(address+", France",function(result) {	
			if(result.Placemark && result.Placemark.length>1){
				var _resultHtml ="";
				result.Placemark.each(function(place) {
					if(place.AddressDetails.Country.CountryNameCode=="FR"){
						_placeMarks.include(place);
					}
				});
				_placeMarks.each(function(_placeMark) {
					var _address = _placeMark.address.split(',')[0];
					var _br = new Element('br');
					var _b = new Element('b',{
						'html':', '+_placeMark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName+' France'			
					});
					var _link = new Element('a',{
						'href':_address,
						'html':_address			
					});
					_link.inject(_multi);
					_b.inject(_multi);
					_br.inject(_multi);
					_link.addEvent('click',function(e) {
						e = new Event(e).stop();
						afficherAdresse(_address,10,_placeMark.Point.coordinates[0],_placeMark.Point.coordinates[1])
					});
				});
				_multi.setStyle("display","block");
			} else {
				if(result.Placemark && result.Placemark.length>0){
					afficherAdresse(address, 10);
				} else {
					map.setCenter(centerPoint, 6);
					map.openInfoWindowTabs(centerPoint, infoTabs);					
				};
			};
		});
	};
}

function afficherAdresse(address,zoomlevel) {
	$("multipleresult").setStyle("display","none");
	$('mapsearch').getElements('input[type=text]')[0].value=address;
	if(arguments.length>2){
		if(markerSearch!=null){
			markerSearch.remove();
		}
		for(k=0;k<=polyOver.length-1;k++){
			map.removeOverlay(polyOver[k]);
		}
		var _point = new GLatLng(arguments[3],arguments[2]);
		markerSearch = new GMarker(_point,{'icon':iconSearch,'zIndexProcess':function() {return -10000000;}});
		map.addOverlay(markerSearch);
		map.setCenter(_point,arguments[1]);
		findSpot(address,markerSearch,_point);
	} else {
		geocoder.getLatLng(
			address+', France',
			function(point) {
				if (!point) {
					if(markerSearch!=null){
						markerSearch.remove();
					}					
					var infoTabs = [new GInfoWindowTab("Infos", "<br/>Nous n'avons pas de résultat pour votre recherche")];
					map.setCenter(centerPoint, 6);
					map.openInfoWindowTabs(centerPoint, infoTabs);
					return false;
				} else {
					if(markerSearch!=null){
						markerSearch.remove();
					}
					markerSearch = new GMarker(point,{'icon':iconSearch,'zIndexProcess':function() {return -10000000;}});	
					map.addOverlay(markerSearch);
					map.setCenter(point,zoomlevel);				
					findSpot(address,markerSearch,point);
				};
			}
		);
	}
 }
function distance(tracker, dist, lineObj) {
	this.Tracker = tracker;
    this.Distance = dist;
    this.LineObj = lineObj;
}
function sortByLength(a, b) {
	var x = a.Distance;
	var y = b.Distance;
	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
function findSpot(address,markerSearch,point){
	var bounds = map.getBounds();
	var visibleTrackers=[];
	for(i=0;i<=trackersXs.length-1;i++){
		if(bounds.contains(trackersXs[i].getPoint())){
			visibleTrackers.push(trackersXs[i]);
		};
	};
	if(visibleTrackers.length==0){
		afficherAdresse(address,map.getZoom()-1);
	} else {
		if(!bounds.contains(point)){
			map.setCenter(centerPoint, 6);
			var infoTabs = [new GInfoWindowTab("Infos", "<br/>Votre recherche indique un résultat en dehors de la zone géographique possible")];
			map.openInfoWindowTabs(centerPoint, infoTabs);
			return false;
		};
		for(k=0;k<=polyOver.length-1;k++){
			map.removeOverlay(polyOver[k]);
		}
		polyOver=[];
		pointDist=[];
		for(j=0;j<=visibleTrackers.length-1;j++){
			polyOver.push(new GPolyline([markerSearch.getLatLng(),visibleTrackers[j].getLatLng()],'#FF0000'));		
			pointDist[j]=new distance(visibleTrackers[j],polyOver[j].getLength(),polyOver[j]);
		}
		pointDist.sort(sortByLength);
		var pointInfo = "<br/>";
		for(l=0;l<=pointDist.length-1;l++) {
			pointInfo += pointDist[l].Tracker._ville+" : <b>"+pointDist[l].Tracker._freq+"</b> FM<br/>";
			map.addOverlay(pointDist[l].LineObj);
			if(l>1 || pointDist[l].Distance==0){
				break;
			}
		}
	   var infoTabs = [new GInfoWindowTab("Infos", pointInfo)];
       GEvent.addListener(markerSearch, "click", function() {
         markerSearch.openInfoWindowTabsHtml(infoTabs);
       });
		markerSearch.openInfoWindowTabs(infoTabs);
	}		
}