/* Map_function.js
 * 
 *
 * Contient toutes les fonctions utiles pour gérer la map google
 */
 
//déclaration et initialisation des variables globales
var map;
var _mFlags = {};
var centerLatitude = 43.74332071724287;
var centerLongitude = 5.795288085937; 
var startZoom = 8;
// tableau contenant tous les poi récupérés
var pois = new Array();
var zoomLinkHtml =  $('zoom-link').get('html');

var displayed_pois = new Array();
var isFilterEnabled = false;
var paginateLimit=100;
var paginateFirst=0;
var paginateLast=0;
var paginateSize=0;
var highlightedText='';
var currentPage=0;
var delay = 300;
var delay2 = 300;
var myTimer = null; 
var myTimer2 = null;
// exécuté au chargement
window.addEvent("load",function(){
	map = new GMap($('map'));
	window.unload = GUnload;
	//map.enableScrollWheelZoom();          
	map.addControl(new GLargeMapControl());
	map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom); 
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());
	GEvent.addListener(map,'zoomend',updateMarkers);
 	GEvent.addListener(map,'moveend',updateMarkers);
 	window.fireEvent('map');	
});




window.addEvent("loadPois",function(sous_menu){
	$('results-list').set('html', '<p>'+loading+'</p>');
    $('pub-list').set('html', '');
   	pois= new Array();
   	hideMarkers(pois);
	map.clearOverlays();
	$('zoom-link').style.visibility = 'hidden';	
   var jSonRequest = new Request.JSON({url: url_pois,secure:false, method: 'get', onComplete: function(jsonObj){

   pois = jsonObj;      
   var nbPois = pois.length;
   if(nbPois == 0){

         if(distance != "0"){
  	        $('results-list').set('html', '<p>'+aucun+' '+type +' '+trouve+'</p>');
 
  	     }
  	     else{
  	       	$('results-list').set('html', '<p>'+aucun+' '+type +' '+trouve+'.</p>');
  	     }    
  }
  else{
  		// si c'est la premiere fois qu'on charge une liste on attache la fonction de filtre
		if(!isFilterEnabled){
			// si jamais du texte est deja tapé, on l'highlight
			onFilter(null);
			isFilterEnabled = true;
			$('filter_box').addEvent('keyup',onFilter);
		}
		else{
    		loadList(pois);
		}
	    loadListPub(pois);
	    $('zoom-link').style.visibility = 'visible';
		$('zoom-link').set('html',zoomLinkHtml);
  } 
}}).send();

});   



     		

var deselectCurrent = function() {};



function changeBodyClass(from, to) {
     document.body.className = document.body.className.replace(from, to);
     return false;
}


function setAlertText(str) {
	$('alert').setHTML = '<p>' + str + '</p>';
}



// masque les marqueurs qui ne sont pas inclus dans la nouvelle liste des pois a afficher
function hideMarkers(liste_pois){

	for (var i=0;i<displayed_pois.length;i++) {
		if(!liste_pois.contains(displayed_pois[i])){
			if(displayed_pois[i].marker != null){
				// si un marqueur etait affiche et qu'il n'est plus dans la liste et que ce n'est pas une pub, on le cache
				if(displayed_pois[i].marker.displayed == true){
					map.removeOverlay(displayed_pois[i].marker);
  					displayed_pois[i].marker.displayed = false;
  				}
			}
  				
		}	
	}
 	displayed_pois = liste_pois;
 	updateMarkers();
}

 function updateMarkers() {
	//Don't remove all the overlays!
 	//map.clearOverlays();
 	var mapBounds = map.getBounds();
    // a 1 poi on associe un marker
    // et une propriete displayed si il est affiche

 	//loop though each of the points in memory and remove those that
 	//aren't going to be shown
  	for (var k=0;k<displayed_pois.length;k++) {
  		var poi = displayed_pois[k];
  		var latlng = new GLatLng(poi.address.latitude,poi.address.longitude);
  		// le poi n'est pas ete affiche
  		if(poi.marker == null){
  			if(mapBounds.contains(latlng)){
  			    var latlng = new GLatLng(poi.address.latitude,poi.address.longitude);
  				createMarker(latlng,poi);		
  				map.addOverlay(poi.marker);
  				poi.marker.displayed = true;
  			}	
  		}
  		else if(poi.marker.displayed == false){
  			if(mapBounds.contains(latlng)){		
  				map.addOverlay(poi.marker);
  				poi.marker.displayed = true;
  			}
  		}
  		// displayed_pois.marker.displayed == true
  	  	else {			
  			if(!mapBounds.contains(latlng) && poi.ordre_pub==null){		
  				map.removeOverlay(poi.marker);
  				poi.marker.displayed = false;
  			}   		

		} 
	}
}		



