/////////////////////////////////////////////////////////////////////////////////////////
/////// LISTE D'AFFICHAGE
///////////////////////////////////////////////////////////////////////////////////////

function findLargeurTableau() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
//  window.alert( 'Width = ' + myWidth );
//  window.alert( 'Height = ' + myHeight );
  return myWidth;
}

function debugMessage(message){
//  alert(message);
}

function getDocumentElement(nom){

  return document.getElementById(nom);
}

/**
 * Retrouve la case d'un tableau
 */
function getCase(liste, index){

  return getDocumentElement(liste.nom + "_case" + index);
}

/**
 * Reconstruit le tableau selon les nouvelles dimensions
 */
function resize(){

  debugMessage("resize");
  x = document.stockListeAffichage;
  autoCalculateProperties(x);
  autoRebuildTableau(x);
}


/**
 * Genere le code HTML du tableau
 */
function buildDisplayTableau(liste, nbElements, nbCasesParLigne, presentation){

  var text = "";
  debugMessage("buildDisplay2 : nb="  + nbElements + "; nbCasesParLigne=" + nbCasesParLigne);
  
  text += "<table width='100%' cellspacing='5' cellpadding='0' align='center'>";
  for (iElement=0; iElement<nbElements; ){
      text +="<tr>";
      for (iColonne=0; (iColonne<nbCasesParLigne)&&(iElement<nbElements); iColonne++){
          text += "<td class='listeAffichageCase' style='vertical-align: top' id='" + liste.nom + "_case" + iElement + "' width='"+Math.ceil((100/nbCasesParLigne))+"%'>";
          if (presentation != null && presentation[iElement] != null){
            text += presentation[iElement];
          }
          text += "</td>";
          iElement++;
      }
      text +="</tr>"
  }
  text += "</table>";
  return text;
}

/**
 * Se charge de construire le tableau correspondant si necessaire
 */
function autoRebuildTableau(liste){
  
  // On ne reconstruit le tableau que s'il sera different
  if (liste.needRebuild){
  
   debugMessage("autoRebuild2 : liste.nbElements=" + liste.nbElements + "; liste.nbCasesParLigne=" + liste.nbCasesParLigne);
  
   // recupere le conteneur
   conteneur = getDocumentElement(liste.nom);
   if (conteneur){
  
     presentation = [];
  
     // sauvegarde la presentation des elements de la liste
     for (iElement = 0; iElement<liste.nbElements; iElement++){
       presentation[iElement]= getCase(liste, iElement).innerHTML;
     }
  
     // construit le nouveau tableau en repositionnant la presentation des elements
     x = document.getElementById(liste.nom);
     x.innerHTML = buildDisplayTableau(liste, liste.nbElements, liste.nbCasesParLigne, presentation);
    }
    liste.needRebuild = false;
  }
}

/**
 * Calcule le nombre de cases par ligne pour le tableau
 */
function calculateNbCasesParLigne(largeurTableau, largeurCellule){

    return Math.ceil(largeurTableau/largeurCellule);
}

/**
 * Calcule le nombre de lignes pour le tableau
 */
function calculateNbLignes(nbElements, nbCasesParLigne){

    return Math.ceil(nbElements/nbCasesParLigne)
}

/**
 * Calcule le nombre de places totale
 */
function calculateNbPlaces(nbElements, nbCasesParLigne){

    return calculateNbLignes(nbElements, nbCasesParLigne)*nbCasesParLigne;
}

/**
 * Met a jour les proprietes d'affichage du tableau a partir de
 * - le nombre d'elements a afficher
 * - la largeur du tableau (en pixels)
 */
function calculateProperties(liste, nbElements, largeurTableau){

    nbCasesParLigneAvant = liste.nbCasesParLigne;
    liste.nbCasesParLigne = calculateNbCasesParLigne(largeurTableau, liste.largeurCellule);
    debugMessage("calcul : nbElement=" + nbElements + "; nbCasesParLigne=" + liste.nbCasesParLigne + "; listeElements=" + liste.nbElements);
    liste.nbPlacesDisponibles = calculateNbPlaces(nbElements, liste.nbCasesParLigne) - liste.nbElements;

    // Si le nombre de cases a change alors il faut reconstruire le tableau
    if (nbCasesParLigneAvant == undefined
        || nbCasesParLigneAvant == null
        || nbCasesParLigneAvant != liste.nbCasesParLigne){
      liste.needRebuild = true;
    }
    debugMessage("nbElements="+liste.nbElements + "nbPlacesDisponible ="+liste.nbPlacesDisponibles+"; liste ="+liste+"\nlargeurCellule ="+liste.largeurCellule+"\navant ="+nbCasesParLigneAvant+"\napres ="+ liste.nbCasesParLigne +"\nneedRebuild ="+ liste.needRebuild);
}

/**
 * Met a jour les proprietes du tableau avec les valeurs de l'objet
 */
function autoCalculateProperties(liste){
    calculateProperties(liste, liste.nbElements, findLargeurTableau() - liste.xMarge);
}

/**
 * Retrouve la case d'un tableau
 */
function getCase(liste, index){

    return getDocumentElement(liste.nom + "_case" + index);
}


