// HiereX - HTML5 Hireoglyphic Displaying 
// © Paul François - 2010-2011			 
// Toute utilisation par un autre site que www.ddchampo.com est interdite sans le consentement de l'auteur. Il est interdit de redistribuer, d'utiliser ou de modifier ce code sans le consentement de l'auteur.		  

window.onload = function() {HXDrawAllCanvas() ;}

var HXVersion = "4.3.7" ;
var CADRATHEIGHT = 40;
var MARGIN = CADRATHEIGHT/20;
var Counters = new Array() ;
var Glyphs = new Array() ;
var AllImages = new Array() ;
var AllDimensions = new Array() ;
var ErrorImage = "./images/editeur/error.png" ;
var ImagesGlobalPath = "./images/hieros_png/";
//var ImagesGlobalPath = "../Full_Library/" ;			
var ImagesExtension = ".png" ;
var Code_Translits = new Array("A","AA","Ai","Aw","Ab","Aby","Abd","Ams","Ar","Ax","Axt","Atf","i","iAb","iAm","iAT","iAdt","ii","iab","iaH","iw","iwa","iwn","ib","ibA","ipt","im","imAx","imi","imnt","in","ini","inb","inpw","ir","iry","iH","iz","isw","it","iTi","id","idn","idr","idt","y","a","aA","awt","ab","abA","apr","anx","arq","aH","aHA","aHa","aSA","aq","ad","aD","w","W","wA","wAH","wAs","wAD","wa","wab","ww","wbA","wp","wn","wr","wrrt","wHa","wHm","wx","wz","wsr","wsx","wsxt","wSA","wSm","wdn","wD","wDAt","wDa","wDb","b","bA","bAs","biA","bit","baHi","bnr","bH","bz","bd","bdt","p","pA","pAq","pr","pH","pXr","pzD","pq","pt","pd","pD","f","fnD","m","M","mA","mAi","mAa","mAat","mAw","mi","mw","mwt","mm","mn","mnit","mniw","mnw","mnhd","mnx","mnxt","mnD","mr","mH","mxAt","mzH","ms","msi","msn","msDr","mSa","mt","md","mD","mDAt","mDH","mDt","n","N","niwt","nw","nb","nbw","nbty","nfw","nfr","nm","nr","nH","nxn","nxxw","nzt","ns","nSmt","nTr","nD","nDm","r","rA","ra","rw","rwd","rwD","rmi","rnp","rxyt","rs","rsw","rtH","rd","rdi","l","h","hb","hrw","H","HA","HAt","Hw","Hwt","Hb","Hp","Hfn","Hm","Hmt","Hn","Hnmmt","Hnqt","Hr","HH","Hz","HqA","HqAt","Htp","HD","HDt","HDD","x","xA","xAwt","xAst","xAt","xa","xw","xpr","xprS","xpS","xm","xn","xnt","xr","xrw","xrp","xsf","xt","xTm","X","XA","XAr","Xn","Xnm","Xnmw","Xr","Xrd","Xkr","s","sA","sAb","sin","sw","swb","sb","sp","smA","smn","sH","sxnt","ssmt","sS","sSn","sSSt","S","SA","Sw","Swt","Swty","Sps","Spsi","Sm","Sma","Sms","Sn","Sny","Sna","Snwt","Sndyt","Ssp","Ss","SsA","Styw","Sd","q","qAb","qiz","qmA","qn","qrsw","qs","qd","k","kA","kAp","kAr","kp","kfA","km","g","gb","gm","grg","gH","gHs","gs","t","tA","ti","tyw","tp","tm","tr","tHn","txn","T","TA","TAw","Tb","TmA","THn","Tz","d","di","dwA","dwAt","db","dmD","dSr","dSrt","dd","D","DA","Dam","Dw","Db","DbA","Dba","Dr","DrD","DHwty","Dsr","Dd","DD","sAH","sAq","siA","sbA","sbq","sbk","spAt","spr","spt","spty","sf","sm","sn","snT","snTr","snD","sr","srqt","sxm","sxmty","sxt","sXr","sSm","sSr","sk","st","sti","stp","stX","sT","sTA","sTAw","sd","sDAw","sDm","z") ;
var Code_Gardiner = new Array("G1","G2","T12","F40","U23","E24","N11","S44","T12","G25","N27","S8","M17","R15","M1","N30","N4","M18","W10","N11","N18","F44","O28","F34","Y6","O45","Aa13","F39","Z11","R14","K1","W25","O36","C6","D4","A47","T24","M40","F44","U10","V15","N41","F21","V37","N4","Z4","D36","O29","S39","D59","S42","Aa20","S34","V12","O11","D34","P6","I1","G35","K3","V26","G43","Z7","V4","V29","S40","M13","T21","D60","G44","U26","F13","E34","G36","T17","P4","F25","R16","Q2","F12","S11","O15","G42","H2","M11","V24","D10","Aa21","N20","D58","G29","W2","U16","L2","G32","M30","F18","K5","R9","M34","Q3","G40","H3","O1","F22","F46","N9","H2","N1","T9","T10","I9","D19","G17","Aa13","U1","E22","Aa11","C10","G46","W19","N35A","G14","G18","Y5","S18","A33","C8","Y3","U22","S27","D27","U6","V22","U38","I3","F31","B3","V32","F21","A12","D52","S43","V20","Y1","S10","V19","N35","S3","O49","W24","V30","S12","G16","P5","F35","T34","H4","G21","O47","S45","W11","F20","K6","R8","Aa27","M29","D21","D21","N5","E23","T12","T12","D9","M4","G23","T13","M24","U31","D56","X8","E23","O4","U13","N5","V28","M16","F4","F18","O6","W3","Aa5","I8","U36","U24","M2","N8","W22","D2","C11","W14","S38","U11","R4","T3","S1","T6","Aa1","M12","R1","N25","R1","N28","S37","L1","S7","F23","R22","G41","W17","Aa15","P8","S42","U34","M3","S20","F32","K4","V19","F26","W9","C4","T28","A17","Aa30","S29","G39","E17","T11","M23","T11","O35","O50","F36","U32","O22","O30","E6","Y3","M9","Y8","N37","M8","H6","S35","S9","A50","A51","N40","M26","T18","V7","D3","U13","O51","S26","O42","V6","F5","I2","F30","N29","F46","A38","T14","Aa8","Q6","T19","Aa28","V31","D28","R5","O18","R5","F22","I6","W11","G38","G28","U17","D56","D56","Aa13","X1","N16","U33","G4","D1","U15","M6","S15","O25","V13","G47","P5","S33","V19","S15","S24","D46","X8","N14","N15","F16","S23","G27","S3","R11","I10","U28","S41","N26","G22","T25","D50","M36","F21","C3","D45","R11","I11","D61","I5","S32","N14","D56","I4","N24","F42","D24","D25","S30","M21","T22","V5","R7","G54","A21","L7","S42","S6","M20","T11","T31","V33","V29","Q1","F29","U21","C7","S22","V2","V3","F33","S19","F21","O34") ;

