
/* GLOBAL VARS */

var $mainMenu, $lpan, $panPub, $panSel, $panSelMap, $panCreate, $panCrea, $panBrowse, $panMymap, $panMyfav, $pan2nd, $panMap, $panMaps, $rPan, $marStock, $medStock, $panMar, $panMed, $geoBox, $msgBox, $mediaComs, $report, $exportPan;

// user folder
var userFolder = '/uploads/usersfolders';
var folderBig = '/b';
var folderMedium = '/m';
var folderSmall  = '/s';
var folderSsmall  = '/ss';

var geocoder;
var geolocMarker = null;
var geolocEvent = null;
var geolocMapEvent = null;
var tempCreateMarker = null;
var tempCreateMarkerEvent = null;

var panMarLock = false;
var panPubPreCreateState = 'off';
var panSelPreCreateState = new Array();

/* i18n */
var lg = new Array();
lg["see list"] = "voir la liste";
lg["hide list"] = "masquer la liste";
lg["You did not create any map yet."] = "Vous n'avez pas encore créé de carte.";
lg["You did not create any place yet."] = "Vous n'avez pas encore créé de lieu.";
lg["You did not create any content yet."] = "Vous n'avez pas encore créé de contenu.";


/**
 * DOM READY 
 */
$(document).ready(function(){
  
  // init vars (elmt for panels, bloc... for quick targeting elements inside)
  $mainMenu = $('#main-menu');
  $lpan = $('#lpan');
  $rPan = $('#rpan');
  $panPub = $('#pan-pub', $lpan);
  $panSel = $('#pan-sel', $lpan);
  $panSelMap = $('.pan-map', $panSel);
  $panCreate = $('#pan-create', $lpan);
  $panCrea = $('#create-pan', $lpan);
  $panBrowse = $('#pan-browse');
  $panMymap = $('#pan-mymap');
  $panMyfav = $('#pan-myfav');
  $pan2nd = $('.pan2nd');
  $panMap = $('#pan-map');
  $panMaps = $('.pan-map');
  $marStock = $('#sel-maps-mar', $panSel);
  $medStock = $('#sel-maps-med', $panSel);
  $panMar = $('#pan-mar');
  $panMed = $('#pan-med');
  $mediaComs = $("#coms");
  $geoBox = $('#geobox');
  $msgBox = $('#msg-box');
  $confirmBox = $('#confirm-box');
  $report = $('#report');
  $exportPan = $('#export-pan');
  
  initGmap();                 // init google map
  firstLoadSelection();       // put selection markers in cluster (first load)
  initCommon();				        // init common stuffs
  initMainMenu();             // init main menu
  initPublicPlace();          // init public place
  initSelectPan();            // init Selection Pan
  initCreationPan();          // init creation pan
  initSecondPans();           // init second pans (browse, my maps...)
  initMarkerPanel();          // init Marker Panel
  initRightPan();             // init right panel (news + tchat)
  initGeoBox();               // init geoBox
  
  // meteor (avatar + tchat)
  //if(mmAvatar.isConnected) mmAvatar.startAnimation();
  
});




/***************************** INITS *****************************/


/**
 * INIT COMMON STUFFS
 */
function initCommon() {
	
	// opacity of the jqModal overlay
	$.jqm.params.overlay = 70;
	
	// unactivate logo link
  $('#header h1 a').click(function(){return false;});
  
  // About Metamap overlay init
  $("#aboutmm").jqm({ajax: '/aboutMetamap', trigger: false, onLoad: prepareAboutMetamap});
  
  $('#about-lnk', $lpan).click(function(){
    $('#aboutmm').data('tab', 'about');
    $('#aboutmm').jqmShow();
    return false;
  });
	
	// Splash Screen ?
	if (showSplash)
	{
		$('#about-lnk', $lpan).trigger('click');
	}
	
  // Msg Box Overlay
  $msgBox.jqm({modal: false, trigger: false});
  $confirmBox.jqm({modal: true, trigger: false});
  
  // Big image Overlay
  $("#big-img").jqm({trigger: false});
  
  // Media comments Overlay
  $mediaComs.jqm({trigger: false});
  $('#marmed-com a', $panMed).click(function(){
    showMediaComs({ 'id': $panMed.data('medId') });
    return false;
  });
  
  // Report Content Overlay
  $report.jqm({trigger: false});
  
  // Export overlay
  $exportPan.jqm({trigger: false});
  
  // Hover on buttons for switching between map / marker / media / people
  $('.bt-list a')
    .hover(
      function() {
        var $btTxt = $(this).parents('.bt-list').next('.bt-list-txt');
        $btTxt.text($(this).text());
      },
      function() {
        var $btTxt = $(this).parents('.bt-list').next('.bt-list-txt');
        $btTxt.text($(this).parents('.bt-list').find('.active').text());
      }
    );
  
  // click on map/marker/media buttons in pan's lists
  $('.bt-list a').bind('click', switchListDisplay);
  
  // reset all order list in filters
  $('.order-list').val('1');
  
  // change order drop down list in filters
  $('.order-list').change(function(){
  	
  	var $pan = $(this).parents('.pan');
  	
  	// for selection pan, set the same order for marker and media when possible (because the request bring back media AND markers)
  	if ($pan.attr('id') == 'pan-sel')
  	{
  		var list = $(this).attr('class').split(' ')[1].split('-')[1];
  		
  		if (list == 'med')
  		{
  			$('.order-mar', $(this).parent()).val(($(this).val() > 3) ? 1 : $(this).val());
  		}
  		else
  		{
  			$('.order-med', $(this).parent()).val($(this).val());
  		}
  	}
  	 	// refresh pan
    refreshPan($pan);
    
  });
  
  // favorise a map
  $('.bt-map-fav a', $panMaps).bind('click', doFav);
  
  // Select Pan Refresh 
  $('.foot-refresh', $panSel).click(function(){    
    refreshPan($panSel);
    return false;
  });
  
  // Marker Pan Refresh 
  $('.foot-refresh', $panMar).click(function(){    
    refreshPan($panMar);
    return false;
  });
  
  // Selected Map Pan Close Button 
  $('.foot-close', $panSel).click(function(){
    toggleSelectedMapPan(false);
    $('.map-name a.active', $panSel).toggleClass('active', false);
    return false;
  });
  
  // Browse/MyMap/MyFav/Map Close Pan Button
  $('.close-pan', $pan2nd).click(function(){

  	if ($(this).parents('.pan').attr('id') == 'pan-map')
  	{
  		var $panOpen = $('#pan-'+$('a.active', $mainMenu).parent().attr('id').split('-')[1]);
  		
  		$panMap.hide();
  		
  		if ($('.wrap-map-list', $panOpen).is(':visible'))
  		{
  			$('.map-name a.active', $panOpen).toggleClass('active', false);
  		}
  	}
  	else
  	{
  		$('a', $mainMenu).toggleClass('active', false);
      $pan2nd.hide();
  	}

  	return false;

  });
  
  // Marker Pan Close Button
  $('.foot-close', $panMar).click(function(){	
    closePanMar();
    return false;
  });
  
}




/**
 * INIT MAIN MENU
 */
function initMainMenu() {
  
  $('#bt-browse a', $mainMenu).bind('click', toggleMainMenuPan);
  $('#bt-mymap a', $mainMenu).bind('click', toggleMainMenuPan);
  $('#bt-myfav a', $mainMenu).bind('click', toggleMainMenuPan);
  
}



/**
 * INIT CREATION PAN
 */
function initCreationPan()
{
	
	$('#bt-create a', $mainMenu).click(function(e){
		startCreateProcess();
		e.preventDefault();
	});
	
	// licences infos in media forms
	$('#lic-infos', $panCrea).live('click', function(){
		$('#aboutmm').data('tab', 'licences');
    $('#aboutmm').jqmShow();
    return false;
	});
	
  // Ending or Cancel create process
  $('#create-end', $panCrea).live('click', function(){
  	
  	// hide create process and show public pan, selected pan, main menu and news pan
    $panCrea.hide();
    $panPub.show();
    $panSel.show();
    $mainMenu.show();
    $rPan.show();
    
    // hide pan marker and remove temp marker 
    closePanMar();
    removeTempMarker();
    
    // remove draggable marker if any
    removeDraggableMarker();
    
    // set the public place as it was before create process
    $('#pub3 #pub-'+panPubPreCreateState, $panPub).trigger('click');
    
    // set selection pan as it was before create process
    for (var k in panSelPreCreateState){
    	$('.map-'+panSelPreCreateState[k]+' .view-map a', $panSel).trigger('click');
    }
    
    // refresh public place
    refreshPan($panPub);
    
    // unlock marker panel
    panMarLock = false;
    
    return false;
    
  });
    
}



/**
 * INIT PUBLIC PLACE
 */
function initPublicPlace() {
  
  var $medList = $('.med-list', $panPub);
    
  // init panel data
  $panPub.data('pg-med', 1);
  $panPub.data('pg-mar', 1);
  
  // '+' and '-'
  $('#pub-less', $panPub).bind('click', changePublicNb);
  $('#pub-more', $panPub).bind('click', changePublicNb);

  // link to show/hide media list
  $('#pub-toggle', $panPub).click(function(){
    togglePublicPan();
    return false;
  });
  
  // public place ON/OFF
  $('#pub3 a', $panPub).bind('click', function(e) {
    publicOnOff($(e.currentTarget));
    e.preventDefault();
  });
  
  // Public Refresh Button
  $('#pub-reload', $panPub).click(function(){    
    refreshPan($(this).parents('.pan'));
    return false;
  });
  
  // active public place if necessary
  if (activePublicPlace) {
    $('#pub-on', $panPub).trigger('click');
  }
}



/**
 * INIT SELECTION PAN
 */
function initSelectPan() {
	
	var $mapList = $('.map-list', $panSel);
	var $selHead = $('#sel-head', $panSel);
  
  // map title link open/hide map pan
  $('.map-name a', $mapList).bind('click', mapTitleAction);
  
  // create a space in panel data where to store an mapId to add to the selection
  $panSel.data('mapId', 0);
  
  // init map to reload if needed
  $panSel.data('mapReload', 0);
  
  // init map viewed
  $panSelMap.data('mapId', 0);
  
  // link "add map to selection"
  $('#sel-add', $selHead).click(function(){
    $('#bt-browse a', $mainMenu).trigger('click');
    return false;
  });
  
  // hide all maps selected
  $('#sel-view-all', $selHead).click(function(){

    var mapIDs = new Array();
    
    // unactive all eyes
    $('.map-list .view-map a', $panSel).toggleClass('active', false);
  	
  	// get maps IDs
  	$('.map-list li', $panSel).each(function(){
  		mapIDs.push($(this).attr('class').split(' ')[0].split('-')[1]);
  	});
  	
  	// and remove markers from cluster
  	for (var i=0; i<mapIDs.length; i++) {
  		mmGeo.removeGeometries(mapIDs[i], true);
  	}
    
    return false;
  	
  });
  
  // hide/show map in selection
  $('.view-map a', $mapList).bind('click', toggleShadeMap);
  
  // del all maps selected
  $('#sel-del-all', $selHead).bind('click', deleteAllSelectedMap);
  
  // del a map from selection
  $('.del a', $mapList).bind('click', deleteSelectedMap);
  
  // events on markers and media in stock
  $('a', $marStock).bind('click', markerTitleAction);
  $('a', $medStock).bind('click', mediaTitleAction);
  
  // event on "export" button
  $('.map-export', $panSelMap).bind('click', exportMap);
  
  // event on "add to"/"participate" button
  $('.map-add-to', $panSelMap).click(function(){
    startCreateProcess({'map': $panSelMap.data('mapId')});
    return false;
  });
  $('.map-participate', $panSelMap).click(function(){
    startCreateProcess({'map': $panSelMap.data('mapId')});
    return false;
  });
  
}



/**
 * INIT SECOND PANS (browse, my maps...)
 */
function initSecondPans() {

  // init info for 2nd pans
  $panMap.data('mapId', 0);
  
  // offi / contrib / all drop down list
  $('.offi-list').change(function(){
    refreshPan($(this).parents('.pan'));
  });
  
  // search button
  $('.search-submit a', $panBrowse).click(function(){
  	var sVal = $('.searchbox input', $panBrowse).val();
  	$panMap.hide();
  	if ($.trim(sVal) != '') {
  		$('.cancel-search', $panBrowse).show();
  		refreshPan($(this).parents('.pan'));
    }
    else
    {
    	alert('La recherche ne peut pas être vide.')
    }
    return false;
  });
  
  // key "ENTER" pressed in search field
  $('.searchbox input', $panBrowse).bind('keypress', function(e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if (code == 13) {
      $('.search-submit a', $panBrowse).trigger('click');
    }
  });  
  
  // cancel search
  $('.cancel-search a', $panBrowse).click(function(){
  	var sVal = $('.searchbox input', $panBrowse).val('');
  	$(this).parent().hide();
  	refreshPan($(this).parents('.pan'));
  	return false;
  });
  
  // event on "selection" button
  $('.add-to-sel', $panMap).bind('click', addMapToSelection);
  
  // event on "export" button
  $('.map-export', $panMap).bind('click', exportMap);
  
  // event on "add to"/"participate" button
  $('.map-add-to', $panMap).click(function(){
  	startCreateProcess({'map': $panMap.data('mapId')});
  	return false;
  });
  $('.map-participate', $panMap).click(function(){
    startCreateProcess({'map': $panMap.data('mapId')});
    return false;
  });
  
}



