// -------------------- 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 = sankoreLang[lang].ev;
    }
    else if(impaire){
        document.getElementById("etudeParite").innerHTML = sankoreLang[lang].unev;
    }
    else{
        document.getElementById("etudeParite").innerHTML = sankoreLang[lang].na;
    }
}

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
            }
        }
        listeZeros.push(Math.round(millieu*100)/100)
    }
    var texteZeros = ""
    if(listeZeros==""){
        zeroFct()
        texteZeros = "~ "
    }
    var texte = sankoreLang[lang].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 = sankoreLang[lang].na;
    }
    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'>" + sankoreLang[lang].curve_higher + "</span>"
        }
        else if(limGauche[0]>limRound){
            document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>" + sankoreLang[lang].curve_lower + "</span>"
        }
        else{
            document.getElementById("etudeAHG").innerHTML = "y = "+limRound
        }
    }
    else{
        document.getElementById("etudeAHG").innerHTML = sankoreLang[lang].na;
    }
    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'>" + sankoreLang[lang].curve_lower + "</span>"
        }
        else if(limDroite[0]>limRound){
            document.getElementById("etudeAHD").innerHTML =  "y = "+limRound +" <span class='texteSecondaire'>" + sankoreLang[lang].curve_higher + "</span>"
        }
        else{
            document.getElementById("etudeAHD").innerHTML =  "y = "+limRound
        }
    }
    else{
        document.getElementById("etudeAHD").innerHTML = sankoreLang[lang].na;
    }
    // Verticales
    var texteAV = ""
    for(var i=0; i<listeIndefini.length; i++){
        texteAV += "x = "+listeIndefini[i]
        if(listeIndefini[i+1]!=undefined){
            texteAV += " ; "
        }
    }
    if(texteAV==""){
        texteAV = sankoreLang[lang].na + " <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/>" + sankoreLang[lang].min + "("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
            }
            else if(etudeD[i-1]>0 && etudeD[i+1]<0){
                texteMax += "<br/>" + sankoreLang[lang].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/>" + sankoreLang[lang].no_min;
    }
    if(texteMax==""){
        texteMax = "<br/>" + sankoreLang[lang].no_max;
    }
    if(texteI==""){
        texteI = "<br/>Aucun I";
    }
    document.getElementById("etudeMin").innerHTML = texteMin;
    document.getElementById("etudeMax").innerHTML = texteMax;
}