
/* GLOBAL VARS */

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

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

var geocoder;

/* 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);
  $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');
  
  initGmap();                 // init google map
  firstLoadPublic();          // put public markers in cluster (first load)
  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)
  initGeoCoder();             // init geoBox
  
  // meteor (avatar + tchat)
  //if(mmAvatar.isConnected) mmAvatar.startAnimation();
  
});




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


/**
 * INIT COMMON STUFFS
 */
function initCommon() {
	
	// opacity of the jqModal overlay
	$.jqm.params.overlay = 50;
	
	// Splash Screen ?
	if (showSplash)
	{
		$("#splash").jqm({ajax: '/getsplashscreen', trigger: false});
		
		$('h1 a', $lpan).click(function(){
			$("#splash").jqmShow();
			return false;
		});
		
		$('h1 a', $lpan).trigger('click');
	}
	else
	{
		// 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).bind('click', { tab: 'about' }, showAboutMetamap);
  
  // Msg Box
  $msgBox.jqm({overlay: 50, modal: false, trigger: false});
  $confirmBox.jqm({overlay: 50, modal: true, trigger: false});
  
  // big image overlay
  $("#big-img").jqm({trigger: false});
  
  // media comments overlay init
  $mediaComs.jqm();
  $('#marmed-com a', $panMed).click(function(){
    showMediaComs({ 'id': $panMed.data('medId') });
    return false;
  });
  
  // Hover and click 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 filters
  $('.filters .bt-list a').bind('click', switchListDisplay);
  
  // click on map/marker/media buttons in browse pan head
  $('.pan-head .bt-list a').bind('click', switchBrowseDisplay);
  
  // favorise a map
  $('.bt-map-fav a', $panMaps).bind('click', doFav);
  
  // Public Refresh
  $('#pub-reload', $panPub).click(function(){    
    refreshPan($(this).parents('.pan'));
    return false;
  });
  
  // Select Pan Refresh 
  $('.foot-refresh', $panSel).click(function(){    
    refreshPan($(this).parents('.pan'));
    return false;
  });
  
  // 2ndPan Refresh 
  $('.foot-refresh', $pan2nd).click(function(){    
    refreshPan($(this).parents('.pan'));
    return false;
  });
  
  // 2ndPan Refresh 
  $('.foot-refresh', $panMar).click(function(){    
    refreshPan($(this).parents('.pan'));
    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 Close Button 
  $('.foot2nd .foot-close', $pan2nd).click(function(){
    $('a', $mainMenu).toggleClass('active', false);
    $('.pan2nd .map-name a.active').toggleClass('active', false);
    $('.pan2nd').hide();
    return false;
  });
  
  // Right Map Pan Close Button 
  $('.foot-close', $panMap).click(function(){
    $panMap.hide();
    $('.pan2nd:visible .map-name a.active').toggleClass('active', false);
    return false;
  });
  
  // Marker Pan Close Button
  $('.foot-close', $panMar).click(function(){	
    $panMar.hide();
    $panMed.hide();
    mmGeo.removeTempMarker();
    mmGeo.removeHighligth();
    return false;
  });
  
}




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



/**
 * INIT CREATION PAN
 */
function initCreationPan()
{
	$('#bt-create', $mainMenu).click(function(e){
		
		// reset all pans for reloading content next time called
		$('.pan2nd').data('isInit', false);
		$('.foot-close', $panSel).trigger('click');
		
		// star Edition if not already
		if (!mmEdit.displayed) { mmEdit.step.startEdition(mmEdit.consultationBlocs); }
    e.preventDefault();
    
  });
}



/**
 * INIT PUBLIC PLACE
 */
function initPublicPlace() {
  
  var $medList = $('.med-list', $panPub);
    
  // init page (+ and -)
  $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', publicOnOff);
  
  // init scrolling on public media list
  //doScroll($medList);
  
  // events on media click
  $('a', $medList).bind('click', mediaTitleAction);
  
}



/**
 * 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);
  
  // scrolling maps
  //doScroll($mapList);
  
  // 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);
  
  // 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);
  
}



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

  // init info for 2nd pans
  $('.pan2nd').data('isInit', false);
  $panMap.data('mapId', 0);
  
  // offi / contrib / all drop down list
  $('.offi-list').change(function(){
    refreshPan($(this).parents('.pan'));
  });
  
  // order drop down list
  $('.order-list').change(function(){
    refreshPan($(this).parents('.pan'));
  });
  
  // search button
  $('.search-submit a', $panBrowse).click(function(){
  	var sVal = $('.searchbox input', $panBrowse).val();
  	if ($.trim(sVal) != '') { $('.cancel-search', $panBrowse).show(); }
    refreshPan($(this).parents('.pan'));
    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 "add to selection" button
  $('#add-to-sel a', $panMap).bind('click', addMapToSelection);
  
  // ### TEMP
  
  $('.bt-dashboad a', $pan2nd).click(function(){return false;});
  $('.del a', $panMyfav).click(function(){return false;});
  
  // ########
  
}



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

 	$panMar.data('marId', 0);
 	$panMar.data('medId', 0);
 	$panMar.data('addCluster', 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(){
 		 mmEdit.step.addMediaFromConsultation($panMar.data('marId'));
 		 $panMar.data('marId', '0').hide();
     $panMed.hide();
 		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 to see the map where the marker belongs to
 	$('.mar-foot a', $panMar).bind('click', addMapToSelection);
 	
}



/*
 * 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 (loadKMLRegion) {
      var hasKml = false;   
  	  var rckml = new GGeoXml('http://' + document.location.host + '/uploads/regioncentre.kml', 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/regioncentre.kml', function() {
  	    			if(rckml.loadedCorrectly()) {
  	    				  map.addOverlay(rckml);
  	    				  hasKml = true;
  	    			}
      			});	
      		}
      	}
      });
    }
	
  }
}



/**
 * INIT GEOCODER
 */
function initGeoCoder() {
	
  geocoder = new GClientGeocoder();
  geocoder.setBaseCountryCode('FR');
  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('');
  	}
  });
  
	
}