function HXDrawAllCanvas() {
		var RegExp1 = new RegExp("&lt;","g") ;
		var RegExp2 = new RegExp("&gt;","g") ;
		var Tableau = new Array();
		Tableau = document.getElementsByTagName("canvas") ;
		var i;
		for (i=0;i<Tableau.length;i++) {
			var canvas = Tableau[i] ;
				canvas.title = canvas.innerHTML.replace(RegExp1,"<").replace(RegExp2,">") ;
				canvas.height = CADRATHEIGHT;
			AllImages[i] = new Array();
			Counters[i] = 0;
			HXLoadSequenceInCanvas(canvas,Counters[i],Glyphs[i],AllImages[i],AllDimensions[i]) ;			
		}
	}
	
function HXDrawSequenceInCanvasWithImages(canvas,Images,Dimensions) {
		HXCalculateWidthOfCanvas(canvas,Images,Dimensions) ;
		var Cadrats = new Array() ;
		Cadrats = canvas.innerHTML.split('-') ;
		var LHChange = canvas.innerHTML.indexOf("!=") ;
		if(LHChange != -1) {
			var RHeight = parseInt(canvas.innerHTML.substr(LHChange+2,2));
			if(RHeight <= 60) {
				if(RHeight >= 25) {
					CADRATHEIGHT = RHeight ;
				}
				else {
					CADRATHEIGHT = 25 ;
				}
			}
			else {
				CADRATHEIGHT = 60 ;
			}
			canvas.height = CADRATHEIGHT;
		}
		var cvs = document.createElement('canvas');
		cvs.width = Cadrats.length * CADRATHEIGHT * 10 ;
		var context = cvs.getContext("2d") ;
		var i;
		var k = 0;
		var XPos = 0;
		var DebutCartouche, CartoucheType, DebutHachures = -1;
		var Color = "N" ;
		var scale = 1.00;
		for (i=0;i<Cadrats.length;i++) {
			if(Cadrats[i].length > 0) {
				var Tab = new Array() ;
				Tab = HXDevideCadratIntoComponents(Cadrats[i]) ;
				var Hachures = Cadrats[i].indexOf("#") ;
				var Pattern,DebutPosition ;
				if(Hachures >= 1) {
					DebutPosition=XPos;
					Pattern = Cadrats[i].substring(Hachures+1,Cadrats[i].length) ;
					Cadrats[i] = Cadrats[i].substring(0,Hachures) ;
				}
				if(Tab[0].length > 1) {
					var Components = new Array() ;
					var Dim = new Array() ;
					Components = Images.slice(k,k-(-Tab[0].length)) ;
					Dim = Dimensions.slice(k,k-(-Tab[0].length)) ;
					XPos = HXDrawGroupAtPosition(Components,Tab[1],Dim,XPos,cvs,Color) ;
					k = k + Tab[0].length;
				}
				else {
					var SpecialMDC = HXRecognizeSpecialMDC(Cadrats[i]) ;
					if(SpecialMDC) {
						k = k+1;
						switch (SpecialMDC) {
							case 1 : 
								if(DebutHachures != -1) {
									HXDrawShadingWithPattern(DebutHachures,XPos,"",cvs) ;
									DebutHachures = XPos*1.25 + CADRATHEIGHT/2 ;
								}
								CartoucheType = 1 ;
								context.save() ;
								context.scale(0.8,0.8) ;
								context.translate(0,CADRATHEIGHT*0.1+1) ;
								scale = 0.8 ;
								DebutCartouche = XPos + CADRATHEIGHT/2 ;
								XPos = XPos*1.25 + CADRATHEIGHT/2 ;									
								break;
							case 2 :
								if(DebutHachures != -1) {
									HXDrawShadingWithPattern(DebutHachures,XPos,"",cvs) ;
								}
								context.restore() ;
								scale = 1.00 ;
								var XDeplacement = HXDrawCartouche(cvs,DebutCartouche,(XPos-MARGIN)*0.8,CartoucheType) ;
								if(DebutHachures != -1) {
									DebutHachures = XPos*0.8 + XDeplacement + MARGIN ;
								}
								XPos = XPos*0.8 + XDeplacement + MARGIN ;
								break;
							case 3 :
								XPos = XPos + CADRATHEIGHT + MARGIN; 
								break;
							case 4 :
								XPos = XPos + CADRATHEIGHT/2 + MARGIN; 
								break;
							case 5 :
								XPos = HXWriteSectionIdentifierAtPos(Cadrats[i].substr(1),XPos,cvs) ;
								break;
							case 7 : 
								DebutHachures =  XPos ;
								break;
							case 8 : 
								HXDrawShadingWithPattern(DebutHachures,XPos,"",cvs) ;
								DebutHachures = - 1 ;
								break;
							case 9 :
								Color = "R" ;
								break;
							case 10 : 
								Color = "N" ;
								break;
							case 11 :
								if(DebutHachures != -1) {
									HXDrawShadingWithPattern(DebutHachures,XPos,"",cvs) ;
									DebutHachures = XPos*1.25 + CADRATHEIGHT/4 ;
								}
								CartoucheType = 2 ;
								context.save() ;
								context.scale(0.8,0.8) ;
								context.translate(0,CADRATHEIGHT*0.1+1) ;
								scale = 0.8;
								DebutCartouche = XPos + CADRATHEIGHT/8 ;
								XPos = XPos*1.25 + CADRATHEIGHT/4 ;	
								break;
						}
					}
					else {
						XPos = HXDrawImageAtPosition(Images[k],XPos,cvs,Dimensions[k],Color) ;
						k = k+1;
					}
				}
				if(Hachures >= 1) {
					HXDrawShadingWithPattern(DebutPosition,XPos,Pattern,cvs) ;
				}
			}
			else {
				k = k+1;
			}
		}
		if(XPos>0) {
			canvas.width = XPos ;
			canvas.getContext("2d").drawImage(cvs,0,0,XPos,CADRATHEIGHT,0,0,XPos,CADRATHEIGHT);
		}
		CADRATHEIGHT = 40 ;
	}
	
