var canvasP5visuel=null;
var fonctionUtilisateurDepotAB, monImageDeposeeAB;

//function preload() { try {avant_de_commencer();} catch(erreur) {}}
function setup() {
	noCanvas(); // incompatible avec autre appel à noCanvas; semble compatible avec appel à createCanvas
	// Possibilité de le laisser en cachant le bloc et désactivant son action ...
	actions_initiales();
}
function draw() {actions_en_boucle();}

function trouverPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
	   do {	curleft += obj.offsetLeft;
	   		curtop += obj.offsetTop;
		  } while (obj = obj.offsetParent);
	return [curleft,curtop];
    }
}

function creerCanvas(a,b) {canvasP5visuel = createCanvas(a,b); initTortue(); return canvasP5visuel;}
function enregistrerCanvas() {saveCanvas();}
function estNombre(x) {return !isNaN(x) && isFinite(x);}
function traiterNombre(val) {if (estNombre(val)) {return Number(val);} else {return val;}}
function degres(x) {return x*180/PI;}
function radians(x) {return x*PI/180;}
function creerZoneTexte(contenu, lignes, colonnes) {
	var texte="",lien="";
	for(var k=0;k<contenu.length;k++) {
		texte = texte+lien+contenu[k]; lien="\n";
	}
	var zone = createElement('TEXTAREA',texte);
	zone.elt.rows = lignes; zone.elt.cols = colonnes;
	zone.elt.readOnly = true; // sinon, quand modifiée par l'utilisateur, non modifiable par programme
	return zone;
}
function contenuZoneTexte(zone, contenu) {
	var texte="",lien="";
	for(var k=0;k<contenu.length;k++) {
		texte = texte+lien+contenu[k]; lien="\n";
	}
	zone.html(texte);
}

function substitution(modele,liste){
  var cmd = modele;
  for (var k=liste.length - 1; k>=0; k--) {
    cmd = cmd.replace(new RegExp('@'+(k+1),'g'),liste[k]);
  }
  return cmd;
}

//var tempsMathJax=0;
function refreshMathJax() {
	//if (millis()-tempsMathJax <1000) {return;}
	MathJax.Hub.Queue(["Typeset",MathJax.Hub]); //tempsMathJax = millis();
}
function codeMath(chaine)  {return "`"+chaine+"`";}

 // pour que touchés dans canvas pas interprétés comme des clics (sur tablettes)
function touchEnded()   { 
	if ((0<mouseX) && (mouseX<width) && (0<mouseY) && (mouseY<height)) {return false;};
	return true;
}
function touchStarted()   { 
	if ((0<mouseX) && (mouseX<width) && (0<mouseY) && (mouseY<height)) {return false;};
	return true;
}

 // pour que glissés dans canvas pas interprétés comme mouvements de la page (sur tablettes)
function touchMoved()   { 
	if ((0<mouseX) && (mouseX<width) && (0<mouseY) && (mouseY<height)) {return false;};
	return true;
}

function surMobile() {
	if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) 
		{ return true;} else {return false;};
}

// **************************************************************

var tortueX, tortueY, tortueAngle, tortueTrace, tortuePolyEnCours, tortueNbSommetsPoly;
//var av = avance, dr = droite, lc = leveCrayon, bc = baisseCrayon;

function initTortue() {
  pixelDensity(1); // pour faciliter le traitement des images
  rectMode(CORNERS); ellipseMode(RADIUS);
  tortueX = width/2;
  tortueY = height/2;
  tortueAngle = -90;
  tortueTrace = true;
  tortuePolyEnCours = false;
  background(255); stroke(0); strokeWeight(1);
}

function avance(d) {
  var x=tortueX, y=tortueY;
  tortueX = tortueX +d*cos(radians(tortueAngle));
  tortueY = tortueY +d*sin(radians(tortueAngle));
  if (tortueTrace) {segment(x,y,tortueX,tortueY);}
}

function segment(x1,y1,x2,y2) {
	if (tortuePolyEnCours) {
		if (tortueNbSommetsPoly==0) {vertex(x1,y1); tortueNbSommetsPoly = tortueNbSommetsPoly+1;}
		vertex(x2,y2); tortueNbSommetsPoly = tortueNbSommetsPoly+1;
	} else {
		line(x1,y1,x2,y2);
	}
}

function debutPoly() {
	tortuePolyEnCours = true;
	tortueNbSommetsPoly = 0;
	beginShape();
}

function finPoly() {
	endShape();
	tortuePolyEnCours = false;
}

function sommet(x,y) {vertex(x,y); tortueNbSommetsPoly = tortueNbSommetsPoly+1;}

function recule(d) {avance(-d)};

function droite(a) {
  a = tortueAngle + a;
  var sgn = 1; if (a<0) {sgn=-1; a=-a;}
  a = (a - 360*floor(a/360))*sgn;
  tortueAngle = a;
}

function gauche(d) {droite(-d)};

function baisseCrayon() {
  tortueTrace = true;
}

function leveCrayon() {
  tortueTrace = false;
}

function fixePos(x,y) {
  var a=tortueX, b=tortueY;
  tortueX = x;
  tortueY = y;
  if (tortueTrace) {line(a,b,tortueX,tortueY);}
}

function sautePos(x,y) {
  var a=tortueX, b=tortueY;
  tortueX = x;
  tortueY = y;
}

function fixeCap(a) {
  var sgn = 1; if (a<0) {sgn=-1; a=-a;}
  a = (a - 360*floor(a/360))*sgn;
  tortueAngle = a;
}

function vers(x,y) {
   tortueAngle = degrees(atan2(y-tortueY, x-tortueX));
   return tortueAngle;
}


// **************************************************************

function pixelsDuCanvas() {return pixels;}
function obtenirPixel(liste,ligne,colonne,compos,valeur) {return liste[4*(ligne*width+colonne)+compos];}
function definirPixel(liste,ligne,colonne,compos,valeur) {liste[4*(ligne*width+colonne)+compos]=valeur;}

function depotImageDansCanvas(nomFonction) {
  	fonctionUtilisateurDepotAB = nomFonction;
  	canvasP5visuel.drop(depotImageDansCanvasAux);
}
function depotImageDansCanvasAux(fichier) {
  	if (fichier.type != "image") {return;}
  	monImageDeposeeAB=createImg(fichier.data,"",imageDeposeeChargeeAB);
}
function imageDeposeeChargeeAB() {
  	fonctionUtilisateurDepotAB(monImageDeposeeAB);
}

// **************************************************************

/* Ne fonctionne pas
function keyPressed() {
	if (keyCode === ESCAPE) { // on veut arrêter toute exécution JavaScript
		// alert("ALLO");  // pour debug
		throw new Error("Interrompu par l'utilisateur");
	}
}
*/

function evaluerExpressionX(chaine,x) { // Pour bloc "evaluer la fonction f(x) %1 en %2
	try {
		var temp = eval(chaine);
		if (estNombre(temp)) {return temp;} else {return 0/0;}
	} 
	catch(err) {return 0/0;}
}
evaluerFonction = evaluerExpressionX;
function racine(x) {return Math.sqrt(x);}
function puissance(x,y) {return Math.pow(x,y);}
exposant = puissance; puiss = puissance; exp =exposant;