/************************* 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 order
	      p.params.o = $('.order-list :selected', $filt).val();
	      
	      // get viewport infos
	      p.params.minlat = vp.minlat;
	      p.params.maxlat = vp.maxlat;
	      p.params.minlon = vp.minlon;
	      p.params.maxlon = vp.maxlon;
	      p.params.z = vp.z;
	      
	      // 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 :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':
      
      browseList = $('.bt-list a.active', $('.pan-head', $pan)).parent().attr('class').split('-')[2];
      
      // for maps / markers / media
      if (browseList != 'user') {
        
        var $filt =  $('.browse-body1 .filters', $pan);
        var offi = $('.offi-list :selected', $filt).val();
        
        // get order
        p.params.o = $('.order-list :selected', $filt).val();
        
        // get search
        var s = $('.searchbox input', $filt).val();
        
        if (s.length > 0 && s.length < 3) {
          alert('Votre recherche doit faire + de 2 charact√®res');
          return false;
        }
        
        p.params.s = $('.searchbox input', $filt).val();
        
        // define the right request name url
        switch (browseList) {
        
          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;
        
        }
        
      }
      // for users
      else {
        
      }
      
      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 :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 :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 :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 :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));
                            // force reload of Favorite Pan
                            $panMyfav.data('isInit', false);
                            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);
  
  // refresh scrolling if pan is open
  if($('.show-hide', $panPub).is(':visible')) {
    //doScroll($marList);
  }
  
  // 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);
  
  // refresh scrolling if pan is open
  if($('.show-hide', $panPub).is(':visible')) {
    //doScroll($medList);
  }
  
  // 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($(this).attr('t'));
  }
  
  // update title in map list
  $('.map-'+mapId+' .map-name span', $panSel).text($(this).attr('t'));
  
  // 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);
    
    // reload current view list scrolling
	  listName = $('.bt-list a.active', $filt).parent().attr('class').split('-')[2];
	  //doScroll($('.'+listName+'-list', $panSel));
  }
  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' : '';
    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+'"><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');
  
  // reload scrolling
  //doScroll($mapList);
  
  // 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 = $('.browse-body1 .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);
  //doScroll($mapList);
  
  // 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 = $('.browse-body1 .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);
  //doScroll($marList);
  
  // events on marker click
  $('.mar-name a', $marList).bind('click', markerTitleAction);
  
}



/**
 * Proceed All Media
 * @param document  x : xml response
 */
