//Variables globales
var map = null;
var geocoder = null;
var number = null;
var rootLink = null;
var dataFolder = null;
var recursiveSearch = null;
var polylines = new Array();
var refresh = true;
var contextPath = null;
var selectedName = null;
var selectedKey = null;
var imgPath = null;
var arrayLink = '';
var arrayCount = 0;
var result_label_to_display = 'default';
var limitPoint = 100;
var autosearch = false;
var displayURI = false;
var siteRoot = null;
var labelURI = null;
var siteContext = null;
var initialization = true;

// Retourne un marker
function createMarker(point, diff_key, texte, imagepath, shadowpath, shadowIsDisabled, imageWidth, imageHeight, shadowWidth, shadowHeight,offsetWidth, offsetHeight,xMin,yMin,xMax,yMax) {
	
	var customImagePath = 'http://'+location.host+imagepath;
	var customShadowPath = 'http://'+location.host+shadowpath;
	
	
	//alert('imagePath = '+imagepath+' - customImagePath = '+customImagePath);
	//alert('shadowpath = '+shadowpath+' - customShadowPath = '+customShadowPath);
	
	
	
	var customIcon = new GIcon(G_DEFAULT_ICON);
	customIcon.image = customImagePath;
	customIcon.shadow = customShadowPath;
	
	customIcon.iconSize = new GSize(parseFloat(imageWidth),parseFloat(imageHeight));
	customIcon.shadowSize = new GSize(parseFloat(shadowWidth),parseFloat(shadowHeight));
	
	
	//alert('image : w:'+parseFloat(imageWidth)+',h:'+parseFloat(imageHeight));
	//alert('shadow : w:'+parseFloat(shadowWidth)+',h:'+parseFloat(shadowHeight));
	
	
	
	if(String(shadowIsDisabled) == 'true'){
		customIcon.shadow = '';
		customIcon.shadowSize = new GSize(parseFloat(imageWidth),parseFloat(imageHeight));
	}
	
	var anchorWidth = parseInt(imageWidth)/2+parseInt(offsetWidth);
	var anchorHeight = parseInt(imageHeight)+parseInt(offsetHeight);
	customIcon.iconAnchor  = new  GPoint(anchorWidth,anchorHeight);

	                
	// Set up our GMarkerOptions object
	markerOptions = { icon:customIcon };

	
	var marker = new GMarker(point, markerOptions);
	marker.value = diff_key;
	// Ajoute un ecouteur sur le marker
	if(xMin==null || xMin=='' || xMin=='null'){
		GEvent.addListener(marker, "click", function() {
			//refresh = false;
			selectedName = $('marker[diff_key=' + diff_key + ']').attr('name');
			selectedKey = diff_key;
			map.openInfoWindowHtml(point, generatePopupInfo(diff_key));
			displayInfos(diff_key);
			refreshRightList();
			
			//var offset = p.offset();
			//p.html( "left: " + offset.left + ", top: " + offset.top );
	
			//var top = $('#partner'+diff_key).offset().top - $('#div_locations').offset().top
			//$('#div_locations').scrollTop(top);
			var top = document.getElementById('partner'+diff_key).offsetTop - document.getElementById('div_locations').offsetTop;
			document.getElementById('div_locations').scrollTop = top ;
			
			document.getElementById('partner'+diff_key).focus();
			
		});
	}else{
		GEvent.addListener(marker, "click", function() {
			map.closeInfoWindow();
			zoomOnMap(xMin,yMin,xMax,yMax,false,'0','0','13',false,false);
		});
	}
	return marker;
}


function getURIToDiplay(completeURI) {
	var regex = new RegExp(siteRoot, "gim");
	return siteContext+completeURI.replace(regex, '');
}

function getURLToDiplay(completeURL) {
	var regex = new RegExp("[H|h][T|t][T|t][P|p]([S|s]){0,1}://", "gim");
	return completeURL.replace(regex, '');
}

