var seq = new alamos();
var french=true;

function alamos() {
    this.termes=new Array(1,2);
    this.pos=new Array();
    this.maxi=0;
    this.der=3;
    this.diff=new Array(); // indexé par la différences diff[5]= 4 la diff est 5
    this.orddiff=new Array(); // indices 0 1 2 ...     orddiff[3]= 5 la diff est 5
    this.manque=new Array(); // indexé par les diff manquantes  manque[9]= 1, pas de 9
    this.ordmanque=new Array(); // indices 0 1 2 ...     ordmanque[2]= 9 il manque le 9
    this.ddiff =new Array(); // diff des diff    ddiff[orddiff[3] - orddiff[2]] = 3
    this.dmanque=new Array(); // diff des diff manquantes
    this.orddmanque=new Array(); //
    this.maxdiff=0;
    this.maxmanque=0;
    this.maxdmanque=0;

    function clr() {
      delete(this.termes);
      this.termes=new Array(1,2);
      delete(this.pos);
      this.pos=new Array();
      this.maxi=0;
      this.der=3;
      this.reset();
    }
    this.clr=clr;

    function reset() {
        // effacement des données
        delete(this.diff);
        this.diff=new Array();
        delete(this.orddiff);
        this.orddiff=new Array();
        delete(this.ddiff);
        this.ddiff=new Array();
        delete(this.manque);
        this.manque=new Array();
        delete(this.ordmanque);
        this.ordmanque=new Array();
        delete(this.dmanque);
        this.dmanque=new Array();
        delete(this.orddmanque);
        this.orddmanque=new Array();
        this.maxdiff=0;
        this.maxmanque=0;
        this.maxdmanque=0;
    }
    this.reset=reset;

    function suivant() {
         var nb=0, j= this.termes.length-1;
         
         for(var i=0; nb<2 && i< j;i++) {
            while(this.termes[i]+this.termes[j]>this.der) j--;
            if(i<j && this.termes[i]+this.termes[j]==this.der) nb++;
         }
         if(nb==1) {
           this.termes[this.termes.length]=this.der;
           this.maxi=this.der;
         }
         this.der++;
     }
     this.suivant = suivant;
     
     function construit(k) {
        while(k>this.termes.length) this.suivant();
     }
     this.construit=construit;
     
     function poursuit(a, b, k) {
        if(b==a) return;
        if(b<a) {
           var c=a; a=b;b=c;
        }
        if(a==this.termes[0] && b== this.termes[1]) {
          this.construit(k);
        } else {
          delete(this.termes);
          this.maxi=b;
          this.der=b+1;
          this.termes=new Array(a,b);
        }
     }
     this.poursuit=poursuit;

     function affiche() {
        var s=""
        for(var i=0;i<this.termes.length; i++)
           s += this.termes[i]+" ";
        return s;
     }
     this.affiche=affiche;

     function complement() {
        var s=(french)?"Complémentaire :\n":"Complement:\n";
        var k=0;
        for(var i=0;i<this.termes[this.termes.length-1]; i++) {
           if(k<this.termes.length-1 && i==this.termes[k]) {
              k++;
           } else {
             if(i!=0)
               s += i+" ";
           }
        }
        return s;
     }
     this.complement=complement;
     
     function gaps() {
        // effacement des données
        this.reset();

        // détermination des différences et de leur maximum
        //  this.termes[i] est le terme de rang i
        for(var i=1;i<this.termes.length;i++) {
           u= this.termes[i]-this.termes[i-1];  // différence
           if(this.diff[u]==null) this.diff[u]=1;  // la première
           else this.diff[u]++;                   // une de plus
           if(u>this.maxdiff) this.maxdiff=u;     // le max des diff
        }

        // on ordonne les différences en les appelant de 1 à maxdiff
        var k=0;
        for(var i=1; i<=this.maxdiff; i++) {
           if(this.diff[i] != null) {
               this.orddiff[k] = i;
               k++;
           } else {
              this.manque[i]=1;
              this.maxmanque=i;
           }  
        }
        // différences manquantes dans l'ordre croissant
        k=0;
        for(var i=1; i<=this.maxmanque; i++) {
           if(this.manque[i] != null) {
               this.ordmanque[k] = i;
               k++;
           }
        }
        // différences des différences manquantes
        for(var i=1;i<this.ordmanque.length;i++) {
           var m = this.ordmanque[i]-this.ordmanque[i-1];
           if(this.dmanque[m]==null) {
             this.dmanque[m] = 1;
             if(m>this.maxdmanque) this.maxdmanque=m;
           } else {
             this.dmanque[m]++;
           }
        }
        k=0;
        for(var i=1;i<=this.maxdmanque;i++) {
           if(this.dmanque[i] != null) {
             this.orddmanque[k] = i;
             k++;
           }
        }
     }
     this.gaps=gaps;

     function daffiche() {
       var s=(french)?"Différences entre deux termes consécutifs et [effectifs] :\n":"Differences:\n";
        for(var i=0; i< this.orddiff.length; i++) {
           var u = this.orddiff[i];
           var e=(i< this.orddiff.length-1)?", ":"";
           s += u+"["+this.diff[u]+"]"+ e;
        }
        return s;

     }
     this.daffiche=daffiche;

     function maffiche() {
       var s=(french)?"Nombres qui ne sont pas des différences :\n":"Not a difference:\n";
       for(var i=0 ; i<this.ordmanque.length; i++) {
           s += this.ordmanque[i]+" "
       }
       return s;

     }
     this.maffiche=maffiche;

     function dmaffiche() {
       var s=(french)?"Écarts entre ces nombres et [effectifs]\n" : "Gaps:\n";
       for(var i=0; i<this.orddmanque.length; i++) {
         var e = (i<this.orddmanque.length-1)?", ":"";
         s += this.orddmanque[i]+"["+this.dmanque[this.orddmanque[i]]+"]"+e;
       }
       return s;

     }
     this.dmaffiche=dmaffiche;
}

function cherche() {
   var u, v=document.frm.g.value;
   do {
       u=v;
       v = v.replace(/[-+,;:]+/g," ");
       v = v.replace(/^\s+/,"");
       v = v.replace(/\s+$/,"");
       v = v.replace(/\s+/g," ");
   } while(u!=v);
   var g=document.frm.g.value.split(/\s+/g);
   if(g.length<2) return;
   seq.poursuit(parseInt(g[0]), parseInt(g[1]), parseInt(document.frm.nt.value));
   seq.gaps();
   var s = seq.affiche(); // + seq.complement();
   document.frm.a.value = s;
   document.frm.d.value = seq.daffiche();
   document.frm.m.value = seq.maffiche()+"\n\n"+seq.dmaffiche();
   etat = "suite";
}
var etat = "suite";

function compl() {
  if(etat=="suite") {
  cherche();
  document.frm.a.value=seq.complement();
    etat="complement";
  } else {
    cherche();
  }
}

function nadd(n) {
   var k = parseInt(document.frm.nt.value)+n;
   if(k<3) k=3;
   else if(k>10000000) k= 10000000;
   document.frm.nt.value = k
   cherche();
}

function exemple(s) {
    var t=s.split(/\s+/g);
    document.frm.g.value=t[0]+" "+t[1];
    document.frm.nt.value = t[2]
    cherche();
    cherche();
}
var Exo=new Array("1 2 500","1 3 500","1 3 1000","2 4 300","3 6 300","","","","","");

function exo(n) {
    exemple(Exo[n]);
}


