var EMPTY_OPTION_10 = new Option("          ",-1);
var EMPTY_OPTION_20 = new Option("                    ",-1);
var EMPTY_OPTION_30 = new Option("                              ",-1);

// Add option in list
function addTextAndValue(aList, aText, aValue){
    aList.options[aList.length] = new Option(aText, aValue);
}

// Add option in list
function addOption(aList, newOpt){
    aList.options[aList.options.length] = cloneOption(newOpt);
}

// Insert option in list
function insertOption(aList, newOpt, index){
    var newOptions = new Array();
    var i = 0;

    for (; i < index; i++) {
        newOptions[i] = cloneOption(aList.options[i]);
    }
    newOptions[i]=cloneOption(newOpt);
    i++;
    for (; i <= aList.options.length; i++) {
        newOptions[i] = cloneOption(aList.options[i-1]);
    }
    clearSelect(aList);
    addOptionArrayToSelect(newOptions, aList);
}

// Add option if list is empty
function addEmptyOption(aList, emptyOption){
    if(aList.length==0) addOption(aList, emptyOption);
}

// Duplique une option
function cloneOption(srcOption){
    return new Option(srcOption.text,srcOption.value);
}

// Delete option
function removeOption(aList, index){
    var length = aList.length;
    var opt = null;
    if( (length>0) && (index<length)) {
        opt = cloneOption(aList.options[index]);
        aList.options[index] = null;
    }
    return opt;
}

// Delete all options with required value
function removeOptionsByValue(aList, aValue){
    for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].value==aValue) {
            removeOption(aList, i);
        }
    }
}

// Delete all options with required text
function removeOptionsByText(aList, aText){
    for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].text==aText) {
            removeOption(aList, i);
        }
    }
}

//  Remove selected options
function removeSelectedOptions(aList){
    for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].selected) {
            removeOption(aList, i);
        }
    }
}

//  Remove selected options
function removeEmptyOptions(aList){
   for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].value=='-1') {
            removeOption(aList, i);
        }
    }
}

// Supprime toutes les entrées d'une liste
function clearSelect(aList)  {
   aList.options.length = 0;
}

// Index de la première option avec valeur spécifiée
function indexOfOptionsByValue(aList, aValue){
    for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].value==aValue) {
            return i;
        }
    }
    return -1;
}

// Index de la première option le texte sp�cifi�e
function indexOfOptionsByText(aList, aText){
    for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].text==aText) {
            return i;
        }
    }
    return -1;
}

// Sélectionner toutes les options
function selectAllOptions(aList){
    for (var i = 0; i < aList.options.length; i++) {
        aList.options[i].selected = true;
    }
}

// Sélectionne l'option identifiée par sa valeur
function selectOptionByValue(aList, selectedValue){
    var aLength = aList.options.length;
    for (var i = 0; i < aLength; i++) {
        if (aList.options[i].value==selectedValue) {
            aList.options[i].selected = true;
            return;
        }
    }
}

// Sélectionne l'option identifiée par sa valeur
function selectOptionByIndex(aList, selectedIndex){
    var aLength = aList.options.length;
    if (selectedIndex==null) selectedIndex=0;
    if ( (selectedIndex<0) || (selectedIndex>=aLength)) selectedIndex=0;
    if (aLength > 0) {
        aList.options[selectedIndex].selected = true;
    }
}

// Retourne l'option identifiée par sa valeur
function getOptionByValue(aList, requiredValue){
    var aLength = aList.options.length;
    for (var i = 0; i < aLength; i++) {
        if (aList.options[i].value==requiredValue) {
            return aList.options[i];
        }
    }
}

// Retourne l'option sélectionnée
function getSelectedOption(aList){
    return aList.options[aList.selectedIndex];
}

// Retourne la première option sélectionnée et désélectionne les autres
function getFirstSelectedOption(aList)
{
  var elementCourant;
  var index = -1;
  for( var i=0; i < aList.length; i++ )
  {
    elementCourant = aList.options[i];
    if( elementCourant.selected )
    {
      if( index == -1 )
        index = i;
      else
      {
        index = -2;
        elementCourant.selected = false;
      }
    }
  }
  return index;
}