/**
 * INIT MARKER PANEL 
 */
function initMarkerPanel() {

 	$panMar.data('marId', 0);
 	$panMar.data('medId', 0);
 	$panMar.data('addCluster', false);
 	$panMar.data('isTemp', false);
 	$panMed.data('medId', 0);
 	
  // favorise a marker
  $('#bt-mar-fav a', $panMar).bind('click', doFav);
  
  // favorise a media
  $('#bt-med-fav a', $panMed).bind('click', doFav);
  
  // note the media
  $('#marmed-plus a', $panMed).bind('click', doNote);
  $('#marmed-minus a', $panMed).bind('click', doNote);

 	// add media to marker link
 	$('#add-media', $panMar).click(function(){
 		startCreateProcess({'mar': $panMar.data('marId')}); 		     
 		return false; 
 	});
 	
  // media menu links
  $('#marmed-menu a', $panMed).bind('click', switchMediaMenu);
  
  // media nav links
  $('#marmed-nav a', $panMed).bind('click', navMediaList);
 	
 	// init audio player
  AudioPlayer.setup("/players/audio-player.swf", {  
    width: 290
  });
 	
 	// link "add to selection"
 	$('.mar-foot a', $panMar).bind('click', addMapToSelection);
 	
 	// event on "export" marker button
  $('#marker-export', $panMar).bind('click', exportMarker);
  
  // event on "export" media button
  $('#media-export', $panMed).bind('click', exportMedia);
 	
}



/*
 * INIT RIGHT PANEL (NEWS + TCHAT)
 */
function initRightPan()
{
	$('#news-more a', $rPan).bind('click', toggleNewsList);
}



/**
 * INIT GOOGLE MAP
 */
function initGmap() {
  
  if(GBrowserIsCompatible()) {
 
    map = new GMap2(document.getElementById("gmap"), {draggableCursor:"crosshair"});
    var mapControl = new GMapTypeControl();
    map.addControl(mapControl, new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10)));
    map.addControl(new GLargeMapControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,40)));
    map.setMapType(G_HYBRID_MAP);
    map.enableScrollWheelZoom(); 
    map.setCenter(new GLatLng(centerLat, centerLon), centerZoom); // center map based on subdomain
    
    // limit minimum zoom
    G_PHYSICAL_MAP.getMinimumResolution = function () { return 4; };
    G_NORMAL_MAP.getMinimumResolution = function () { return 4; };
    G_SATELLITE_MAP.getMinimumResolution = function () { return 4; };
    G_HYBRID_MAP.getMinimumResolution = function () { return 4; }; 

    // map events    
    GEvent.addListener(map, 'moveend', function(){
    	mmGeo.setCurrentViewport();
    	if(mmGeo.lastHighlighted){
    	  mid = mmGeo.lastHighlighted.marId; 
    		if (!($panMar.is(':visible')) || $panMar.data('marId') != mid)
    		{
    		  showMarker(mid);
    		}
    	}
    });

    // add the KML for Region Centre
    if (loadKMLFile != '') {
      var hasKml = false;   
  	  var rckml = new GGeoXml('http://' + document.location.host + '/uploads/' + loadKMLFile, function() {
  		  if(rckml.loadedCorrectly()) {
  			  map.addOverlay(rckml);
  			  hasKml = true;
  		  }
  	  });
  
      GEvent.addListener(map, 'zoomend', function(o, n){
      	if(n > 15){
      		map.removeOverlay(rckml);
      		hasKml = false;
      	}else{
      		if(hasKml == false){
      			rckml = new GGeoXml('http://' + document.location.host + '/uploads/' + loadKMLFile, function() {
  	    			if(rckml.loadedCorrectly()) {
  	    				  map.addOverlay(rckml);
  	    				  hasKml = true;
  	    			}
      			});	
      		}
      	}
      });
    }
	
  }
}



/**
 * INIT GEOCODER
 */
function initGeoBox() {
	
  geocoder = new GClientGeocoder();
  geocoder.setCache(null);   
  
  // "GO" button
  $("#geobox-action", $geoBox).bind('click', doGeolocalize);
  
  // key "ENTER" pressed + default text
  $('#geobox-input', $geoBox).bind('keypress', function(e) {
  	var code = (e.keyCode ? e.keyCode : e.which);
  	if (code == 13) {
  		$("#geobox-action", $geoBox).trigger('click');
  	}
  })
  .bind('focus', function(e){
  	if ($('#geobox-input', $geoBox).val() == $('.default-txt', $geoBox).text()) {
  		$('#geobox-input', $geoBox).val('');
  	}
  });
  
  // close button for geopans
  $('.geoclose', $geoBox).click(function(){
  	$(this).parent().hide();
  	return false;
  });
  
	
}



/************************* GETTERS *************************/

/**
 * GET PAN PARAMS
 * @param element   $p : pan element
 * @return array of params
 */
function getPanParams($pan) {
  
  // init param object (containing request name an params for this request)
  var p = {};
  p.params = {};

  // get panel name
  pan = $pan.attr('id').split('-')[1];
  
  // get request and parameters for the right action
  switch (pan) {
    
    /* Public Panel */
    
    case 'pub':
    
      // if place public is OFF, do nothing
      var onOff = $('#pub3 a.active', $panPub).attr('id').split('-')[1];

      // ON
      if (onOff == 'on') {
      
	      var $filt =  $('.filters', $pan);
	      var listName = $('.bt-list a.active', $filt).parent().attr('class').split('-')[2];
	      
	      // get viewport infos
	      p.params = getViewportBounds();
	      p.params.z = vp.z;
	      
	      // get order
        p.params.o = $('.order-list:visible :selected', $filt).val();
	      
	      // define the right request name url
	      switch (listName) {
	      
	        case 'mar':  // markers list
	          p.req = 'getpublicmarkers';
	          p.callb = doPublicMarkers;
	          p.params.l = $panPub.data('pg-mar');
	          break;
	          
	        case 'med':  // media list
	          p.req = 'getpublicmedia';
	          p.callb = doPublicMedia;
	          p.params.l = $panPub.data('pg-med');
	          break;
	          
	      }
	      
      }
      else { // OFF
      	return false;
      }
      
      break;
    
  
    /* Selection Panel */
    
    case 'sel':
      
      var $filt =  $('.filters', $pan);
      
      // get order
      p.params.o = $('.order-list:visible :selected', $filt).val();
      
      // get map ID (if the mapId is not 0 in panel data, this is for adding this map to the selection)
      if ($pan.data('mapId') != 0) {
        p.params.id = $pan.data('mapId');
        p.req = 'addselectedmap';
        p.callb = doAddSelectedMap;
      }
      else {
        p.params.id = $panSelMap.data('mapId');
        p.req = 'getselectedmap';
        p.callb = doSelectedMap;
      }
      
      break;
      
      
    /* Browse Panel */
      
    case 'browse':
      
      var $filt =  $('.filters', $pan);
      var listName = $('.bt-list a.active', $filt).parent().attr('class').split('-')[2];

      var offi = $('.offi-list :selected', $filt).val();
      
      // get order
      p.params.o = $('.order-list:visible :selected', $filt).val();
      
      // get search
      var s = $('.searchbox input', $filt).val();
      
      if (s.length > 0 && s.length < 3) {
        alert('3 caractères minimum');
        return false;
      }
      
      p.params.s = $('.searchbox input', $filt).val();
      
      // define the right request name url
      switch (listName) {
      
        case 'map': // maps list
          
          p.req = 'getallmaps';
          p.callb = doAllMaps;
          p.params.t = offi;
          
          break;
          
        case 'mar': // markers list
        
          p.req = 'getallmarkers';
          p.callb = doAllMarkers;
          p.params.t = offi;
          
          break;
          
        case 'med': // media list
        
          p.req = 'getallmedia';
          p.callb = doAllMedia;
          p.params.t = offi;
          
          break;
      
      }
        
      break;
      
      
    /* MyMap Panel */
      
    case 'mymap':
        
      var $filt =  $('.filters', $pan);
      var listName = $('.bt-list a.active', $filt).parent().attr('class').split('-')[2];
      
      // get order
      p.params.o = $('.order-list:visible :selected', $filt).val();
      
      // define the right request name url
      switch (listName) {
      
        case 'map': // maps list
          p.req = 'getusermaps';
          p.callb = doUserMaps;
          break;
        
        case 'mar':  // markers list
          p.req = 'getusermarkers';
          p.callb = doUserMarkers;
          break;
          
        case 'med':  // media list
          p.req = 'getusermedia';
          p.callb = doUserMedia;
          break;
          
      }
      
      break;
      
      
    /* MyFav Panel */
      
    case 'myfav':
        
      var $filt =  $('.filters', $pan);
      var listName = $('.bt-list a.active', $filt).parent().attr('class').split('-')[2];
      
      // get order
      p.params.o = $('.order-list:visible :selected', $filt).val();
      
      // define the right request name url
      switch (listName) {
      
        case 'map': // maps list
          p.req = 'getuserfavmaps';
          p.callb = doUserFavMaps;
          break;
        
        case 'mar':  // markers list
          p.req = 'getuserfavmarkers';
          p.callb = doUserFavMarkers;
          break;
          
        case 'med':  // media list
          p.req = 'getuserfavmedia';
          p.callb = doUserFavMedia;
          break;
          
      }
      
      break;
      
      
    /* Pan Map */
      
    case 'map':
      
      var $filt =  $('.filters', $pan);
      var listName = $('.bt-list a.active', $filt).parent().attr('class').split('-')[2];
      
      // mapId
      p.params.id = $pan.data('mapId');
      
      // get order
      p.params.o = $('.order-list:visible :selected', $filt).val();
      
      // define the right request name url
      switch (listName) {
      
        case 'mar':  // markers list
          p.req = 'getmapmarkers';
          p.callb = doMapMarkers;
          break;
          
        case 'med':  // media list
          p.req = 'getmapmedia';
          p.callb = doMapMedia;
          break;
          
      }
      
      break;
      
      
    /* Pan Marker */
      
    case 'mar':
      
      p.params.id = $panMar.data('marId');
      p.params.m = $panMar.data('medId');
      p.params.o = $('.order-list:visible :selected', $panMar).val();
      
      // request
      p.req = 'getmarkermedia';
      
      // calback
      p.callb = doMarkerMedia;
      
      break;
      
      
    /* Pan Media */
      
    case 'med':
      
      p.params.id = $panMar.data('medId');
      
      // request
      p.req = 'getmediainfos';
      
      // calback
      p.callb = doMediaInfos;
      
      break;
  
  }
  
  return p;
  
}



/**
 * REQUEST DATA TO SERVER AND PROCEED
 * @param   array   p : array of parameters
 */
function requestXMLData(p) {
  
  // do ajax request and proceed the XML for each case
  $.ajax({type:     'POST',
          dataType: 'xml',
          url:      '/'+p.req,
          data:     p.params,
          beforeSend: function(req) { $('#sel-loader', $panSel).toggleClass('loading', true); },
          success:    function(xml, textStatus){ p.callb(xml); },
          complete:   function(req) { $('#sel-loader', $panSel).toggleClass('loading', false); }
  });
  
}


/**
 * INFORM DB
 * @param   array   p : array of parameters
 */
function informDB(p) {
	
	params = ('params' in p) ? p.params : {};
  
  // do ajax request
  $.ajax({type:     'POST',
          dataType: 'json',
          url:      '/'+p.req,
          data:     params
  });
  
}



/**
 * POST A FAV MAP / MARKER / MEDIA
 * @param   object    p : parameters for the request
 */
function postFav(p)
{
	
	$.ajax({type:       'POST',
          dataType:   'json',
          url:        '/'+p.req,
          data:       p.params,
          beforeSend: function(req) { p.loadElmt.toggleClass('loading', true); },
          success:    function(j){
            
                        switch(j.success)
                        {
                          
                          case 'ok':
                            // display success message
                            showPanMsg(p.msgElmt, j.msg, j.success);
                            // save mapId
                            addFav(p.what, parseInt(p.params.id));
                            // active star
                            p.loadElmt.toggleClass('active', true);
                            break;
                            
                          case 'no':
                            
                            switch(j.msg)
                            {
                              case 'notauth':
                                // display the modal msg for login
                                showMsgBox(j.msg);
                                break;
                              default:
                                // display error message
                                showPanMsg(p.msgElmt, j.msg, j.success);
                                break;
                            }
                            
                            break;
                        }
                        
                      },
          complete:   function(req) { p.loadElmt.toggleClass('loading', false); }
  });
	
}



/**
 * POST A NOTE
 * @param   object    p : parameters for the request
 */