function HXRecognizeSpecialMDC(expression) {
		var flag = false ;
		if(expression == "&lt;") {
			flag = 1 ;
			return flag ;
		}
		if(expression == "&gt;") {
			flag = 2 ;
			return flag ;
		}
		if(expression == "..") {
			flag = 3 ;
			return flag ;
		}
		if(expression == ".") {
			flag = 4 ;
			return flag ;
		}
		if(expression.substr(0,1) == "|") {
			flag = 5 ;
			return flag ;
		}
		if(expression.substr(0,1) == "!") {
			flag = 6 ;
			return flag ;
		}
		if(expression == "#b") {
			flag = 7 ;
			return flag ;
		}
		if(expression == "#e") {
			flag = 8 ;
			return flag ;
		}
		if(expression == "$r") {
			flag = 9 ;
			return flag ;
		}
		if(expression == "$b") {
			flag = 10 ;
			return flag ;
		}
		if(expression == "&lt;S") {
			flag = 11 ;
			return flag;
		}
		return flag ;
	}
	
function HXWriteSectionIdentifierAtPos(Identifier,Position,Canvas) {
		var context = Canvas.getContext("2d") ;
		context.lineWidth = 1 ;
		context.font = Math.floor(CADRATHEIGHT/4)+"pt Arial" ;
		context.textAlign = "center" ;
		context.fillStyle = "rgb(0, 0, 255)";
		context.textBaseline = "top" ;
		var metrics = context.measureText(Identifier);
		context.fillText(Identifier,Position+metrics.width/2+MARGIN,0);
		context.strokeStyle= "rgb(0, 0, 255)" ;
		context.strokeRect(Math.floor(Position)+0.5,0.5,Math.ceil(metrics.width+2*MARGIN),Math.floor(13*CADRATHEIGHT/32)) ;
		context.beginPath();
		context.moveTo(Math.round(Position+metrics.width/2+MARGIN)+0.5,Math.floor(13*CADRATHEIGHT/32)) ;
		context.lineTo(Math.round(Position+metrics.width/2+MARGIN)+0.5,CADRATHEIGHT) ;
		context.stroke() ;
		return Position + metrics.width + 3*MARGIN ;
	}
	