function onFilter(event){
	// on desactive le précédent appel
	if(myTimer!=null){
		   myTimer = $clear(myTimer);
	}
	
     myTimer = filter.delay(delay);
}


function filter(){
		currentPage=0;
		highlightedText = $('filter_box').value;
		//on filtre les pois
		var pois2 = new Array();
		// on cherche au niveau du nom, de l'adresse, de la ville,... 
		var regexp = new RegExp(highlightedText, "gi");
		for (var i = 0; i < pois.length; i++) {
			if(pois[i].name.search(regexp) !=-1 
			|| pois[i].address.LocalityName.search(regexp) !=-1 
			|| pois[i].address.ThoroughfareName.search(regexp) !=-1){ 
				pois2.push(pois[i]); 
			}
		}


		// on charge la liste
		loadList(pois2);
}


// tri les pub par ordre
function sortPub(a, b){
	return a.ordre_pub - b.ordre_pub;

}
 function loadListPub(pois){
 	var pois_pub= new Array();
  	for (var i=0;i<pois.length;i++) {
  		// on ajoute le poi dans la liste des pubs si ordre_pub est défini
  		if(pois[i].ordre_pub !=null){
        	pois_pub.push(pois[i]);
        }
  	}
  	pois_pub.sort(sortPub);
  	
  	for (var i=0;i<pois_pub.length;i++) {
 	  	loadPoiPub(pois_pub[i]);	
   }
} 



 function loadPoiPub(poi){
   			var listItem = new Element('li');
    		listItem.addClass('white');

			var linkInfoWindow = new Element('a');
			linkInfoWindow.setProperty('href','#');
 			linkInfoWindow.set('html', poi.name+' - ' +poi.address.LocalityName +'<br />');
			linkInfoWindow.injectInside(listItem);	
		//	new Element('span').set('html', poi.address.ThoroughfareName + ' - ' + poi.address.LocalityName+'<br />').addClass('description').injectInside(listItem); 
			listItem.injectInside('pub-list');
			var focusPoint = function(){
	   			 // on se déplace jusqu'au point
	    		var point = new GLatLng(poi.address.latitude,poi.address.longitude);
	    		if(poi.marker == null){
	    			createMarker(point,poi);		
	    			map.addOverlay(poi.marker);
	    			poi.marker.displayed = true;
	    		}	    
	    		map.panTo(point);
	    		// on actualise les marqueurs (si la zone était cachée)
	    		updateMarkers();
	    		// on affiche la popup 
	    		showWindow(poi,1);
	    		return false;
		}
	
	  
		linkInfoWindow.addEvent('click',focusPoint);
    
		listItem.addEvent('mouseenter', function(){	
				highlight(poi);		
		});
		listItem.addEvent('mouseleave', function(){	
				unHighlight(poi);				
		});	

}



 
function loadList(pois){
    $('results-list').set('html', '');
    var nbPoi = pois.length; 
    paginateSize = Math.ceil(nbPoi / paginateLimit);
    paginateFirst = (currentPage * paginateLimit) +1 ;
    if((currentPage + 1) * paginateLimit >= nbPoi +1 ){
        paginateLast = nbPoi;
    }
    else{
        paginateLast = (currentPage + 1) * paginateLimit;
    }
    var top;
    if(nbPoi == 1){
        if(distance != "0"){
            top = $('results-list').set('html', '<p><b>' + nbPoi + '</b> '+type+' '+trouve+'</p>');
        }
  	    else{
  	        top = $('results-list').set('html', '<p><b>' + nbPoi + '</b> '+type+' '+trouves+'</p>');
  	    }
  	}
  	else{
        if(distance != "0"){
            top = $('results-list').set('html', '<p><b>'+type + ' ' + paginateFirst + ' - ' + paginateLast + '</b> '+suruntotalde+' ' + nbPoi + ' '+types + '</p>');
        }
  	    else{
  	        top = $('results-list').set('html', '<p><b>'+type + ' ' + paginateFirst + ' - ' + paginateLast + '</b> '+suruntotalde+' ' + nbPoi + ' '+types + '</p>'); 
  	    }  	       
    }
  	// map.clearOverlays();
//	new Fx.Scroll($('sidebar')).toElement(top);
     // tableau des pois affichés suite a la pagination

    var paginatepois = new Array();
    for (var k=paginateFirst-1;k<paginateLast;k++) { 
 		paginatepois.push(pois[k]);
	}
    hideMarkers(paginatepois);
    
 	for (var k=0;k<paginatepois.length;k++) { 
 		loadPoi(paginatepois[k]);
	}
	
	// affichage du footer que si il y a plus de paginateLimit pois
	
	if(paginateSize > 1){ 
		var footer = new Element('p').set('html', pagederesultats+': ');
		for (var k=0;k<paginateSize;k++) {
			// pas de lien sur la page courante
			if(k == currentPage){
               	new Element('b').set('html', ' [' + (k+1) +'] ').injectInside(footer);
			}
			else{
			    // pageNumber: numero de la page a afficher
				footer.appendText(' ');
                var linkPage = new Element('a');
	            linkPage.setProperty('href','#');
	            linkPage.set('html', '[' + (k+1) + ']');
                //footer += '<a href="#">[' + (k+1) +']</a> ';
                linkPage.addEvent('click',paginate(pois,k));
                linkPage.injectInside(footer);
				footer.appendText(' ');
			}
		}
		footer.injectInside('results-list');
    }
    


}