function postNote(p)
{
  
  $.ajax({type:       'POST',
          dataType:   'json',
          url:        '/'+p.req,
          data:       p.params,
          beforeSend: function(req) {
          	           // unactivate plus and minus bt
          	           $('#marmed-plus a', $panMed).toggleClass('active', false);
                       $('#marmed-minus a', $panMed).toggleClass('active', false);
                       // display loader img
          	           p.loadElmt.toggleClass('loading', true);
          	          },
          success:    function(j){
            
                        switch(j.success)
                        {
                          
                          case 'ok':
                            // active button
                            p.loadElmt.toggleClass('active', true);
                            // display new note
                            var $medNote = $('#marmed-note span', $panMed);
                            $medNote.text(j.note);
                            var isPos = parseInt(j.note) >= 0;
                            $medNote.toggleClass('neg', !isPos);
                            break;
                            
                          case 'no':
                            
                            switch(j.msg)
                            {
                              case 'notauth':
                                // display the modal msg for login
                                showMsgBox(j.msg);
                                break;
                              default:
                                // active button
                                p.loadElmt.toggleClass('active', true);
                                break;
                            }
                            
                            break;
                        }
                        
                      },
          complete:   function(req) { p.loadElmt.toggleClass('loading', false); }
  });
  
} 



/**
 * Proceed Public Markers
 * @param document  x : xml response
 */
function doPublicMarkers(x) {
  
  var $marList = $('.mar-list', $panPub);
  var marClu = {};     // markers infos for cluster
  marClu['map_0'] = {};  // define public map as 'map_0'
  var z = 0;
  
  // get total markers from request
  var tot = parseInt($(x).find('mm').attr('tot'));
  var oldPg = parseInt($panPub.data('pg-mar'));
  
  // new page of markers
  if ((oldPg*limitPublicMarker) > tot) {
    var newPg = Math.ceil(tot/limitPublicMarker);
    if (newPg == 0) {newPg = 1;}
    var curReal = tot;
  }
  else {
    var newPg = oldPg;
    var curReal = newPg*limitPublicMarker;
  }
  
  // save current page
  $panPub.data('pg-mar', newPg);
  
  // display values
  $('#pub-cur', $panPub).text(curReal);
  $('#pub-tot', $panPub).text(tot);
  
  // marker list template
  var marTpl = new String('<ul>');
  
  $(x).find('mar').each(function(){
    
    zeb = (z == 0) ? 'zeb1' : 'zeb2';
    
    marId = $(this).attr('id');
    marTitle = $(this).attr('t');
    marNat = $(this).attr('n');
    marGeo = $(this).attr('g');
    marLat = $(this).attr('la');
    marLon = $(this).attr('lo');
    marCoo = $(this).attr('c');
    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
    marType = $(this).attr('tp');
    
    marClu['map_0']['m'+marId] = {
                            lat: marLat,
                            lon: marLon,
                            marId: marId,
                            mapId: 0,
                            panId: 'pub',
                            ico: 't'+marType+'.png',
                            eve: false
                            };
    
    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
    marTpl += '</li>';
    
    z++;
    if (z > 1) { z = 0; }
    
  });
  
  marTpl += '</ul>';
  
  // update cluster
  mmGeo.removeGeometries(0);
  mmGeo.addGeometries(marClu);
  
  // insert list to DOM
  $marList.empty().append(marTpl);
  
  // events on marker click
  $('a', $marList).bind('click', markerTitleAction);
  
}



/**
 * Proceed Public Media
 * @param document  x : xml response
 */

function doPublicMedia(x) {
  
  var $medList = $('.med-list', $panPub);
  var marClu = {};     // markers infos for cluster
  marClu['map_0'] = {};  // define public map as 'map_0'
  
  // get total media from request
  var tot = parseInt($(x).find('mm').attr('tot'));
  var oldPg = parseInt($panPub.data('pg-med'));
  
  // new page of media
  if ((oldPg*limitPublicMedia) > tot) {
  	var newPg = Math.ceil(tot/limitPublicMedia);
  	if (newPg == 0) {newPg = 1;}
  	var curReal = tot;
  }
  else {
  	var newPg = oldPg;
  	var curReal = newPg*limitPublicMedia;
  }
  
  // save current page
  $panPub.data('pg-med', newPg);
  
  // display values
  $('#pub-cur', $panPub).text(curReal);
  $('#pub-tot', $panPub).text(tot);
  
  // media list template
  var medTpl = new String('<ul>');
  
  $(x).find('med').each(function(){
    
    medId = $(this).attr('id');
    medTitle = $(this).attr('t');
    medType = $(this).attr('tp');
    medThumb = $(this).attr('th');
    marId = $(this).attr('mid');
    marUser = $(this).attr('u');
    marNat = $(this).attr('mn');
    marGeo = $(this).attr('mg');
    marLat = $(this).attr('mla');
    marLon = $(this).attr('mlo');
    marCoo = $(this).attr('mc');
    marType = $(this).attr('mtp');
    
    marClu['map_0']['m'+marId] = {
                            lat: marLat,
                            lon: marLon,
                            marId: marId,
                            mapId: 0,
                            panId: 'pub',
                            ico: 't'+marType+'.png',
                            eve: false
                            };
    
    medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
    medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
    
    if (typeof(medThumb) != 'undefined' && medThumb != '0') {
      medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+$(this).attr('th')+'" alt="'+medTitle+'" />';
    }
    else {
      medTpl += ' <span>.</span>';
    }
    
    
    medTpl += ' </a>';
    medTpl += '</li>';
    
  });
  
  medTpl += '</ul>';
  
  // update cluster
  mmGeo.removeGeometries(0);
  mmGeo.addGeometries(marClu);
  
  // insert list to DOM
  $medList.empty().append(medTpl);
  
  // events on media click
  $('a', $medList).bind('click', mediaTitleAction);
  
}



/**
 * Proceed Refresh Selected Map
 * @param document  x : xml response
 */
function doSelectedMap(x) {
  
  var $marList = $('.mar-list', $panSel);
  var $medList = $('.med-list', $panSel);
  var $filt = $('.pan-map .filters', $panSel);
  var marClu = {};     // markers infos for cluster
  var z = 0;
  
  
  /* MAP */
  
  var $mapSel = $('map', $(x));
  var mapId = $mapSel.attr('id');
  
  // is the map masked in the map list ?
  var isMasked = ($('.map-'+mapId+' .view-map a', $panSel).hasClass('active')) ? false : true;
  
  // is the map panel open on this map ?
  var mapIsOpened = ($('.map-'+mapId+' .map-name a', $panSel).hasClass('active')) ? true : false;

  // replace map title in pan if pan is opened
  if (mapIsOpened) {
    $('.pan-map h3', $panSel).text($mapSel.attr('t'));
  }
  
  // update title in map list
  $('.map-'+mapId+' .map-name span', $panSel).text($mapSel.attr('t'));
  
  // update shared status
  $('.map-'+mapId+' .map-name', $panSel).removeClass('shared').removeClass('owner').addClass($mapSel.attr('status'));

  // save current mapId to the map pan data
  if (mapIsOpened) {
    $panSelMap.data('mapId', mapId);
  }
  
  
  /* MARKERS */
  
  // marker list template
  var marTpl = new String('<div class="map-'+mapId+'"><ul>');
  
  // map for the cluster
  marClu['map_'+mapId] = {};
  
  // marker list
  $(x).find('mar').each(function(){
    
    zeb = (z == 0) ? 'zeb1' : 'zeb2';
    
    marId = $(this).attr('id');
    marUser = $(this).attr('u');
    marTitle = $(this).attr('t');
    marNat = $(this).attr('n');
    marGeo = $(this).attr('g');
    marLat = $(this).attr('la');
    marLon = $(this).attr('lo');
    marCoo = $(this).attr('c');
    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
    marType = $(this).attr('tp');
    
    // if map is masked, don't add to cluster
    if (!isMasked) {
    	
    	marClu['map_'+mapId]['m'+marId] = {
                            lat: marLat,
                            lon: marLon,
                            marId: marId,
                            mapId: mapId,
                            panId: 'sel',
                            ico: 't'+marType+'.png',
                            eve: false
                            };
    	
    }
    
    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
    marTpl += '</li>';
    
    z++;
    if (z > 1) { z = 0; }
    
  });
  
  marTpl += '</div>';
  
  // if map is not masked, add to cluster
  if (!isMasked) {
	  // update cluster
	  mmGeo.removeGeometries(mapId);
	  mmGeo.addGeometries(marClu);
  }
  
  
  /* MEDIA */
  
  // media list template
  var medTpl = new String('<div class="map-'+mapId+'">');
  
  var $medXML = $(x).find('med');
  
  if ($medXML.length > 0)
  {
  	medTpl += '<ul>';
  
	  $medXML.each(function(){
	    
	    medId = $(this).attr('id');
	    medTitle = $(this).attr('t');
	    medType = $(this).attr('tp');
	    medThumb = $(this).attr('th');
	    marId = $(this).attr('mid');
	    marUser = $(this).attr('u');
	        
	    medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
	    medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
	    
	    if (typeof(medThumb) != 'undefined' && medThumb != '0') {
	      medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+medThumb+'" alt="'+medTitle+'" />';
	    }
	    else {
	      medTpl += ' <span>.</span>';
	    }
	    
	    medTpl += ' </a>';
	    medTpl += '</li>';
	    
	  });
	  
	  medTpl += '</ul>';
  
  }
  else
  {
  	medTpl += '<p class="msg-nores">Aucun contenu dans cette carte</p>';
  }
  
   medTpl += '</div>';

  // append list of markers/media to map if open, otherwise in stock
  if (mapIsOpened) {
  	
    $marList.empty().append(marTpl);
    $medList.empty().append(medTpl);
    $('a', $marList).bind('click', markerTitleAction);
    $('a', $medList).bind('click', mediaTitleAction);
    
  }
  else {
    
    $('.map-'+mapId, $marStock).remove();
    $('.map-'+mapId, $medStock).remove();
    $marStock.append(marTpl);
    $medStock.append(medTpl);
    $('a', $marStock).bind('click', markerTitleAction);
    $('a', $medStock).bind('click', mediaTitleAction);
  
  }
  
}



/**
 * Proceed Add Selected Map
 * @param document  x : xml response
 */
function doAddSelectedMap(x) {
  
  // reset mapId in data panel
  $panSel.data('mapId', 0);
    
  var mapId;
  var marClu = {};     // markers infos for cluster
  var z = 0;
  
  
  /* MAP */
  
  var $mapList = $('.map-list ul', $panSel);
  var nbMaps = $('li', $mapList).length;
  var mapTpl = new String();
  
  $(x).find('map').each(function(){
    
    mapId = $(this).attr('id');
    mapTitle = $(this).attr('t');
    mapOffi = ($(this).attr('o') == 1) ? 'offi' : '';
    mapShared = $(this).attr('status');
    zeb = (nbMaps % 2 == 0) ? 'zeb1' : 'zeb2';
    
    mapTpl += '<li class="map-'+mapId+' '+zeb+'">';
    mapTpl += ' <p class="view-map"><a title="afficher" href="" class="active"><span>.</span></a></p>';
    mapTpl += ' <p class="del"><a title="retirer de la selection" href=""><span>.</span></a></p>';
    mapTpl += ' <p class="map-name '+mapOffi+' '+mapShared+'"><a href="" title="'+mapTitle+'"><span>'+mapTitle+'</span></a></p>';
    mapTpl += '</li>';
    
  });
  
  // add map to DOM
  $mapList.append(mapTpl);
  
  // attach events on map title and buttons
  $('.map-'+mapId+' .map-name a', $mapList).bind('click', mapTitleAction);
  $('.map-'+mapId+' .view-map a', $mapList).bind('click', toggleShadeMap);
  $('.map-'+mapId+' .del a', $mapList).bind('click', deleteSelectedMap);
  
   
  /* MARKERS */
  
  // marker list template
  var marTpl = new String('<div class="map-'+mapId+'"><ul>');
  
  // map for the cluster
  marClu['map_'+mapId] = {};
  
  // marker list
  $(x).find('mar').each(function(){
    
    zeb = (z % 2 == 0) ? 'zeb1' : 'zeb2';
    
    marId = $(this).attr('id');
    marUser = $(this).attr('u');
    marTitle = $(this).attr('t');
    marNat = $(this).attr('n');
    marGeo = $(this).attr('g');
    marLat = $(this).attr('la');
    marLon = $(this).attr('lo');
    marCoo = $(this).attr('c');
    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
    marType = $(this).attr('tp');
    
    marClu['map_'+mapId]['m'+marId] = {
                            lat: marLat,
                            lon: marLon,
                            marId: marId,
                            mapId: mapId,
                            panId: 'sel',
                            ico: 't'+marType+'.png',
                            eve: false
                            };
    
    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
    marTpl += '</li>';
    
    z++;
    
  });
  
  marTpl += '</ul></div>';
  
  // update cluster
  mmGeo.removeGeometries(mapId);
  mmGeo.addGeometries(marClu);
  
  // append list to stock
  $marStock.append(marTpl);

  // add event on markers  
  $('a', $marStock).bind('click', markerTitleAction);
  
  
  /* MEDIA */
  
  // media list template
  var medTpl = new String('<div class="map-'+mapId+'"><ul>');
  
  $(x).find('med').each(function(){
    
    medId = $(this).attr('id');
    medTitle = $(this).attr('t');
    medType = $(this).attr('tp');
    medThumb = $(this).attr('th');
    marId = $(this).attr('mid');
    marUser = $(this).attr('u');
          
    medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
    medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
      
    if (typeof(medThumb) != 'undefined' && medThumb != '0') {
      medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+medThumb+'" alt="'+medTitle+'" />';
    }
    else {
      medTpl += ' <span>.</span>';
    }
      
    medTpl += ' </a>';
    medTpl += '</li>';
    
  });
  
  medTpl += '</ul></div>';
  
  // append list to stock
  $medStock.append(medTpl);

  // add event on media  
  $('a', $medStock).bind('click', mediaTitleAction);
  
  // trigger click on the map
  $('.map-'+mapId+' .map-name a', $panSel).trigger('click');
  
  // scroll to added map
  if ($('li ', $mapList).length > 8) {
    $mapList.parent().scrollTo($('.map-'+mapId, $mapList), 300);
  }
}