function HXLookForGardinerCodeMatchingTranslit(translit) {
		var retour = false ;
		for(var i=0;i<Code_Translits.length;i++) {
			if(Code_Translits[i] == translit) {
				retour = Code_Gardiner[i] ;
				break;
			}
		}
		return retour ;
	}
	
function HXReturnGlyphsCorrespondingToNumber(nombre) {
		switch (nombre) {
			case "1" :
				return "Z1";
				break;
			case "2" :
				return "Z4";
				break;
			case "3" :
				return "Z2" ;
				break;
			case "10" :
				return "V20" ;
				break;
			case "100" :
				return "V1" ;
				break;
			case "1000" :
				return "M12" ;
				break;
			case "10000" :
				return "D50" ;
				break;
			case "100000" :
				return "I8" ;
				break;
			case "1000000" :
				return "C11" ;
				break;
			default :
				return "ERROR";
				break;
			}
	}
	
function HXDrawCartouche(canvas,PositionDebut,PositionFin,Type_C) {
		var XIncr ;
		var context = canvas.getContext("2d") ;	
		var lineWidth = CADRATHEIGHT*0.05 ;
		context.lineWidth = lineWidth;
		context.strokeStyle= "rgba(0, 0, 0, 1)" ;
		switch (Type_C) {
			case 1 :
				context.beginPath();
				context.arc(PositionDebut,CADRATHEIGHT/2,CADRATHEIGHT/2-lineWidth,Math.PI*3/2,Math.PI/2,true) ;
				context.arc(PositionFin,CADRATHEIGHT/2,CADRATHEIGHT/2-lineWidth,Math.PI/2,Math.PI*3/2,true) ;
				context.closePath();
				context.moveTo(PositionFin+CADRATHEIGHT/2-lineWidth,0) ;
				context.lineTo(PositionFin+CADRATHEIGHT/2-lineWidth,CADRATHEIGHT) ;
				context.stroke();
				XIncr = CADRATHEIGHT/2 ;
				break;
			case 2 :
				context.beginPath();
				context.rect(PositionDebut,lineWidth/2,PositionFin-PositionDebut+CADRATHEIGHT/8,CADRATHEIGHT-lineWidth) ;
				context.moveTo(PositionFin+CADRATHEIGHT/8,lineWidth/2) ;
				context.lineTo(PositionFin+9*CADRATHEIGHT/8,lineWidth/2) ;
				context.moveTo(PositionFin+CADRATHEIGHT/8,CADRATHEIGHT-lineWidth/2) ;
				context.lineTo(PositionFin+9*CADRATHEIGHT/8,CADRATHEIGHT-lineWidth/2) ;
				context.stroke() ;
				context.lineWidth = lineWidth/4 ;
				context.beginPath();
				context.moveTo(PositionFin+3*CADRATHEIGHT/8,0) ;
				context.lineTo(PositionFin+3*CADRATHEIGHT/8,CADRATHEIGHT) ;
				context.moveTo(PositionFin+7*CADRATHEIGHT/16,0) ;
				context.lineTo(PositionFin+7*CADRATHEIGHT/16,CADRATHEIGHT) ;
				context.moveTo(PositionFin+9*CADRATHEIGHT/8,0) ;
				context.lineTo(PositionFin+9*CADRATHEIGHT/8,CADRATHEIGHT) ;
				context.rect(PositionFin+CADRATHEIGHT/2,CADRATHEIGHT/7,5*CADRATHEIGHT/8,CADRATHEIGHT/7) ;
				context.rect(PositionFin+CADRATHEIGHT/2,3*CADRATHEIGHT/7,5*CADRATHEIGHT/8,CADRATHEIGHT/7) ;
				context.rect(PositionFin+CADRATHEIGHT/2,5*CADRATHEIGHT/7,5*CADRATHEIGHT/8,CADRATHEIGHT/7) ;
				context.stroke() ;
				XIncr = 5*CADRATHEIGHT/4 ;
				break;
		}
		return XIncr;
	}
	