//generation du contenu de la popup
function generatePopupInfo(diff_key) {
	var xml = $('marker[diff_key=' + diff_key + ']');

	var v_name = xml.attr('name');
	var v_adress = xml.attr('address');
	var v_code = xml.attr('cp');
	var v_city = xml.attr('city');
	var v_country = xml.attr('country');
	var v_email = xml.attr('email');
	var v_phone = xml.attr('telephone');
	var v_data = xml.attr('description');
	var v_fax = xml.attr('fax');
	var v_url = xml.attr('web');
	var v_uri = xml.attr('partner_uri');

	var myHtml = '';
	myHtml = '<div class="info_bulle">';
	myHtml += '<p class="name">' + v_name + '</p>';
		
	myHtml += '<div class="coord">';
	if ((v_adress != undefined && v_adress != '' && v_adress != ' ')
			|| (v_code != undefined && v_code != '' && v_code != ' ')
			|| (v_city != undefined && v_city != '' && v_city != ' ')
			|| (v_country != undefined && v_country != '' && v_country != ' ')) {
		myHtml += '<table><tr class="adress"><td class="picto">';
		myHtml += '<img src="' + imgPath + 'book_open.gif" alt="address"/>';
		myHtml += '</td><td class="value">';
		myHtml += v_adress + '<br/>' + v_code + '&nbsp;' + v_city + '<br/>'
				+ v_country;
		myHtml += '</td></tr></table>';
	}
	if (v_email != undefined && v_email != '' && v_email != ' ') {
		myHtml += '<table><tr class="email"><td class="picto">';
		myHtml += '<img src="' + imgPath + 'email_edit.gif" alt="email"/>';
		myHtml += '</td><td class="value">';
		myHtml += v_email;
		myHtml += '</td></tr></table>';
	}
	if (v_phone != undefined && v_phone != '' && v_phone != ' ') {
		myHtml += '<table><tr class="phone"><td class="picto">';
		myHtml += '<img src="' + imgPath + 'phone.gif" alt="phone"/>';
		myHtml += '</td><td class="value">';
		myHtml += v_phone;
		myHtml += '</td></tr></table>';
	}
	if (v_fax != undefined && v_fax != '' && v_fax != ' ') {
		myHtml += '<table><tr class="phone"><td class="picto">';
		myHtml += '<img src="' + imgPath + 'fax.gif" alt="phone"/>';
		myHtml += '</td><td class="value">';
		myHtml += v_fax;
		myHtml += '</td></tr></table>';
	}
	if (v_url != undefined && v_url != '' && v_url != ' ') {
		var urlToDisplay = getURLToDiplay(v_url);
		myHtml += '<table><tr class="url"><td class="picto">';
		myHtml += '<img src="' + imgPath + 'page_world.gif" alt="Url"/>';
		myHtml += '</td><td class="value">';
		myHtml += '<a target="_blank" href="' + v_url + '">' + urlToDisplay
				+ '</a>';
		myHtml += '</td></tr></table>';
	}
	if (displayURI && v_uri != undefined && v_uri != '' && v_uri != ' ') {
		var uriToDisplay = getURIToDiplay(v_uri);
		myHtml += '<table><tr class="uri"><td class="picto">';
		myHtml += '<img src="' + imgPath + 'page_world.gif" alt="Url"/>';
		myHtml += '</td><td class="value">';
		myHtml += '<a target="_self" href="' + uriToDisplay + '">' + labelURI
				+ '</a>';
		myHtml += '</td></tr></table>';
	}
	myHtml += '</div>';
	if ((v_data != undefined && v_data != '' && v_data != ' ')) {
		myHtml += '<div class="data">' + v_data + '</div>';
	}
	myHtml += '</div>';


	return myHtml;
}