/**
 * Proceed All Maps
 * @param document  x : xml response
 */
function doAllMaps(x) {
  
  var $mapList = $('.map-list', $panBrowse);
  var $mapXML = $(x).find('map');
  var mapTpl = new String();
  var z = 0;
  
  // if there is maps
  if ($mapXML.length > 0)
  {
  
	  // map list template
	  mapTpl += '<ul>';
	  
	  $mapXML.each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    mapId = $(this).attr('id');
	    mapTitle = $(this).attr('t');
	    mapOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    mapTpl += '<li class="map-'+mapId+' '+zeb+'">';
	    mapTpl += ' <p class="add-map"><a href="" title="ajouter"><span>ajouter</span></a></p>';
	    mapTpl += ' <p class="map-name '+mapOffi+'"><a href="" title="'+mapTitle+'"><span>'+mapTitle+'</span></a></p>';
	    mapTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
    mapTpl += '</ul>';
  
  }
  else
  {
  	mapTpl += '<p class="msg-nores">Aucun résultat</p>';
  }
  
  // insert list to DOM
  $mapList.empty().append(mapTpl);
  
  // events on map click
  $('.map-name a', $mapList).bind('click', mapTitleAction);
  
  // event on "add to selection" button
  $('.add-map a', $mapList).bind('click', addMapToSelection);
  
}



/**
 * Proceed All Markers
 * @param document  x : xml response
 */
function doAllMarkers(x) {
  
  var $marList = $('.mar-list', $panBrowse);
  var $marXML = $(x).find('mar');
  var marTpl = new String();
  var z = 0;
  
  // if there is markers
  if ($marXML.length > 0)
  {
  
	  // marker list template
	  marTpl += '<ul>';
	  
	  $marXML.each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    marId = $(this).attr('id');
	    marTitle = $(this).attr('t');
	    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
	    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
	    marTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
	  marTpl += '</ul>';
	  
  }
  else
  {
  	marTpl += '<p class="msg-nores">Aucun résultat</p>';
  }
  
  // insert list to DOM
  $marList.empty().append(marTpl);
  
  // events on marker click
  $('.mar-name a', $marList).bind('click', markerTitleAction);
  
}



/**
 * Proceed All Media
 * @param document  x : xml response
 */
function doAllMedia(x) {
  
  var $medList = $('.med-list', $panBrowse);
  var $medXML = $(x).find('med');
  var medTpl = new String();
  
  // if there is media
  if ($medXML.length > 0)
  {
  
	  // media list template
	  medTpl += '<ul>';
	  
	  $medXML.each(function(){
	    
	    medId = $(this).attr('id');
	    medTitle = $(this).attr('t');
	    medType = $(this).attr('tp');
	    medThumb = $(this).attr('th');
	    marId = $(this).attr('mid');
	    marUser = $(this).attr('u');
	    
	    medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
	    medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
	    
	    if (typeof(medThumb) != 'undefined' && medThumb != '0') {
	      medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+medThumb+'" alt="'+medTitle+'" />';
	    }
	    else {
	      medTpl += ' <span>.</span>';
	    }
	    
	    medTpl += ' </a>';
	    medTpl += '</li>';
	    
	  });
	  
	  medTpl += '</ul>';
	  
  }
  else
  {
    medTpl += '<p class="msg-nores">Aucun résultat</p>';
  }
  
  // insert list to DOM
  $medList.empty().append(medTpl);
  
  // events on media click
  $('a', $medList).bind('click', mediaTitleAction);
  
}



/**
 * Proceed User Maps
 * @param document  x : xml response
 */
function doUserMaps(x) {
  
  var $mapList = $('.map-list', $panMymap);
  var z = 0;
  
  if ($(x).children('mm').children().length != 0) {
  
	  // map list template
	  var mapTpl = new String('<ul>');
	  
	  $(x).find('map').each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    mapId = $(this).attr('id');
	    mapTitle = $(this).attr('t');
	    mapOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    mapTpl += '<li class="map-'+mapId+' '+zeb+'">';
	    mapTpl += ' <p class="add-map"><a href="" title="ajouter"><span>ajouter</span></a></p>';
	    mapTpl += ' <p class="map-name '+mapOffi+'"><a href="" title="'+mapTitle+'"><span>'+mapTitle+'</span></a></p>';
	    mapTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
	  mapTpl += '</ul>';
	  
	  // insert list to DOM
	  $mapList.empty().append(mapTpl);
	  
	  // events on map click
	  $('.map-name a', $mapList).bind('click', mapTitleAction);
	  
	  // event on "add to selection" button
	  $('.add-map a', $mapList).bind('click', addMapToSelection);
  
  }
  else  // no maps
  {
  	$mapList.empty().append('<p class="msg-nores">'+lg["You did not create any map yet."]+'</div>');
  }
  
}



/**
 * Proceed User Markers
 * @param document  x : xml response
 */
function doUserMarkers(x) {
  
  var $marList = $('.mar-list', $panMymap);
  var z = 0;
  
  if ($(x).children('mm').children().length != 0) {
	  
	  // marker list template
	  var marTpl = new String('<ul>');
	  
	  $(x).find('mar').each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    marId = $(this).attr('id');
	    marTitle = $(this).attr('t');
	    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
	    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
	    marTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
	  marTpl += '</ul>';
	  
	  // insert list to DOM
	  $marList.empty().append(marTpl);
	  
	  // events on marker click
	  $('.mar-name a', $marList).bind('click', markerTitleAction);
	  
  }
  else  // no markers
  {
    $marList.empty().append('<p class="msg-nores">'+lg["You did not create any place yet."]+'</div>');
  }
  
}



/**
 * Proceed User Media
 * @param document  x : xml response
 */
function doUserMedia(x) {
  
  var $medList = $('.med-list', $panMymap);
  
  if ($(x).children('mm').children().length != 0) {
  
	  // media list template
	  var medTpl = new String('<ul>');
	  
	  $(x).find('med').each(function(){
	    
	    medId = $(this).attr('id');
	    medTitle = $(this).attr('t');
	    medType = $(this).attr('tp');
	    medThumb = $(this).attr('th');
      marId = $(this).attr('mid');
      marUser = $(this).attr('u');
          
      medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
      medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
      
      if (typeof(medThumb) != 'undefined' && medThumb != '0') {
        medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+medThumb+'" alt="'+medTitle+'" />';
      }
      else {
        medTpl += ' <span>.</span>';
      }
      
      medTpl += ' </a>';
      medTpl += '</li>';
	    
	  });
	  
	  medTpl += '</ul>';
	  
	  // insert list to DOM
	  $medList.empty().append(medTpl);
	  
	  // events on media click
	  $('a', $medList).bind('click', mediaTitleAction);
	  
  }
  else  // no media
  {
    $medList.empty().append('<p class="msg-nores">'+lg["You did not create any content yet."]+'</div>');
  }
  
}



/**
 * Proceed User Fav Maps
 * @param document  x : xml response
 */
function doUserFavMaps(x) {
  
  var $mapList = $('.map-list', $panMyfav);
  var z = 0;
  
  if ($(x).children('mm').children().length != 0) {
  
	  // map list template
	  var mapTpl = new String('<ul>');
	  
	  $(x).find('map').each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    mapId = $(this).attr('id');
	    mapTitle = $(this).attr('t');
	    mapOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    mapTpl += '<li class="map-'+mapId+' '+zeb+'">';
	    mapTpl += ' <p class="add-map"><a href="" title="ajouter"><span>ajouter</span></a></p>';
	    mapTpl += ' <p class="del"><a href="" title="retirer"><span>retirer</span></a></p>';
	    mapTpl += ' <p class="map-name '+mapOffi+'"><a href="" title="'+mapTitle+'"><span>'+mapTitle+'</span></a></p>';
	    mapTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
	  mapTpl += '</ul>';
	  
	  // insert list to DOM
	  $mapList.empty().append(mapTpl);
	  
	  // events on map click
	  $('.map-name a', $mapList).bind('click', mapTitleAction);
	  
	  // event on "add to selection" button
	  $('.add-map a', $mapList).bind('click', addMapToSelection);
	  
	  // event on "del map from fav"
	  $('.del a', $mapList).bind('click', delFav);
	  
	}
  
}



/**
 * Proceed User Fav Markers
 * @param document  x : xml response
 */
function doUserFavMarkers(x) {
  
  var $marList = $('.mar-list', $panMyfav);
  var z = 0;
  
  if ($(x).children('mm').children().length != 0) {
  
	  // marker list template
	  var marTpl = new String('<ul>');
	  
	  $(x).find('mar').each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    marId = $(this).attr('id');
	    marTitle = $(this).attr('t');
	    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
	    marTpl += ' <p class="del"><a href="" title="retirer"><span>retirer</span></a></p>';
	    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
	    marTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
	  marTpl += '</ul>';
	  
	  // insert list to DOM
	  $marList.empty().append(marTpl);
	  
	  // events on marker click
	  $('.mar-name a', $marList).bind('click', markerTitleAction);
	  
	  // event on "del marker from fav"
    $('.del a', $marList).bind('click', delFav);
	  
	}
  
}



/**
 * Proceed User Fav Media
 * @param document  x : xml response
 */
function doUserFavMedia(x) {
  
  var $medList = $('.med-list', $panMyfav);
  
  if ($(x).children('mm').children().length != 0) {
  
	  // media list template
	  var medTpl = new String('<ul>');
	  
	  $(x).find('med').each(function(){
	    
	    medId = $(this).attr('id');
	    medTitle = $(this).attr('t');
	    medType = $(this).attr('tp');
	    medThumb = $(this).attr('th');
      marId = $(this).attr('mid');
      marUser = $(this).attr('u');
          
      medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
      medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
      
      if (typeof(medThumb) != 'undefined' && medThumb != '0') {
        medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+medThumb+'" alt="'+medTitle+'" />';
      }
      else {
        medTpl += ' <span>.</span>';
      }
      
      medTpl += ' </a>';
      medTpl += '</li>';
	    
	  });
	  
	  medTpl += '</ul>';
	  
	  // insert list to DOM
	  $medList.empty().append(medTpl);
	  
	  // events on media click
	  $('a', $medList).bind('click', mediaTitleAction);
	  
	}
  
}



/**
 * Proceed Map Markers
 * @param document  x : xml response
 */
function doMapMarkers(x) {

  /* MAP */
  
  $(x).find('map').each(function(){
    
    // replace map title in pan
    $('h3', $panMap).text($(this).attr('t'));
    
    // show right actions
    if ($(this).attr('status') == 'owner') {
      $('.map-add-to', $panMap).show();
      $('.map-participate', $panMap).hide();
    }
    else if($(this).attr('status') == 'shared') {
      $('.map-participate', $panMap).show();
      $('.map-add-to', $panMap).hide();
    }
    else {
      $('.map-add-to', $panMap).hide();
      $('.map-participate', $panMap).hide();
    }
    
  });
    
  
  /* MARKER */

  var $marList = $('.mar-list', $panMap);
  var $marXML = $(x).find('mar');
  var marTpl = new String();
  var z = 0;
  
  // if there is markers
  if ($marXML.length > 0)
  {
  	
	  // marker list template
	  marTpl += '<ul>';
	  
	  $marXML.each(function(){
	    
	    zeb = (z == 0) ? 'zeb1' : 'zeb2';
	    
	    marId = $(this).attr('id');
	    marTitle = $(this).attr('t');
	    marOffi = ($(this).attr('o') == 1) ? 'offi' : '';
	    
	    marTpl += '<li class="mar-'+marId+' '+zeb+'">';
	    marTpl += ' <p class="mar-name '+marOffi+'"><a href="" title="'+marTitle+'"><span>'+marTitle+'</span></a></p>';
	    marTpl += '</li>';
	    
	    z++;
	    if (z > 1) { z = 0; }
	    
	  });
	  
	  marTpl += '</ul>';
	  
  }
  else
  {
  	marTpl += '<p class="msg-nores">Aucun lieu dans cette carte</p>';
  }
  
  // insert list to DOM
  $marList.empty().append(marTpl);
  
  // events on marker click
  $('a', $marList).bind('click', markerTitleAction);

}



/**
 * Proceed Map Media
 * @param document  x : xml response
 */
