/*
* Fonction de tri des <select>
*/
function sortSelect(oSelect,sortBy) {

	var aOptions = new Array();
	var aSelectTexts = new Array();
	var aSelectValues = new Array();
	
	//
	//	Si sortBy pas spécifié (ou spécifié à  null), on trie les 'textes' des combo par défaut
	//
	var sortByText = ( sortBy == null || typeof(sortBy) != 'number' || sortBy == 1 );
	var sortByValues = ( sortBy != null && sortBy == 2 );
	var sortByValuesCompareNumbers = ( sortBy != null && sortBy == 3 );

	for ( i=0 ; i<oSelect.length ; i++ ) {
		//
		//	On crée Le tableau d'<option> :
		//	Si on ne passe pas par le constructeur, Netscape plante.
		//
		aOptions[i] = new Option(oSelect.options[i].text,oSelect.options[i].value);

		//
		//	Le tableau des clés texte (ou value) à trier :
		//
		aSelectTexts[i] = oSelect.options[i].text;
		aSelectValues[i] = oSelect.options[i].value;
	}
   
	//
	//	Tri des clés de texte (ou value) des options:
	//
	if ( sortByValues ) {
		aSelectValues.sort();
		
	} else if ( sortByValuesCompareNumbers ) {
		aSelectValues.sort(compareNumbers);
		
	} else {
	  // tri par default
	  aSelectTexts.sort();
  }
		
	//
	//	On reset l'objet select de la page
	//
	oSelect.length = 0;

	//
	//	On trie le tableau d'options en prenant pour modèle de tableau de textes triés :
	//
	//	Pour chaque item du tableau de textes trié,
	//	on regarde la correspondance dans le tableau d'<option>
	//	Si on trouve l'item on s'en sert pour créer le nouveau <select>, et on retire
	//	du tableau d'<option> l'item correspondant sinon ça bugge
	//
	for ( i=0 ; i < aSelectTexts.length ; i++ ) {

		for ( j=0 ; j < aOptions.length ; j++ ) {

			if ( sortByText ) {
				if ( aSelectTexts[i] == aOptions[j].text ) {
					oSelect.options[i] = aOptions[j];
					// On retire l'index j de cet array ET du coup on diminue sa longueur de 1 :
					aOptions = aOptions.slice(0,j).concat(aOptions.slice(j+1,aOptions.length));
					break;
				}
			} else {
				if ( aSelectValues[i] == aOptions[j].value ) {
					oSelect.options[i] = aOptions[j];
					aOptions = aOptions.slice(0,j).concat(aOptions.slice(j+1,aOptions.length));
					break;
				}
			}

		}

	}

	return;
}


// comparaison pour tri entiers
function compareNumbers(a, b) {
	return a - b;
}



function deleteSelectedSelectItems (
  oSelect  // oSelect
){
  	for ( i=oSelect.length-1 ; i>=0 ; i-- ) {
    	if ( oSelect.options[i].selected == true ) {
    	 oSelect.options[i] = null;
      }
    }
}

function deleteSelectItem (
  oSelect,  // oSelect
  itemNo    // item to delete
){  	
  oSelect.options[itemNo] = null;
}

function deleteAllSelectItems (
  oSelect  // oSelect
){  	
  oSelect.length = 0;
}



/**
*	fonction permettant de déplacer un (des) élément(s) de la combo de départ (oSelectFrom)
*	vers la fonction de destination (oSelectDest)
*/
function moveSelectItems (
  oSelectFrom,  // oSelect combo de départ
  oSelectDest,  // oSelect combo de destination
  selectAll    // boolean sélectionner tous les items dans le combo de départ
){
	//
	//	On copie les options sélectionnées dans la combo oSelectFrom
	//	vers la combo oSelectDest et on les supprime ensuite dans la
	//	combo oSelectFrom
	//
	var selectAllItems = ( selectAll != null && selectAll == true && oSelectFrom.disabled == false);

  if ( selectAllItems )	{
  	for ( i=0; i<oSelectFrom.length ; i++ ) {
    	//alert("oSelectDest.length: "+oSelectDest.length);
			oSelectDest.length += 1;
			oSelectDest.options[oSelectDest.length-1].value=oSelectFrom.options[i].value;
			oSelectDest.options[oSelectDest.length-1].text=oSelectFrom.options[i].text;
		}
		// vide le premier
    oSelectFrom.length = 0;

	} else {
    // On est "obligé" pour l'instant de parcourir la liste 2 fois car dans
    // dans une même opération ça merde...
    //
  	for ( i=0; i<oSelectFrom.length ; i++ ) {
    	if ( oSelectFrom.options[i].selected == true ) {
    	    //alert("oSelectDest.length: "+oSelectDest.length);
					oSelectDest.length += 1;
					oSelectDest.options[oSelectDest.length-1].value=oSelectFrom.options[i].value;
					oSelectDest.options[oSelectDest.length-1].text=oSelectFrom.options[i].text;
  		}
  	}
		for ( i=oSelectFrom.length-1 ; i >= 0 ; i-- ) {
  		if ( oSelectFrom.options[i].selected == true ) {
  			oSelectFrom.options[i] = null;
  		}
		}
  }
}


function moveSelectItemsAndSort(
  oSelectFrom,  // oSelect combo de départ
  oSelectDest,  // oSelect combo de destination
  selectAll,    // boolean sélectionner tous les items dans le combo de départ
  sortByFrom,   // int type de tri (null ou 1, 2, 3) pour le combo de départ
  sortByDest   // int type de tri (null ou 1, 2, 3) pour le combo de destination
){
  // D'abord on move
  moveSelectItems ( oSelectFrom, oSelectDest, selectAll );
  
	//
	//	On trie éventuellement si demandé les deux combos
	//
	if ( sortByFrom != null ) {
		sortSelect(oSelectFrom, sortByFrom);
  }
	if ( sortByDest != null ) {
		sortSelect(oSelectDest, sortByDest);
  }
}




function shiftSelectItem( oSelect, iDirection ){
  // Pour éviter les incohérences avec les autres codes de déplacement
  var nextIndex = -1;
  var isMultiple = false;

  if ( oSelect.multiple ) {
    isMultiple = true;
    oSelect.multiple = false;
  }

  var si = oSelect.selectedIndex;
  
  if( si != -1 ){ // aucune sélection
    nextIndex = si + iDirection;
    if ( nextIndex != -1 && nextIndex != oSelect.length ) {

      var nextOption = new Option( oSelect.options[nextIndex].text, oSelect.options[nextIndex].value );
      var selectedOption = oSelect.options[si];
      
      oSelect.options[nextIndex].text = selectedOption.text;
      oSelect.options[nextIndex].value = selectedOption.value;
      oSelect.options[nextIndex].selected = true;
      
      oSelect.options[si].text = nextOption.text;
      oSelect.options[si].value = nextOption.value;
    }
    
  } else {
    window.status = 'Aucune sélection';
  }
  
  // Rétablit éventuellement
  if ( isMultiple ) {
    if ( si != -1 ){
      if (nextIndex > -1 && nextIndex != oSelect.length) {
        oSelect.selectedIndex = nextIndex ;
      }
    }
    oSelect.multiple = true;
  }

}

  
function moveDownSelectItem(oSelect){
  shiftSelectItem(oSelect, 1);
}
function moveUpSelectItem(oSelect){
  shiftSelectItem(oSelect, -1);
}
