/*jslint browser: true, eqeqeq: true, undef: true*/
/*global $, Prototype, Event, GBrowserIsCompatible, GLatLng, GEvent, GMap2, GMapTypeControl, GMarker, GSmallMapControl, GUnload */

/**
 * Ajout de la méthode String.trim().
 * Supprime les espaces en début et fin de chaîne.
 */
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "");
};

/**
 * Ajout de la méthode String.capitalize().
 */
String.prototype.capitalize = function(){
    return this.replace(/\w+/g, function(a){
        return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
    });
};

/**
 * Le singleton principal qui possède la méthode init() à appeler
 * Utilisation du Module Pattern: http://yuiblog.com/blog/2007/06/12/module-pattern/
 */
var AME = function() {
  // les méthodes privées
  function toggleElt(e) {
    var elt = Event.element(e);
    var ul = elt.next();
    if(ul.nodeType === 3) {
      ul = ul.next();
    }
    if(elt.hasClassName('unfold')) {
      ul.toggle();
      elt.removeClassName('unfold');
      elt.addClassName('fold');
    }
    else {
      ul.toggle();
      elt.removeClassName('fold');
      elt.addClassName('unfold');
    }
  }

  function installToggle() {
    $('sidebar').select('.toggle').each(function(node) {
      node.addClassName('unfold');
      node.next().toggle();
      node.observe('click', toggleElt);
    });
  }

  return { // les propriétés et méthodes publiques
    init: function() {
      installToggle();
      AME.MyGMap.init();
    }
  };
}(); // les parenthèses permettent à la fonction anonyme de s'éxécuter et d'effectuer le return

/**
 * Le singleton AME.MyGMap qui va gérer la GoogleMap.
 * Utilisation du Module Pattern: http://yuiblog.com/blog/2007/06/12/module-pattern/
 */
AME.MyGMap = function() {
  // Les propriétés privées
  var listMarkers = [];
  var gmapLoaded = false;
  var gmapMgrTpl = '<div id="gmapMgr">Afficher la carte</div>';

  // les méthodes privées
  function setCoords(x, y, label) {
    if(GBrowserIsCompatible()) {
      var markerGmap = {};
      markerGmap.x = x;
      markerGmap.y = y;
      markerGmap.label = label;
      listMarkers.push(markerGmap);
    }
  }

  // Creates a marker at the given point with the given number label
  function createMarker(element) {
    var point = new GLatLng(element.x, element.y);
    var marker = new GMarker(point, {title:element.label});
    GEvent.addListener(marker, "click", function() {
      var opts = {maxWidth:50};
      marker.openInfoWindowHtml("<b>" + element.label + "</b>",opts);
    });
    return marker;
  }

  function loadGmap() {
    var gmap = document.getElementById("gmap");
    if(gmap && listMarkers.length>0) {
      //gmap.className="show";
      var map = new GMap2(gmap);
      map.enableDoubleClickZoom();
      map.addControl(new GSmallMapControl());
      map.addControl(new GMapTypeControl());
      map.setCenter(new GLatLng(listMarkers[0].x, listMarkers[0].y), 9);
      for(var i = 0; i<listMarkers.length; i++) {
        map.addOverlay(createMarker(listMarkers[i]));
      }
    }
  }

  function toggleMap() {
    var gmap = $('gmap');
    if(gmap.visible()) {
      $('gmapMgr').update('Afficher la carte');
    }
    else {
      $('gmapMgr').update('Cacher la carte');
    }
    gmap.toggle();
    if(!gmapLoaded) {
      gmapLoaded = true;
      loadGmap();
    }
  }

  function unloadGmap() {
    if(gmapLoaded) {
      GUnload();
    }
  }

  function installMap() {
    var gmap = $('gmap');
    if(gmap) {
      gmap.hide();
    }
    if(listMarkers.length>0) {
      // on crée le bouton pour afficher/cacher la carte si il n'existe pas déjà
      if(null === $('gmapMgr')) {
        $('content').select('.storycontent')[0].insert({bottom: gmapMgrTpl});
        $('gmapMgr').observe('click', toggleMap);
      }
    }
  }

  return { // les propriétés et méthodes publiques    init: function() {      installMap() ;
      Event.observe(window, 'unload', function() {
        unloadGmap();
      });
    },
    setCoords: setCoords  };
}();


function setCoords(x, y, label) {
  AME.MyGMap.setCoords(x, y, label);
}

// dès que le DOM est chargé, on peut lancer la méthode d'initialisation...
document.observe('dom:loaded', function() {AME.init();});