// Retourne la dernière option sélectionnée et désélectionne les autres
function getLastSelectedOption(aList)
{
  var elementCourant;
  var index = -1;
  for( var i=aList.length-1; i >= 0; i-- )
  {
    elementCourant = aList.options[i];
    if( elementCourant.selected )
    {
      if( index == -1 )
        index = i;
      else
      {
        index = -2;
        elementCourant.selected = false;
      }
    }
  }
  return index;
}

// Retourne la valeur de l'option sélectionnée
function getSelectedOptionValue(aList){
    return getSelectedOption(aList).value;
}

// Retourne la valeur de l'option sélectionnée
function getSelectedOptionText(aList){
    return getSelectedOption(aList).text;
}

// Fonction de tri
function sortSelect( obj ){
    var o = new Array();
    for (var i=0; i<obj.options.length; i++) {
        o[o.length] = new Option( obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected) ;
    }
    o = o.sort(
            function(a,b) {
        if (a.text < b.text) {
            return -1;
        }
        if (a.text > b.text) {
            return 1;
        }
        return 0;
    });
            for (var i=0; i<o.length; i++) {
                obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
                obj.options[i].selected = false;
            }
}

// Remplit une liste depuis un tableau d'options
function addOptionArrayToSelect(optionArray, aList, selectedIndex) {
    for (var i = 0; i < optionArray.length; i++) {
        addOption(aList,optionArray[i]);
    }
    if (selectedIndex) selectOptionByIndex(aList,selectedIndex);
    return;
}

// Remplit une liste depuis un tableau de valeur.
function addValueArrayToSelect(valueArray, aList, selectedIndex) {
    var aValue;
    for (var i = 0; i < valueArray.length; i++) {
        aValue = valueArray[i];
        addTextAndValue(aList,aValue,aValue);
    }
    selectOptionByIndex(aList,selectedIndex);
    return;
}

// Retourne toutes les options sélectionnées dans un tableau
function getSelectedOptionList(aList){
    var selectedOptionList = new Array();
    var opt;

    for(var i=aList.length-1; i>=0; i--) {
        opt = aList.options[i]
        if(opt.selected) {
            selectedOptionList[selectedOptionList.length]=cloneOption(opt);
        }
    }

    return selectedOptionList;
}

// Retourne le nombre d'options sélectionnées
function getSelectedOptionCount(aList){
    var optionCount = 0;

    for(var i=aList.length-1; i>=0; i--) {
        if(aList.options[i].selected) {
            optionCount++;
        }
    }

    return optionCount;
}

//  Déplace les options sélectionnées de la première liste vers la deuxième
function moveSelectedOptions(listFrom, listTo, sortList){
    var opt;

    for(var i=listFrom.length-1; i>=0; i--) {
        opt = listFrom.options[i]
        if(opt.selected) {
            addOption(listTo,cloneOption(opt));
            removeOption(listFrom, i);
        }
    }

    if (sortList){
        sortSelect(listTo);
    }
}

//  Déplace les options sélectionnées de la première liste vers la deuxième
function moveSelectedNonStarredOptions(listFrom, listTo, sortList){
    var opt;

    for(var i=listFrom.length-1; i>=0; i--) {
        opt = listFrom.options[i]
        if(opt.selected) {
          if(opt.text.charAt(0)=='*')
          {
            alert ("Vous ne pouvez pas déplacer cette option: "+opt.text);
          }
          else
          {
            addOption(listTo,cloneOption(opt));
            removeOption(listFrom, i);
          }
        }
    }

    if (sortList){
        sortSelect(listTo);
    }
}

//  Déplace toutes les options de la première liste vers la deuxième
function moveAllOptions(listFrom, listTo, sortList){
    for(var i=listFrom.length-1; i>=0; i--) {
        addOption(listTo,cloneOption(listFrom.options[i]));
    }

    if (sortList){
        sortSelect(listTo);
    }

    clearSelect(listFrom);
}