function HXDrawShadingWithPattern(PositionDebut,PositionFin,Pattern,canvas) {
		if(Pattern == "") { Pattern = "1234" } ;
		var cvs = document.createElement('canvas');
		var largeur = PositionFin-PositionDebut-MARGIN;
		cvs.width = largeur + 2*CADRATHEIGHT ;
		var ctx    = cvs.getContext('2d');
		ctx.beginPath() ;
		ctx.strokeStyle = "rgb(0,0,0)" ;
		for(i=0;i<largeur+CADRATHEIGHT;i=i+5) {
			ctx.moveTo(i,CADRATHEIGHT) ;
			ctx.lineTo(CADRATHEIGHT+i,0) ;
		}
		ctx.stroke() ;
		var context = canvas.getContext("2d") ;
		for(var i=0;i<Pattern.length;i++) {
			switch (Pattern.substr(i,1)) {
				case "1" : 
					context.drawImage(cvs,CADRATHEIGHT,0,largeur/2,CADRATHEIGHT/2,PositionDebut,0,largeur/2,CADRATHEIGHT/2) ;
					break;
				case "2" :
					context.drawImage(cvs,CADRATHEIGHT+largeur/2,0,largeur/2,CADRATHEIGHT/2,PositionDebut+largeur/2,0,largeur/2,CADRATHEIGHT/2) ;
					break;
				case "3" :
					context.drawImage(cvs,CADRATHEIGHT,CADRATHEIGHT/2,largeur/2,CADRATHEIGHT/2,PositionDebut,CADRATHEIGHT/2,largeur/2,CADRATHEIGHT/2) ;
					break;
				case "4" :
					context.drawImage(cvs,CADRATHEIGHT+largeur/2,CADRATHEIGHT/2,largeur/2,CADRATHEIGHT/2,PositionDebut+largeur/2,CADRATHEIGHT/2,largeur/2,CADRATHEIGHT/2) ;
					break;
			}
		}
	}
	
function HXDevideCadratIntoComponents(Cadrat) {
		var Retour = new Array() ;
		var Components = new Array() ;
		var Pattern = new Array() ;
		if(Math.max(Cadrat.indexOf(':'),Cadrat.indexOf('*'))!=-1) {
			while(Math.max(Cadrat.indexOf(':'),Cadrat.indexOf('*'))!=-1) {
				var pos ;
				if(Math.min(Cadrat.indexOf(':'),Cadrat.indexOf('*'))!=-1) {
					pos = Math.min(Cadrat.indexOf(':'),Cadrat.indexOf('*')) ;
				}
				else {
					pos = Math.max(Cadrat.indexOf(':'),Cadrat.indexOf('*')) ;
				}
				Components.push(Cadrat.substring(0,pos)) ; 
				Pattern.push(Cadrat.substring(pos,pos+1)) ;
				Cadrat = Cadrat.substring(pos+1,Cadrat.length) ;
			}
			Components.push(Cadrat) ;
		}
		else {
			Components.push(Cadrat);
		}
		Retour[0] = Components;
		Retour[1] = Pattern;
		return Retour;
	}
	
