//IE : boolean ayant la valeur true si on est sous Internet Explorer.
IE = false;
if(navigator.appName == "Microsoft Internet Explorer"){
  IE = true;
}

function selecteurChamp(leftpart, rightpart, selectprinc, selectlie, selectlie3, nom){
  this.nom = nom;
  this.leftpartId = leftpart;
  this.rightpartId = rightpart;
  this.tabadd = new Array();//tableau des id des éléments sélectionnés à gauche
  this.tabremove = new Array();//tableau des id des éléments sélectionnés à droite
  this.selectprinc = selectprinc;
  this.selectlie = selectlie;
  this.selectlie3 = selectlie3;
  this.numidzero = 1;
}



//Vérifie la présence d'une valeur dans un tableau
function valisintab(val, tab){
  for(i=0; i<tab.length; i++){
    if(tab[i] == val){
      return true;
    }
  }
  return false;
}

//Fonction appelée lors du click sur un élément de la partie de gauche
function leftpartclick(val, objet){
  if(valisintab(val, objet.tabadd)){
    document.getElementById(objet.nom+'_'+val).style.background='#ffffff';
    return removeValueTabgauche(val, objet);
  }else{
	//alert(objet.nom+":"+val);
    document.getElementById(objet.nom+'_'+val).style.background='#817cea';
    return addValueTabgauche(val, objet);
  }

}

//Fonction appelée lors du click sur un élément de la partie de droite
function rightpartclick(val, objet){
  if(valisintab(val, objet.tabremove)){
    document.getElementById(objet.nom+'_'+val).style.background='#ffffff';
    return removeValueTabdroit(val, objet);
  }else{
    document.getElementById(objet.nom+'_'+val).style.background='#817cea';
    return addValueTabdroit(val, objet);
  }
}

//Ajoute une valeur au tableau contenant les éléments sélectionnés dans la partie de droite
function addValueTabgauche(val, objet){
  objet.tabadd[objet.tabadd.length]=val;
  return true;
}

//Enlève une valeur au tableau contenant les éléments sélectionnés dans la partie de gauche
function removeValueTabgauche(val, objet){
  newtab = new Array();
  for(i=0; i<objet.tabadd.length; i++){
    if(objet.tabadd[i] == val){
      for(j=i; j<objet.tabadd.length-1; j++){
        newtab[j] = objet.tabadd[j+1];
      }
      objet.tabadd = newtab;
      return true;
    }else{
      newtab[i] = objet.tabadd[i];
    }
  }
  return false;
}

//Ajoute une valeur au tableau contenant les éléments sélectionnés dans la partie de droite
function addValueTabdroit(val, objet){
  objet.tabremove[objet.tabremove.length]=val;
  return true;
}

//Enlève une valeur au tableau contenant les éléments sélectionnés dans la partie de droite
function removeValueTabdroit(val, objet){
  newtab = new Array();
  for(i=0; i<objet.tabremove.length; i++){
    if(objet.tabremove[i] == val){
      for(j=i; j<objet.tabremove.length-1; j++){
        newtab[j] = objet.tabremove[j+1];
      }
      objet.tabremove = newtab;
      return true;
    }else{
      newtab[i] = objet.tabremove[i];
    }
  }
  return false;
}

