var geoXml ;
var map ;
var cadre_map ;
var path_kml ;
var opt_global = {messagebox:false,nozoom:true,icontype:"style",noshadow:true};
var opt_camping = {messagebox:false,nozoom:true,width_icon:32,icontype:"style",noshadow:true};
var opt_geo ;
var type_map = "global";
var doit_maj ;
var id_camping ;
var num_diapo ;
var search ;
var overview;
var is_recherche = false ;
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.contains = function(t) { return this.indexOf(t) >= 0 ? true : false }
function jeval(str){
	return eval("("+str+")");
}

function loadScript(callbackName) {	
	eval(callbackName+"();");
}
function is_def(va){
	return (typeof(va) != "undefined");
}
if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}
function load_googlemap(){	
	if (GBrowserIsCompatible()) 
	{  
		retaillFenetre();		
		map = new GMap2(cadre_map); 
		map.tab_id_cpg = new Array();
		map.tab_marker_default = new Array();
		if(type_map != "global"){
			map.setCenter(new GLatLng(lat,lon), zoo); 			
		}
		else{
			map.setCenter(new GLatLng(46.89023157359399, 4.04296875), 5);
			//map.setCenter(new GLatLng(49.4664306640625,-1.23532998561859), 10);
		}
		//overview = new GOverviewMapControl();
		//map.addControl(overview);
		map.addControl(new GMapTypeControl());
		map.addMapType(G_PHYSICAL_MAP);
		map.enableScrollWheelZoom(); 		
		chargerKML();
		GEvent.addListener(geoXml,'parsed',event_parsed);
	}
	else{
		alert('Votre navigateur n\'est pas compatible avec cette carte');
	}	
}
var ecouteurAjoutes ;
function event_parsed(){
    if(type_map == "global")
	    maj_nb_camping();
    cacherAttente();
	if(!ecouteurAjoutes ){	
		GEvent.clearInstanceListeners(map);	
		GEvent.addListener(map, 'click',traite_marker );	
		GEvent.addListener(map, 'moveend', fin_mouvement);
		GEvent.addListener(map, 'zoomend', traite_zoom);
		GEvent.addListener(map, 'movestart', debut_mouvement);		
	}
	if(map.getZoom() == zoom_anc && overlay_temp){
		
		map.addOverlay(overlay_temp);
		overlay_temp = null;
		
	}
}
function aller_orig(){
	map.setCenter(new GLatLng(46.89023157359399, 4.04296875), 5);
	closeOverlay();
}

function traite_marker(overlay, point) {
	//si click sur marqueur
	if(overlay && overlay.openInfoWindow){		
		//si description vide alors c'est un regroupement, donc on zoome, sinon on affiche la description		
		if(type_map == "global" && (!overlay.title || overlay.title.trim() == "")){
			var nouvo_zoom = parseInt(map.getZoom())+1;
			map.setCenter(new GLatLng(overlay.getLatLng().lat(),overlay.getLatLng().lng()),(nouvo_zoom));			
		}			
	}	
}

var timeout_zoom;
function traite_zoom(oldLevel,  newLevel){    
    if(timeout_zoom != null)
        clearTimeout(timeout_zoom);
	timeout_zoom = setTimeout("traitement_zoom_end("+oldLevel+")",100);    
    setDisabled("form_recherche_dispo",(newLevel <= 5));
    var direction = oldLevel > newLevel ? -1 : 1;
    if(newLevel >= 17) direction = -1;
    if(newLevel <= 0) direction = +1;
    var validZoom = [3,5,8,10,13,17];
    if (validZoom.indexOf(newLevel) == -1) {
        map.setZoom(newLevel + direction);    
        return false ;    
    }
	overlay_temp = null;
	closeOverlay();
	
}

function traitement_zoom_end(oldLevel){
    zoom_anc = oldLevel;
    if(estTransition() != 0){
           map.clearOverlays();
    }
}


var zoom_anc ;
function creer_url_maj_kml(){
	var bound = map.getBounds();
	var xmin = bound.getSouthWest().lng();
	var ymin = bound.getSouthWest().lat();
	var xmax = bound.getNorthEast().lng();
	var ymax = bound.getNorthEast().lat();
	var zoom = map.getZoom();	
	var path_aspx = (type_map == "global") ? "./kml/gen_kml.aspx" : "./kml/gen_kml_camp.aspx";
	if(type_map == "global"){
		if(map.getZoom() <= 5){
			path_kml =path_aspx+"?zoom="+map.getZoom();
		}
		else{
			path_kml = path_aspx+"?xmax="+xmax+"&ymax="+ymax+"&xmin="+xmin+"&ymin="+ymin+"&zoom="+zoom;
		}
		if(search){
			path_kml+= "&search="+search;
		}
	}
	else{
		path_kml = path_aspx+"?xmax="+xmax+"&ymax="+ymax+"&xmin="+xmin+"&ymin="+ymin+"&zoom="+zoom+"&id="+id_camping+"&d="+num_diapo;
	}		
	return path_kml ;
}
function chaine_id_cpg(){
	if(map.getZoom() <= 5 && type_map != "global") return '';
	if(map.tab_id_cpg.length <=0) return '';
	var l = map.tab_id_cpg.length;
	var s = map.tab_id_cpg[0]+"";
	for(var i = l - 1;i>0;i--){
		if(map.tab_id_cpg[i])
		s+= "+"+map.tab_id_cpg[i];
	}
	return s ;
}
var timeout_debut_mouvement ;
function debut_mouvement(){
	closeOverlay();
	//overview.hide();
    if(timeout_debut_mouvement != null)
        clearTimeout(timeout_debut_mouvement);
	timeout_debut_mouvement = setTimeout("traitement_debut_mouvement();",200);	
}