function doAllMedia(x) {
  
  var $medList = $('.browse-body1 .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);
  //doScroll($medList);
  
  // 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);
	  //doScroll($mapList);
	  
	  // 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);
	  //doScroll($marList);
	  
	  // 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);
	  //doScroll($medList);
	  
	  // 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);
	  //doScroll($mapList);
	  
	  // 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);
	  //doScroll($marList);
	  
	  // 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);
	  //doScroll($medList);
	  
	  // 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(){
    
    mapId = $(this).attr('id');
    
    // replace map title in pan
    $('h3', $panMap).text($(this).attr('t'));
    
  });
    
  
  /* 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);
  //doScroll($marList);
  
  // 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(){
    
    mapId = $(this).attr('id');
    
    // replace map title in pan
    $('h3', $panMap).text($(this).attr('t'));
    
  });
    
  
  /* 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);
  //doScroll($medList);
  
  // 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'));
    
  });
  
  // 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 {
    // center on marker
    GEvent.trigger(mmGeo.overlayed[mmGeo.marker_prefix + marId], 'click');
  }
  
  
  /* 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 a', $panMar).show(); }
  else { $('#add-media a', $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();
  //doScroll($medList);  
  
  
  /* 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
    
    // if needed to reload the map (because workflow has been used to add media/marker inside)
    if ($panSel.data('mapReload') == mapId)
    {
      $('.foot-refresh', $panSel).trigger('click');
      $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];
  
  // 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
    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 ($panCreate.is(':visible'))
  {
    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 p = {};
  p.params = {};
  p.params.id = $a.parents('li').attr('class').split(' ')[0].split('-')[1];

  switch(delWhat)
  {
  	case 'map':
  	  p.req = 'delfavmap';
  	  break;
  	case 'mar':
      p.req = 'delfavmarker';
      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);
    
  }
  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) {
  
	if ($panCreate.is(':visible') && !$('#create-content-end', $panCreate).is(':visible'))
	{
		showMsgBox('Vous devez d\'abord quitter le processus d\'ajout de contenu.');
	}
	else
	{
	
		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
		  $panMar.hide();
      $panMed.hide();
			
			// 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();
	    }
	    // 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
					$panMar.hide();
          $panMed.hide();
					  
					$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(){
	  	$.ajax({ type:'POST',
	  		       dataType:'html',
	  		       success:function(data, textStatus){
	  		         jQuery.facebox(data);
	  		       },
	  		       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>');
      //doScroll($('#med-txt', $panMed));
      break;
      
    case '5': // rss
      
      $medMenu.show();
      
      $f = $m.find('feed');
      
      var rssTpl = '<h3>'+$f.attr('t')+'</h3>';
      rssTpl += '<ul>';
      
      if ($f.length > 0)
      {
      	$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>';
      
      $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)
{
	// 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();
}

/**
 * TOGGLE ON/OFF PUBLIC PLACE
 */
function publicOnOff(e) {
	
	$a = $(e.currentTarget);
	
	// 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);
		}
		
	}
	
	e.preventDefault();
	
}



/**
 * 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/MARKER/MEDIA ID FROM GLOBAL ARRAY
 */
function delFavMapId(mapId)
{
  if (hasFavMap(mapId))
    favMaps.splice(favMaps.indexOf(mapId));
}



