//-- sylvie tissot ---
function evalue(){
	
	//----------------------------
	//-- init ----------
	//----------------------------
	tabSignes = Array("+","-","=","*","(",")","/",";");
	tabSignesSansMult = Array("+","-",")","=","/",";");
	
	//----------------------------
	//-- interprétation et nombre de variables ----------
	//----------------------------
	tabDef = Array();
	tabVar = Array();
	nbVar  =0;

	vDefinition = document.forms["formulaire"].definition.value;
	vTabDefinition = vDefinition.split("\n");
	vNbDefinition  = vTabDefinition.length;
	for(i=0;i<vNbDefinition;i++){
		//-- definitions ---
		vLaDef = vTabDefinition[i];
		vTab = vLaDef.split("=");
		tabDef[vTab[0]]=vTab[1]
		//-- variables ----
		tabVar[nbVar]=vTab[0];
		nbVar++;
	}
	
	//--------------------------------
	// valeur de l'expression ---
	//--------------------------------
	vValue = document.forms["formulaire"].depart.value;
	
	//-- virer le "=" ----
	vTabTemp = vValue.split("=");
	vGauche = vTabTemp[0];
	//vDroite = vTabTemp[1].replace("+","$");
	//vDroite = vDroite.replace("-","+");
	//vDroite = vDroite.replace("$","-");
	vDroite = vTabTemp[1];
	vValue = vGauche + "-" + vDroite;
	//alert(vValue)
	
	//--------------------------------
	// expression à éliminer ---
	//--------------------------------
	vElimine = document.forms["formulaire"].elimine.value;
	vValueDecliner = vValue + ";" //-- astuce pour finir la boucle
	//--------------------------------
	// expression avec elimine=0 ---
	//--------------------------------
	vValue_0 = "";
	vNb = vValueDecliner.length;
	
	vExpr = "";
	vTrouveElimine = false;
	vOldSigne = ""
	vCarPrecedent = ""
	
	for(i=0;i<vNb;i++){
		//-- recherche expression --
		vCar    = vValueDecliner.substr(i,1);
		
		//-- attention au 1-x
		if (vCar=="-"){
			if (vCarPrecedent=="1"){
				vTrouveSigne = false;
			}else{
				vTrouveSigne = tabSignesSansMult.inArray(vCar);
			}
		}else{
			//-- parentheses ouvrantes : compter le nombre
			if (vCar==")"){
				vNbOuvrantes = fCompte(vExpr,"(");
				vNbFermantes = fCompte(vExpr,")");
				if (vNbFermantes<vNbOuvrantes){
					vTrouveSigne = false
				}else{
					vTrouveSigne = tabSignesSansMult.inArray(vCar);
				}
			}else{
				vTrouveSigne = tabSignesSansMult.inArray(vCar);
			}
		}
		
		//-- si signe ou pas : évaluation ou pas ---
		if (vTrouveSigne==false){
			//-- est-ce que l'expression contiendra elimine ?
			if (vCar==vElimine){
				vTrouveElimine = true;
				
			}else{
				
			}
			//-- pas un signe : continuer l'expressions
			vExpr = vExpr + vCar
			//alert("pas signe : " + vExpr)
		}else{
			//-- c'est un signe ? voir si elimine est dans l'expression
			if (vTrouveElimine == true){
				//-- ne pas tenir compte de l'expression car 0
			}else{
				//alert(" signe : " + vExpr)
				vValue_0 = vValue_0 + vOldSigne + vExpr
			}
			vExpr = ""
			vTrouveElimine = false
			vOldSigne = vCar
		}
		
		//-- mémoriser au cas où c'est "1-"
		vCarPrecedent = vCar
	}
	vValue_0 = fNettoie(vValue_0);
	//alert("value 0 : " + vValue_0);
	
	//--------------------------------
	// expression avec elimine=1 ---
	//--------------------------------
	vValue_1 = "";
	vNb = vValueDecliner.length;
	
	vExpr = "";
	vTrouveElimine = false;
	vOldSigne = ""
	vCarPrecedent = ""
	
	for(i=0;i<vNb;i++){
		//-- recherche expression --
		vCar    = vValueDecliner.substr(i,1);
		
		//-- attention au 1-x
		if (vCar=="-"){
			if (vCarPrecedent=="1"){
				vTrouveSigne = false;
			}else{
				vTrouveSigne = tabSignesSansMult.inArray(vCar);
			}
		}else{
			//-- parentheses ouvrantes : compter le nombre
			if (vCar==")"){
				vNbOuvrantes = fCompte(vExpr,"(");
				vNbFermantes = fCompte(vExpr,")");
				if (vNbFermantes<vNbOuvrantes){
					vTrouveSigne = false
				}else{
					vTrouveSigne = tabSignesSansMult.inArray(vCar);
				}
			}else{
				vTrouveSigne = tabSignesSansMult.inArray(vCar);
			}
		}
		
		//-- si signe ou pas : évaluation ou pas ---
		if (vTrouveSigne==false){
			//-- est-ce que l'expression contiendra elimine ?
			if (vCar==vElimine){
				vTrouveElimine = true;
				vExpr = vExpr + 1
			}else{
				vExpr = vExpr + vCar
			}
			
			
			//alert("pas signe : " + vExpr)
		}else{
			//-- éventuellement virer 1-1
			vTrouve_1_1 = vExpr.indexOf("1-1", 0)
			if (vTrouve_1_1==-1){
				//alert(" signe : " + vExpr)
				vValue_1 = vValue_1 + vOldSigne + vExpr
			}else{
			}		
			vExpr = ""
			vTrouveElimine = false
			vOldSigne = vCar
		}
		
		//-- mémoriser au cas où c'est "1-"
		vCarPrecedent = vCar
	}
	vValue_1 = fNettoie(vValue_1);
	 
	//alert("value 1 : " + vValue_1);
	
	//--------------------------------
	// multiplication ---
	//--------------------------------
	vValue_finale = "";
	
	vValue_0d = vValue_0 + ";" //-- astuce pour finir la boucle
	vValue_1d = vValue_1 + ";" //-- astuce pour finir la boucle
	vNb0 = vValue_0d.length;
	vNb1 = vValue_1d.length;
	
	vExpr0 = "";
	vOldSigne0 = ""
	vCarPrecedent0 = ""
	
	for(i=0;i<vNb0;i++){
		//-- recherche expression --
		vCar0    = vValue_0d.substr(i,1);
		
		//-- attention au 1-x
		if (vCar0=="-"){
			if (vCarPrecedent0=="1"){
				vTrouveSigne0 = false;
			}else{
				vTrouveSigne0 = tabSignesSansMult.inArray(vCar0);
			}
		}else{
			//-- parentheses ouvrantes : compter le nombre
			vNbOuvrantes0 = fCompte(vExpr0,"(");
			vNbFermantes0 = fCompte(vExpr0,")");
			if (vNbFermantes0<vNbOuvrantes0){
				vTrouveSigne0 = false
			}else{
				vTrouveSigne0 = tabSignesSansMult.inArray(vCar0);
			}
		}
		
		//-- si signe ou pas : évaluation ou pas ---
		if (vTrouveSigne0==false){
			vExpr0 = vExpr0 + vCar0
			//alert("pas signe 0 :"+vExpr0)
		}else{
			//vValue_1 = vValue_1 + vOldSigne + vExpr
			vExpr1 = "";
			vOldSigne1 = ""
			vValue_finale1 = ""
			vCarPrecedent1 = ""
			
			for(j=0;j<vNb1;j++){
				//-- recherche expression --
				vCar1    = vValue_1d.substr(j,1);
		
				//-- attention au 1-x
				if (vCar1=="-"){
					if (vCarPrecedent1=="1"){
						vTrouveSigne1 = false;
					}else{
						vTrouveSigne1 = tabSignesSansMult.inArray(vCar1);
					}
				}else{
					//-- parentheses ouvrantes : compter le nombre
					vNbOuvrantes1 = fCompte(vExpr1,"(");
					vNbFermantes1 = fCompte(vExpr1,")");
					if (vNbFermantes1<vNbOuvrantes1){
						vTrouveSigne1 = false
					}else{
						vTrouveSigne1 = tabSignesSansMult.inArray(vCar1);
					}
				}
		
				//-- si signe ou pas : évaluation ou pas ---
				if (vTrouveSigne1==false){
					vExpr1 = vExpr1 + vCar1
					//alert("pas signe 1 "+vExpr1)
				}else{
					if ((vOldSigne0=="+") || (vOldSigne0=="")){
						vSigneDef = vOldSigne1
					}else{
						if (vOldSigne1=="-"){
							vSigneDef = "+"
						}else{
							vSigneDef = "-"
						}
					}
					//-- simplification de l'écriture ---
					vTrouve_plus1  = vExpr1.indexOf("+", 0)
					vTrouve_moins1 = vExpr1.indexOf("-", 0)
					if (vTrouve_plus1==-1){
						if (vTrouve_moins1==-1){
							vExpr1Parent = vExpr1
						}else{
							vExpr1Parent = "(" + vExpr1 + ")"
						}
					}else{
						vExpr1Parent = "(" + vExpr1  + ")"
					}
					vTrouve_plus0  = vExpr0.indexOf("+", 0)
					vTrouve_moins0 = vExpr0.indexOf("-", 0)
					if (vTrouve_plus0==-1){
						if (vTrouve_moins0==-1){
							vExpr0Parent = vExpr0
						}else{
							vExpr0Parent = "(" + vExpr0 + ")"
						}
					}else{
						vExpr0Parent = "(" + vExpr0  + ")"
					}
					
					//-- écriture finale ---------------------
					vExprConcat = fDedoublonne(vExpr1Parent + "*" + vExpr0Parent)
					
					vValue_finale1 = vValue_finale1 + vSigneDef + "(" + vExprConcat + ")"
					vExpr1 = ""
					vOldSigne1 = vCar1
				}
				//-- mémoriser au cas où c'est "1-"
				vCarPrecedent1 = vCar1

			}
			
			//-------------------------
			vValue_finale = vValue_finale + vValue_finale1 //--+ vOldSigne0 
			vExpr0 = ""
			vOldSigne0 = vCar0
		}
		//-- mémoriser au cas où c'est "1-"
		vCarPrecedent0 = vCar0

	}
	//alert(vValue_finale)
	
	//--------------------------------
	// compter le nombre de variables
	//--------------------------------
	
	vValue = vValue_finale
	vNb = vValue.length;
	
	/*
	//--------------------------------
	//-- développer ---
	//--------------------------------
	vNbVar = tabVar.length;
	vTabChaine = fRecursive(vNbVar-1);
	vChaineTotale = "";
	vChaineTotaleNettoyee = "";
	vChaineTotaleinterpretee = "";
	
	vNbExpressions = vTabChaine.length;
	for(i=0;i<vNbExpressions;i++){
		vChaine    = vTabChaine[i];
		vNewExpression = vValue;
		vExpVariables = "";
		vExpInterpretee = "* ";

		for(j=0;j< vNbVar; j++){
			vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
			vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
			vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
			vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
			vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
			vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
			if (vChaine.substr(j,1)=="0"){
				vExpVariables = vExpVariables + "(1-" + tabVar[j] + ")";
				if (vExpInterpretee=="* "){
					vExpInterpretee = "* Ce qui n'est pas ";
				}else{
					vExpInterpretee = vExpInterpretee + " et qui ne sont pas ";
				}
				vExpInterpretee = vExpInterpretee + tabDef[tabVar[j]];
			}else{
				vExpVariables   = vExpVariables + tabVar[j];
				if (vExpInterpretee=="* "){
				}else{
					vExpInterpretee = vExpInterpretee + " et qui sont ";
				}
				vExpInterpretee = vExpInterpretee + tabDef[tabVar[j]];
			}			
		}
		//alert(vNewExpression);
		//alert(eval(vNewExpression));
		valExpression = eval(vNewExpression);
		if (valExpression == 0) {
			chaineFinale = valExpression + vExpVariables;
			chaineFinaleNettoyee    = "";
			chaineFinaleinterpretee = ""
		}else{
			chaineFinale = vExpVariables;
			chaineFinaleNettoyee = vExpVariables;
			chaineFinaleinterpretee = vExpInterpretee;
		}
		
		if (vChaineTotale==""){
		}else{
			vChaineTotale = vChaineTotale + " + ";
		}
		vChaineTotale = vChaineTotale + chaineFinale;
		
		if (chaineFinaleNettoyee==""){
		}else{
			if (vChaineTotaleNettoyee==""){
			}else{
				vChaineTotaleNettoyee   = vChaineTotaleNettoyee + "<BR>";
				vChaineTotaleinterpretee = vChaineTotaleinterpretee + "<BR>";
			}
			vChaineTotaleNettoyee = vChaineTotaleNettoyee + chaineFinaleNettoyee + "=0";
			vChaineTotaleinterpretee = vChaineTotaleinterpretee + chaineFinaleinterpretee ;
			
		}
		
	}
	*/
	
	document.getElementById( 'arrivee' ).innerHTML =vValue_finale +"=0"//+ "<BR><BR>soit : <BR>" + vChaineTotale;
	//document.getElementById( 'arriveeNettoyee' ).innerHTML =vChaineTotaleNettoyee;
	
	
	//document.getElementById( 'interpretation' ).innerHTML ="<font color=\"#FF0000\">Certaines classes d'objets n'existent pas, à savoir :</font><BR>"+vChaineTotaleinterpretee;
	
	
	//vNewExpression = vNewExpression.replace(tabVar[j],vChaine.substr(j,1));
}
//--------------------------
Array.prototype.inArray = function(val) {
   vRetour=false;
   for(var i = 0; i < this.length; i++) {
      if(this[i] == val){
	      vRetour=true;
      }else{
      }
  	}
	return vRetour;
}
 

