/* per.js
   fraction associée à une écriture décimale illimitée périodique

   Jean-Paul Davalan 2003 jpdvl@wanadoo.fr
*/


function periode2fraction(inp) {

this.gcd = function(a, b) {
  var u=a, v=b, w;
  if(u<v) {
    w=u;
    u=v;
    v=w;
  }
  while(v != 0) {
    w=u%v;
    u=v;
    v=w;
  }
  return u;
}


this.puiss = function(k) {
	var a=1;
	for(var i=0; i<k; i++)
		a *=10;
	return a;
}


this.neuf = function(d) {
	return this.puiss(d)-1
}
this.zeros = function(d) {
	var s=""
	for(var i=0;i<d;i++)
              s +="0"
	return s;
}
this.toInt = function(s) {
	var u=s.replace(/^0+/,"");
	if(u=="") u="0"
	return parseInt(u);
}

this.nettoie = function(expr) {
        var s=expr, sa;
        s = s.replace(/\s+/g,"")
	if(s=="") s="0"
        do {
                sa=s;
		s = s.replace(/[\(\{\<]/g,"[")
		s = s.replace(/[\)\}\>]/g,"]")
		s = s.replace(/\s+/g,"")	// " " gauche
                s = s.replace(/\++/g,"") 	// + de gauche
		s = s.replace(/\s*\+\s*/g,"")
		s = s.replace(/\s*\-\s*/g,"-")
                s = s.replace(/\-\-/g,"")	// --
                s = s.replace(/\[\]$/,"[0]")
                s = s.replace(/\[.*\[/,"[")
                s = s.replace(/\].*\]/,"]")
                s = s.replace(/\].+$/,"]")
		//if(s.indexOf("]")<0) s = s+"[0]"
        } while(sa != s);
	s = s.replace(/\,/g,".");
        if(s.indexOf(".")<0) {
		if(s.indexOf("]")<0)
			s = s+".[0]"
		else {
			s = "0."+s
		}
	}

	if(s.indexOf("]")<0 && s.indexOf("[")<0) 
		s = s+"[0]"

	else if(s.indexOf("]")<0 )
		s = s+"]"

	else if(s.indexOf("[")<0 )
		s = s.replace(/\]$/,"[0]")
	s = s.replace(/\[\]$/,"[0]")
        return s;
}
	var a, t="", s = this.nettoie(inp), str="";
	var reg = new RegExp( "([\+-]*)" + "([0-9]+)" + "[\.,]" + "([0-9]*)" + "(\[[0-9]+\])", "g");
	a = reg.exec(s); 	
	reg.exec("")
	if(a==null) return;
	if(a[1]=="-")
		str += "Le nombre n est négatif\n"
	a[4] = a[4].replace(/^\[+/,"")
	a[4] = a[4].replace(/\]+$/,"")
	var r = a[3].length
	var d = a[4].length
	var rs = a[4].replace(/^0+/,"");
	if(rs=="") rs="0"
	a[2] = a[2].replace(/^0+/,"");
	if(a[2]=="") a[2]="0"
	
	var nf=this.neuf(d), pr=this.puiss(r);
	str +="La période ("+ a[4] +") est de "+ d +" chiffre"+((d>1)?"s":"")+"\n\n"
	str += "Le nombre n est bien un rationnel\n"
	var c0= a[4].charAt(0), c1=new RegExp(c0,"gi"),c2=""+a[4].replace(c1,"");
	if((c0=="0" || c0=="9")&&c2=="") {
		if(a[3]=="" || a[3].replace(c1,"")=="")
			str += "Le nombre n est entier\n"
		else
			str += "Le nombre n est décimal\n"
	}
	
	if(a[2]+a[3]!="") {
		str += "n = "+a[1]+"("+a[2]+a[3]+" + " + a[4] + "/" + nf +")/"+pr+"\n"
		x=this.toInt(a[2]+a[3]) * nf + this.toInt(rs)
	} else  {
		str += "n = 0\n"
		x=this.toInt(rs);
	}
	y = this.neuf(d) * pr;
	str +=  "n = "+a[1]+"(("+a[2]+a[3]+")*"+nf +" + "+ a[4]+")/("+nf+""+this.zeros(r)+")\n\n"
	str += "Le nombre n a pour écriture fractionnaire\n"
	str +=  "n = "+a[1]+x+"/"+y+"\n"
	g = this.gcd(x,y)
	if(g>1) {
		str += "La fraction peut se simplifier par "+g+"\n"
		x = x/g
		y=y/g
		str += "n = "+a[1]+x+"/"+y+"\n"
	} else {
		str += "La fraction est irréductible\n"
	}
	var fraction = reponse = a[1]+x+"/"+y
	if(y==1) {
		str += "La fraction est égale à l'entier n = "+ a[1]+x+"\n"
		reponse = a[1]+x
	}
	return { "entree": s, "fraction": fraction, "reponse":reponse, "expl": str};
}

function calcule() {
	
	var u=periode2fraction(document.ecrit.decim.value)
	var s = "n = "+u["entree"]+" = "+u["fraction"]
	if(u["fraction"] != u["reponse"])
		s += " = "+u["reponse"]
	document.frm.t.value=u["fraction"];
	if(document.ecrit.detail.checked==true) s +="\n\n"+u["expl"]
	if(arguments.length==0)
		cherche(false)
	document.getElementById("dec2fr").innerHTML="<pre>" + s + "</pre>"
	//dec2fr1.innerHTML="<pre>" + s + "</pre>"
}

function exple(s) {
	document.ecrit.decim.value=s
	if(arguments.length<2) {
		calcule()
	} else {
		calcule(false)
	}
}

function clr2() {
	document.ecrit.decim.value=""
	document.getElementById("dec2fr").innerHTML=""
}

function kmaxchiffres(k) {
        var b=1+Math.floor((k)*Math.random()), s=""
        for(var i=0;i<b;i++)
                s += ""+Math.floor(10*Math.random())
        return s
}

function perhasard() {
        var a = Math.floor(1000*Math.random()),
                b = kmaxchiffres(3),
                c = kmaxchiffres(4),
                ch=((Math.random()<0.2)?"-":""),
                s = ch+a+","+b+"["+c+"]";
        clr2();
        document.ecrit.decim.value=s;
        calcule();
}

