var progiciels_zoneGraphique;
var progiciels_tortue;

var progiciels_remplissageEnCours = false;
var progiciels_courbeARemplir = null;
var progiciels_courbesRemplies =[];
var progiciels_couleurRemplissage = '#ffffff';
debutRemplir = function(){ progiciels_remplissageEnCours = true;}
finRemplir = function(){
	if(!progiciels_courbeARemplir){return;}
	progiciels_courbeARemplir.dataX.push(progiciels_courbeARemplir.dataX[0]); progiciels_courbeARemplir.dataY.push(progiciels_courbeARemplir.dataY[0]);
	progiciels_courbeARemplir.setProperty({fillColor: progiciels_couleurRemplissage});  progiciels_remplissageEnCours = false;
	progiciels_courbesRemplies.push(progiciels_courbeARemplir); progiciels_courbeARemplir = null;}
initCourbeRemplis = function(){
	if(progiciels_courbeARemplir){return;}
	progiciels_courbeARemplir = progiciels_zoneGraphique.createElement('curve', [[progiciels_tortue.X()],[progiciels_tortue.Y()]], {});
	progiciels_courbeARemplir.dataX = [progiciels_tortue.X()]; progiciels_courbeARemplir.dataY =[progiciels_tortue.Y()];}
progiciels_detruireCourbesRemplies = function(){
	var n = progiciels_courbesRemplies.length;
	for (var i = n-1; i >= 0; i--){ progiciels_zoneGraphique.removeObject( progiciels_courbesRemplies[i].id);}
	progiciels_courbesRemplies = [];}
function couleurRemplissage(r,v,b) {progiciels_couleurRemplissage= couleur(r,v,b);};

PI = Math.PI;
sin = Math.sin;
cos = Math.cos;
tan = Math.tan;
arccos =acos = Math.acos;
arcsin = asin = Math.asin;
arctan = atan = Math.atan;
exp = Math.exp;
log = Math.log;
abs = Math.abs;
alea = random = Math.random;
plafond = ceil = Math.ceil;
plancher = floor = Math.floor;
alea = Math.random;

sinD = function(x) {return sin(x*PI/180); };
cosD = function(x) {return cos(x*PI/180); };
tanD = function(x) {return tan(x*PI/180); };
round = arrondir = function(x) {return plancher(x+0.5); };
hasard = function(a,b) {return plancher(a+(b-a+1)*alea())};

tortueCourante = function(t){ progiciels_tortue = t; };
dr = droite = function(angle){ progiciels_tortue.right(angle); };
crayonTrace = function(){ return progiciels_tortue.isPenDown; };
posX = function(){ return progiciels_tortue.X(); };
posY = function(){ return progiciels_tortue.Y(); };
cap = function(){ return progiciels_tortue.dir; };
fCap = fixeCap = function(angle){ progiciels_tortue.right(angle - Cap()); };
capVers = function(x, y){ progiciels_tortue.lookTo([x, y]); };
lc = leveCrayon = function(){ progiciels_tortue.penUp(); };
bc = baisseCrayon = function(){ progiciels_tortue.penDown(); };
ve = videEcran = function(){ progiciels_detruireCourbesRemplies(); progiciels_tortue.clearScreen(); cacheTortue();};
tc = tailleCrayon = function(n){ progiciels_tortue.setPenSize(n);};
mt = montreTortue = function(){ progiciels_tortue.showTurtle(); };
ct = cacheTortue = function(){ progiciels_tortue.hideTurtle(); };
videEcran = function(){ progiciels_tortue.cs(); };

function couleur(r,v,b) { var c; chaine="#"; 
       c=r.toString(16); if (c.length<2) {c="0"+c;}; chaine=chaine+c;
       c=v.toString(16); if (c.length<2) {c="0"+c;}; chaine=chaine+c;
       c=b.toString(16); if (c.length<2) {c="0"+c;}; chaine=chaine+c; return chaine;};
function couleurCrayon(r,v,b) {progiciels_tortue.setPenColor(couleur(r,v,b));};
function segment(x1,y1,x2,y2) { progiciels_tortue.setPos(x1,y1); fPos(x2,y2);};
function polygoneRegulier(n,cx,cy,r,ai) {
   for(var i=0;i<n;i=i+1) {
     segment(cx+r*cosD(ai+i*360/n),cy+r*sinD(ai+i*360/n),cx+r*cosD(ai+(i+1)*360/n),cy+r*sinD(ai+(i+1)*360/n));}};
function cercle(x,y,r) {polygoneRegulier(72,x,y,r,0)};

function initZoneGraphique(nomZone,xmin,xmax,ymin,ymax) {
	progiciels_zoneGraphique = JXG.JSXGraph.initBoard(nomZone, {boundingbox: [xmin,ymax,xmax,ymin], keepaspectratio:true, axis:false });
	progiciels_tortue = progiciels_zoneGraphique.createElement('turtle',[],{});
	couleurCrayon(0,0,0); }
	