//Initialise la carte 
function initialize(servletContextPath, entriesFolder, recursiveFolder,
		polylines_array, jspContextPath, partenaire_label, forcedValue,
		forcedLatitude, forcedLongitude, forcedZoom, autoSearch,maxpoint,location,display_uri,site_root,label_uri,site_context) {

	if (GBrowserIsCompatible()) {
		rootLink = servletContextPath;
		dataFolder = entriesFolder;
		recursiveSearch = recursiveFolder;
		autosearch = autoSearch;
		contextPath = jspContextPath;
		result_label_to_display = partenaire_label;
		imgPath = servletContextPath + '../../../../resources/images/';
		polylines = polylines_array;
		limitPoint = maxpoint;
		displayURI = display_uri;
		siteRoot = site_root;
		labelURI = label_uri;
		siteContext = site_context;
		map = new GMap2(document.getElementById('map_canvas'));
		map.setCenter(new GLatLng(48.8948986, 2.2006881), 10);
		map.setUIToDefault();
		geocoder = new GClientGeocoder();
		//alert(dataFolder);
		if(location == null || !geocoder){
			updateDataEntries(true, forcedValue, forcedLatitude, forcedLongitude,
					forcedZoom,autoSearch );
		}else{			
			geocoder.getLatLng(location, function(point) {
				if (!point) {
					if(label != null && label != '' && label != '??? partnermap.form.labelerror ???'){
						alert(address + ' ' + label);
					}else{
						alert(address + " not found");
					}
				} else {
					map.setCenter(point, 13);
					search = true;
					updateDataEntries(false, false, forcedLatitude, forcedLongitude,
							forcedZoom,autoSearch );
				}
			});		
		}
		// $('#div_locations').css('height', $('#infoColumn').height());
		
		// Gestion du drag & drop de la carte
		GEvent.addListener(map, "moveend", function() {
			if(initialization){
				initialization = false;
			}else{
				updateDataEntries(false, false, forcedLatitude, forcedLongitude,
						forcedZoom,autoSearch);
			}
		});		
		
		GEvent.addListener(map, "dragend", function() {
			map.closeInfoWindow();
		});	
		
		GEvent.addListener(map, "zoomend", function(oldLevel,newLevel) {
			map.closeInfoWindow();
		});	
		
		
	}
}



//Fonction pour le champs de recherche
function showAddress(address,label) {
	if (geocoder) {
		geocoder.getLatLng(address, function(point) {
			if (!point) {
				if(label != null && label != '' && label != '??? partnermap.form.labelerror ???'){
					alert(address + ' ' + label);
				}else{
					alert(address + " not found");
				}
			} else {
				map.setCenter(point, 13);
			}
		});
	}
}

function centerMap(data) {	
	//alert(data);
	var reg = new RegExp(
			"<initlng>(.*)</initlng>[\\s ]*<initlat>(.*)</initlat>[\\s ]*<initzoom>(.*)</initzoom>",
			"g");
	var groups = reg.exec(data);
	if(groups != null){
		if(groups.length >= 4){
			var initX = parseFloat(groups[1]);
			var initY = parseFloat(groups[2]);
			var initZoom = parseInt(groups[3]);
			//alert('initX = '+initX+'\ninitY = '+initY+'\ninitZoom = '+initZoom);
			if (initX != '' && initY != '' && initZoom != '' && !isNaN(initX)
					&& !isNaN(initY) && !isNaN(initZoom)) {
				map.setCenter(new GLatLng(initY, initX), initZoom);
			}
		}else{
			alert('groups is too short (<5) = '+groups);
		}
	}else{
		//alert('groups is null !');
	}
	//alert('fin centermap');
}

//affiche les infos associe a un marqueur
function displayInfos(diff_key) {
	var myHtml = $("#partner" + diff_key).clone();
	$("#partner" + diff_key).remove();
	$('#div_locations').prepend(myHtml);
}



//Met a jour le XML en fonction de la zone visible de la carte
function updateDataEntries(init, forcedValue, forcedLatitude, forcedLongitude,
		forcedZoom, autoSearch) {
	//alert('updateDataEntries - search = '+search);
	if (refresh == false) {
		refresh = true;
	} else {
		//affiche l'image de chargement
		$('#loadingbox').css('display', 'block');
		var bounds = map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var lngSpanWest = southWest.lng();
		var latSpanWest = southWest.lat();
		var lngSpanEast = northEast.lng();
		var latSpaneast = northEast.lat();
		if (init) {
			lngSpanWest = 0;
			latSpanWest = 0;
			lngSpanEast = 0;
			latSpaneast = 0;
		}
		sendUpdateDataRequest(lngSpanWest,latSpanWest,lngSpanEast,latSpaneast,forcedValue,forcedLatitude,forcedLongitude,forcedZoom,autoSearch,init,false);
	}
}