function doMapMedia(x) {
  
  /* MAP */
  
  $(x).find('map').each(function(){
    
    // replace map title in pan
    $('h3', $panMap).text($(this).attr('t'));
    
    // show right actions
    if ($(this).attr('status') == 'owner') {
      $('.map-add-to', $panMap).show();
      $('.map-participate', $panMap).hide();
    }
    else if($(this).attr('status') == 'shared') {
      $('.map-participate', $panMap).show();
      $('.map-add-to', $panMap).hide();
    }
    else {
      $('.map-add-to', $panMap).hide();
      $('.map-participate', $panMap).hide();
    }
    
  });
    
  
  /* MEDIA */

  var medTpl = new String();
  var $medList = $('.med-list', $panMap);
  
  var $medXML = $(x).find('med');
  
  // if there is media
  if ($medXML.length > 0)
  {
  
	  // media list template
	  medTpl += '<ul>';
	  
	  $medXML.each(function(){
	    
	    medId = $(this).attr('id');
	    medTitle = $(this).attr('t');
	    medType = $(this).attr('tp');
	    medThumb = $(this).attr('th');
	    marId = $(this).attr('mid');
	    marUser = $(this).attr('u');
	        
	    medTpl += '<li class="med-'+medId+' mar-'+marId+'">';
	    medTpl += ' <a href="" class="t'+medType+'" title="'+medTitle+'">';
	    
	    if (typeof(medThumb) != 'undefined' && medThumb != '0') {
	      medTpl += ' <img src="'+userFolder+'/'+marUser+folderSmall+'/'+medThumb+'" alt="'+medTitle+'" />';
	    }
	    else {
	      medTpl += ' <span>.</span>';
	    }
	    
	    medTpl += ' </a>';
	    medTpl += '</li>';
	    
	  });
	  
	  medTpl += '</ul>';
  
  }
  else
  {
  	medTpl += '<p class="msg-nores">Aucun contenu dans cette carte</p>';
  }
  
  // insert list to DOM
  $medList.empty().append(medTpl);
  
  // events on media click
  $('a', $medList).bind('click', mediaTitleAction);

}



/**
 * Proceed Marker Media
 * @param document  x : xml response
 */
function doMarkerMedia(x) {
  
  var $marXml = $(x).find('mar');
  var marId, marOwn;
  
	/* MARKER */
  
  $marXml.each(function(){
    
    marId = $(this).attr('id');
    marLat = $(this).attr('la');
    marLon = $(this).attr('lo');
    marOwn = $(this).attr('own');
    marType = $(this).attr('tp');
    
    // replace marker title in pan
    $('h3', $panMar).text($(this).attr('t'));
    
  });
  
  // treat cluster adding (do nothing for temporary marker)
  // if the marker need to be added to the cluster 
  if ($panMar.data('addCluster') 
		  || (typeof mmGeo.overlayed[mmGeo.marker_prefix + marId]!= "undefined" && !mmGeo.overlayed[mmGeo.marker_prefix + marId].div_)) {
  	mmGeo.addTempMarker({lat: marLat, lon: marLon, marId: marId, panId: 'tmp', mapId: null, ico: 't'+marType+'.png'});
  	$panMar.data('addCluster', false); // reset adding to cluster
  	// center on marker
    GEvent.trigger(mmGeo.temp_overlay, 'click');
  }
  else if (!$panMar.data('isTemp')) { // not adding to cluster AND not a temporary marker
    // center on marker
    GEvent.trigger(mmGeo.overlayed[mmGeo.marker_prefix + marId], 'click');
  }
  
  // reset temporary state
  $panMar.data('isTemp', false);
  
  
  /* MEDIA LIST */
  
  var $medList = $('.marmed-list', $panMar);
  var z = 0;
  
  // media list template
  var medTpl = new String('<ul>');
  
  $marXml.find('med').each(function(){
  	
  	zeb = (z == 0) ? 'zeb1' : 'zeb2';
    
    medId = $(this).attr('id');
    medTitle = $(this).attr('t');
    medType = $(this).attr('tp');
    marUser = $(this).attr('u');
        
    medTpl += '<li class="med-'+medId+' '+zeb+'">';
    medTpl += ' <p class="med-thumb">';
    medTpl += '  <a href="" title="'+medTitle+'" class="t'+medType+'">';
    
    if ($(this).attr('th')) {
      medTpl += ' <img src="'+userFolder+'/'+marUser+folderSsmall+'/'+$(this).attr('th')+'" alt="'+medTitle+'" width="34" height="34" />';
    }
    else {
      medTpl += ' <span>.</span>';
    }
    
    medTpl += '  </a>';
    medTpl += ' </p>';
    medTpl += ' <p class="med-name"><a href=""><span>'+medTitle+'</span></a></p>';
    medTpl += '</li>';
    
    z++;
    if (z > 1) { z = 0; }
    
  });
  
  medTpl += '</ul>';
  
  // insert list to DOM
  $medList.empty().append(medTpl);
  
  // events on media click
  $('a', $medList).bind('click', marMedTitleAction);
  
  // add link for adding media to marker if the user owns it
  if (marOwn == 1) { $('#add-media', $panMar).show(); }
  else { $('#add-media', $panMar).hide(); }
  
  // get maps where the marker belongs to
  $(x).find('map').each(function(){
  	$('.mar-foot span', $panMar).text($(this).attr('t'));
  	$('.mar-foot p', $panMar).removeAttr('class').addClass('map-'+$(this).attr('id'));
  });
  
  // show pans and apply scrolling
  $panMar.show();
  $panMed.show();
  
  
  /* MEDIA SELECTED */
  
  medSel = $panMar.data('medId');
  
  // if no selected media, select the first one
  if (medSel == 0) {
    $('li:first .med-name a', $medList).toggleClass('active', true);
  }
  else {
  	if ($('li ', $medList).length > 4) {
  	  $medList.scrollTo($('.med-'+medSel, $medList), 300);
  	}
    $('.med-'+medSel+' .med-name a', $medList).toggleClass('active', true);
  }
  
  // get media selected infos from xml
  showMedia($(x).children('mm').children('med'));
	
}


/**
 * Proceed Media Infos
 * @param document  x : xml response
 */
function doMediaInfos(x) {
  
  showMedia($(x).find('med'));
  
}




/************************* ACTIONS *************************/

/**
 * CHANGE PUBLIC NUMBER OF MARKER/MEDIA DISPLAYED ON GMAP
 * @param   event   e
 */
function changePublicNb(e) {
	
	var $a = $(e.currentTarget);
	var $div = $a.parent();
	var act = $a.attr('id').split('-')[1];
	var cur = parseInt($('#pub-cur', $div).text());
	var tot = parseInt($('#pub-tot', $div).text());
	var list = $('.bt-list a.active', $panPub).parent().attr('class').split('-')[2];
	var limit = (list == 'med') ? limitPublicMedia : limitPublicMarker;
	var page = Math.ceil(cur/limit);
	
	// more or less ?
	switch (act) {
		
		case 'more':
		  if (cur < tot) {
		  	$panPub.data('pg-'+list, page+1);
		    refreshPan($panPub);
		  }
		  break;
		  
		default:
		  if (cur > limit) {
		  	$panPub.data('pg-'+list, page-1);
		  	refreshPan($panPub);
		  }
		  break;
		  	
	}
	
	e.preventDefault();
	
}



/**
 * MAP TITLE ACTION
 * @param event   e
 */
function mapTitleAction(e) {
	
  var $a = $(e.currentTarget);
  var mapId = $a.parent().parent().attr('class').split(' ')[0].split('-')[1];
  var $pan = $a.parents('.pan');
  
  // hide public place if 'select' bloc
  if ($pan.attr('id').split('-')[1] == 'sel') {
    togglePublicPan(false);
  }
  
  // only if map is not the current active
  if (!$a.hasClass('active')) {
    $('.map-name a', $pan).toggleClass('active', false);   // unactive all map name links
    $a.toggleClass('active', true);                        // active map link
    showMapPan(mapId, $pan);                               // show map media
    
    // hide marker panel
    closePanMar();
    
    // a clic on map in the selection panel
    if ($pan.attr('id') == 'pan-sel') {
    	
    	// hide 2nd panels
      $pan2nd.hide();
      $('a', $mainMenu).toggleClass('active', false);
      
      // trigger map hits
      var p = {};
      p.req = 'openselectedmap';
      p.params = {}
      p.params.id = mapId;
      informDB(p);
      
    }
    
    // if needed to reload the map (because workflow has been used to add media/marker inside)
    if ($panSel.data('mapReload') == mapId)
    {
    	refreshPan($panSel);
      $panSel.data('mapReload', '0');
    }
  }
  
  e.preventDefault();
  
}



/**
 * MARKER TITLE ACTION
 * @param event   e
 */
function markerTitleAction(e) {
	var $a = $(e.currentTarget);
  var panName = $a.parents('.pan').attr('id').split('-')[1];
  var mapId = $a.parents('.pan-map').data('mapId'); 
  var addToClust = ((panName == 'pub' && $('#pub-on', $panPub).hasClass('active')) || (panName == 'sel' && $('.map-'+mapId+' .view-map a', $panSel).hasClass('active'))) ? false : true;
  var marId = $a.parent().parent().attr('class').split(' ')[0].split('-')[1];
  showMarker(marId, addToClust);
  e.preventDefault();
}



/**
 * MEDIA TITLE ACTION
 * @param event   e
 */
function mediaTitleAction(e) {
  var $a = $(e.currentTarget);
  var ids = $a.parent().attr('class').split(' ');
  var panName = $a.parents('.pan').attr('id').split('-')[1];
  var mapId = $a.parents('.pan-map').data('mapId');
  var addToClust = ((panName == 'pub' && $('#pub-on', $panPub).hasClass('active')) || (panName == 'sel' && $('.map-'+mapId+' .view-map a', $panSel).hasClass('active'))) ? false : true;
  showMarker(ids[1].split('-')[1], addToClust, ids[0].split('-')[1]);
  e.preventDefault();
}



/**
 * MEDIA TITLE ACTION IN MARKER PANEL
 * @param event   e
 */
function marMedTitleAction(e) {
  
  var $a = $(e.currentTarget);
  var $li = $a.parent().parent();
  var $medName = $('.med-name a', $li);
  var medId = $li.attr('class').split(' ')[0].split('-')[1];
  var $medList = $('.marmed-list', $panMar);
  
  // do nothing if media is already active
  if (!$medName.hasClass('active')) {
    $('.med-name a', $panMar).toggleClass('active', false);   // unactive all map name links
    $medName.toggleClass('active', true);                     // active map link
    $panMar.data('medId', medId);                             // save Media Id in media pan
    $('#marmed-menu a', $panMed).toggleClass('active', false);// unactive media menu links
    $('#marmed-preview', $panMed).toggleClass('active', true);// active preview
    $('.marmed-body', $panMed).hide();                        // hide menu bodies
    $('#body-preview', $panMed).empty().show();               // empty and show the preview
    $medList.scrollTo($('.med-'+medId, $medList), 300);       // scroll to media in the list
    refreshPan($panMed);
  }
  
  e.preventDefault();
 	
}



/**
 * FAVORISE A MAP
 * @param {event} e 
 */
function doFav(e) {
  
  var $a = $(e.currentTarget);
  var $pan = $a.parents('.pan');
  var panName = $pan.attr('id').split('-')[1];
  
  // if not already fav
  if (!$a.hasClass('active'))
  {
	  
	  var p = {};
	  
	  // get ID's and request name
	  switch (panName)
	  {
	  	case 'sel':
        var id = $('.pan-map', $pan).data('mapId');
        p.req = 'favmap';
        p.what = 'map';
        break;
	  	case 'map':
	  	  var id = $pan.data('mapId');
	  	  p.req = 'favmap';
	  	  p.what = 'map';
	  	  break;
	  	case 'mar':
	  	  var id = $pan.data('marId');
        p.req = 'favmarker';
        p.what = 'mar';
        break;
      case 'med':
        var id = $pan.data('medId');
        p.req = 'favmedia';
        p.what = 'med';
        break;
	  }
	  
	  p.loadElmt = $a;
	  p.msgElmt = $('.pan-msg', $pan);
	  p.params = {};
	  p.params.id = id;
	  
	  // save fav on DB
	  postFav(p);
	  
  }
  else
  {
  	// display error message
  	switch (panName)
    {
      case 'mar':
        var txt = 'lieu déjà favorisé !';
        break;
      case 'med':
        var txt = 'contenu déjà favorisé !';
        break;
      default:
        var txt = 'carte déjà favorisée !';
        break;
    }
  	
    showPanMsg($('.pan-msg', $pan), txt, 'no');
    
  }
  
  e.preventDefault();
  
}



/**
 * Do Note a Media
 * @param   event   e
 */
function doNote(e)
{
	
	var $a = $(e.currentTarget);
	
	// if not already noted with this note
  if (!$a.hasClass('active'))
  {
		var p = {};
		p.params = {};
		p.req = 'note';
		p.params.id = $panMed.data('medId');
		p.params.note = $a.parent().attr('id').split('-')[1];
		p.loadElmt = $a;
		
		postNote(p);
  }

	e.preventDefault();
	
}