//Fonction appelée pour ajouter un élément à la partie de droite
function addElement(bool, objet){
  if(objet.tabadd.length > 0){
	deselectnepasimporter = false;
    for( i=0; i<objet.tabadd.length; i++){
      trVal = objet.tabadd[i];
	  if(document.getElementById(objet.nom+'_'+trVal)){
        if(trVal != ""){
          valeur = document.getElementById(objet.nom+'_'+trVal).value;
          inner = document.getElementById(objet.nom+'_'+trVal).innerHTML;
          if(trVal != 0){
            eraseElement(objet.leftpartId, objet.nom+'_'+trVal);
          }else{
        	objet.numidzero = objet.numidzero +1; 
          }
          nvDiv = document.createElement("div");
          if(trVal != 0){
            nvDiv.setAttribute("id", objet.nom+'_'+trVal);
          }else{
            trVal = "_"+objet.numidzero.toString();
            nvDiv.setAttribute("id", objet.nom+'_'+trVal);
            deselectnepasimporter = true;
          }
          nvDiv.nodeValue = trVal;
          nvDiv.setAttribute("value", valeur);
          if(IE){
            nvDiv.onclick=new Function("rightpartclick('"+trVal+"', "+objet.nom+")");
          }else{
            nvDiv.setAttribute("onclick", "rightpartclick('"+trVal+"', "+objet.nom+")");
          }
          document.getElementById(objet.rightpartId).appendChild(nvDiv);
          document.getElementById(objet.nom+'_'+trVal).innerHTML=inner;
          document.getElementById(objet.nom+'_'+trVal).style.cursor='default';
          if(inner.substr(0,1) == "["){
            nvDiv = document.createElement("option");
            nvDiv.setAttribute("id", trVal+"s");
            nvDiv.setAttribute("value", trVal);
            nvDiv.innerHTML=inner;
            document.getElementById(objet.selectlie).appendChild(nvDiv);
          }else if(inner.substr(0,1) == "{"){
            nvDiv = document.createElement("option");
            nvDiv.setAttribute("id", trVal+"s");
            nvDiv.setAttribute("value", trVal);
            nvDiv.innerHTML=inner;
            document.getElementById(objet.selectlie3).appendChild(nvDiv);
          }else{
            nvDiv = document.createElement("option");
            nvDiv.setAttribute("id", trVal+"s");
            nvDiv.setAttribute("value", trVal);
            nvDiv.innerHTML=inner;
            document.getElementById(objet.selectprinc).appendChild(nvDiv);
          }
        }
      }
    }
    // Permet de deselctionner la ligne ne pas importer
    if(deselectnepasimporter){
      leftpartclick('0', selecteurchamp);
    }
    objet.tabadd = new Array();
  }else{
    if(bool == true){
      var noeuds = document.getElementById(objet.leftpartId).firstChild;
      if(noeuds != null){
        addValueTabgauche(noeuds.id, objet);
        addElement(true, objet);
      }
    }
  }
}

//Fonction appelée pour ajouter tous les éléments à la partie de droite
function addAll(objet){
  objet.tabadd = new Array();
  var noeuds = document.getElementById(objet.leftpartId).firstChild;
  while(noeuds != null){
    if(document.getElementById(noeuds.id)){
      objet.tabadd[objet.tabadd.length] = noeuds.id.substring(noeuds.id.indexOf("_")+1);
    }
    noeuds = noeuds.nextSibling;
  }
  addElement(false, objet);
}

//Fonction appelée pour enlever un élément de la partie de droite
function removeElement(objet){
  if(objet.tabremove.length > 0){
    for( i=0; i<objet.tabremove.length; i++){
      trVal = objet.tabremove[i];
	  if(document.getElementById(objet.nom+'_'+trVal)){
      if(trVal != ""){
        valeur = document.getElementById(objet.nom+'_'+trVal).value;
        inner = document.getElementById(objet.nom+'_'+trVal).innerHTML;
        eraseElement(objet.rightpartId, objet.nom+'_'+trVal);

        if(inner.substr(0,1) == "["){
          eraseElement(objet.selectlie, objet.nom+'_'+trVal+"s");
        }else if(inner.substr(0,1) == "{"){
          eraseElement(objet.selectlie3, objet.nom+'_'+trVal+"s");
        }else{
          eraseElement(objet.selectprinc,objet.nom+'_'+ trVal+"s");
        }
        nvDiv = document.createElement("div");
        nvDiv.setAttribute("id", objet.nom+'_'+trVal);
        //nvDiv.setAttribute(trVal);
        if(IE){
          nvDiv.onclick=new Function("leftpartclick('"+trVal+"', "+objet.nom+")");
        }else{
          nvDiv.setAttribute("onclick", "leftpartclick('"+trVal+"', "+objet.nom+")");
        }
        if(trVal.substr(0,1)!="_"){
          document.getElementById(objet.leftpartId).appendChild(nvDiv);
          document.getElementById(objet.nom+'_'+trVal).innerHTML=inner;
          document.getElementById(objet.nom+'_'+trVal).style.cursor='default';
        }
      }
	  }
    }
    objet.tabremove = new Array();
  }else{
    var noeuds = document.getElementById(objet.rightpartId).firstChild;
    if(noeuds != null){
      addValueTabdroit(noeuds.id, objet);
      removeElement(objet);
    }
  }
}

//Fonction appelée pour enlever tous les éléments de la partie de droite
function removeAll(objet){
  objet.tabremove = new Array();
  var noeuds = document.getElementById(objet.rightpartId).firstChild;
  while(noeuds != null){
    if(document.getElementById(noeuds.id)){
      objet.tabremove[objet.tabremove.length] = noeuds.id.substring(noeuds.id.indexOf("_")+1);
    }
    noeuds = noeuds.nextSibling;
  }
  removeElement(objet);
}