function paginate(pois,page){
 return function(){
	                currentPage=page;
                    loadList(pois);  	
                };

}


function loadPoi(poi){
    var regexpHighlight = new RegExp('('+highlightedText+')', "gi");
    var name = poi.name.replace(regexpHighlight ,'<strong>$1</strong>');
   // var ThoroughfareName = poi.address.ThoroughfareName.replace(regexpHighlight ,'<strong>$1</strong>');
    var LocalityName = poi.address.LocalityName.replace(regexpHighlight ,'<strong>$1</strong>');
  
  
   	var listItem = new Element('li');
    listItem.addClass('white');

	var linkInfoWindow = new Element('a');
	linkInfoWindow.setProperty('href','#');
 	linkInfoWindow.set('html', name+' - ' + LocalityName+' ('+ poi.address.PostalCodeNumber.substr(0,2)+')<br />');
	linkInfoWindow.injectInside(listItem);	
	//new Element('span').set('html', ThoroughfareName + ' - ' + LocalityName+'<br />').addClass('description').injectInside(listItem);  

	listItem.id = 'poi'+poi.id;
	listItem.injectInside('results-list');	


    var focusPoint = function() {
    var point = new GLatLng(poi.address.latitude,poi.address.longitude);
    unHighlight(poi);
	    if(poi.marker == null){
	    	createMarker(point,poi);		
	    	map.addOverlay(poi.marker);
	    	poi.marker.displayed = true;
	    }	    
    	var position = map.getCenter();
    	var zoom = map.getZoom();
    	map.setCenter(point,15);
    	// on affiche la popup 
   		showWindow(poi,1);
   		var zoomLink=$('zoom-link');
   		var html = zoomLink.get('html');

   		var unfocusPoint = function(){
			// on se replace au centre de la carte 
			map.setCenter(position, zoom);
			zoomLink.set('html',html);
			return false;
		}
		 
		var link = new Element('a');
   		link.setProperty('href','#');
   		link.set('html', "Afficher toute la carte");
   		link.addEvent('click',unfocusPoint);
   		zoomLink.set('html','');
   		link.injectInside(zoomLink);
        updateMarkers();
   		GEvent.addListener(poi.marker, 'infowindowclose',unfocusPoint);	
   		 return false;
	}
		
	
/*	var focusPoint = function(){
	    // on se déplace jusqu'au point
	    var point = new GLatLng(poi.address.latitude,poi.address.longitude);
	    if(poi.marker == null){
	    	createMarker(point,poi);		
	    	map.addOverlay(poi.marker);
	    	poi.marker.displayed = true;
	    }	    
	    map.panTo(point);
	    // on actualise les marqueurs (si la zone était cachée)
	    updateMarkers();
	   ;
	    // on affiche la popup 
	    showWindow(poi,1);
	    return false;
	}
*/	
	  
	linkInfoWindow.addEvent('click',focusPoint);
	

    
	listItem.addEvent('mouseenter', function(){	
			highlight(poi);		
	});
	listItem.addEvent('mouseleave', function(){	
			unHighlight(poi);				
	});      
	
}




