var mode=0;

function kap(s, discr) {
	this.s=s.replace(/\s+/g,"")
	this.s=s.replace(/[^0-9]+/g,"")
	this.n=s.length;
	//alert("kap "+s);
	this.suivant = function (s) {
		var n=s.length, t = [], t0=[], t1=[], ta, tb, t2=[],l0="",l1="";l2="";
		// lecture des chiffres
		for(var i=0;i<n;i++) {
			t[i]=parseInt(s.charAt(i))
		}
		// construction des deux nombres n et m
		if(discr==0 ){ // Kaprekar
                        t.sort(function(x,y){return(x>y)?1:-1});
			for(var i=0; i<n; i++) {
				t0[i] = t[i];
				t1[n-1-i] = t[i];
			}
                } else if(discr==1) { // retournement simple
			for(var i=0;i<n; i++) {
				t0[i] = t[i];
                                t1[n-1-i] = t[i];
                        }
		} else if(discr==2) { // mélange alterné
			for(var i=0; i<n; i++) {
				t0[i]=t[i]
			}
			for(var i=1; i<=n/2; i+=2) {
				var d=t0[i];
				t0[i]=t0[n-1-i]
				t0[n-1-i]=d;
			}
			for(var i=0; i<n; i++) {
                                t1[i]=t0[n-1-i]
                        }
		} else if(discr==3) { // pair/impair
			t.sort(function(x,y){return(x>y)?1:-1});
			for(var i=0; i<n; i++) {
				var c= 1-2*i%2;
                                if(i+c<n)t0[i]=t[i+c]
				else t0[i]=t[i]
                        }
			for(var i=0;i<n; i++) {
                                t1[n-1-i] = t0[i];
                        }			
		}
		// détermination du plus grand de n ou de m
		var ordre=-1; // égaux ?
		for(var i=n-1; ordre==-1 && i>=0; i--) {
			if(t0[i]>t1[i]) ordre = 1;  // t0 > t1
			else if(t0[i]<t1[i]) ordre =0; // t0 < t1
		}
		if(ordre<=0) {  // t0 <= t1
			ta=t0;
			tb=t1;
		} else {        // t1 < t0
			tb=t0;
			ta=t1;
		}
		for(var i=0; i<n; i++) {
			l0 = ta[i]+l0
			l1 = tb[i]+l1
		}
		var ret=0;
		for(var i=0;i<n; i++) {
			var a=tb[i]-ta[i]-ret;
			ret=0;
			if(a<0)  {
				a += 10
				ret=1;
			}
			t2[i]=a
		}
		var p;
		for(p=n-1; t2[p]==0 && p>0; p--) ;
		for(var i=p; i>=0; i--) 
			l2 = l2 + t2[i];
			
		return {"l0": l0, "l1": l1, "l2": l2}
	}
	var reponse="le nombre proposé est\n"+"\t"+s+"\n"
	var etape=0;
	var u=s, last=s;
	var test = true;
	var tab=[];
	this.cycle=""
	this.deb=""
	this.per=0;
	this.lecycle = function() {
		this.cycle=this.deb;
		var v=this.deb;
		for(var i=1; i<this.per; i++) {
			var e = this.suivant(v)
                	v = e.l2;	
			this.cycle += ", "+v
		}
		return "("+this.cycle + ")\n"
	}
	while(test) {
		etape++;
		var e = this.suivant(u)
		u = e.l2;
		
		if(tab[e.l2]==null) {
			reponse += "étape "+etape+" : \n"+e.l1+" - "+e.l0+" = "+e.l2+"\n"
			tab[e.l2]= etape
		} else {
			this.per = etape-tab[e.l2]
			this.deb=e.l2
			this.cycle=this.lecycle()
			reponse += "étape "+etape+" : \n"+e.l1+" - "+e.l0+" = "+e.l2+"\n"
			if(this.per==1) {
				reponse += "Point fixe "+this.deb+"\n"
			
			} else if(this.per>1) {
				reponse += "Cycle de longueur "+this.per+"\n"
				reponse += (this.lecycle())+"\n"
			}
			reponse	+="Fin\n"
			
			test = false;
		}
		//alert(reponse)
	}
	return reponse;
}

function cherche() {
	var s = document.frm.t.value;
	s = s.replace(/[^0-9]+/g,"")
	document.frm.t.value=s;
	var r = kap(s, mode);
	//document.frm.ar.value = r;
	document.getElementById("rep").innerHTML="<pre>"+r+"</pre>"
}
function efface() {
	document.frm.t.value="";
	//document.frm.ar.value=""
	document.getElementById("rep").innerHTML=""
}
function hasard() {
	var s="", r=parseInt(document.frm.nc.value);
	efface();
	if(r<1 || r >2000) {
		r = 1+Math.floor(25*Math.random())
		document.frm.nc.value = r;
	}
	s = s+""+Math.floor(1+9*Math.random())+""
	for(var i=0;i<r-1;i++) {
		var ur = Math.floor(10*Math.random());
		s = s+ur
		document.frm.t.value=s;
	}
	//alert(s)
	document.frm.t.value=s;
	
	cherche()
}

function exemple(n) {
	var s = " " + n;
       	s=s.replace(/\s+/g,"")
       	s=s.replace(/[^0-9]+/g,"")
	document.frm.t.value = s;
        document.frm.nc.value = s.length;
	cherche()
}


		

			
		