function moveAllNonStarredOptions(listFrom, listTo, sortList){
    for(var i=listFrom.length-1; i>=0; i--) {
    	if(listFrom.options[i].text.charAt(0)!='*')
        {
        addOption(listTo,cloneOption(listFrom.options[i]));
        removeOption(listFrom, i);
        }
    }
    if (sortList){
        sortSelect(listTo);
    }
}

//  Déplace l'élément sélectionné en tête de liste
function moveFirst( list )
{
  var index = getFirstSelectedOption(list);
  if( index > 0 )
  {
    var elementCourant = cloneOption( list.options[index] );
    var elementPrecedent;
    for( var i = index; i > 0; i-- )
    {
      elementPrecedent = cloneOption( list.options[i-1] );
      list.options[i] = elementPrecedent;
    }
    list.options[0] = elementCourant;
    list.options[0].selected = true;
  }
}

//  Déplace l'élément sélectionné d'un cran vers le haut
function moveUp( list )
{
  var index = getFirstSelectedOption(list);
  if( index > 0 )
  {
    var elementPrecedent = cloneOption( list.options[index-1] );
    var elementCourant = cloneOption( list.options[index] );
    list.options[index-1] = elementCourant;
    list.options[index-1].selected = true;
    list.options[index] = elementPrecedent;
  }
}

//  Déplace l'élément sélectionné d'un cran vers le bas
function moveDown(list)
{
  var index = getLastSelectedOption(list);
  if( index >= 0 )
  {
    var elementSuivant = cloneOption( list.options[index+1] );
    var elementCourant = cloneOption( list.options[index] );
    list.options[index+1] = elementCourant;
    list.options[index+1].selected = true;
    list.options[index] = elementSuivant;
  }
}

//  Déplace l'élément sélectionné en fin de liste
function moveLast(list)
{
  var index = getLastSelectedOption(list);
  if( index >= 0 )
  {
    var elementCourant = cloneOption( list.options[index] );
    var elementSuivant;
    for( var i = index; i < list.length-1; i++ )
    {
      elementSuivant = cloneOption( list.options[i+1] );
      list.options[i] = elementSuivant;
    }
    list.options[list.length-1] = elementCourant;
    list.options[list.length-1].selected = true;
  }
}

// Retourne l'ensemble des valeurs concaténées (attribut value) sous la forme d'une String (séparateur "," par defaut)
function getValuesAsString(aList,aSeparator){
    var count = aList.length;
    var selectedString = "";
    var separator = (aSeparator) ? aSeparator : ",";

    for(i=0; i<count; i++){
        if (i!=0) selectedString += separator;
        selectedString += aList.options[i].value;
    }
    return selectedString;
}

// Retourne l'ensemble des valeurs concaténées (attribut value) sous la forme d'une String (s�parateur "," par defaut)
function getSelectedValuesAsString(aList,aSeparator){
    var count = aList.length;
    var selectedString = "";
    var separator = (aSeparator) ? aSeparator : ",";
    var opt;

    for(i=0; i<count; i++) {
        opt = aList.options[i]
        if(opt.selected) {
          if( selectedString != "" ) selectedString += separator;
            selectedString += opt.value;
        }
    }
    return selectedString;
}

// Retourne l'ensemble des valeurs concaténées (attribut text) sous la forme d'une String (séparateur "," par defaut)
function getTextsAsString(aList,aSeparator){
    var count = aList.length;
    var selectedString = "";
    var separator = (aSeparator) ? aSeparator : ",";

    for(i=0; i<count; i++){
        if (i!=0) selectedString += separator;
        selectedString += aList.options[i].text;
    }
    return selectedString;
}