function traitement_debut_mouvement(index){
    zoom_anc = map.getZoom();
}
var timeout_fin_mouvement ;
function fin_mouvement(){
    if(timeout_fin_mouvement != null)clearTimeout(timeout_fin_mouvement);
	setTimeout("traitement_fin_mouvement();",200);	
}
var index_fin_mouvement = 0 ;
function traitement_fin_mouvement(index){
    if(type_map == "global"){
    if(estTransition() != 0){//si on passe du mode avec les regroupements, au mode sans, ou inversement

	    map.clearOverlays();
	    if(estTransition() > 0){//si on passe d'une vue avec regroupement, a une vue sans
	        geoXml.afficher_temp();
	    }
	    if(map.getZoom() <= 5){
            setTabDetails("","");
        }
    }	   	    		
	 
	//si on passe d'une vue sans regroupement a une vue avec et qu'on a mémorisé le contenu de la vue avec
	if(estTransition() < 0 && map.tab_marker_default.length != 0){
	    chargerCarteDefaut();
	}
	else{
	    //si on a pas le contenu avec regroupement, ou qu'on est pas dans une vue avec regroupement
	    if(map.tab_marker_default.length == 0 || (map.getZoom() > 5)){			        		
	        chargerKML();
	    }
	} 
	}	
}
//retourne 1 si on passe de l'affichage avec regroupement a celui sans, -1 sinon, 0 si on change pas d'affichage
function estTransition(){
    if(map.getZoom() <= 5  && zoom_anc > 5 )
        return -1 ;
    if(zoom_anc <= 5 && map.getZoom() > 5)
        return 1;
    return 0;
}
function chargerCarteDefaut(){

map.clearOverlays();
    var l = map.tab_marker_default.length;
    for(var i = 0;i<l;i++){
        var m = map.tab_marker_default[i] ;
        if(m.taille){
            var new_taille = (m.taille / 100) * 10 + 14 ;         
            m.getIcon().iconSize = new GSize(new_taille,new_taille);
            m.getIcon().iconAnchor = new GPoint(new_taille/2,new_taille/2);
            m.importance = 2 ;
        }
        map.addOverlay(m);
    }
}
var timer = 0 ;
function chargerKML(){
    var path_kml = creer_url_maj_kml()
	timer++;
	var s = "";
	
	if(geoXml)
	var ch = chaine_id_cpg() ;
	var tab_mark = new Array();
	if(geoXml == null ){
	    geoXml = new GeoXml("geoXml", map,path_kml,opt_geo);
	}
	else{
	    geoXml.url = path_kml;
	}	
    geoXml.chaine_id_cpg =ch;    
	setTimeout("lancerParseGeoXML("+timer+");",500);
}
function lancerParseGeoXML(id){
	if(timer == id){
		montrerAttente();
		geoXml.parse(); 
	}
}
var div_attente ;
function montrerAttente(){

    $("div_attente").style.visibility = "visible";	
    $("img_attente").style.visibility = "visible";	
}
function cacherAttente(){
	$("img_attente").style.visibility = "hidden";
	$("div_attente").style.visibility = "hidden";
}
function centrerCarteSur(lat,lon,zoom,geonameid){
	search = geonameid;
	ferme_mpe(i_mpe_recherche);
	if(map.getZoom() == zoom){
		map.panTo(new GLatLng(lat,lon));
	}
	else{
		map.setCenter(new GLatLng(lat,lon), zoom);
	}
}

/****** fonction utilisée dans le tab de detail *****************/
var marker_cercle;
function entourerPoint(lat, lon){
	var fingerIcon =  new GIcon(); 
	fingerIcon.image = "./style/circle.png" ;
	fingerIcon.shadow = "";
	fingerIcon.iconSize = new GSize(28, 28);
	fingerIcon.iconAnchor = new GPoint(14, 14);
	fingerIcon.transparent = "";
	fingerIcon.printImage = "";
	fingerIcon.mozPrintImage = "";
	if(!marker_cercle){
        marker_cercle = new GMarker(new GLatLng(lat,lon),{icon:fingerIcon,zIndexProcess:importanceOrder});
        marker_cercle.importance  = 1;        
        map.addOverlay(marker_cercle);
    }
    else{
        marker_cercle.setLatLng(new GLatLng(lat,lon));
        marker_cercle.show();
    }	
}
function supprimerEntourage()
{
    if(marker_cercle)
	    marker_cercle.hide();
}
function afficheInfoWindowMarker(i){
	GEvent.trigger(geoXml.tab_marker[i],"click");
}
/*********************************************************/
//permet de mettre des marker au dessus des autres
function importanceOrder (marker,b) {
	return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
}