// recursive pour donner la suite de chiffres
function fRecursive(n){
	if (n==0){
		tab = Array("0","1")
		return tab;
	}else{
		vTab = fRecursive(n-1);
		vNb  = vTab.length
		vNewTab = Array()
		for(i=0;i<vNb;i++){
			indice = i*2
			vNewTab[ indice + 0 ] = "0" + vTab[i]
			vNewTab[ indice + 1 ] = "1" + vTab[i]
		}
		return vNewTab;
	}
}

function fCompte(vChaine,vCherche){
	vNbCompte=0;
	vLongueur = vChaine.length;
	for(l=0;l<vLongueur;l++){
		vCompteCar = vChaine.substr(l,1);
		if (vCompteCar==vCherche){
			vNbCompte=vNbCompte+1;
		}else{
		}
	}
	return vNbCompte;
}
function fNettoie(vChaine){
	vRetour=vChaine;
	vNbVarNettoie=tabVar.length
	for(z=0;z< vNbVarNettoie; z++){
		vChReplace = tabVar[z]+"+1*(1-"+tabVar[z]+")"
		vRetour = vRetour.replace(vChReplace,"1");
		vChReplace = "("+tabVar[z]+")"
		vRetour = vRetour.replace(vChReplace,tabVar[z]);
	}
	vRetour = vRetour.replace("1*","");
	vRetour = vRetour.replace("*1","");
	vRetour = vRetour.replace("*(1)","");
	vRetour = vRetour.replace("(1)*","");
	return vRetour;
}

function fDedoublonne(vChaine){
	vTabDouble = vChaine.split("*")
	vTabDouble.sort(TrierColAsc)
	vNbDouble = vTabDouble.length
	//-- tri ----------
	vRetour = ""
	for(id=0;id<vNbDouble;id++){
		if (vRetour==""){
		}else{
			vRetour = vRetour + "*"
		}
		vRetour = vRetour + vTabDouble[id]
	}
	//-- suppression des doubles
	vNbVarDouble=tabVar.length
	for(z=0;z< vNbVarDouble; z++){
		vChReplace = tabVar[z]+"*"+tabVar[z]
		vRetour = vRetour.replace(vChReplace,tabVar[z]);
		vChReplace = "(1-"+tabVar[z]+")*(1-"+tabVar[z]+")";
		vRetour = vRetour.replace(vChReplace,"(1-"+tabVar[z]+")");
		vRetour = vRetour.replace("**","*");
	}
	return vRetour

}

function TrierColAsc(x1,x2){   
 // Tri ascendant sur chaîne de caractères
 return (x1 < x2 ? -1 : 1);
}   