// Retourne l'ensemble des valeurs concaténées (attribut value) sous la forme d'une String (séparateur "," par defaut)
function getValuesAsString(aList,aSeparator){
    var count = aList.length;
    var selectedString = "";
    var separator = (aSeparator) ? aSeparator : ",";

    for(i=0; i<count; i++){
        if (i!=0) selectedString += separator;
        selectedString += aList.options[i].value;
    }
    return selectedString;
}

// Remplit la liste esclave depuis un tableaux de tableaux d'entrées en
// fonction de l'entrée sélectionnée dans le tableau maître. Le tableau
// à utiliser dans le liste des tableaux est identifié par l'identifiant de
// l'entrée sélectionnée dans la liste maître.
// Un index à sélectionner dans la liste esclave peut être passé.
function updateSlaveListByValue(optionArrayMap, masterList, slaveList, selectedSlaveIndex) {
    var mapKey       = getSelectedOptionValue(masterList);
    updateListByKey(optionArrayMap,slaveList,mapKey,selectedSlaveIndex);
}

// Remplit la liste esclave depuis un tableaux de tableaux d'entrées en
// fonction de l'entrée sélectionnée dans le tableau maître. Le tableau
// à utiliser dans le liste des tableaux est identifié par le texte de
// l'entrée sélectionnée dans la liste maître.
// Un index à sélectionner dans la liste esclave peut être passé.
function updateSlaveListByText(optionArrayMap, masterList, slaveList, selectedSlaveIndex) {
    var mapKey      = getSelectedOptionText(masterList);
    updateListByKey(optionArrayMap,slaveList,mapKey,selectedSlaveIndex);
}

// Remplit la liste esclave depuis un tableaux de tableaux d'entrées en
// fonction de l'entrée sélectionnée dans le tableau maître. Le tableau
// à utiliser dans le liste des tableaux est identifié par le texte de
// l'entrée sélectionnée dans la liste maître.
// Un index à sélectionné dans la liste esclave peut être passé.
function updateListByKey(optionArrayMap, aList, mapKey,selectedIndex) {
    var optionArray = optionArrayMap[mapKey];
    clearSelect(aList);
    if (optionArray!=null){
        addOptionArrayToSelect(optionArray,aList,selectedIndex);
    }
}

// retourne l'index du radio sélectionné
function getSelectedRadioIndex(radio){
    for (var i=0; i<radio.length;i++) {
        if (radio[i].checked) {
            return i;
        }
    }
    return -1;
}

// retourne le radio sélectionné
function getSelectedRadio(radio){
    var index = getSelectedRadioIndex(radio);
  return (index >= 0) ? radio[index] : null;
}

// retourne la valeur du radio sélectionné
function getSelectedRadioValue(radio){
    var selectedRadio= getSelectedRadio(radio);
    return (selectedRadio) ? selectedRadio.value : null;
}

// retourne le texte du radio sélectionné
function getSelectedRadioText(radio){
    var selectedRadio= getSelectedRadio(radio);
    return (selectedRadio) ? selectedRadio.text : null;
}

// Sélectionne l'option identifiée par sa valeur
function selectRadioByValue(radio, selectedValue){
    var aLength = radio.length;
    for (var i = 0; i < aLength; i++) {
        if (radio[i].value==selectedValue){
          radio[i].checked = "checked";
        }
    }
}


	//--------------------------------------------------------------
	// Nom : "invSelec"
	// Role : inverse la coche des cases dans un formulaire
	//        c'est à dire qu'une case non cochée devient cochée
	//        et vice versa
	// Paramètres :
	//     Entrée : la liste des cases à cocher concernées
	//     Sortie : -
	//--------------------------------------------------------------
	function invSelec(listeCases) {
	 // cas pour une case
	 if (listeCases.checked == true)
	 	listeCases.checked = false;
	 else
	 	listeCases.checked = true;
	 	
	 // parcours des cases
	 for (i = 0; i < listeCases.length; i++)
	 {
	   // test et inversion de l'état de la case
	  if (listeCases[i].checked == true)
	    listeCases[i].checked = false;
	  else
	  	listeCases[i].checked = true;
	 }
	}