function ListeAffichage(nom, nombre, largeurCellule, largeurMarge, affichageCellule){

    // Initialisation des composants internes
    this.elements = [];
    this.nbElements = 0; // sera mis a jour lors de l'ajout d'un element
    this.nbPlacesDisponibles = 0; // sera initialise par le calcul des proprietes
    this.needRebuild = false; // sert a savoir si on a besoin de reconstruite le tableau
    this.xMarge = largeurMarge;

    // Valeurs a l'initialisation
    this.nom = nom;
    this.largeurCellule = largeurCellule;
    this.buildCellule = (affichageCellule != null) ? affichageCellule : function (index, element){return index};

    // Enregistre cette liste d'affichage dans le document
    document.stockListeAffichage = this;

    // Recherche un nom identifiant libre
    while (getDocumentElement(this.nom) != null) {
        this.nom = nom + Math.round(Math.random()*1000000);
    }

    /**
     * Ajoute un element a la liste
     */
    this.addElement = function(element){

        debugMessage("addElement : nbPlacesDisponibles=" + this.nbPlacesDisponibles);
        if (this.nbPlacesDisponibles > 0){

            this.elements[this.nbElements] = element;
            this.nbPlacesDisponibles--;
            x = getCase(this, this.nbElements);
            x.innerHTML = this.buildCellule(element, this.nbElements);
            this.nbElements++;
        }
    }

    /**
     * Retire un element de la liste en fonction de sa place (a partir de 0)
     */
    this.delElement = function(i){

      debugMessage("delElement : i=" + i);
      debugMessage("delElement : this.elements=" + this.elements);

      // Fait remonter d'une position les elements de la liste
      for (iElement = i; iElement<this.nbElements-1; iElement++){
        this.elements[iElement] = this.elements[iElement+1];

        // On modifie les indexs des �l�ments s'il y en a un        
        if (this.elements[iElement].index != null){
          this.elements[iElement].index = this.elements[iElement].index - 1;
        }
      }
      this.elements[this.nbElements-1] = "";
      debugMessage("delElement : this.elements=" + this.elements);
      
      this.nbPlacesDisponibles++;
      this.nbElements--;
      
      // Fait remonter d'une position les cases qui suivent
      for (iElement = i; iElement<this.nbElements; iElement++){
        x = getCase(this, iElement);
        
        // On est oblig� de reg�n�rer le contenu de la case car les indexes
        x.innerHTML = this.buildCellule(this.elements[iElement], iElement);
      }
      getCase(this, this.nbElements).innerHTML = "";
    }


    // Initialise le tableau en fonction du nombre d'elements prevu dans le tableau
    calculateProperties(this, nombre, findLargeurTableau() - this.xMarge);

    // Repositionne le besoin de reconstruction car a l'initialisation, on le construit avec le bon nombre d'elements
    this.needRebuild = false; // sert a savoir si on a besoin de reconstruite le tableau

    // Construction du conteneur avec le tableau
    text = "<div id='" + this.nom + "'>";
    text += buildDisplayTableau(this, this.nbPlacesDisponibles, this.nbCasesParLigne, null);
    text +="</div>";

    debugMessage(text);

    document.write(text);

    // Regenere le tableau au redimmensionnement de la fenetre
    window.onresize=resize;

    return this;
}

function actualiseListe(typeRecherche){
    
    formulaire = document.forms['globalForm'];
    formulaire.elements['typeRecherche'].value = typeRecherche;
    return doActionListe('actualise');
}

// Soumet le formulaire avec un paramètre d'action
var submitOnesListe = false;
function doActionListe(name){

  if (!submitOnes){
    submitOnesListe = true;
    formulaire = document.forms['globalForm'];
    formulaire.elements['action'].value = name;
    formulaire.submit();
  }
  else return false;
}

function rechercheListe(typeRecherche){
    document.forms['globalForm'].elements['typeRecherche'].value = typeRecherche;
    return doActionListe('recherche');
  }

// change la quantité à partir de la quantité bis
function changeQuantiteListe(elementAction){

  formulaire = document.forms['globalForm'];
  formulaire.elements['quantite'].value = formulaire.elements['quantiteBis'].value;
  
  actualiseListe(elementAction);
}



// ---------------------------------------------------------------
// Scripts spécifiques à la page de la boutique
function nouvelleRecherche(name, typeRecherche){
    
    formulaire = document.forms['globalForm'];
  
    // Si les valeurs de recherches n'ont pas changées, on ne fait rien
    if (formulaire.elements['filtreRecherche'].value == filtreRecherche
        && formulaire.elements['categorie_ID'].value == categorie_ID){
  
      return false;
    }
    else {
      formulaire.elements['typeRecherche'].value = typeRecherche;
      return doActionListe(name);
    }
  }
  
  function articleInfo(index, id, typeElement, pathPochette, reference, designation, description, prixVente, poids, isDansPanier, langueTraduction, lienArticle){
    this.index = index;
    this.id = id;
    this.typeElement = typeElement;
    this.pathPochette = pathPochette;
    this.reference = reference;
    this.designation = designation;
    this.description = description;
    this.prixVente = prixVente;
    this.poids = poids;
    this.isDansPanier = isDansPanier;
    this.langueTraduction;
    this.lienArticle=lienArticle;
    return this;
  }
  


