<!-- drag&drop d'objets
ob=[] // tableau des objets
listeZoneCible = new Array();
depart = '';
arrivee = '';

function selObj(e){ // sélection de l'objet sous la souris
el=ie?event.srcElement:e.target;
if(!el.tagName)el=el.parentNode // pour NS6+
}

function drag(e){
selObj(e);
if (el.id.substr(0,2)=="dd" && ob==D){  // si l'objet est déplaçable
	depart = el.parentNode.parentNode.id;
  ob=el;el=D; // le capture
  }
return false // necessaire Gecko
}

function bouge(e){
sx=ie?db.scrollLeft:pageXOffset;     //scroll h
sy=ie?db.scrollTop:pageYOffset;      //scroll v
px=ie?event.clientX+sx:e.pageX;      //curseur x
py=ie?event.clientY+sy:e.pageY;      //curseur y
if(ob != D){
  with(ob.style){position="absolute";display="inline";
    left=px+"px";top=py+3+"px";cursor="move"
    }
  }
return false 
}

function drop(e){ // dépose l'objet
selObj(e);
if (el.id.substr(0,2)=="dd")el=el.parentNode; // une case peut contenir plusieurs critères
if (el.parentNode.id=="cible")el=el.parentNode;

arrivee = el.parentNode.id;
if (arrivee != depart)
{
	if (el.parentNode.id.match("zoneC")){  // si c'est bien une case à critères

		regType=new RegExp("-[^_]*_","gi");
		regNom=new RegExp("_[^:]*:?","gi");
		
		nomsOpt = ob.id;
		nomsOpt = nomsOpt.replace(/dd/,'');
		
    type = regType.exec(ob.id).join('');
    nomsOpt = nomsOpt.replace(type,'');
   	type = type.replace(/-/,'').replace(/_/,'');
   	
    nom = regNom.exec(ob.id).join('');
    nom = nom.replace(/_/,'').replace(/:/,'');
    nomsOpt = nomsOpt.replace(nom,'');
    
    listeNomsOpt = new Array;
    
    while (nomsOpt != '')
    {
			regNomOpt=new RegExp(":[^:]*:?","gi");
    	nomOpt = regNomOpt.exec(nomsOpt).join('');
    	nomOpt = nomOpt.replace(/:/,'').replace(/:/,'');
    	listeNomsOpt.push(nomOpt);
    	nomsOpt = nomsOpt.replace(/:/,'');
    	nomsOpt = nomsOpt.replace(nomOpt,'');
    }
    
    if (el.parentNode.id.match("zoneCible")){
    	if (searchElementInListeCritere(listeZoneCible,nom) == -1)
    	{
    		listeZoneCible.push(new Critere(type,nom));
    		for (var i=0; i<listeNomsOpt.length; i++)
    		{
    			listeZoneCible.push(new Critere(type,listeNomsOpt[i]));
    		}
    	}
    }
    else if (el.parentNode.id.match("zoneCriteres")){
    	listeZoneCible = removeElementInListeCritere(listeZoneCible,nom);
    	for (var i=0; i<listeNomsOpt.length; i++)
    	{
    		listeZoneCible = removeElementInListeCritere(listeZoneCible,listeNomsOpt[i]);
    	}
    }
    el.appendChild(ob); // colle l'objet dans la case sélectionnée
    el.style.width = "auto";
    ob.style.position="";
    ob=D; // annule la sélection
    afficheCriteres(listeZoneCible); //Met à jour le tableau 
    
  	}
  }
  else
  {
  	ob.style.position="";
  	ob=D; // annule la sélection
  }
}

function change(e){

	selObj(e);
	
	if (el.id.substr(0,2)=="dd")
	{
		crit = el;
		el=el.parentNode; // une case peut contenir plusieurs critères
	}
	if (el.parentNode.id.match("zoneC")){  // si c'est bien une case à critères
		regType=new RegExp("-[^_]*_","gi");
		regNom=new RegExp("_[^:]*:?","gi");

		nomsOpt = crit.id;
		nomsOpt = nomsOpt.replace(/dd/,'');
		
    type = regType.exec(crit.id).join('');
    nomsOpt = nomsOpt.replace(type,'');
   	type = type.replace(/-/,'').replace(/_/,'');
   	
    nom = regNom.exec(crit.id).join('');
    nom = nom.replace(/_/,'').replace(/:/,'');
    nomsOpt = nomsOpt.replace(nom,'');
    
    listeNomsOpt = new Array;

    while (nomsOpt != '')
    {
			regNomOpt=new RegExp(":[^:]*:?","gi");
    	nomOpt = regNomOpt.exec(nomsOpt).join('');
    	nomOpt = nomOpt.replace(/:/,'').replace(/:/,'');
    	listeNomsOpt.push(nomOpt);
    	nomsOpt = nomsOpt.replace(/:/,'');
    	nomsOpt = nomsOpt.replace(nomOpt,'');
    }
		if (el.parentNode.id.match("zoneCible")){
    	 listeZoneCible = removeElementInListeCritere(listeZoneCible,nom);
    	for (var i=0; i<listeNomsOpt.length; i++)
    	{
    		listeZoneCible = removeElementInListeCritere(listeZoneCible,listeNomsOpt[i]);
    	}
    	zone = D.getElementById('criteres'); // colle l'objet dans la case sélectionnée
    }
    else if (el.parentNode.id.match("zoneCriteres")){
    	if (searchElementInListeCritere(listeZoneCible,nom) == -1)
    	{
    		listeZoneCible.push(new Critere(type,nom));
    		for (var i=0; i<listeNomsOpt.length; i++)
    		{
    			listeZoneCible.push(new Critere(type,listeNomsOpt[i]));
    		}
    	}

    	zone = D.getElementById('cible'); // colle l'objet dans la case sélectionnée
    }
    
    zone.appendChild(crit);
    zone.style.width = "auto";
    crit.style.position="";
    crit.className = '';
    crit=D; // annule la sélection
    afficheCriteres(listeZoneCible); //Met à jour le tableau 
    
  }
}