/**
 * 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 showMainMenuPan(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 media list
	    togglePublicPan(false);
	    
	    // hide open selected map if any
	    toggleSelectedMapPan(false);
	    
	    // unactive maps active
	    $('.map-name a.active', $pan2nd).toggleClass('active', false);
	    
	    // hide all menu pans
	    $('.pan2nd').hide();
	    
	    // show active
	    $pan.show();
	    
	    // refresh bloc if necessary
	    if (!$pan.data('isInit'))
	    {
	    	
	      // init to true
	      $pan.data('isInit', true);
	      
	      // reset search box
	      $('.searchbox input', $panBrowse).val('');
	      
	      // if user authenticated, load data
	      if ($('.msg-notauth', $pan).length == 0)
	      {
	        refreshPan($pan);
	      }
	      
	    }
	  
	  }
	  
  }
    
  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 pan = $pan.attr('id').split('-')[1];
    var list = $a.parent().attr('class').split('-')[2];
    var $listToShow = $('.wrap-'+list+'-list', $panBody);
    var $scrollList = $listToShow.find('.'+list+'-list');
    
    // highlight the right tab
    $a.parents('.bt-list').find('a').toggleClass('active', false);
    $a.toggleClass('active', true);
    
    // show the right list
    $('.wrap-list', $panBody).hide();
    $listToShow.show();
    
    // for a map in the selection, only re-init the scroll on the the right list (markers or media), no refresh Pan
    if ($pan.attr('id').split('-')[1] == 'sel') {
      //doScroll($scrollList);
    }
    // for all other panels, refresh Pan
    else {
    	
    	// for mymap pan or myfav pan, check if user is authenticated before loading data
    	if (pan == 'mymap' || pan == 'myfav') {
    	  if ($('.msg-notauth', $pan).length == 0)
    	  {
    	  	refreshPan($pan);
    	  }
    	}
    	else {
        refreshPan($pan);
    	}
    }
  
  }
  
  e.preventDefault();
  
}



/**
 * SWITCH BROWSE PAN LIST DISPLAY
 * @param event   e
 */
function switchBrowseDisplay(e) {
  
  var $a = $(e.currentTarget);
  
  // do switch if necessary
  if (!$a.hasClass('active')) {
    
    var $pan = $a.parents('.pan');
    var list = $a.parent().attr('class').split('-')[2];
    
    // body to show (different for user list)
    var $bodyToShow = (list == 'user') ? $('.browse-body2', $pan) : $('.browse-body1', $pan);
    var $listToShow = (list == 'user') ? $('.wrap-map-list', $bodyToShow) : $('.wrap-'+list+'-list', $bodyToShow);
    
    // hide pan map if open
    $panMap.hide();
    
    // unactive map title link
    $('.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 body
    $('.browse-body', $pan).hide();
    $bodyToShow.show();
    
    // show the right list
    $('.wrap-list', $bodyToShow).hide();
    $listToShow.show();
    
    // refresh Pan
    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();
	  
	  // do scroll if necessary (for media text preview and body details)
	  if (menu == 'preview' && $('#med-txt', $panMed).length > 0)
	  {
	  	//doScroll($('#med-txt div', $panMed));
	  }
	  
	  if (menu == 'details')
    {
      //doScroll($('div', $medBody));
    }
		
	}
	
	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();
	
}


/**
 * ABOUT METAMAP OVERLAY
 */
 
function showAboutMetamap(e)
{
	$('#aboutmm').data('tab', e.data.tab);
	$('#aboutmm').jqmShow();
	e.preventDefault();
} 

 
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');
};


/****************************** 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];
    //doScroll($('.'+list+'-list', $pubList));
  }
  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);
    //doScroll($activeList);
    $('.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();
	}
	
	e.preventDefault();
	
}


/**
 * APPLY SCROLLING
 * @param element   $el : element to be scrolled with jSrollPane
 */
function doScroll($el) {
  
  $el.jScrollPane({scrollbarWidth:12, scrollbarMargin:0, showArrows:true, arrowSize:11, animateTo:true});
  
}



/**
 * 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() + ' FR';
  
  if(address != ""){     
    showAddress(address);
  }
  
  e.preventDefault();
}



/**
 * MOVE MAP ON ADDRESS (GEOCODING)
 */
function showAddress(address) {
    geocoder.getLatLng(
      address,
      function(point) {
        if (!point) {
          alert(address + " Adresse non trouvée, l'avez vous bien écrite ?");
        }
        else {
          map.panTo(point, map.getCenter());
          map.setZoom(16);
        }
      }
    );
  }
 


/**
 * 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 MAP BOUNDS
 */
function displayMapBounds() {
  bounds = map.getBounds();
  sw = bounds.getSouthWest();
  ne = bounds.getNorthEast();
  console.log('latMin: '+sw.lat()+' latMax: '+ne.lat());
  console.log('lngMin: '+sw.lng()+' lngMax: '+ne.lng());
}