/**
 * ADD MAP TO SELECTION
 * @param event   e
 */
function addMapToSelection(e) {
	
	if (panMarLock)
  {
    showMsgBox('Vous devez d\'abord quitter le processus d\'ajout de contenu.');
  }
  else
  {
  
	  var $a = $(e.currentTarget);
	  var $pan = $a.parents('.pan');
	  var panName = $pan.attr('id').split('-')[1];
	  var mapId;
	  var $mapList = $('.map-list', $panSel);
	  
	  // get mapID
	  switch(panName) {
	   
	    case 'map':
	      mapId = $pan.data('mapId'); 
	      break;
	      
	    case 'mar':
	      mapId = $a.parent().attr('class').split('-')[1];
	      break;
	      
	    default:	// when clicked in a map list add but
	      mapId = $a.parent().parent().attr('class').split(' ')[0].split('-')[1];
	      break;
	    
	  }
	  
	  
	  // warn user if this map is already in selection
	  if ($('.map-'+mapId, $mapList).length > 0) {
	    if ($('li ', $mapList).length > 8) {
	      $mapList.scrollTo($('.map-'+mapId, $mapList), 300);
	      showMsgBox('Cette carte est déjà dans votre selection.');
	    }
	    $('.map-'+mapId+' .map-name a', $mapList).trigger('click');
	  }
	  else {
	    // add map to the selection
	    $panSel.data('mapId', mapId);
	    if (panName == 'mar') { $('.foot-close', $panMar).trigger('click'); }
	    refreshPan($panSel);
	  }
	  
  }
  
  e.preventDefault();
}



/**
 * DELETE MAP FROM SELECTION
 * @param event   e
 */
function deleteSelectedMap(e) {
	
	var $a = $(e.currentTarget);
	var mapId = $a.parent().parent().attr('class').split(' ')[0].split('-')[1];
	
	// delete from cluster
	mmGeo.removeGeometries(mapId, true);
	
	// delete map in map list / markers in stock / media in stock
	$('.map-'+mapId, $panSel).remove();
	
	// if this map is open, close pan map
	if ($panSelMap.data('mapId') == mapId) {
		toggleSelectedMapPan(false);
	}
	
	// synchro BDD
  var p = {};
  p.params = {};
  p.params.id = mapId;
  p.req = 'delselectedmap';
  informDB(p);
		
	e.preventDefault();
	
}



/**
 * DELETE ALL MAPS FROM SELECTION
 * @param event   e
 */
function deleteAllSelectedMap(e) {
	
	var $mapList = $('.map-list li', $panSel);
	
	$mapList.each(function(){
		
		var mapId = $(this).attr('class').split(' ')[0].split('-')[1];
		
		// delete from cluster
    mmGeo.removeGeometries(mapId, true);
    
    // delete map in map list / markers in stock / media in stock
    $('.map-'+mapId, $panSel).remove();
    
    // if this map is open, close pan map
	  if ($panSelMap.data('mapId') == mapId) {
	    toggleSelectedMapPan(false);
	  }
    
	});
	
	if ($mapList.length > 0) {
		// synchro BDD
	  var p = {};
	  p.req = 'delselectedmap';
	  informDB(p);
	}
    
  e.preventDefault();
  
}



/**
 * DELETE MAP / MARKER FROM FAV
 * @param   event   e
 */
function delFav(e){
	
	var $a = $(e.currentTarget);
	var $favElmt = $a.parents('li');
	var delWhat = $a.parents('.wrap-list').attr('class').split(' ')[0].split('-')[1];
	var eltId = $a.parents('li').attr('class').split(' ')[0].split('-')[1];
	var p = {};
  p.params = {};
  p.params.id = eltId;

  switch(delWhat)
  {
  	case 'map':
  	  p.req = 'delfavmap';
  	  delFavMapId(eltId);
  	  break;
  	case 'mar':
      p.req = 'delfavmarker';
      delFavMarkerId(eltId);
      break;
  }
  
  // del DOM element
  $favElmt.remove();
  
  // synchro BDD
  informDB(p);
	
	e.preventDefault();
}



/**
 * TOGGLE HIDE / SHOW MAP
 */
function toggleShadeMap(e) {
	
	var $a = $(e.currentTarget);
	var mapId = $a.parent().parent().attr('class').split(' ')[0].split('-')[1];
	
	// prevent double click
	$a.unbind();
	
	// remove markers from cluster
  mmGeo.removeGeometries(mapId, true);
	
	// if active, shadow map / if inactive, unshade map
	if ($a.hasClass('active')) {

    $a.toggleClass('active', false);
	  
  }
	else {
		
		var p = {};
    p.params = {};
    
    $a.toggleClass('active', true);
    
    // refresh pan
    p.params.o = $('.order-list :selected', $panSel).val();
    p.params.id = mapId;
    p.req = 'getselectedmap';
    p.callb = doSelectedMap;
    requestXMLData(p);
		
	}
	
	// re-bind link
	$a.bind('click', toggleShadeMap);
	
	e.preventDefault();
	
}



/**
 * SHOW MAP PAN (in selection pan or the 2nd pans)
 * @param int       mapId
 * @param element   $pan
 */
function showMapPan(mapId, $pan) {
	
	var faved = hasFav('map', mapId);
  
  // Do stuff with stock for selection pan
  if ($pan.attr('id').split('-')[1] == 'sel') {
    
    var $mapList = $('.map-list', $pan);
    var $marList = $('.mar-list', $pan);
    var $medList = $('.med-list', $pan);   
    var $marShow = $('#sel-maps-mar .map-'+mapId, $pan);
    var $medShow = $('#sel-maps-med .map-'+mapId, $pan);
    var mapTitle = $('.map-'+mapId+' .map-name span', $mapList).text();
    var oldMap   = $panSelMap.data('mapId');
    
    // init map title
    $('h3', $panSelMap).text(mapTitle);
    
    // if the map panel has a map inside, move it to stock
    if (oldMap > 0) {
    	$marStock.append($('.map-'+oldMap, $marList));
    	$medStock.append($('.map-'+oldMap, $medList));    	
    }
    
    // move markers and media of the selected map from stock to pan map
    $marList.append($('.map-'+mapId, $marStock));
    $medList.append($('.map-'+mapId, $medStock));
    
    // save mapId in the pan-map panel
    $panSelMap.data('mapId', mapId);
    
    // set the map fav bt
    $('.bt-map-fav a', $panSelMap).toggleClass('active', faved);
    
    // empty map msg
    $('.pan-msg', $panSelMap).empty();
    
    // display sel map pan
    toggleSelectedMapPan(true);
    
    // show right map actions
    if ($('.map-'+mapId+' .map-name', $mapList).hasClass('owner')) {
    	$('.map-add-to', $panSelMap).show();
    	$('.map-participate', $panSelMap).hide();
    }
    else if ($('.map-'+mapId+' .map-name', $mapList).hasClass('shared')) {
      $('.map-participate', $panSelMap).show();
      $('.map-add-to', $panSelMap).hide();
    }
    else {
    	$('.map-add-to', $panSelMap).hide();
    	$('.map-participate', $panSelMap).hide();
    }
    
  }
  else { // for all 2nd Pan
    
    // save mapId in the pan map
    $panMap.data('mapId', mapId);
    
    // set the map fav bt
    $('.bt-map-fav a', $panMap).toggleClass('active', faved);
    
    // empty map msg
    $('.pan-msg', $panMap).empty();
    
    // show Pan
    $panMap.show();
    
    // load data
    refreshPan($panMap);
    
  }
    
}



/**
 * SHOW MARKER PANEL (optional choose media to show at opening)
 * @param int       marId      : Marker ID
 * @param boolean   addToClust : add the marker to cluster (true)
 * @param int       medId      : Media ID
 */
function showMarker(marId, addToClust, medId) {
  
		var medId = (typeof(medId) != "undefined" || medId == 0) ? medId : 0;
		var addToClust = (typeof(addToClust) == "undefined") ? false : addToClust;
		
		$panMar.data('addCluster', addToClust);
		
		// if new marker requested (not the current opened)
		if (marId != $panMar.data('marId') || $panMar.data('marId') == 0) {
		  
		  // hide pans
		  closePanMar();
			
			// save marker and media to panel data
			$panMar.data('marId', marId);
			$panMar.data('medId', medId);
			$panMed.data('medId', medId);
			
			// default the fav marker bt
			var faved = hasFav('mar', marId);
			$('#bt-mar-fav a', $panMar).toggleClass('active', faved);
			
			// active preview pan by default when viewing new marker
			$('#marmed-menu a', $panMed).toggleClass('active', false);
	    $('#marmed-preview', $panMed).toggleClass('active', true);
	    $('.marmed-body', $panMed).hide();
	    $('#body-preview', $panMed).empty().show();
	    
			// get marker infos
			refreshPan($panMar);
			
		}
		else { // same marker requested
		
			var $medList = $('.marmed-list', $panMar);
	
	    // if same media requested
	    if (medId == 0)
	    {
	    	
	      // show pans
        $panMar.show();
        $panMed.show();
        
        // check fav star if it must be unactive
        var faved = hasFav('mar', marId);
        $('#bt-mar-fav a', $panMar).toggleClass('active', faved);
        
	    }
	    // if another media requested
	    else if (medId > 0)
	    {
				if ($('.med-'+medId, $panMar).length > 0)  // media exists : scroll to it
				{
				  
					// show pans
					$panMar.show();
          $panMed.show();
					  
		      $panMar.data('medId', medId);
		      
		      if ($('li ', $medList).length > 5) {
		        $medList.scrollTo($('.med-'+medId, $medList), 300);
		      }
		      
					$('.med-'+medId+' .med-name a', $panMar).trigger('click');
					
				}
				else  // media is not in the DOM list, reload the panel
				{
					
					// hide pans
					closePanMar();
					  
					$panMar.data('medId', medId);
					refreshPan($panMar);
					
				}
	    }
			
		}
	  
}



/**
 * LOAD A MEDIA IN MEDIA PANEL 
 * @param   element   $m : media XML element
 */
function showMedia($m) {
	
  var $medPreview = $('#body-preview', $panMed);
  var $medDetails = $('#body-details', $panMed);
  var $medAlert = $('#marmed-alert', $panMed);
  var $medMenu = $('#marmed-menu', $panMed);
  var $medNote = $('#marmed-note span', $panMed);
  var $medCom = $('#marmed-com span', $panMed);
  
  medId = $m.attr('id');
  medUser = $m.attr('u');
  medTitle = $m.attr('t');
  medTxt = $m.attr('tx');
  medType = $m.attr('tp');
  medFile = $m.attr('f');
  medNote = $m.attr('p');
  medCom = $m.attr('com');
  
  // media note
  $medNote.text(medNote);
  var isPos = parseInt(medNote) >= 0;
	$medNote.toggleClass('neg', !isPos);
  
  // save Id in the pan
  $panMed.data('medId', medId);
  
  // default the fav media bt
  var faved = hasFav('med', medId);
  $('#bt-med-fav a', $panMed).toggleClass('active', faved);
  
  // default the notes bts
  $('#marmed-plus a', $panMed).toggleClass('active', false);
  $('#marmed-minus a', $panMed).toggleClass('active', false);
  
  // display comments count
  $medCom.text(medCom);

  // show the alert bt if not already reported
  if (typeof($m.attr('mst')) != "undefined") {
  
	  // prepare button for alert
	  $medAlert.unbind().click(function(){
	  	
	  	if (panMarLock)
		  {
		    showMsgBox('Vous devez d\'abord quitter le processus d\'ajout de contenu.');
		  }
		  else
		  {
		  	$.ajax({
		  		type:'POST',
	        dataType:'html',
	        success:function(c, textStatus){
	        	$('#report-wrap', $report).html(c);
	          $report.jqmShow();
	        },
	        url:$m.attr('mst')
	      });
		  }
	  	
	  	return false;
	  	
	  }).show();
	  
  }
  else {
  	// hide button
  	$medAlert.hide();
  }
  
  // load media function for each media type
  switch (medType) {
    
    case '1': // image
      $medMenu.show();
      $medPreview.empty().append('<div id="med-img" class="med-'+medId+'"><a href=""><img src="'+userFolder+'/'+medUser+folderMedium+'/'+medId+'.'+medFile+'" alt="'+medTitle+'" /></a></div>'); 
      $medDetails.empty().append('<div><h3>'+medTitle+'</h3><p id="med-desc">'+medTxt+'</p></div>');
      $('#med-img a', $panMed).unbind();
      $('#med-img a', $panMed).click(function(){
      	var $img = $('#med-img img', $panMed);
      	var $inner = $("#wrap-big-img a");
      	var src = $img.attr("src").replace('/m/', '/b/');
      	$inner.empty().append('<img src="'+src+'" alt="'+$img.attr("alt")+'" />');
      	$('#big-img').jqmShow();
      	$('#big-img').jqmAddClose($inner);
      	return false;
      });
      break;
    
    case '2': // video
      $medMenu.show();
      $medPreview.empty().append('<div id="med-vid" class="med-'+medId+'">'+medFile+'</div>');
      $medDetails.empty().append('<div><h3>'+medTitle+'</h3><p id="med-desc">'+medTxt+'</p></div>');
      break;
      
    case '3': // audio
      $medMenu.show();
      $medPreview.empty().append('<div id="med-aud" class="med-'+medId+'"><p id="playeraudio"></p></div>');
      loadAudioPlayer(medUser, medId, medTitle);
      $medDetails.empty().append('<div><h3>'+medTitle+'</h3><p id="med-desc">'+medTxt+'</p></div>');
      break;
    
    case '4': // text
      $medMenu.hide();
      $medPreview.empty().append('<div id="med-txt" class="med-'+medId+'"><div><h3>'+medTitle+'</h3>'+medTxt+'</div></div>');
      break;
      
    case '5': // rss
      
      $medMenu.show();
      
      var rssTpl = new String();
      
      $f = $m.find('feed');
      
      if ($f.children('f').length > 0)
      {
      	rssTpl = '<h3>'+$f.attr('t')+'</h3>';
      	
      	rssTpl += '<ul>';
      	
      	$f.children('f').each(function(){
      		rssTpl += '<li><span>'+$(this).attr('d')+'</span> <a href="'+$(this).attr('l')+'" target="_blank">'+$(this).attr('t')+'</a></li>';
      	});
      	
      	rssTpl += '</ul>';
      }
      else // Feed has errors
      {
      	rssTpl += '<p id="feed-error">Ce Flux contient des erreurs et ne peut pas être affiché.</p>';
      }
      
      $medPreview.empty().append('<div id="med-rss" class="med-'+medId+'"><div>'+rssTpl+'</div></div>');
      $medDetails.empty().append('<div><p id="med-desc">'+medTxt+'</p></div>');
      break;
      
  }
  
}