function initdrag(){
D=document;ie=D.all?1:0;op=window.opera?1:0;dtd= D.compatMode=="CSS1Compat"?1:0;ob=D
db=ie&!op&&dtd?D.documentElement:D.body //exception IE6 dtd
D.onmousedown=drag;D.onmouseup=drop;D.onmousemove=bouge;D.ondblclick=change; 
}

function addEvent(obj,evType,fn,capt){ // ajoute un événement sans écraser l'éxistant.
if(obj.addEventListener){obj.addEventListener(evType,fn,capt);return true;} // NS6+
else if(obj.attachEvent)obj.attachEvent("on"+evType,fn) // IE 5+
else {return false;}
} 

addEvent(window,"load",initdrag)


//-->
/*
	Masque les lignes de la table si elle ne correspondent pas
	à la liste des critéres donnée
	Démasque sinon
 */
function afficheCriteres(listeCriteres)
{
	majCriteres(listeCriteres);
    	
	if (listeCriteres.length > 0)
	{
		document.getElementById('utilisation').className = 'masquer';
	}
	else
	{
		document.getElementById('utilisation').className = 'afficher';
	}
}

function majCriteres(listeCriteres)
{

	/*
		Déduction des listes de critères par type
	 */

	var listeCriteresFAI = new Array;
	var listeCriteresDegroupage = new Array;
	var listeCriteresPrix = new Array;
	var listeCriteresDebits = new Array;
	var listeCriteresCategorie = new Array;

	for (var i=0; i<listeCriteres.length; i++) 
	{
		switch (listeCriteres[i].type) {
			case 'FAI':
				listeCriteresFAI.push(listeCriteres[i].nom);
				break;
			case 'degroupage':
				listeCriteresDegroupage.push(listeCriteres[i].nom);
				break;
			case 'prix':
				listeCriteresPrix.push(listeCriteres[i].nom);
				break;	
			case 'debits':
				listeCriteresDebits.push(listeCriteres[i].nom);
				break;
			case 'categorie':
				listeCriteresCategorie.push(listeCriteres[i].nom);
				break;
			default:
				break;
		}
	}

	var xhr_object = null; 

	if(window.XMLHttpRequest) // Firefox
		xhr_object = new XMLHttpRequest();
	else if(window.ActiveXObject) // Internet Explorer
   	xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	else { // XMLHttpRequest non supporté par le navigateur
   	alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
   	return;
	}
	
	xhr_object.open("POST", "/include/table-criteres.php", true);

	xhr_object.onreadystatechange = function() {
   	if(xhr_object.readyState == 4) {
   			document.getElementById('mesure').innerHTML = (xhr_object.responseText);
    		forEach(document.getElementsByTagName('table'), function(table) {
      		if (table.className.search(/\bsortable\b/) != -1) {
        		sorttable.makeSortable(table);
      		}
   		 });
   	}
	}
	xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
	var data = "fai="+listeCriteresFAI+"&degroupage="+listeCriteresDegroupage+"&prix="+listeCriteresPrix+"&debits="+listeCriteresDebits+"&categorie="+listeCriteresCategorie+"";
	xhr_object.send(data); 
}

/*
 Construit un objet Critere
 possédant un type = nom de colonne
 et le nom = intitule du critere
 */
function Critere(newType,newNom) 
{
	this.type = newType;
	this.nom = newNom;
}

/*
	Retourne l'indice du critere correspondant
	au nomCritere donné dans listeCritere
	-1 si le critere n'existe pas
 */
function searchElementInListeCritere(listeCritere,nomCritere)
{
	var k=0;
	while (k<listeCritere.length && listeCritere[k].nom != nomCritere)
	{
		k++;
	}
	if (k>=listeCritere.length)
	{
		return -1;
	}
	else
	{
		return k;
	}
}

/*
	Retourne une liste de criteres correspondant
	à la liste donné privé du critère correspondant au nom donné
	Retourne listeCritère si le critere n'existe pas
 */
function removeElementInListeCritere(listeCritere,nomCritere)
{
	var ret = new Array();
	var k=0;
	while (k<listeCritere.length && listeCritere[k].nom != nomCritere)
	{
		ret.push(listeCritere[k]);
		k++;
	}	
	return ret.concat(listeCritere.slice((k+1),listeCritere.length));
}