function HXLoadSequenceInCanvas(canvas,counter,total,Images,Dimensions) {
		var Cadrats = new Array() ;
		var Images = new Array() ;
		var Dimensions = new Array() ;
		Cadrats = canvas.innerHTML.split('-') ;
		var Signes = new Array() ;
		total = Cadrats.length;
		var i;
		var count = 0;
		for (i=0;i<total;i++) {
			var Tab = new Array() ;
			Tab = HXDevideCadratIntoComponents(Cadrats[i]) ;
			count = count + Tab[0].length;
			Signes = Signes.concat(Tab[0]) ;
		}
		total = count ;
		for (i=0;i<count;i++) {
			Signes[i] = Signes[i].replace(/&amp;/g,"&") ;
			var src ;
			var RegularExpression = new RegExp("^[a-zA-Z]*$","g") ;
			var NumberRegExp = new RegExp("^[0-9]*$","g") ;
			var Hachures = Signes[i].indexOf("#") ;	
			if(Hachures >= 1) {
				Signes[i] = Signes[i].substring(0,Hachures) ;
			}
			if(RegularExpression.test(Signes[i])) {
				var chaine = HXLookForGardinerCodeMatchingTranslit(Signes[i]) ;
				if(chaine) {
					src = ImagesGlobalPath+chaine+ImagesExtension ; 
				}
				else {
					src = ErrorImage ;
				}
			}
			else if(NumberRegExp.test(Signes[i])) {
				var chaine = HXReturnGlyphsCorrespondingToNumber(Signes[i]) ;
				if(chaine) {
					src = ImagesGlobalPath+chaine+".png" ; 
				}
				else {
					src = ErrorImage ;
				}
			}
			else {
				var src = ImagesGlobalPath+Signes[i]+ImagesExtension  ; 
			}
			if(Signes[i].indexOf("&") > -1) {
				var Content = new Array() ;
				Content = Signes[i].split("&") ;
				src = ImagesGlobalPath ;
				for (var j=0;j<Content.length;j++) {
					var chaine = HXLookForGardinerCodeMatchingTranslit(Content[j]) ;
					if(chaine) {
						src = src + chaine ; 
					}
					else {
						src = src + Content[j] ;
					}
					if(j != Content.length - 1) {
						src = src + "&" ;
					}
				}
				src = src + ImagesExtension  ;
			}
			if(HXRecognizeSpecialMDC(Signes[i])) { src = ErrorImage ; }		
			Images[i] = new Image() ;
			Images[i].onload = function() {
				counter = counter-(-1) ;
				if(counter == total) {
					HXDrawSequenceInCanvasWithImages(canvas,Images,Dimensions) ;
				}
			} 
			Images[i].src = src;
			Images[i].onerror = function() {
				this.src = ErrorImage ;
			}
		}
	}
	
function HXCalculateWidthOfCanvas(canvas,Images,Dimensions) {
		var i;
		for(i=0;i<Images.length;i++) {
			Dimensions[i] = new Array () ;
			Dimensions[i] = HXCalculateLimitsOfSign(Images[i]) ;
		}
	}
	
function HXCalculateLimitsOfSign(myImage) {
		var Limits = new Array() ;
		if(Math.max(myImage.naturalHeight,myImage.naturalWidth) > 150) {
			Limits[0] = false;
			Limits[1] = myImage.naturalWidth;
			Limits[2] = myImage.naturalHeight;
		}
		else {
			try {
				var canvas = document.createElement('canvas');
				var ctx    = canvas.getContext('2d');
				ctx.drawImage(myImage, 0, 0, myImage.naturalWidth, myImage.naturalHeight);
				var imageData = ctx.getImageData(0,0,myImage.naturalWidth,myImage.naturalHeight) ;
				var i,j ;
				var limite_horizontale=0 ;
				var limite_verticale=imageData.height;
				for(i=imageData.width-1;i>=0;i--) {
					if(limite_horizontale == 0) {
						for(j=0;j<imageData.height;j++) {
							var indice = (j*imageData.width+i+1)*4-1 ;
							if(imageData.data[indice] != 0) {
								limite_horizontale=i+1;
								break; 
							}
						}
					}
					else { break;}
				}
				for(i=0;i<imageData.height;i++) {
					if(limite_verticale == imageData.height) {
						for(j=0;j<imageData.width;j++) {
							var indice = (i*imageData.width+j+1)*4-1 ;
							if(imageData.data[indice] != 0) {
								limite_verticale=i;
								break; 
							}
						}
					}
					else { break;}
				}
				Limits[0] = true;
				Limits[1] = limite_horizontale;
				Limits[2] = limite_verticale;
				delete canvas;
			}
			catch (e) {
				Limits[0] = false;
				Limits[1] = myImage.naturalWidth;
				Limits[2] = myImage.naturalHeight;
			}
		}
		return Limits;
	}
	