/**
 * SHOW MEDIA COMMENTS
 * @param json p : parameters to pass to the ajax request
 */
function showMediaComs(p)
{
	if (panMarLock)
  {
    showMsgBox('Vous devez d\'abord quitter le processus d\'ajout de contenu.');
  }
  else
  {
		// get comments from server
	  $.ajax({type:     'GET',
	          dataType: 'html',
	          url:      '/comment',
	          data:     p,
	          beforeSend: function(req) { $('#sel-loader', $panSel).toggleClass('loading', true); },
	          success:    function(c){
	          	$('#coms-wrap', $mediaComs).html(c);
	          	$mediaComs.jqmShow();
	          	prepareComList();
	          },
	          complete:   function(req) { $('#sel-loader', $panSel).toggleClass('loading', false); }
	  });
  }
}


/**
 * PREPARE COM LIST
 */
function prepareComList()
{
	// new comment link
	$('#com-add', $mediaComs).bind('click', doNewCom);
	
	// pagination links
	$('#com-page a', $mediaComs).each(function(){
		$(this).click(function(){
			showMediaComs({ 'page': $(this).attr('href').split('=')[1] })
			return false;
		});
	});
}


/**
 * PREPARE NEW COMMENT FORM
 */
function prepareNewCom()
{
	// cancel button
	$('#com-cancel', $mediaComs).click(function(){
		showMediaComs({ 'id': $panMed.data('medId') });
		return false;
	});
	
	// create com
	$('#com-create', $mediaComs).click(function(){
		
		var p = {
			title: $('#commentaire_title', $mediaComs).val(),
			txt: $('#commentaire_txt', $mediaComs).val(),
			csrf: $('#commentaire__csrf_token', $mediaComs).val()
		};
		
		// send to server
	  $.ajax({type:     'POST',
	          dataType: 'html',
	          data:     p,
	          url:      $('form', $mediaComs).attr('action'),
	          success:    function(code){
	            
	            // display html
	            $('#coms-wrap', $mediaComs).html(code);
	            
	            // prepare form if any error OR com list if ok
	            if ($('#com-bt', $mediaComs).length > 0)
	            {
	            	prepareNewCom();
	            }
	            else {
	            	prepareComList();
	            	$('#marmed-com span', $panMed).text($('h2 span', $mediaComs).text());
	            }
	          }
	  });
		
		return false;
	});
}


/**
 * SHOW COMMENT FORM
 * @param event e
 */
function doNewCom(e)
{
	// get comment form HTML
  $.ajax({type:     'GET',
          dataType: 'html',
          url:      '/comment/new',
          success:    function(data){
            $('#coms-wrap', $mediaComs).html(data);
            prepareNewCom();
          }
  });
  
  e.preventDefault();
}


/**
 * DO REPORT MECHANISM
 */
function doReport(data) {
	
	// insert html for success report
	$('#report-wrap', $report).html(data);
	
	// hide report button in marker panel
	$('#marmed-alert a', $panMed).hide();
	
}



/**
 * Toggme public state on/off
 */
function publicOnOff($a) {

  // do nothing if link is active
  if (!$a.hasClass('active')) {
    if ($a.attr('id').split('-')[1] == 'on') {
      $('#pub3 a', $panPub).toggleClass('active', false);
      $a.toggleClass('active', true);
      $('#pub-reload', $panPub).trigger('click');
      togglePublicPan(true);
    }
    else {
      $('#pub3 a', $panPub).toggleClass('active', false);
      $a.toggleClass('active', true);
      mmGeo.removeGeometries(0, true);
      togglePublicPan(false);
    }
  }
}

/**
 * IS THE GIVEN MAP/MARKER/MEDIA FAVED BY CURRENT USER ?
 */
function hasFav(what, id)
{
	switch(what)
	{
		case 'map':
      return in_array(id, favMaps);
      break;
		case 'mar':
		  return in_array(id, favMarkers);
		  break;
		case 'med':
		  return in_array(id, favMedia);
      break;
	}
}


/**
 * ADD FAV MAP/MARKER/MEDIA ID TO GLOBAL ARRAY
 */
function addFav(what, id)
{
	if (!hasFav(what, id))
	{
		switch(what)
	  {
	  	case 'map':
        favMaps.push(id);
        break;
	    case 'mar':
	      favMarkers.push(id);
	      break;
	    case 'med':
	      favMedia.push(id);
	      break;
	  }
	}
}



/**
 * REMOVE FAV MAP ID FROM GLOBAL ARRAY
 */
function delFavMapId(id)
{
	var pos = favMaps.indexOf(parseInt(id));

  if (pos != -1) {
    favMaps.splice(pos,1);
  }
}



/**
 * REMOVE FAV MARKER ID FROM GLOBAL ARRAY
 */
function delFavMarkerId(id)
{
  var pos = favMarkers.indexOf(parseInt(id));

  if (pos != -1) {
    favMarkers.splice(pos,1);
  }
}



/**
 * REFRESH A PAN
 * @param element   $pan : pan
 */
function refreshPan($pan) {
  var p = getPanParams($pan); // get all params for ajax request
  if (p !== false) {
    requestXMLData(p);             // request datas
  }
}



/**
 * SHOW MAIN MENU PANS (display/hide)
 * @param event   e
 */
function toggleMainMenuPan(e) {
  var $a = $(e.currentTarget);
  var pan = $a.parent().attr('id').split('-')[1];
  var $pan = $('#pan-'+pan);
  
  // don't open if in Edition Mode
  if ($panCreate.is(':visible'))
  {
  	showMsgBox('Vous devez d\'abord quitter le processus d\'ajout de contenu.');
  }
  else
  {
	  // if pan is not still visible
	  if (!$pan.is(':visible'))
	  {
	    
	    // unactive all choices
	    $('a', $mainMenu).toggleClass('active', false);
	    
	    // active current
	    $a.toggleClass('active', true);
	    
	    // hide public panel
	    togglePublicPan(false);
	    
	    // hide open selected map panel
	    toggleSelectedMapPan(false);
	    
	    // hide marker panel
	    closePanMar();
	    
	    // unactive maps active
	    $('.map-name a.active', $pan2nd).toggleClass('active', false);
	    
	    // hide all menu pans
	    $('.pan2nd').hide();
	    
	    // show active
	    $pan.show();
	    
	    // reset search box
	    $('.searchbox input', $panBrowse).val('');
	     
	    // if user authenticated, load data
	    if ($('.msg-notauth', $pan).length == 0)
	    {
	      refreshPan($pan);
	    }
	      
	  }
	  else
	  {
	  	$('.close-pan', $pan).trigger('click');
	  }
	  
  }
    
  e.preventDefault();
}




/**
 * SWITCH LIST DISPLAY (map/media)
 * @param event   e
 */
function switchListDisplay(e) {
	
  var $a = $(e.currentTarget);
  
  // do switch if necessary
  if (!$a.hasClass('active')) {
  
    var $panBody = $a.parents('.filters').next('.pan-body');
    var $pan = $a.parents('.pan');
    var list = $a.parent().attr('class').split('-')[2];
    var $listToShow = $('.wrap-'+list+'-list', $panBody);
    
    // unactive map title link in 2nd pans
    if ($pan.hasClass('pan2nd'))
    {
      $('.map-name a.active', $pan).toggleClass('active', false);
    }
    
    // highlight the right tab
    $a.parents('.bt-list').find('a').toggleClass('active', false);
    $a.toggleClass('active', true);
    
    // show the right order
    $('.order-list', $pan).hide();
    $('.order-'+list, $pan).show();
    
    // show the right list
    $('.wrap-list', $panBody).hide();
    $listToShow.show();
    
    // if pan is not selection pan
    if ($pan.attr('id') != 'pan-sel') {
    	
    	var pan = $pan.attr('id');
    	
    	// hide pan-map if necessary
    	if (pan != 'pan-map') {
        $panMap.hide();
    	}
    	
    	// for mymap pan or myfav pan, check if user is authenticated before loading data
    	if (pan == 'pan-mymap' || pan == 'pan-myfav') {
    	  if ($('.msg-notauth', $pan).length == 0)
    	  {
    	  	refreshPan($pan);
    	  }
    	}
    	else {
        refreshPan($pan);
    	}
    }
  
  }
  
  e.preventDefault();
  
}



/**
 * SWITCH MEDIA MENU
 * @param event e
 */
function switchMediaMenu(e)
{
	
	var $menu = $(e.currentTarget);
	
	// if not the current
	if (!$menu.hasClass('active'))
	{
		
		var menu = $menu.attr('id').split('-')[1];
		var $medBody = $('#body-'+menu, $panMed);
		
  	// active the link
	  $('#marmed-menu a', $panMed).toggleClass('active', false);
	  $menu.toggleClass('active', true);
	  
	  // show the right body
	  $('.marmed-body', $panMed).hide();
	  $medBody.show();
	  
	}
	
	e.preventDefault();
	
}



/**
 * NAV IN A MARKER MEDIA LIST (previous or next)
 * @param event e
 */
function navMediaList(e)
{
	
	var $a = $(e.currentTarget);
	var way = $a.attr('id').split('-')[1];
	var medId = $panMed.data('medId');
	
	switch(way)
	{
		case 'next':
		  var $el = $('.med-'+medId, $panMar).next('li');
		  break;
		case 'prev':
      var $el = $('.med-'+medId, $panMar).prev('li');
      break;
	}
	
	if ($el.length > 0)
  {
  	var $medList = $('.marmed-list', $panMar);
    $('.med-name a', $el).trigger('click');
    
    if ($('li', $medList).length > 5)
    {
    	$medList.scrollTo($('.'+$el.attr('class').split(' ')[0], $medList), 300);
    }
  }
	
	e.preventDefault();
	
}


/**
 * Switch tabs in ABOUT Metamap overlay
 */ 
function doAboutMetamapTab(e) {
	
  var $link = $(e.currentTarget); 
  var $li = $link.parent();
  var $menu = $li.parent();  
  var tab = $li.attr('class');
  
  // off all tabs
  $menu.find('a').attr('class', '');
  $('#jqm-about div', e.data.w).hide();
  
  // show current
  $link.attr('class', 'selected');
  $('#'+$li.attr('class'), e.data.w).show();  
  
  e.preventDefault();

}


/**
 * DISPLAY METAMAP ? OVERLAY
 */
function prepareAboutMetamap(hash){
  // click on the tabs
  $('#about-menu a', hash.w).unbind();
  $('#about-menu a', hash.w).bind('click', {'w': hash.w}, doAboutMetamapTab);
  $('.'+hash.w.data('tab')+' a', hash.w).trigger('click');
};


/**************** CREATE PROCESS ******************/

/**
 * Start Create Process
 * @param json p : marker or map ID
 */
function startCreateProcess(p)
{
	var p = (typeof(p) != 'undefined') ? p : {};
	
	// lock Marker Panel
	panMarLock = true;
	
	// memorize state of public place
	panPubPreCreateState = $('#pub3 a.active').attr('id').split('-')[1];
	
	// memorize selected map activated (actually viewed)
	panSelPreCreateState = new Array();
	
	$('.map-list li', $panSel).each(function(){
		panSelPreCreateState.push($(this).attr('class').split(' ')[0].split('-')[1]);
  });
  
	// hide public markers and selected map's markers
	$('#pub3 #pub-off').trigger('click');
	$('#sel-view-all', $panSel).trigger('click');
	
	// show Create Pan
  showCreatePan();
  
  // if create in a given map, take the pre first step
  if (p.map) {
  	createInMap(p.map);
  }
  else {  
    chooseMediaType(p);
  }
}