//Fonction appelée pour détruire un noeud en passant en paramètre l'id de l'élément père de l'élément à supprimer
//et l'id de l'élément à supprimer
function eraseElement(idparent, idNode){
  var noeuds = document.getElementById(idparent).firstChild;
  while(noeuds != null){
    if(noeuds.id == idNode){
      document.getElementById(idparent).removeChild(noeuds);
      break;
    }
    noeuds = noeuds.nextSibling;
  }
}

//ordonne les éléments d'un tableau de nombres
function ordonneTableauParPosition(objet){
  tableau = new Array();
  var noeuds = document.getElementById(objet.rightpartId).firstChild;
  j=0;
  while(noeuds != null){
    for(i=0; i<objet.tabremove.length; i++){
      if(noeuds.id.substring(noeuds.id.indexOf("_")+1) == objet.tabremove[i]){
        tableau[j++] = objet.tabremove[i];
      }
    }
    noeuds = noeuds.nextSibling;
  }
  return tableau;
}

//Monte le ou les éléments sélectionnés dans le div de droite
function monteElements(objet){
  objet.tabremove = ordonneTableauParPosition(objet);
  for(i=0; i<objet.tabremove.length; i++){
    monteElement(objet.tabremove[i], objet);
  }
}

//Monte un élément sélectionné dans le div de droite
function monteElement(elem, objet){
  var noeud1 = document.getElementById(objet.rightpartId).firstChild;
  noeud2 = noeud1.nextSibling;
  while(noeud1 != null && noeud2 != null){
    if(noeud2.id == objet.nom+'_'+elem){
      id1 = noeud1.id;
      id2 = noeud2.id;
      value1 = noeud1.value;
      value2 = noeud2.value;
      inner1 = noeud1.innerHTML;
      inner2 = noeud2.innerHTML;
      style1 = noeud1.style.background;
      style2 = noeud2.style.background;
      noeud1.setAttribute("id", id2);
      noeud1.setAttribute("value", value2);
      noeud1.style.background = style2;
      noeud1.innerHTML = inner2;
      if(IE){
        noeud1.onclick=new Function("rightpartclick('"+id2.substring(id2.indexOf("_")+1)+"', "+objet.nom+")");
      }else{
        noeud1.setAttribute("onclick", "rightpartclick('"+id2.substring(id2.indexOf("_")+1)+"', "+objet.nom+")");
      }
      noeud2.setAttribute("id", id1);
      noeud2.setAttribute("value", value1);
      noeud2.style.background = style1;
      noeud2.innerHTML = inner1;
      if(IE){
        noeud2.onclick=new Function("rightpartclick('"+id1.substring(id1.indexOf("_")+1)+"', "+objet.nom+")");
      }else{
        noeud2.setAttribute("onclick", "rightpartclick('"+id1.substring(id1.indexOf("_")+1)+"', "+objet.nom+")");
      }
      break;
    }
    noeud1 = noeud1.nextSibling;
    noeud2 = noeud2.nextSibling;
  }
}


//Descend le ou les éléments sélectionnés dans le div de droite
function descendElements(objet){
  objet.tabremove = ordonneTableauParPosition(objet);
  for(i=objet.tabremove.length; i>=0; i--){
    descendElement(objet.tabremove[i], objet);
  }
}


//Descend un élément sélectionné dans le div de droite
function descendElement(elem, objet){
  var noeud1 = document.getElementById(objet.rightpartId).firstChild;
  //var noeud2 = document.getElementById("rightpart").firstChild;
  noeud2 = noeud1.nextSibling;
  while(noeud1 != null && noeud2 != null){
    if(noeud1.id == objet.nom+'_'+elem){
      id1 = noeud1.id;
      id2 = noeud2.id;
      value1 = noeud1.value;
      value2 = noeud2.value;
      inner1 = noeud1.innerHTML;
      inner2 = noeud2.innerHTML;
      style1 = noeud1.style.background;
      style2 = noeud2.style.background;
      noeud1.setAttribute("id", id2);
      noeud1.setAttribute("value", value2);
      noeud1.style.background = style2;
      noeud1.innerHTML = inner2;
      if(IE){
        noeud1.onclick=new Function("rightpartclick('"+id2.substring(id2.indexOf("_")+1)+"', "+objet.nom+")");
      }else{
        noeud1.setAttribute("onclick", "rightpartclick('"+id2.substring(id2.indexOf("_")+1)+"', "+objet.nom+")");
      }
      noeud2.setAttribute("id", id1);
      noeud2.setAttribute("value", value1);
      noeud2.style.background = style1;
      noeud2.innerHTML = inner1;
      if(IE){
        noeud2.onclick=new Function("rightpartclick('"+id1.substring(id1.indexOf("_")+1)+"', "+objet.nom+")");
      }else{
        noeud2.setAttribute("onclick", "rightpartclick('"+id1.substring(id1.indexOf("_")+1)+"', "+objet.nom+")");
      }
      break;
    }
    noeud1 = noeud1.nextSibling;
    noeud2 = noeud2.nextSibling;
  }
}