av = avance = function(d){
	if (progiciels_remplissageEnCours){initCourbeRemplis();};
	progiciels_tortue.forward(d); 
	if (progiciels_courbeARemplir){progiciels_courbeARemplir.dataX.push(progiciels_tortue.X()); progiciels_courbeARemplir.dataY.push(progiciels_tortue.Y());}};	
fPos = fixePosition = function(x, y){
	if (progiciels_remplissageEnCours){initCourbeRemplis();};
	if (crayonTrace()){ progiciels_tortue.moveTo([x, y]);} else { progiciels_tortue.setPos(x, y);}
	if (progiciels_remplissageEnCours){progiciels_courbeARemplir.dataX.push(progiciels_tortue.X()); progiciels_courbeARemplir.dataY.push(progiciels_tortue.Y());}};
	
// ****************************************
// * Definissez vos procedures ci-dessous *
// ****************************************

// *** Factorisation premi¸re ***

function factorisation(n) {
	var chaine="";
	var d=2;
	var e;
	while (d*d <= n) {
		if (n % d == 0) {
			e=1; n=n/d;
			while (n % d == 0) {
				e=e+1;
				n=n/d;
			};
			if (e==1) {chaine = chaine + "(" + d.toString() +  ")";} 
			else { chaine = chaine + "(" + d.toString() + "^" + e.toString() + ")";};
		};
		if (d==2) {d=3;} else {d=d+2;};
	};
	if (n>1) {chaine = chaine + "(" + n.toString() + ")";};
	return chaine;
};

function factViaFenetres() {
	var n = parseInt(prompt("Nombre naturel > 1 SVP"));
	alert(n.toString() + " = " + factorisation(n));
};

function factViaZonesTextes() {
	var entree = document.getElementById("facto_nombre");
	var sortie = document.getElementById("facto_chaine");
	sortie.value = factorisation(entree.value);
};


// *** Polygones emboitˇs ***

function polyEmboites(n,cx,cy,r,ai,nbFois, beta) {
   beta=beta*360/n;
   for(var i=0;i<nbFois;i++) {
     couleurRemplissage(hasard(0,255),hasard(0,255),hasard(0,255));
     debutRemplir();
     polygoneRegulier(n,cx,cy,r,ai);
     finRemplir();
     r=r*cosD(180/n)/cosD(180/n - beta);
	 ai = ai + beta;
   }
}

function tracer() {
  progiciels_zoneGraphique.suspendUpdate(); 
  ve();
  progiciels_tortue.setProperty({strokeWidth:1,strokeOpacity:1,fillOpacity:1});
  progiciels_tortue.hideTurtle();
  var n = parseInt((document.getElementById("poly_n")).value);
  var r = parseFloat((document.getElementById("poly_r")).value);
  var ai = parseFloat((document.getElementById("poly_ai")).value);
  var f = parseFloat((document.getElementById("poly_f")).value);
  var nb = parseInt((document.getElementById("poly_nb")).value);
  polyEmboites(n,0,0,r,ai,nb,f);
  progiciels_zoneGraphique.unsuspendUpdate();
}

function effacer() {
  ve();
}

// *** Polygones versatiles ***
 
 function polyRegu(n) {
 	var alpha = Math.PI/n - Math.PI/2;
 	for(var i = 0; i < n; i++) { 
		points[i] = brd.create('point',[5*Math.cos(alpha+i*2*Math.PI/nbPoints), 5*Math.sin(alpha+i*2*Math.PI/nbPoints)], {name:' '});  }
 }
 
 function polyangle(pt, n, nbPts) {
  var col;
  var arr = new Array();
  for(var i = 0; i < nbPts; i++) {
   arr[i] = brd.create('point', 
         [function(t) {
            return function () {var x = pt[t].X(); 
                                var x1 = pt[(t+1)% nbPts].X(); 
                                var s = S.Value();
                                return x+(x1-x)*s;
                         }}(i), 
          function(t) {
            return function () {var y = pt[t].Y(); 
                                var y1 = pt[(t+1)% nbPts].Y(); 
                                var s = S.Value();
                                return y+(y1-y)*s;
                         }}(i)
          ], 
          {style:3, name:"",withLabel:false,visible:false});
  }
  col =  function(){return JXG.hsv2rgb(hue.Value()*n,0.7,0.9);};
  brd.create('polygon',pt, {fillColor:col});
  if(n>0)
    polyangle(arr, --n, nbPts);
 }
 
 function reTracer() {
 	frac = S.Value();
 	nbPoints =  parseInt((document.getElementById("avance_n")).value);
 	laCouleur = hue.Value();
 	
 	JXG.JSXGraph.freeBoard(brd);
    brd = JXG.JSXGraph.initBoard('jxgbox', {originX: 300, originY: 300, unitX: 50, unitY: 50});
    points = null;
    points = new Array();
    S = brd.create('slider', [[-5,-6],[5,-6],[0,frac,1]], {name:'S'});
 	hue = brd.create('slider', [[-5,-7],[5,-7],[0,laCouleur,36]], {name:'color'});
 
 	brd.suspendUpdate();
 	polyRegu(nbPoints);
 	polyangle(points,nbIterations, nbPoints);
 	brd.unsuspendUpdate();
 }

