
// -------------------- Etude de fonctions --------------------

var etudeX = new Array()
var etudeY = new Array()
var etudeD = new Array()
var limGauche = new Array()
var limDroite = new Array()
var listeIndefini = new Array()
var listeZeros = new Array()
var intervalEtudeGauche = -50
var intervalEtudeDroite = 50
var precisionEtude = 0.001

function etudier(fct){
	if(check(fct)){
		prepareEtude(fct)
		pariteFct()
		signeFct(fct)
        asymptotes()
        courbure()
		ensembleDefinition()
	}
}

// Préparation à l'étude de fonction
function prepareEtude(fct){
	listeIndefini = new Array()
    var f = function(x){
        return eval(fct)
    }
	// Calcul de tous les points de la fonction
	var i = 0
	for(var x=intervalEtudeGauche; x<=intervalEtudeDroite; x+=precisionEtude){
		etudeX[i] = x
		etudeY[i] = Math.round(f(x)*10000)/10000
		etudeD[i] = Math.round(1000000*(f(x+0.0001)-f(x-0.0001))/(2*0.0001))/1000000
		i++
	}
	// Calcul des extrémités de la fonction
	var x = -100000
	limGauche[0] = f(x)
	x = -10000
	limGauche[1] = f(x)
	x = 100000
	limDroite[0] = f(x)
	x = 10000
	limDroite[1] = f(x)
}

// Recherche de l'ensemble de définition
function ensembleDefinition(){
	var fctDefinie = false
	var dejaDefinie = false
	var EDF = ""
	if(!isNaN(limGauche[0])){
		fctDefinie = true
		dejaDefinie = true
		EDF += "]-∞;"
	}
	if(!isNaN(limGauche[1]) && !fctDefinie){
		fctDefinie = true
		dejaDefinie = true
		EDF += "]-∞;"
	}
	for(var i=0; i<etudeX.length; i++){
		if(fctDefinie && isNaN(etudeY[i])){
			fctDefinie = false
			EDF += (parseInt(etudeX[i]/precisionEtude)*precisionEtude)+"["
		}
		else if(!fctDefinie && !isNaN(etudeY[i])){
			fctDefinie = true
			if(dejaDefinie){
				EDF += " u "
			}
			EDF += "["+(parseInt(etudeX[i]/precisionEtude)*precisionEtude)+";"
			dejaDefinie = true
		}
	}
	if(fctDefinie && !isNaN(limDroite[1])){
		fctDefinie = false
		EDF += "+∞["
	}
	if(fctDefinie && !isNaN(limDroite[0])){
		fctDefinie = false
		EDF += "+∞["
	}
	for(var i=0; i<listeIndefini.length; i++){
		if(i==0){
			EDF += " - {"
		}
		EDF += listeIndefini[i]
		if(i==listeIndefini.length-1){
			EDF += "}"
		}
		else
			EDF += ";"
	}
	document.getElementById('etudeEDF').innerHTML = EDF
}

// Etude de la parité
function pariteFct(){
	var posZero
	var paire = true
	var impaire = true
	var positif, negatif
	var precisionParite = 1000
	for(var i=0;i<etudeX.length;i++){
		if(Math.round(etudeX[i]*precisionParite)/precisionParite==0){
			posZero = i
		}
	}
	for(var i=1; i<etudeX.length/2; i++){
		if(etudeY[posZero+i]>0){
			positif = Math.floor(etudeY[posZero+i])
		}
		else{
			positif = Math.ceil(etudeY[posZero+i])
		}
		if(etudeY[posZero-i]>0){
			negatif = Math.floor(etudeY[posZero-i])
		}
		else{
			negatif = Math.ceil(etudeY[posZero-i])
		}

		if(positif<25000 && positif>-25000){
			if(positif != negatif){
				paire = false
				//alert(i+" ; "+posZero+" ; "+etudeX.length+" ; "+positif+" ; "+negatif)
			}
			if(positif != (-negatif)){
				impaire = false
			}
		}
	}
	if(paire){
		document.getElementById("etudeParite").innerHTML = "even"
	}
	else if(impaire){
		document.getElementById("etudeParite").innerHTML = "uneven"
	}
	else{
		document.getElementById("etudeParite").innerHTML = "n/a"
	}
}

function zeroFct(){
	listeZeros = new Array()
	var listeZerosArr = new Array()
	var precZeros = 5
	for(var i=0; i<etudeX.length; i++){
		if(Math.round(etudeY[i]*1000)/1000==0){
			var nouveauZero = Math.round(etudeX[i]*precZeros)/precZeros
			if(listeZerosArr[listeZerosArr.length-1]!=nouveauZero){
				listeZeros.push(Math.round(etudeX[i]*10)/10)
				listeZerosArr.push(nouveauZero)
			}
		}
	}
}