// affiche l'infowindow associée au poi
// paramètres: l'objet poi et le numero de l'onglet pour la page maximisée
function showWindow(poi,tab) {
	var marker = poi.marker;
	deselectCurrent();
	var listItem = $('poi'+poi.id);
	if(listItem!=null){
		listItem.addClass('selected');
		deselectCurrent = function() {listItem.removeClass('selected')}
    }

   	var approx='';
   	if(poi.address.accuracy < 7){
   	    approx = '<span class="iscentroid">'+positionnementapproximatif+'</span><br>';
   	}	
    // bug IE
    if (document.all) {
		var maxContentFrame = document.createElement('<iframe name="window_iframe">');
	}
	else{
   		var maxContentFrame = document.createElement('iframe');
   		maxContentFrame.name="window_iframe";
	}
	if(tab==1){
   		maxContentFrame.src = 'details_poi.php?frame=true&id=' + poi.id;
   	}
   	else{
   	   	maxContentFrame.src = 'avis_poi.php?frame=true&id=' + poi.id;
   	}
   	maxContentFrame.frameBorder="0";
   	maxContentFrame.scrolling="auto";
   	maxContentFrame.border=0;
   	maxContentFrame.style.width="98%";
   	maxContentFrame.style.border="0";
   	maxContentFrame.style.height="99%";

	var divWindow = new Element('div');

    divWindow.setProperty('html','<div class="maxtitle">' + ' <b>' + poi.name + '</b></div>' + 
	approx + poi.address.ThoroughfareName + '<br>' +
	poi.address.PostalCodeNumber + ' ' + poi.address.LocalityName + '<br>' +
    prefixe + poi.telephone + '<br>');
    // lien visite virtuelle
    if(poi.url360 != null){
		var link360 = new Element('a');
		link360.setProperty('href',poi.url360);
		link360.setProperty('target','_blank');
		link360.addClass('none');
		link360.set('html','<img border="0" src="/v1/images/famfamfam/camera.png" /><b>Visite virtuelle 360°</b>');
   	 	link360.injectInside(divWindow);
 	/*	var openSqueezeBox = function(){
   	   		SqueezeBox.initialize({
   	    		handler:'iframe',
        		size: {x: 1000, y: 550}
    		});
			return !SqueezeBox.fromElement(link360);
		};      
   		link360.addEvent('click',openSqueezeBox);      */
   		new Element('br').injectInside(divWindow);
    }

    
   	// ebook 
    if(poi.ebook != null){
		var ebook = new Element('a');
		ebook.setProperty('href',poi.ebook);
		ebook.setProperty('target','_blank');
		ebook.addClass('none');
		ebook.set('html','<img border="0" src="/v1/images/famfamfam/book.png" /><b>Ebrochure</b>');
   	 	ebook.injectInside(divWindow);
 	/*	var openSqueezeBox = function(){
   	   		SqueezeBox.initialize({
   	    		handler:'iframe',
        		size: {x: 1000, y: 550}
    		});
			return !SqueezeBox.fromElement(ebook);
		};      
   		ebook.addEvent('click',openSqueezeBox);  */
   		new Element('br').injectInside(divWindow);
    }  
     
    
        // lien site web
    if(poi.website != null){
		var website = new Element('a');
		website.setProperty('href',poi.website);
		website.setProperty('target','_blank');
		website.addClass('none');
		website.set('html','<img border="0" src="/v1/images/famfamfam/world.png" />Site Internet');
   	 	website.injectInside(divWindow);
   	 	new Element('br').injectInside(divWindow);
    }
     
    	// adresse mail 
    if(poi.email != null){
		var email = new Element('a');
		email.setProperty('href','mailto:'+poi.email);
		email.addClass('none');
		email.set('html','<img border="0" src="/v1/images/famfamfam/email.png" />Email');
   	 	email.injectInside(divWindow);
   	 	new Element('br').injectInside(divWindow);
    }    

    	// description 
    if(poi.description != null){
    	new Element('br').injectInside(divWindow);
		var desc = new Element('span');
		desc.set('html',poi.description);
   	 	desc.injectInside(divWindow);
   	 	new Element('br').injectInside(divWindow);
    }   
    
    divWindow.addClass('info-window');      
    marker.openInfoWindow(divWindow);

	

	/*
	SqueezeBox.assign($$('a.boxed'), {
		parse: 'rel'
	});*/


}