function HXColorCorrection(canvas,width,height,red,green,blue) {
		var context = canvas.getContext("2d") ;
		var imageData = context.getImageData(0,0,width,height) ;
		var pix = imageData.data ;
		for (var i = 0, n = pix.length; i < n; i += 4) {
			pix[i] += red;
			pix[i+1] += green;
			pix[i+2] += blue;
		}
		context.putImageData(imageData,0,0) ;
	}
	
function HXDrawImageAtPositionGeneral(myImage,Dimensions,Xpos,Ypos,Reduction,canvas,Color) {
		var context = canvas.getContext("2d") ;	
		var imgH;
		var imgW;
		var RapportHL = myImage.naturalHeight / myImage.naturalWidth;
		var limite_horizontale = Dimensions[1];
		var limite_verticale = Dimensions[2];			
		if(Math.max(myImage.naturalHeight,myImage.naturalWidth) < CADRATHEIGHT) {
			imgH = myImage.naturalHeight*Reduction;
			imgW = myImage.naturalWidth*Reduction;
		}
		else {
			if(RapportHL >= 1) {
				imgH = CADRATHEIGHT*Reduction;
				imgW = CADRATHEIGHT/RapportHL*Reduction;
			}
			else {
				imgH = CADRATHEIGHT*RapportHL*Reduction;
				imgW = CADRATHEIGHT*Reduction;
			}
		}
		var final_height = (myImage.naturalHeight-limite_verticale)*imgW/myImage.naturalWidth;
		var final_width = limite_horizontale*imgW/myImage.naturalWidth;
		
		var cvs = document.createElement('canvas');
		var ctx = cvs.getContext('2d');
		
		if(Dimensions[0]) {
			if(Color != "N"){
				ctx.drawImage(myImage,0,limite_verticale,limite_horizontale,myImage.naturalHeight-limite_verticale,0,0,final_width,final_height) ;
				HXColorCorrection(cvs,final_width,final_height,201,29,29) ;
				context.drawImage(cvs,Xpos,Ypos-(final_height/2)) ;
			}
			else {
				context.drawImage(myImage,0,limite_verticale,limite_horizontale,myImage.naturalHeight-limite_verticale,Xpos,Ypos-(final_height/2),final_width,final_height) ;
			}
			imgW = final_width;
		}
		else {
			if(Color != "N") {
				ctx.drawImage(myImage,0,0,imgW,imgH);
				HXColorCorrection(cvs,imgW,imgH,201,29,29) ;
				context.drawImage(cvs,Xpos,Ypos-(imgH/2)) ;
			}
			else {
				context.drawImage(myImage,Xpos,Ypos-(imgH/2),imgW,imgH);
			}
		}
		return Xpos+imgW ;
	}

function HXDrawImageAtPosition(myImage,position,canvas,Dimensions,Color) {
		var retour = HXDrawImageAtPositionGeneral(myImage,Dimensions,position,CADRATHEIGHT/2,1.00,canvas,Color) ;
		retour += MARGIN ;
		return retour ;
	}