function signeFct(fct){
	var signe = new Array()
	var signePlus = new Array()
	var signeMoins = new Array()
	var dernier = 0
	if(limGauche[0]>0){
		signe[0] = "+"
		signePlus[0] = limGauche[1]
		signeMoins[0] = limGauche[0]
	}
	else{
		signe[0] = "-"
		signePlus[0] = limGauche[1]
		signeMoins[0] = limGauche[0]
	}
	for(var i=0; i<etudeY.length; i++){
		if(signe[signe.length-1]=="+"){
			if(etudeY[i]<0){
				signe.push("-")
				signePlus.push(etudeX[i])
				signeMoins.push(etudeX[dernier])
			}
			else if(etudeY[i]>0){
				dernier = i
			}
		}
		if(signe[signe.length-1]=="-"){
			if(etudeY[i]>0){
				signe.push("+")
				signePlus.push(etudeX[i])
				signeMoins.push(etudeX[dernier])
				//alert(signe+" ; "+signePlus+'\n'+etudeY[i+1]+" ; "+etudeY[i]+" ; "+etudeY[i-1]+" ; "+etudeY[i-2]+'\n'+etudeX[i+1]+" ; "+etudeX[i]+" ; "+etudeX[i-1]+" ; "+etudeX[i-2])
			}
			else if(etudeY[i]<0){
				dernier = i
			}
		}
	}
	var valeurPlus, valeurMoins, millieu, precisionZero
	listeZeros = new Array()
	for(var i=1; i<signePlus.length; i++){
		valeurPlus = signePlus[i]
		valeurMoins = signeMoins[i]
		for(var k=0;k<10000;k++){
			millieu = (valeurPlus + valeurMoins)/2
			x = valeurPlus
			if(eval(fct)>0){
				x = millieu
				if(eval(fct)>0){
					valeurPlus=millieu
				}
				else if(eval(fct)<0){
					valeurMoins=millieu
				}
				else{
					break
				}
			}
			else if(eval(fct)<0){
				x = millieu
				if(eval(fct)<0){
					valeurPlus=millieu
				}
				else if(eval(fct)>0){
					valeurMoins=millieu
				}
				else{
					break
				}
			}
			else{
				millieu = valeurPlus
				break
			}
			x = valeurPlus
			precisionZero = eval(fct)
			x = valeurMoins
			precisionZero -= eval(fct)
			if(precisionZero>0.0001){
				break
			}
		}
		//alert(signePlus[i]+" et "+signeMoins[i]+" -> "+millieu)
		listeZeros.push(Math.round(millieu*100)/100)
	}
	var texteZeros = ""
	if(listeZeros==""){
		zeroFct()
		texteZeros = "~ "
	}
	var texte = "Signe : "
	var aSupprimer = new Array()
	for(var i=0; i<signe.length; i++){
		texte += "<td>"+signe[i]+"</td>"
		if(listeZeros[i]!=undefined){
			x = listeZeros[i]
			if(isFinite(eval(fct))){
				texte += "<td class='border'>"+listeZeros[i]+"</td>"
			}
			else{
				texte += "<td class='border infini'>"+listeZeros[i]+"</td>"
				listeIndefini.push(listeZeros[i])
				aSupprimer.push(i)
			}
		}
	}
	document.getElementById("etudeSigne").innerHTML = texte
	for(var i=0; i<aSupprimer.length; i++){
		listeZeros.splice((aSupprimer[i]-i), 1)
	}
	if(listeZeros==""){
		texteZeros = "n/a"
	}
	document.getElementById("etudeZeros").innerHTML = texteZeros+listeZeros
}

function asymptotes(){
	// Horizontales
	if(Math.abs(limGauche[0])<1000){
		var limRound = Math.round(limGauche[0]*100)/100
		if(limGauche[0]<limRound){
			document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>(curve is higher than a l'AH)</span>"
		}
		else if(limGauche[0]>limRound){
			document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>(curve is lower than a l'AH)</span>"
		}
		else{
			document.getElementById("etudeAHG").innerHTML = "y = "+limRound
		}
	}
	else{
		document.getElementById("etudeAHG").innerHTML = "n/a"
	}
	if(Math.abs(limDroite[0])<1000){
		var limRound = Math.round(limDroite[0]*100)/100
		if(limDroite[0]<limRound){
			document.getElementById("etudeAHD").innerHTML =  "y = "+limRound +" <span class='texteSecondaire'>(curve is lower than a l'AH)</span>"
		}
		else if(limDroite[0]>limRound){
			document.getElementById("etudeAHD").innerHTML =  "y = "+limRound +" <span class='texteSecondaire'>(curve is higher than a l'AH)</span>"
		}
		else{
			document.getElementById("etudeAHD").innerHTML =  "y = "+limRound
		}
	}
	else{
		document.getElementById("etudeAHD").innerHTML = "n/a"
	}
	// Verticales
	var texteAV = ""
	for(var i=0; i<listeIndefini.length; i++){
		texteAV += "x = "+listeIndefini[i]
		if(listeIndefini[i+1]!=undefined){
			texteAV += " ; "
		}
	}
	if(texteAV==""){
		texteAV = "n/a <br/>"
	}
	document.getElementById("etudeAV").innerHTML = texteAV
}

function courbure(){
    var texteMin = "";
    var texteMax = "";
    var texteI = "";
    var nbrI = 0;
    var i;
    for(i=0; i<etudeD.length; i++){
        if(etudeD[i]==0){
            if(etudeD[i-1]<0 && etudeD[i+1]>0){
                texteMin += "<br/>Min("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
            }
            else if(etudeD[i-1]>0 && etudeD[i+1]<0){
                texteMax += "<br/>Max("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
            }
            else{
                nbrI++;
                texteI += '<br/>I<span style="vertical-align:sub;font-size:50%;">'+nbrI+"</span>("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
            }
        }
    }
    if(texteMin==""){texteMin = "<br/>No minimum";}
    if(texteMax==""){texteMax = "<br/>No maximum";}
    if(texteI==""){texteI = "<br/>Aucun I";}
    document.getElementById("etudeMin").innerHTML = texteMin;
    document.getElementById("etudeMax").innerHTML = texteMax;
    document.getElementById("etudeI").innerHTML = texteI;
}