function sendUpdateDataRequest(lngSpanWest,latSpanWest,lngSpanEast,latSpaneast,forcedValue,forcedLatitude,forcedLongitude,forcedZoom,autoSearch,init,zoom){
	var link = rootLink + "updateData.jsp?entriesFolder=" + dataFolder
		+ "&lngSpanWest=" + lngSpanWest + "&latSpanWest=" + latSpanWest
		+ "&lngSpanEast=" + lngSpanEast + "&latSpanEast=" + latSpaneast
		+ "&recursiveSearch=" + recursiveSearch + "&forcedValue="
		+ forcedValue + "&forcedLatitude=" + forcedLatitude
		+ "&forcedLongitude=" + forcedLongitude + "&forcedZoom="
		+ forcedZoom
		+ "&autoSearch="+autoSearch
		+"&maxPoint="+limitPoint+"&zoomRequired="+zoom;
	
	$.get(link, function(data) {
					$('#partnermap_data').html(data);
					if (init == true || search == true || zoom == true) {
						centerMap(data);
						search = false;
						zoom = false;
					}
					refreshRightList();
					updateMarkers();
				});
	
}



//tableau des points affichées
var displayedOverlay = new Array();
var polylinesDisplayed = false;

//Met a jour les markers contenu dans le XML, et les place sur la carte
function updateMarkers() {
	//map.clearOverlays();
	if(!polylinesDisplayed){
		showPolylines();
		polylinesDisplayed = true;
	}
	var markers = document.getElementsByTagName('marker');
	//number = markers.length;
	for ( var i = 0; i < markers.length; i++) {
		var point2 = new GLatLng(parseFloat(markers[i].getAttribute('y')),
								 parseFloat(markers[i].getAttribute('x')));
		
		var diff = parseInt(markers[i].getAttribute('diff'));		
		var overlayName = markers[i].getAttribute('diff_key');
		//alert('overlayName = '+overlayName+' - diff = '+diff);
		if(diff!=null && overlayName!=null){
			if(diff <0){
				removeMarker(map,overlayName)
			}else{
				addMarker(map,overlayName,markers,i,point2);
			}
		}
	}
}

//Ajoute un point sur la carte
function addMarker(map,overlayName,markers,i,point2){
	if(map != null && markers[i] !=null && point2 != null){		
		if(displayedOverlay[overlayName] == null){			
			//create marker
			//alert("markers[i].getAttribute('xMin') = #"+markers[i].getAttribute('xMin')+"#");
			var overlay = createMarker(point2, 
					markers[i].getAttribute('diff_key'), 
					markers[i].getAttribute('description'),
					markers[i].getAttribute('image'),
					markers[i].getAttribute('shadow'),
					markers[i].getAttribute('shadow_disabled'),
					markers[i].getAttribute('image_width'),
					markers[i].getAttribute('image_height'),
					markers[i].getAttribute('shadow_width'),
					markers[i].getAttribute('shadow_height'),
					markers[i].getAttribute('offset_width'),
					markers[i].getAttribute('offset_height'),
					markers[i].getAttribute('xMin'),
					markers[i].getAttribute('yMin'),
					markers[i].getAttribute('xMax'),
					markers[i].getAttribute('yMax')
			);
			
			//add it to a map
			map.addOverlay(overlay);
			
			//keep reference in an array
			displayedOverlay[overlayName] = overlay;			
		}else{
			//alert('displayedOverlay['+overlayName+'] not null');
		}
	}else{
		alert('map = '+map+' - markers[i] = '+markers[i]+' - point2 = '+point2);
	}
	
}

//Retire un point de la carte
function removeMarker(map,overlayName){
	//alert('remove : displayedOverlay['+overlayName+'] = '+displayedOverlay[overlayName]);
	if(displayedOverlay[overlayName] != null){
		map.removeOverlay(displayedOverlay[overlayName]);
		displayedOverlay[overlayName]=null;
	}
}