function HXDrawGroupAtPosition(Components,Pattern,Dimensions,position,canvas,Color) {
		var Total_Width = 0;
		var Total_Height = 0;
		var Coef_Reduction = 1;
		var SubComponentsWidth = new Array() ;
		var SubComponentsHeight = new Array() ; 
		var SubComponentsNumber = new Array() ;
		var SubComponentsCoef = new Array() ;
		for(var i=0; i<Components.length; i++) {
			var imgH;
			var imgW;
			var final_height ;
			var final_width ;
			var RapportHL = Components[i].naturalHeight / Components[i].naturalWidth;
			if(Math.max(Components[i].naturalHeight,Components[i].naturalWidth) < CADRATHEIGHT) {
				imgH = Components[i].naturalHeight;
				imgW = Components[i].naturalWidth;
			}
			else {
				if(RapportHL >= 1) {
					imgH = CADRATHEIGHT;
					imgW = CADRATHEIGHT/RapportHL;
				}
				else {
					imgH = CADRATHEIGHT*RapportHL;
					imgW = CADRATHEIGHT;
				}
			}
			if(Dimensions[i][0]) {
				var limite_horizontale = Dimensions[i][1];
				var limite_verticale = Dimensions[i][2];
				final_height = (Components[i].naturalHeight-limite_verticale)*imgW/Components[i].naturalWidth;
				final_width = limite_horizontale*imgW/Components[i].naturalWidth;
			}
			else {
				final_height = imgH;
				final_width = imgW;
			}
			if(i>0) {
				if(Pattern[i-1] == '*'){
					SubComponentsWidth[SubComponentsWidth.length - 1] += final_width ;
					SubComponentsWidth[SubComponentsWidth.length - 1] += MARGIN ;
					SubComponentsHeight[SubComponentsHeight.length - 1] = Math.max(SubComponentsHeight[SubComponentsWidth.length - 1],final_height) ;
					SubComponentsNumber[SubComponentsNumber.length - 1] += 1; 
				}
				else {
					SubComponentsWidth.push(final_width) ;
					SubComponentsHeight.push(final_height) ;
					SubComponentsNumber.push(1) ;
				}
			}
			else {
				SubComponentsWidth.push(final_width);
				SubComponentsHeight.push(final_height); 
				SubComponentsNumber.push(1) ;
			}
		}
		for(var k=0; k<SubComponentsWidth.length; k++) {
			if(SubComponentsWidth[k] > CADRATHEIGHT){
				SubComponentsCoef.push(CADRATHEIGHT/SubComponentsWidth[k]) ;
			}
			else {
				SubComponentsCoef.push(1.00) ;
			}
			Total_Width = Math.max(Total_Width,SubComponentsWidth[k]*SubComponentsCoef[k]) ;
		}
		for(var j=0; j<SubComponentsHeight.length; j++) {
			Total_Height += SubComponentsHeight[j]*SubComponentsCoef[j];
		}
		Total_Height += (SubComponentsWidth.length - 1)*MARGIN;
		var RapportHL2 = Total_Height/Total_Width;
		if(Math.max(Total_Height,Total_Width) > CADRATHEIGHT) {
			if(RapportHL2 >= 1) {
				Coef_Reduction = CADRATHEIGHT/Total_Height;
			}
			else {
				Coef_Reduction = CADRATHEIGHT/Total_Width;
			}
		}
		else{Coef_Reduction = 1.00 ;}
		var EspaceVerticalRestant = CADRATHEIGHT-(Total_Height)*Coef_Reduction ;
		var j=0;
		var new_position = position;
		var Y_position = 0 ;
		var Y_height = 0;
		for(var i=0; i<Components.length; i++) {
			if(i>0) {
				if(Pattern[i-1] == '*'){
					new_position = HXDrawImageAtPositionGeneral(Components[i],Dimensions[i],new_position,Y_position,Coef_Reduction*SubComponentsCoef[j],canvas,Color) ;
					new_position += (CADRATHEIGHT-SubComponentsWidth[j]*SubComponentsCoef[j])*Coef_Reduction/(SubComponentsNumber[j]-1) + MARGIN*Coef_Reduction*SubComponentsCoef[j]; 
				}
				else {
					new_position = position;
					j += 1;
					if(SubComponentsNumber[j]==1) {
						new_position += (Total_Width-SubComponentsWidth[j])*Coef_Reduction/2 ;
					}
					Y_position = Y_height + EspaceVerticalRestant/(SubComponentsNumber.length-1) + SubComponentsHeight[j]*Coef_Reduction*SubComponentsCoef[j]/2 + MARGIN*Coef_Reduction;
					Y_height = Y_height + EspaceVerticalRestant/(SubComponentsNumber.length-1) + SubComponentsHeight[j]*Coef_Reduction*SubComponentsCoef[j] + MARGIN*Coef_Reduction;
					new_position = HXDrawImageAtPositionGeneral(Components[i],Dimensions[i],new_position,Y_position,Coef_Reduction*SubComponentsCoef[j],canvas,Color) ;
					if(SubComponentsNumber[j]>1) {
						new_position += (CADRATHEIGHT-SubComponentsWidth[j]*SubComponentsCoef[j])*Coef_Reduction/(SubComponentsNumber[j]-1)+MARGIN*Coef_Reduction*SubComponentsCoef[j];
					}
				}
			}
			else {
				Y_height =SubComponentsHeight[j]*Coef_Reduction*SubComponentsCoef[j] ;
				Y_position = Y_height/2 ;
				if(SubComponentsNumber[j]==1) {
						new_position += (Total_Width-SubComponentsWidth[j])*Coef_Reduction/2 ;
				}
				new_position = HXDrawImageAtPositionGeneral(Components[i],Dimensions[i],new_position,Y_position,Coef_Reduction*SubComponentsCoef[j],canvas,Color) ;
				if(SubComponentsNumber[j]>1) {
					new_position += (CADRATHEIGHT-SubComponentsWidth[j]*SubComponentsCoef[j])*Coef_Reduction/(SubComponentsNumber[j]-1); 
				}
			}
		}
		return position-(-Total_Width*Coef_Reduction)+MARGIN ;
	}