//Fonction qui trie les éléments par ordre alphabétique dans le div de gauche
function triElements(objet){
  ordonne = false;
  while(ordonne == false){
    var noeud1 = document.getElementById(objet.leftpartId).firstChild;
    var noeud2 = document.getElementById(objet.leftpartId).firstChild;
    noeud2 = noeud2.nextSibling;
    ordonne = true;
    while(noeud1 != null && noeud2 != null){
	  if(noeud1.innerHTML && noeud2.innerHTML){
      if(noeud1.innerHTML.toUpperCase() > noeud2.innerHTML.toUpperCase()){
        id1 = noeud1.id;
        idchamp1 = id1.substring(id1.indexOf("_")+1);
        id2 = noeud2.id;
        //alert(idchamp1);
        if(idchamp1 != '0'){
        ordonne = false;
        value1 = noeud1.value;
        value2 = noeud2.value;
        inner1 = noeud1.innerHTML;
        inner2 = noeud2.innerHTML;
        style1 = noeud1.style.background;
        style2 = noeud2.style.background;
        noeud1.setAttribute("id", id2);
        noeud1.setAttribute("value", value2);
        noeud1.style.background = style2;
        noeud1.innerHTML = inner2;
        if(IE){
          //alert(id2);
          noeud1.onclick=new Function("leftpartclick('"+id2.substring(id2.indexOf("_")+1)+"', "+objet.nom+")");
        }else{
          noeud1.setAttribute("onclick", "leftpartclick('"+id2+"', "+objet.nom+")");
        }
        noeud2.setAttribute("id", id1);
        noeud2.setAttribute("value", value1);
        noeud2.style.background = style1;
        noeud2.innerHTML = inner1;
        if(IE){
          noeud2.onclick=new Function("leftpartclick('"+id1.substring(id1.indexOf("_")+1)+"', "+objet.nom+")");
        }else{
          noeud2.setAttribute("onclick", "leftpartclick('"+id1+"', "+objet.nom+")");
        }
        break;
        }
      }
	  }
      noeud1 = noeud1.nextSibling;
      noeud2 = noeud2.nextSibling;
    }
  }
}

/**
 * Retourne la liste des champs sélectionnés
 * @return la liste des champs séparé par des ';'
 */
function getListeChamps(objet){
  listetemp = "";
  var noeuds = document.getElementById(objet.rightpartId).firstChild;
  while(noeuds != null){
    if(listetemp == ''){
      listetemp = noeuds.id.substring(noeuds.id.indexOf("_")+1);
    }else{
      listetemp += ';'+noeuds.id.substring(noeuds.id.indexOf("_")+1);
    }
  noeuds = noeuds.nextSibling;
  }
  return listetemp;
}
/**
 * Initilise le selectueur de champ avec les valeurs contenu dans idchamp
 * @param objet objet à initialisé
 * @param idchamp id du champ qui contient les valeur
 * @return
 */
function selecteurchampsloadDiv(objet, idchamp){
  var listechamp = document.getElementById(idchamp).value;
  while(listechamp.length > 0){
    if(listechamp.indexOf(';') != -1){
      valeurchamp = listechamp.substring(0, listechamp.indexOf(';'));
      listechamp = listechamp.substring(listechamp.indexOf(';')+1);
    }else{
      valeurchamp = listechamp;
      listechamp = '';
    }
    objet.tabadd[objet.tabadd.length]=valeurchamp;
  }
  addElement(false, objet);
}
 
// fonction permettant de mettre à jour le calque de sélection d'un champ.
function montredivselecteurchamp(){
   if (http_request.readyState == 4) {
    if (http_request.status == 200) {
      document.getElementById('SelecteurChamp').innerHTML=http_request.responseText;
      document.getElementById('SelecteurChamp').style.display='block';
      return loadDivExecute();
    } else {
      alert('Un probl\u00E8me est survenu lors de la mise \u00E0 jour du calque de s\u00E9lection des champs.');
    }
  }
  return true;
}