//Place les contours des departements sur la carte 
function showPolylines() {
	for ( var i = 0; i < polylines.length; i++) {
		var url = polylines[i];
		map.addOverlay(new GGeoXml(url));
	}
}

//Affiche les informations
function openInfo(diff_key, lat, lng) {
	var content = $('#partner' + diff_key + ' tbody');
	if (content.css('display') == 'none') {
		content.css('display', 'block');
		selectedName = $('marker[diff_key=' + diff_key + ']').attr('name');
		selectedKey = diff_key;
	} else
		content.css('display', 'none');
	//refresh = false;
	map.openInfoWindowHtml(new GLatLng(parseFloat(lat), parseFloat(lng)),
			generatePopupInfo(diff_key));
	
	refreshRightList();
}

//Met à jour la liste des resultats
function refreshRightList() {
	

	var html = '';
    
	var markerArray =  document.getElementsByTagName('marker') ;
	
	
	
	
	var nbrElementDisplayed = 0;
	for ( var i = 0; i < markerArray.length; i++) {

		var xml = markerArray[i];
		
		var diff = parseInt(xml.getAttribute('diff'));
		
		if(diff != null && diff >=0){

			var v_x = xml.getAttribute('x');
			var v_y = xml.getAttribute('y');
			var v_image = xml.getAttribute('image');
			var v_name = xml.getAttribute('name');
			var v_adress = xml.getAttribute('address');
			var v_code = xml.getAttribute('cp');
			var v_city = xml.getAttribute('city');
			var v_country = xml.getAttribute('country');
			var v_email = xml.getAttribute('email');
			var v_phone = xml.getAttribute('telephone');
			var v_data = xml.getAttribute('description');
			var v_fax = xml.getAttribute('fax');
			var v_url = xml.getAttribute('web');
			var v_diff_key =  xml.getAttribute('diff_key');
			var v_xMin =  xml.getAttribute('xMin');
			var v_yMin =  xml.getAttribute('yMin');
			var v_xMax =  xml.getAttribute('xMax');
			var v_yMax =  xml.getAttribute('yMax');
	
			var myHtml = '';
			if (v_name == selectedName && v_name != '' && v_name != ' ' && selectedKey==v_diff_key) {
				myHtml = '<table class="partnerEntry partnerEntryOnMap" id="partner' + v_diff_key + '">';
			} else {
				myHtml = '<table class="partnerEntry partnerEntryOnMapClosed" id="partner' + v_diff_key + '">';
			}
	
			if(v_xMin == null){
				myHtml += generateHeaderForNormalPoint(v_diff_key,v_image,v_name,v_y,v_x);
			}else{
				myHtml += generateHeaderForMetaPoint(v_diff_key,v_image,v_name,v_xMin,v_yMin,v_xMax,v_yMax);
			}
			
			myHtml += generateContentForPoint(v_adress,v_code,v_city,v_country,v_email,v_phone,v_fax,v_url);
			myHtml += '</table>';
	
			// myHtml += '</td></tr><tr><td class="data">';
	
			// if(v_data!=undefined && v_data!='' && v_data!=' '){
			// myHtml += v_data.substring(0,180);
			// }
	
			myHtml += '</td></tr></tbody></table>';
	
			//complete html code
			html = html + myHtml;
			
			//update nbr element displayed
			nbrElementDisplayed++;
			
		}//end id diff >=0
		
	}//end for
	$('#div_locations').html(html);
	$('#loadingbox').css('display', 'none');
	
	//update number of results
	$('#nbResults').html(nbrElementDisplayed + ' ' + result_label_to_display);
}

function zoomOnMap(lngSpanWest,latSpanWest,lngSpanEast,latSpaneast,forcedValue,forcedLatitude,forcedLongitude,forcedZoom,autoSearch,init){
	map.closeInfoWindow();
	
		
	var link = rootLink + "getCenter.jsp?minLat=" + latSpanWest
	+ "&minLng=" + lngSpanWest + "&maxLat=" + latSpaneast
	+ "&maxLng=" + lngSpanEast;
	$('#loadingbox').css('display', 'block');
	$.get(link, function(data) {
				$('#partnermap_data').html(data);				
				centerMap(data);
				$('#loadingbox').css('display', 'none');
			});
}