var currentMarker ;
var MyOverlay = function(marker, html) {
	this.marker = marker;
	this.html = html;
}
function subGPoints(a,b) {
	return new GPoint(a.x-b.x, a.y-b.y);
}    
function addGPoints(a,b) {
	return new GPoint(a.x+b.x, a.y+b.y);
} 

function change_pays(val){
	setTimeout("enable_region("+(val == "")+");",500) ;    
}
function enable_region(oui){
	document.getElementById(id_ddl_region).disabled = oui ;
}


//retourne un tableau contenant tout les marqueurs présent dans le cadre
function setMarkerBound(include_hidden){	
var tab_marker_bound;
    if(typeof(include_hidden) == "undefined") include_hidden = true ;
	var b = map.getBounds();
	tab_marker_bound = new Array();
	var l = geoXml.tab_marker.length;
	for(var i = 0;i<l;i++){
		var m = geoXml.tab_marker[i];
		if(b.contains(m.getPoint()) && (include_hidden || (!include_hidden && !m.isHidden()))) {
			tab_marker_bound.push(m);
		}		
	}
	return tab_marker_bound ;
}
//traite la réponse de la dispo
function reponse_dispo(str_cpg_64,err){
    if(err != null){ 
        alert(err);
    }
    else{
	    var str_id_cpg = "+"+decode64(str_cpg_64)+"+";
	    is_recherche = true ;
	    var tab_marker_bound = setMarkerBound();
	    var l = tab_marker_bound.length ;
	    for(var i = 0;i<l;i++){
		    if(tab_marker_bound[i].camping){
			    var c = tab_marker_bound[i].camping.id ;
			    if(!str_id_cpg.contains("+"+c+"+")){
				    tab_marker_bound[i].hide();
			    }
			    else{
			        tab_marker_bound[i].show();
				    tab_marker_bound[i].setImage("./style/camping_dispo.png");
			    }
		    }	
	    }
	    }
	maj_nb_camping();
	cacherAttente()
}
//met a jour l'onglet du nombre de camping
function maj_nb_camping(){	
	if(map.getZoom() > 5){
	    var tab_marker_bound = setMarkerBound(!is_recherche);
		var l = tab_marker_bound.length ;
		var inner = "<div id='liste_camping'>";
		for(var i = 0; i <l ; i++){
		    if(tab_marker_bound[i].camping){		        
		        inner += TrimPath.processDOMTemplate("liste_cpg_jst",tab_marker_bound[i].camping);
		    }
		}
		setTabDetails(l,inner+"</div>");				
	}
	else{
		setTabDetails("","");	
	}
}
function annuler_recherche(){
    var l = geoXml.tab_marker.length ;
    for(var i = 0;i<l;i++){
	    geoXml.tab_marker[i].show();
		geoXml.tab_marker[i].setImage("./style/camping.png");	
	}
	is_recherche = false ;
	maj_nb_camping();
}

/****************** ENCODEUR /DECODEUR 64 *****************/
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encode64(input) {
	var output = "";
	var chr1, chr2, chr3;
	var enc1, enc2, enc3, enc4;
	var i = 0;
	do {
		chr1 = input.charCodeAt(i++);
		chr2 = input.charCodeAt(i++);
		chr3 = input.charCodeAt(i++);
		enc1 = chr1 >> 2;
		enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
		enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
		enc4 = chr3 & 63;
		if (isNaN(chr2)) {
			enc3 = enc4 = 64;
		} else if (isNaN(chr3)) {
			enc4 = 64;
		}
		output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
		keyStr.charAt(enc3) + keyStr.charAt(enc4);
	} while (i < input.length);
	return output;
}
function decode64(input) {
	var output = "";
	var chr1, chr2, chr3;
	var enc1, enc2, enc3, enc4;
	var i = 0;
	// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
	input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	do {
		enc1 = keyStr.indexOf(input.charAt(i++));
		enc2 = keyStr.indexOf(input.charAt(i++));
		enc3 = keyStr.indexOf(input.charAt(i++));
		enc4 = keyStr.indexOf(input.charAt(i++));
		chr1 = (enc1 << 2) | (enc2 >> 4);
		chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
		chr3 = ((enc3 & 3) << 6) | enc4;
		output = output + String.fromCharCode(chr1);
		if (enc3 != 64) {
			output = output + String.fromCharCode(chr2);
		}
		if (enc4 != 64) {
			output = output + String.fromCharCode(chr3);
		}
	} while (i < input.length);
	return output;
}