/**
* Ce fichier fait parti d'un package, toute modification doit entrainer la génération
* d'un nouveau package pour être pris en compte.
* voir l'objet ObjFichierPackage pour connaitre la marche à suivre pour regénérer un package
* @since 20/05/2009 Olivier REYT <reyt@benchmark.fr> 
*/

/**
 * @package framework
 * @subpackage benchmark
 * @filesource
 */

/**
 * Objet conteneur servant d'interface pour l'utilisation des conteneurs de modules 
 *
 * @author Olivier REYT <reyt@benchmark.fr>
 * @since 09/03/2009 Olivier REYT <reyt@benchmark.fr> Création
 * @package framework
 * @subpackage benchmark
 */
if(typeof benchmark == "undefined") { var benchmark = new Object();}
if(typeof benchmark.framework == "undefined") { benchmark.framework = new Object();}
if(typeof benchmark.framework.ihm == "undefined") { benchmark.framework.ihm = new Object();}
if(typeof benchmark.framework.ihm.module == "undefined") { benchmark.framework.ihm.module = new Object();}

/**
* Constructeur :
* @return void
* @author Olivier REYT <reyt@benchmark.fr>
* @since 09/03/2009 Olivier REYT <reyt@benchmark.fr>
*/
benchmark.framework.ihm.module.conteneur = function(idConteneur, idProprietaire) {

      // configuration :

      // @var integer Identifiant du propriétaire
      this.idProprietaire = null;

      // @var integer Identifiant du conteneur
      this.idConteneur = null;
     
      // @var string Nom de l'élément DOM auquel correspond le conteneur
      this.idElementConteneur = null;

      // @var string Nom de l'élément DOM auquel correspond la liste des modules du conteneur
      this.idElementlisteModule = null;

      // @var boolean Actions existantes sur les événements des modules
      this.onEvent = false;

      // @var array Liste des événements sur les modules du conteneurs
      this.listeEvenement = false;

      // @var boolean Sauvegarde au moment de la minimisation
      this.minimisation = false;

      // @var string Informations en get correspondantes à la sauvegarde 
      // au moment de la minimisation
      this.getMinimisation = null;

      // @var boolean Sauvegarde au moment de l'unload
      this.unload = false;

      // @var string Informations en get correspondantes à la sauvegarde 
      // au moment de l'unload
      this.getUnload = null;

      // @var boolean Possibilité de modifer les droits
      this.modificationDroit = false;

      // @var string Informations en get correspondantes à la sauvegarde 
      // au moment de la modification des droits
      this.getSauvegardeDroit = null;
  
      // @var string Informations en get correspondantes à l'accés
      // aux droits d'un module
      this.getAccesDroit = null;  
   
      // @var boolean Le drag & drop est il activé ?
      this.dragAndDrop = false;

      // @var boolean Possibilité de déplacer un module vers une autre configuration
      this.deplacer = false;

      // @var string Informations en get correspondantes à la sauvegarde 
      // au moment du déplacement d'un module vers une autre configuration
      this.getDeplacer = null;

      // @var string Initialisation du conteneur pour les plugins
      this.initialiseConteneurPlugin = function initialiseConteneurPlugin(){};

      // @var string surcharge Js des initialisations de modules pour les plugins
      this.initialiseModulePlugin = function initialiseModulePlugin(module){};
 
      // @var string surcharge Js lors de la sauvegarde lors du unload pour les plugins plugins
      this.sauvegardeModulePlugin = function sauvegardeModulePlugin(donnee){return donnee;};

      // @var module moduleDroitOuvert Module dont les droits sont ouverts
      this.moduleDroitOuvert = null;
      
      // @var string urlControleurAjax URL du controleur Ajax
      this.urlControleurAjax = '/framework/lib/controleur_ajax/cgi/controleur_ajax.norevue.php';
 
      //@var boolean Indicateur de modification de l'ordre des modules
      this.listeModulesModifie = false;
 
      //@var integer Compteur d'action de module sous forme de tableau
      this.compteurActionModule;
 
      //@var integer Compteur de drag and drop de module sous forme de tableau
      this.compteurDragAndDropModule = new Array();
 
      /**
      * constructeur : Constructeur d'un conteneur
      *
      * @param integer idConteneur Identifiant du conteneur
      * @param integer idProprietaire Identifiant du proprietaire du conteneur
      * @return boolean
      * @author Olivier REYT <reyt@benchmark.fr>
      * @since 09/03/2009 Olivier REYT <reyt@benchmark.fr>
      */
      this.constructeur = function(idConteneur, idProprietaire){
            this.idConteneur           = idConteneur;
            this.idElementConteneur    = "#conteneur_module_"+idConteneur;
            this.idProprietaire        = idProprietaire;
            this.idElementlisteModule  = "#liste_module_"+idConteneur;
      };

      /**
      * formateListeDragAndDrop : formatage du tableau des modules drag & droppé
      *
      * @return string Un string utilisable dans les AJAX
      * @author Olivier REYT <reyt@benchmark.fr>
      * @since 13/03/2009 Olivier REYT <reyt@benchmark.fr>
      */
      this.formateListeDragAndDrop = function(){
            // On récupére la liste des drag&drop et on la formate
            // On initialise une variable qui va contenir le résultat
            var listeDragAndDrop    = Array();
            jQuery.map(this.compteurDragAndDropModule, function(valeur, index){
      		if(valeur != undefined){
      			listeDragAndDrop.push("\""+index+"\":\""+valeur+"\"");
      		}
      	});

      	listeDragAndDrop = listeDragAndDrop.join(", ");
      	listeDragAndDrop = "{"+listeDragAndDrop+"}";          

            return listeDragAndDrop;
      }

      /**
      * initialise : Initialisation d'un conteneur lancé 
      *
      * @param integer idConteneur Identifiant du conteneur
      * @param integer idProprietaire Identifiant du proprietaire du conteneur
      * @return boolean
      * @author Olivier REYT <reyt@benchmark.fr>
      * @since 09/03/2009 Olivier REYT <reyt@benchmark.fr>
      */
      this.initialise = function(){

            if (this.dragAndDrop){
            	var self = this;
            	$(this.idElementConteneur).ready(function () {
            	      $('#colonne_1_'+self.idConteneur).sortable({
                  		handle:'div.module_prise div.titre',      // Elements à cliquer pour drag & dropper
                  		items:'div.module_dad',		            // Elements drag & dropable
                  		containment: '#papier',                   // Element dans la limite duquel on peut drag & dropper
                  		axis: 'y',                                // Les élements ne peuvent etre déplacer que verticalement
                  		accurateIntersection : true,              // overlap calculations
                  		scrollSpeed: 20,                          // Vitesse de scroll
                  		scroll: true,                             // La page scroll quand on vient au bord
                  		scrollSensitivity: 50,                    // A combien on commence à scroller quand on s'approche du bord
                  		revert: false,                            // Quand on relache le module, il revient avec un effet smoth
                  		zIndex: 14,                               // Zindex de l'élément drag & droppé
                  		delay : 0,                                // Délai avant le début du drag & drop
                  		placeholder: 'emptyPlaceMarker',          // Classe de l'espace vide lors d'un déplacement
                  		forcePlaceholderSize: true,				  // Changement depuis la 1.6 de jquery.ui on ajoute pour forcer
                  		update: function(event, ui){
                  			// Action lors de la modification de la liste
                  			self.listeModulesModifie = true;
                  			
                  			// On met à jour le compteur de drag & drop
                  			// On récupére l'idModule
                  			var arrayIdModule	= ui.item[0].id.split("_");
      					var idModule	= arrayIdModule[1];

                  			if (self.compteurDragAndDropModule[idModule]){
                  			     self.compteurDragAndDropModule[idModule] += 1;      
                  			}
                  			else {
                  			    self.compteurDragAndDropModule[idModule] = 1;  
                  			}
                  		}
              	      });
                  });
            }

            // Action effectué à la sortie de la page
      	if (this.unload){
      		$(window).bind("beforeunload",{self:this},function (e) {
      		      if (e.data.self.getUnload && e.data.self.listeModulesModifie){
      			      sauvegardePreference(e.data.self, e.data.self.getUnload,  0);
      			}
      		});
      	}
      	
      	// On initialise le conteneur plugin
      	this.initialiseConteneurPlugin(self);
      }

       // on appel le constructeur 
       this.constructeur(idConteneur, idProprietaire);
};