function generateHeaderForMetaPoint(v_diff_key,v_image,v_name,v_xMin,v_yMin,v_xMax,v_yMax){
	var myHtml ='';
	myHtml += '<thead><tr><th colspan="2" onclick="zoomOnMap(\''+v_xMin+'\',\''+v_yMin+'\',\''+v_xMax+'\',\''+v_yMax+'\',false,\'0\',\'0\',\'13\',false,false);">' 
		+ '<p><a id=\"idanchor'+v_diff_key+'\" name=\"anchor'+v_diff_key+'\"/>';
	if (v_image != undefined && v_image != '' && v_image != ' ') {
		myHtml += '<img src="' +  v_image
				+ '" alt="marker" title="' + v_name + '" /> ';
	}
	myHtml += v_name + '</p></th></tr></thead>';
	return myHtml;
}

function generateHeaderForNormalPoint(v_diff_key,v_image,v_name,v_y,v_x){
	var myHtml ='';
	myHtml += '<thead><tr><th colspan="2" onclick="openInfo(\'' + v_diff_key
		+ '\', \'' + v_y + '\',\'' + v_x + '\');">' + '<p><a id=\"idanchor'+v_diff_key+'\" name=\"anchor'+v_diff_key+'\"/>';
	if (v_image != undefined && v_image != '' && v_image != ' ') {
	myHtml += '<img src="' +  v_image
			+ '" alt="marker" title="' + v_name + '" /> ';
	}
	myHtml += v_name + '</p></th></tr></thead>';
	return myHtml;
}

function generateContentForPoint(v_adress,v_code,v_city,v_country,v_email,v_phone,v_fax,v_url){

	
	var myHtml ='';
	myHtml += '<tbody><tr><td class="coord">';
	
	myHtml += '<table cellspacing="0">';
	if ((v_adress != undefined && v_adress != '' && v_adress != ' ')
		|| (v_code != undefined && v_code != '' && v_code != ' ')
		|| (v_city != undefined && v_city != '' && v_city != ' ')
		|| (v_country != undefined && v_country != '' && v_country != ' ')) {
	myHtml += '<tr class="adress"><td class="picto">';
	myHtml += '<img src="' + imgPath + 'book_open.gif" alt="address"/>';
	myHtml += '</td><td class="value">';
	myHtml += v_adress + '<br/>' + v_code + '&nbsp;' + v_city + '<br/>'
			+ v_country;
	myHtml += '</td></tr>';
	}
	if (v_email != undefined && v_email != '' && v_email != ' ') {
	myHtml += '<tr class="email"><td class="picto">';
	myHtml += '<img src="' + imgPath + 'email_edit.gif" alt="email"/>';
	myHtml += '</td><td class="value">';
	myHtml += v_email;
	myHtml += '</td></tr>';
	}
	if (v_phone != undefined && v_phone != '' && v_phone != ' ') {
	myHtml += '<tr class="phone"><td class="picto">';
	myHtml += '<img src="' + imgPath + 'phone.gif" alt="phone"/>';
	myHtml += '</td><td class="value">';
	myHtml += v_phone;
	myHtml += '</td></tr>';
	}
	if (v_fax != undefined && v_fax != '' && v_fax != ' ') {
	myHtml += '<tr class="phone"><td class="picto">';
	myHtml += '<img src="' + imgPath + 'fax.gif" alt="fax"/>';
	myHtml += '</td><td class="value">';
	myHtml += v_fax;
	myHtml += '</td></tr>';
	}
	if (v_url != undefined && v_url != '' && v_url != ' ') {
	var urlToDisplay = getURLToDiplay(v_url);
	myHtml += '<tr class="url"><td class="picto">';
	myHtml += '<img src="' + imgPath + 'page_world.gif" alt="Url"/>';
	myHtml += '</td><td class="value">';
	myHtml += '<a target="_blank" href="' + v_url + '">' + urlToDisplay
			+ '</a>';
	myHtml += '</td></tr>';
	}
	return myHtml;
}