function zoomCity(lat, lng){
     	var position = map.getCenter();
    	var zoom = map.getZoom();
    	map.setCenter(new GLatLng(lat,lng),13);
   		var html = $('zoom-link').get('html');
   		var zoomLink = $('zoom-link');
   		var unfocusPoint = function(){
			// on se replace au centre de la carte 
			map.setCenter(position, zoom);
			zoomLink.set('html',html);
			return false;
		} 
		var link = new Element('a');
   		link.setProperty('href','#');
   		link.set('html', "Afficher toute la carte");
   		link.addEvent('click',unfocusPoint);
   		zoomLink.set('html','');
   		link.injectInside(zoomLink);	
}



function createMarker(point, poi) {
    var icon = new GIcon();
    var rubriques=''
    if(poi.rubriques.length > 0){
	    rubriques += poi.rubriques[0].code;
	    for (var i = 1; i < poi.rubriques.length; i++) {
           rubriques += '_'+poi.rubriques[i].id;
        }
	}
		                        
   // icon.image = 'http://www.allogarage.fr/~'+manufacturers+'/~'+networks+'/animated_marker.gif';
   //icon.image = 'http://www.rivieraforyou.com/v1/main/animated_gif.php?codes_NAF='+codes_NAF;
   //icon.shadow = "../images/shadow_marqueur.png"; 
    
    icon.image = poi.rubriques[0].image;
    icon.shadow = poi.rubriques[0].shadow;
    icon.iconSize=new GSize(32,32);
    icon.shadowSize=new GSize(56,32);
   	icon.iconAnchor=new GPoint(16,32);
    icon.infoWindowAnchor=new GPoint(16,0); 
   

    
    //icon.iconSize = new GSize(36,36);
    //icon.shadowSize = new GSize(55, 36);
    //icon.iconAnchor = new GPoint(18, 36);
    //icon.infoWindowAnchor = new GPoint(16, 1); 
    var marker = new GMarker(point,icon);    
    //var marker = new GMarker(point,G_DEFAULT_ICON);
    
    poi.marker = marker;
   

    var focusPoint = function() {
    	var position = map.getCenter();
    	var zoom = map.getZoom();
    	map.setCenter(marker.getPoint(),15);
    	
   		showWindow(poi,1);
   		var html = $('zoom-link').get('html');
   		var zoomLink = $('zoom-link');
   		
   		var unfocusPoint = function(){
			// on se replace au centre de la carte 
			map.setCenter(position, zoom);
			zoomLink.set('html',html);
		} 
		var link = new Element('a');
   		link.setProperty('href','#');
   		link.set('html', "Afficher toute la carte");
   		link.addEvent('click',unfocusPoint);
   		zoomLink.set('html','');
   		link.injectInside(zoomLink);
   		
   		GEvent.addListener(marker, 'infowindowclose',unfocusPoint);	
	}
	
    

	marker.highlightCircle = null;

	GEvent.addListener(marker, "mouseover", function(){ highlight(poi);	onScroll(poi);});	
 	GEvent.addListener(marker, "mouseout", function(){ unHighlight(poi);});
	GEvent.addListener(marker, 'click', focusPoint); 
	
  	return marker;
}