/**
 * Get "participate/add to a map" template
 * @param int   mapId : Map ID
 */
function createInMap(mapId)
{
	if (typeof(mapId) != 'undefined') {
		
		// request server
		$.ajax({
      type:     'GET',
      dataType: 'html',
      data:     {'map': mapId},
      url:      '/createinmap',
      success:    function(c){
        $('#create-pan-in', $panCrea).html(c);
      }
    });
		
	}
}


/**
 * Show Create Pan and hide all the others
 */
function showCreatePan() {
	// hide pans
  $pan2nd.hide();
  $panMar.data('marId', '0');
  closePanMar();
  $mainMenu.hide();
  $rPan.hide();
  $('a', $mainMenu).toggleClass('active', false);
  $panSel.hide();
  $panPub.hide();
  
  // show Create Pan
  $('#create-pan-in', $panCrea).empty().append('<p id="create-first-load"></p>');
  $panCrea.show();
}


/**
 * Get Choose Media Type template
 * @param object  p : parameters to add to the request
 */
function chooseMediaType(p){
	
	var p = (typeof(p) != 'undefined') ? p : {};
	
	$.ajax({
      type:     'GET',
      dataType: 'html',
      data:     p,
      url:      '/choosemediatype',
      success:    function(c){
        $('#create-pan-in', $panCrea).html(c);
      }
  });
	
}


/**
 * Export Map
 * @param event e
 */
function exportMap(e){
	var mapId = ($(e.currentTarget).parents('.pan').attr('id') == 'pan-sel') ? $panSelMap.data('mapId') : $panMap.data('mapId');
	var p = {'url': 'mapIds='+mapId, 'embed': 'mapIds='+mapId};
	showExportPan(p);
	e.preventDefault();
}


/**
 * Export Marker
 * @param event e
 */
function exportMarker(e){
	var marId = $panMar.data('marId');
  var p = {'embed': 'markerId='+marId};
  showExportPan(p);
  e.preventDefault();
}


/**
 * Export Media
 * @param event e
 */
function exportMedia(e){
	var medId = $panMed.data('medId');
  var p = {'embed': 'mediaId='+medId};
  showExportPan(p);
  e.preventDefault();
}


/**
 * Show Export Pan
 */
function showExportPan(p) {
	
	var domainName = window.location.host;
	
	// link
	if ('url' in p) {
		$('#export-link', $exportPan).show();
		
		$('#export-url', $exportPan)
	    .val('http://'+domainName+'/?'+p.url)
	    .focus(function(){
	      this.select();
	    })
	    .click(function(){
	      this.select();
	    });
	}  
  
    
  // embed
  $('#export-embed', $exportPan)
    .val('<iframe src="http://'+domainName+'/embed?'+p.embed+'" height="343" width="400"></iframe>')
    .focus(function(){
      this.select();
    })
    .click(function(){
      this.select();
    });
    
  $exportPan.jqmShow();
	
}


/****************************** UTILS ******************************/ 


/**
 * LOAD AUDIO PLAYER
 * @param int     userId    : user ID
 * @param int     medId     : media ID
 * @param string  medTitle  : media title
 */
function loadAudioPlayer(userId, medId, medTitle) {
  AudioPlayer.embed("playeraudio", {
    soundFile: "http://"+window.location.hostname+userFolder+"/"+userId+"/"+medId+".mp3",
    titles: medTitle,
    autostart: "yes",
    transparentpagebg: "no",
    pagebg: "333333"
  });
}



/**
 * TOGGLE PUBLIC PAN
 * @param boolean   forceTo (optional) : force pan to be shown (true) or hided (false)
 */
function togglePublicPan(forceTo) {
  var $pubToggle = $('#pub-toggle', $panPub);
  var $pubList = $('.show-hide', $panPub);
  
  if ( ((typeof(forceTo) == 'boolean') && forceTo)
       || ((typeof(forceTo) != 'boolean') && !$pubList.is(':visible')) ) {
    $pubList.slideDown();
    $pubToggle.text(lg["hide list"]);
    toggleSelectedMapPan(false);
    list = $('.bt-list a.active', $panPub).parent().attr('class').split('-')[2];
    closePanMar();
    $pan2nd.hide();
    $('a', $mainMenu).toggleClass('active', false);
  }
  else {
    $pubList.slideUp();
    $pubToggle.text(lg["see list"]);
  }
}



/**
 * TOGGLE SELECTED MAP PAN
 * @param boolean   forceTo (optional) : force pan to be shown (true) or hided (false)
 */
function toggleSelectedMapPan(forceTo) {
  
  var $panMap = $('.show-hide', $panSel);
  
  if ( ((typeof(forceTo) == 'boolean') && forceTo)
      || ((typeof(forceTo) != 'boolean') && !$panMap.is(':visible')) ) {
    
    togglePublicPan(false);
    $panMap.slideDown();
    activeList = $('.wrap-list:visible', $panMap).attr('class').split(' ')[0].split('-')[1];
    $activeList = $('.'+activeList+'-list', $panMap);
    $('.foot-bt', $panSel).show();
  
  }
  else {
    
    $panMap.slideUp();
    $('.map-name a.active', $panSel).toggleClass('active', false);
    $('.foot-bt', $panSel).hide();
  
  }
  
}


/**
 * TOGGLE NEWS LIST
 * @param event e
 */
function toggleNewsList(e) {
	
	var $nL = $('#news-list');
	
	if ($nL.is(':visible'))
	{
		$nL.slideUp();
		$('#hide-news', $rPan).hide();
		$('#show-news', $rPan).show();
	}
	else
	{
		$nL.slideDown();
    $('#show-news', $rPan).hide();
    $('#hide-news', $rPan).show();
    closePanMar();
    $pan2nd.hide();
    $('a', $mainMenu).toggleClass('active', false);
	}
	
	e.preventDefault();
	
}


/**
 * Close Marker Pan
 */
function closePanMar()
{
	$panMar.hide();
	$panMed.hide();
  mmGeo.removeTempMarker();
  mmGeo.removeHighligth();
}


/**
 * SHOW MAP MSG
 * @param   element   el  : message container 
 * @param   string    msg : msg to display
 * @param   boolean   type: 'ok' or 'no'
 */
function showPanMsg($el, msg, type)
{
	// show success msg
  $el.empty().append('<span class="msg-'+type+'">'+msg+'</span>');
    
  // hide message after X seconds
  setTimeout(function() { $el.children('.msg-'+type).fadeOut(1000); }, 3000);
	
}



/**
 * SHOW MSG-BOX
 * @param   string  msg : message to display
 */
function showMsgBox(msg) {
	
	if (typeof(msg) == 'string') {
		
		var $msgBox = $('#msg-box');
		
		$('.boxmsg', $msgBox).hide();
		
		switch(msg) {
			
			case 'notauth' :
			  $('#msgnotauth', $msgBox).show();
			  break;
			  
			case 'msglic':
			  $('#msglic', $msgBox).show();			  
			  break;
			  
			default:
			  $('#msgtmp', $msgBox).empty().append('<p>'+msg+'</p>').show();
			  break;
			
		}
		
		$msgBox.jqmShow();
		
	}
	
}

/**
 * SHOW CONFIRM-BOX
 * @param   string  msg : message to displa
 * @param   callback : function callback
 * @param cancelCallback : callback on cancel
 */
function confirm(msg,callback) {
	
  if (typeof(msg) != 'string') return;
  
  $confirmBox
    .jqmShow()
    .find('p.jqmConfirmMsg')
      .html(msg)
    .end()
    .find(':submit:visible')
      .click(function(){
        if (this.value == 'oui' && callback) callback();
        $confirmBox.jqmHide();
      });
}


/**
 * GEOLOCALIZE an ADDRESS
 * @param event e
 */
function doGeolocalize(e) {
	
  var address = $("#geobox-input", $geoBox).val();
  
  if(address != "" && address != $('.default-txt', $geoBox).text()){
  	togglePublicPan(false);
  	toggleSelectedMapPan(false);
  	$pan2nd.hide();
  	$('a', $mainMenu).toggleClass('active', false);
  	closePanMar();   
    geocoder.getLocations(address, showAddress);
  }
  
  e.preventDefault();
}


/**
 * Add a draggable marker for choosing where to put the media that the user is adding 
 */
function addDraggableMarker() {
	
	// create a draggable marker
	geolocMarker = new GMarker(map.getCenter(), {draggable:true});
	
	// when moving the marker, update lat and lng values in form
	geolocEvent = GEvent.addListener(geolocMarker, 'dragend', function(latlng){
      $('#lat', $panCrea).val(latlng.lat());
      $('#lon', $panCrea).val(latlng.lng());
   });
   
   // when dragging the map, recenter the marker
   geolocMapEvent = GEvent.addListener(map, "moveend", function() {
     geolocMarker.setLatLng(map.getCenter());
   });
   
   // add marker on the map
   map.addOverlay(geolocMarker);
}


/**
 * Remove the draggabled marker used in the marker form
 */
function removeDraggableMarker() {
	
	if (geolocMarker != null)
	{
		// remove marker from map
		map.removeOverlay(geolocMarker);
		
		// remove event on dragging map to recenter the marker
		GEvent.removeListener(geolocMapEvent);
	}
	
	// set vars to null
	geolocMarker   = null;
	geolocEvent    = null;
	geolocMapEvent = null;
}


/**
 * Add the temporary created marker on gmap and center on it
 * @param json marker : Marker infos
 * @param int  medId  : Media ID to show when opening marker pan
 */
function addTempMarkerAndCenter(marker, medId)
{
	// marker's icon
	var myIcon = new GIcon();
	myIcon.image = 'images/'+marker.ico;
	myIcon.iconSize = new GSize(32,32);
	myIcon.iconAnchor = new GPoint(16,32);
	
	tempCreateMarker = new GMarker(new GLatLng(marker.lat, marker.lng), {icon: myIcon});
	
	// add click event on marker
	tempCreateMarkerEvent = GEvent.addListener(tempCreateMarker, 'click', function(){
		map.panTo(tempCreateMarker.getLatLng());
		$panMar.data('isTemp', true);
    showMarker(marker.marId, false, medId);
  });
  
  GEvent.trigger(tempCreateMarker, 'click');
	
	map.addOverlay(tempCreateMarker);
}


/**
 * Remove the temporary created marker from gmap
 */
function removeTempMarker()
{
	if (tempCreateMarker != null)
  {
    // remove temp marker from map
    map.removeOverlay(tempCreateMarker);
  }
  
  tempCreateMarker = null;
  tempCreateMarkerEvent = null;
}



/**
 * TREAT GEOLOCATED ADDRESSES FROM GEOCODER
 */
function showAddress(reponse) {
	
	// no address
	if (!reponse || reponse.Status.code != 200)
	{
		$('.geopan', $geoBox).hide();
		$('#noaddr', $geoBox).slideDown();
	}
	else // adresse(s) found
	{
		var nbAddresses = reponse.Placemark.length;
		
		// if more than 1 address found
		if (nbAddresses > 1)
		{
			var $listAddr = $('<ul>');
			var z = 'zeb2'; 
			
			// loop adresses
			for(i=0; i<nbAddresses; i++)
			{
				var loc = reponse.Placemark[i];
				var $a = $('<a>').attr('href', '');
				var $li = $('<li>');
				
				z = (z == 'zeb1') ? 'zeb2' : 'zeb1';
				
				$a.addClass(z).text(loc.address)
				              .data('lat', loc.Point.coordinates[1])
				              .data('lng', loc.Point.coordinates[0])
				              .click(function(){
				              	$('#geobox-input', $geoBox).val($(this).text());
				              	$('#geoaddresses', $geoBox).slideUp();
				              	map.setCenter(new GLatLng($(this).data('lat'), $(this).data('lng')), 14);
				              	return false;
				              });
				
				$li.append($a);
				$listAddr.append($li);
			}

      // add list to DOM
      $('#geoaddresses div', $geoBox).empty().append($listAddr);
      
      // show right pan
      $('.geopan', $geoBox).hide();
      $('#geoaddresses', $geoBox).slideDown();
      
		}
		else // 1 address found
		{
			var loc = reponse.Placemark[0];
			$('#geobox-input', $geoBox).val(loc.address);
			map.setCenter(new GLatLng(loc.Point.coordinates[1], loc.Point.coordinates[0]), 14);
		}
	}
	
}
 


/**
 * FONCTION IN_ARRAY() (as in php)
 */ 
function in_array(needle, collection, strict) {
    
    if (strict == null) {
        strict = false;
    }
    
    var i = collection.length-1;
    
    if (i >= 0) {
        
        do {
            if (collection[i] == needle) {
                
                if (strict && typeof(collection[i]) != typeof(needle)) {
                    continue;
                }
                
                return true;
            }
        } while (i--);
    }
    
    return false;
}


/**
 * GET VIEWPORTS BOUNDS
 */
function getViewportBounds() {
  
  var bounds = map.getBounds();
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  
  var p = {};
  p.minlat = sw.lat();
  p.maxlat = ne.lat();
  p.minlon = sw.lng();
  p.maxlon = ne.lng();
  
  return p;
}