function onScroll(poi){
	// on desactive le précédent appel
	if(myTimer2!=null){
		   myTimer2 = $clear(myTimer2);
	}
	if(poi != null){
		var scroll = function(){
			var listItem = $('poi'+poi.id);
			new Fx.Scroll($('results-list')).toElement(listItem);
		};
     	myTimer2 = scroll.delay(delay2);
	}
}

function scroll(poi){

}



// lors du survol de la souris sur un marker
function highlight(poi){
	if(poi.marker != null){
		var marker = poi.marker;
		var polyPoints = makePolyPoints(marker);
		if(marker.highlightCircle == null){
			marker.highlightCircle = new GPolygon(polyPoints,"#000000",2,0.0,"#747489",.9);
			try
			{
				map.addOverlay(marker.highlightCircle);
			}catch(err)
			{
				return null;
			}
		}
	}
	var listItem = $('poi'+poi.id);
	if(listItem != null){
		listItem.addClass('highlight');
	}	

}

// sortie de la souris sur un marker
function unHighlight(poi){
	if(poi.marker != null){
		var marker = poi.marker;
		if(marker.highlightCircle != null){
			map.removeOverlay(marker.highlightCircle);	
			marker.highlightCircle = null;
		}
	}
	var listItem = $('poi'+poi.id);
	if(listItem != null){
		listItem.removeClass('highlight');
	}
}


	
function makePolyPoints(_marker)
{
	var polyPoints = Array();
	var markerPoint=  _marker.getLatLng();
	var projection = G_NORMAL_MAP.getProjection();
 	var mapZoom = map.getZoom();
	var clickedPixel = projection.fromLatLngToPixel(markerPoint, mapZoom);
	//var polySmallRadius = 20;
	var  ellipseRadA = 20;
	var ellipseRadB = 10;

	var polyNumSides = 20;
 	var polySideLength = 18;

	for (var a = 0; a<(polyNumSides+1); a++) {
 		var aRad = polySideLength*a*(Math.PI/180);
		var pixelX =  clickedPixel.x + ellipseRadA * Math.cos(aRad);
 		var pixelY =  + clickedPixel.y + ellipseRadB * Math.sin(aRad);
 		var polyPixel = new GPoint(pixelX,pixelY);
 		var polyPoint = projection.fromPixelToLatLng(polyPixel,mapZoom);
 		polyPoints.push(polyPoint);
 	}
	return polyPoints;
}



function xmlToHtml(x) {
x=x.replace( /\&apos;/g, '\'');
return x;
}


/*
// fonctions auxiliaires
function windowHeight() {
	// Standard browsers (Mozilla, Safari, etc.)
	if (self.innerHeight)
		return self.innerHeight;
	// IE 6
	if (document.documentElement && document.documentElement.clientHeight)
		return document.documentElement.clientHeight;
	// IE 5
	if (document.body)
		return document.body.clientHeight;
	// Just in case.
	return 0;
}

function handleResize() {
	var height = windowHeight() - document.getElementById('header').offsetHeight -document.getElementById('menu').offsetHeight -document.getElementById('footer').offsetHeight - 40;
	document.getElementById('map').style.height = height + 'px';
	document.getElementById('sidebar').style.height = height + 'px';
}

window.onresize = handleResize;
handleResize();
*/