function parseLigne(i) 
{
	if (typeof i == "number") 
		return parseInt(i); 
	SelecInLine_ext(parseInt(i[0]), parseInt(i[1]), parseInt(i[2])); 
	return parseInt(i[0]);
}

function BeginBlock(line) { BeginBlock_ext(parseLigne(line)); }
function EndBlock(line) { EndBlock_ext(parseLigne(line)); }
function SelecLine(line) { SelecLine_ext(parseLigne(line)); }
function SelecInLine(line, deb, size) { SelecInLine_ext(parseInt(line), parseInt(deb), parseInt(size)); }

function CallFunction(line, param) { CallFunction_ext(-1, param); SelecLine(parseLigne(line)); }

function ReadInt	(line) { return ParseInt(ReadInt_ext(parseLigne(line))); }
function ReadFloat	(line) { return ReadFloat_ext(parseLigne(line)); }
function ReadDouble	(line) { return ReadDouble_ext(parseLigne(line)); }
function ReadChar	(line) { return ParseChar(ReadChar_ext(parseLigne(line))); }

function Print		(line, str) { Print_ext(parseLigne(line), str); }
function PrintInt	(line, i) 	{ Print_ext(parseLigne(line), ""+i); }
function PrintChar	(line, c) 	{ Print_ext(parseLigne(line), String.fromCharCode(parseInt(c))); }
function PrintVal	(line, v) 	{ Print_ext(parseLigne(line), ""+v); }

function charEq(x, y) { return String.fromCharCode(ParseChar(x)) == y; }

function RETURN(line, val) 
{ 
	if (typeof val == "number") return ParseInt(Return_int(parseLigne(line), parseInt(val))); 
	if (typeof val == "string") return Return_string(parseLigne(line), val);
	if (typeof val == "boolean") return Return_bool(parseLigne(line), val); 
}

function AddGlobalTabInt	(line, str, size){ AddGlobalTab_ext(parseLigne(line), str, parseInt(size), 0); var t = new Array(); for (i = 0 ; i < size ; i++) t[i] = 0; return t; }
function AddGlobalTabShort	(line, str, size){ AddGlobalTab_ext(parseLigne(line), str, parseInt(size), 3); var t = new Array(); for (i = 0 ; i < size ; i++) t[i] = 0; return t; }
function AddGlobalTabChar	(line, str, size){ AddGlobalTab_ext(parseLigne(line), str, parseInt(size), 1); var t = new Array(); for (i = 0 ; i < size ; i++) t[i] = '\0'; return t; }
function AddGlobalTabBool	(line, str, size){ AddGlobalTab_ext(parseLigne(line), str, parseInt(size), 4); var t = new Array(); for (i = 0 ; i < size ; i++) t[i] = false; return t; }
function AddGlobalTabFloat	(line, str, size){ AddGlobalTab_ext(parseLigne(line), str, parseInt(size), 5); var t = new Array(); for (i = 0 ; i < size ; i++) t[i] = 0; return t; }
function AddGlobalTabDouble	(line, str, size){ AddGlobalTab_ext(parseLigne(line), str, parseInt(size), 2); var t = new Array(); for (i = 0 ; i < size ; i++) t[i] = 0.0; return t; }
function GetChar_I(c)
{
	if (typeof c == 'number') return c;
	if (typeof c == 'string') if (c.length > 0) return c.charCodeAt(0);
	return 0;
}
function AddGlobalInt		(line, str, val) { return ParseInt(AddGlobalInt_ext(parseLigne(line), str, parseInt(val))); }
function AddGlobalShort		(line, str, val) { return ParseShort(AddGlobalShort_ext(parseLigne(line), str, parseInt(val))); }
function AddGlobalChar		(line, str, val) { return ParseChar(AddGlobalChar_ext(parseLigne(line), str, GetChar_I(val))); }
function AddGlobalBool		(line, str, val) { return AddGlobalBool_ext(parseLigne(line), str, (val)); }
function AddGlobalFloat		(line, str, val) { return AddGlobalFloat_ext(parseLigne(line), str, parseFloat(val)); }
function AddGlobalDouble	(line, str, val) { return AddGlobalDouble_ext(parseLigne(line), str, parseFloat(val)); }

function SetGlobalInt		(line, str, val) { return ParseInt(SetGlobalInt_ext(parseLigne(line), str, parseInt(val))); }
function SetGlobalShort		(line, str, val) { return ParseShort(SetGlobalShort_ext(parseLigne(line), str, parseInt(val))); }
function SetGlobalChar		(line, str, val) { return ParseChar(SetGlobalChar_ext(parseLigne(line), str, GetChar_I(val))); }
function SetGlobalBool		(line, str, val) { return SetGlobalBool_ext(parseLigne(line), str, (val)); }
function SetGlobalFloat		(line, str, val) { return SetGlobalFloat_ext(parseLigne(line), str, parseFloat(val)); }
function SetGlobalDouble	(line, str, val) { return SetGlobalDouble_ext(parseLigne(line), str, parseFloat(val)); }

function SetGlobalTabInt	(line, str, ind, val) { return ParseInt(SetGlobalTabInt_ext(parseLigne(line), str, parseInt(val), parseInt(ind))); }
function SetGlobalTabShort	(line, str, ind, val) { return ParseShort(SetGlobalTabShort_ext(parseLigne(line), str, parseInt(val), parseInt(ind))); }
function SetGlobalTabChar	(line, str, ind, val) { return ParseChar(SetGlobalTabChar_ext(parseLigne(line), str, GetChar_I(val), parseInt(ind))); }
function SetGlobalTabBool	(line, str, ind, val) { return SetGlobalTabBool_ext(parseLigne(line), str, (val), parseInt(ind)); }
function SetGlobalTabFloat	(line, str, ind, val) { return SetGlobalTabFloat_ext(parseLigne(line), str, parseFloat(val), parseInt(ind)); }
function SetGlobalTabDouble	(line, str, ind, val) { return SetGlobalTabDouble_ext(parseLigne(line), str, parseFloat(val), parseInt(ind)); }


function AddLocalTabInt		(line, str, size){ AddLocalTab_ext(parseLigne(line), str, parseInt(size), 0); }
function AddLocalTabShort	(line, str, size){ AddLocalTab_ext(parseLigne(line), str, parseInt(size), 3); }
function AddLocalTabChar	(line, str, size){ AddLocalTab_ext(parseLigne(line), str, parseInt(size), 1); }
function AddLocalTabBool	(line, str, size){ AddLocalTab_ext(parseLigne(line), str, parseInt(size), 4); }
function AddLocalTabFloat	(line, str, size){ AddLocalTab_ext(parseLigne(line), str, parseInt(size), 5); }
function AddLocalTabDouble	(line, str, size){ AddLocalTab_ext(parseLigne(line), str, parseInt(size), 2); }

function AddLocalInt		(line, str, val) { return ParseInt(AddLocalInt_ext(parseLigne(line), str, parseInt(val))); }
function AddLocalShort		(line, str, val) { return ParseShort(AddLocalShort_ext(parseLigne(line), str, parseInt(val))); }
function AddLocalChar		(line, str, val) { return ParseChar(AddLocalChar_ext(parseLigne(line), str, GetChar_I(val))); }
function AddLocalBool		(line, str, val) { return AddLocalBool_ext(parseLigne(line), str, (val)); }
function AddLocalFloat		(line, str, val) { return AddLocalFloat_ext(parseLigne(line), str, parseFloat(val)); }
function AddLocalDouble		(line, str, val) { return AddLocalDouble_ext(parseLigne(line), str, parseFloat(val)); }

function SetLocalInt		(line, str, val) { return ParseInt(SetLocalInt_ext(parseLigne(line), str, parseInt(val))); }
function SetLocalShort		(line, str, val) { return ParseShort(SetLocalShort_ext(parseLigne(line), str, parseInt(val))); }
function SetLocalChar		(line, str, val) { return ParseChar(SetLocalChar_ext(parseLigne(line), str, GetChar_I(val))); }
function SetLocalBool		(line, str, val) { return SetLocalBool_ext(parseLigne(line), str, (val)); }
function SetLocalFloat		(line, str, val) { return SetLocalFloat_ext(parseLigne(line), str, parseFloat(val)); }
function SetLocalDouble		(line, str, val) { return SetLocalDouble_ext(parseLigne(line), str, parseFloat(val)); }

function DelGlobal(line, str) 	{ DelGlobal_ext(parseLigne(line), str); }

function DelLocal(line, str)	{ DelLocal_ext(parseLigne(line), str); }

function Test(line, str, b)		{ Test_ext(parseLigne(line), str, b); return  b == true; }

function getElementsByName_iefix(name, tag) {
//	if(navigator.appName != 'Microsoft Internet Explorer')
//		return document.getElementsByName(name);
	var elem=document.getElementsByTagName(tag);
	var arr=new Array();
	for(i=0,iarr=0; i < elem.length; i++) {
		att=elem[i].getAttribute("name");
		if(att == name) {
			arr[iarr]=elem[i];
			iarr++;
		}
	}
	return arr;
}


function GetCode()
{
	var div_var = getElementsByName_iefix('simulateur', 'div');
	for (var i = 0, c = div_var.length ; i < c ; i++)
	{
		var code = div_var[i].innerHTML
		div_var[i].innerHTML = "";
		var id = div_var[i].id;
		LoadCode(code, id);
		var in_pre = getElementsByName_iefix(id+"_input", 'pre');
		for (var j = 0, cj = in_pre.length ; j < cj ; j++)
		{
			var input = in_pre[j].innerHTML;
			in_pre[j].innerHTML = "";
			LoadIn(id, input, in_pre[j].id);
		}
		LoadPanel(id);
	}
	/**/
	div_var = getElementsByName_iefix('simulateur_no_in', 'div');
	
	for (var i = 0, c = div_var.length ; i < c ; i++)
	{
		var code = div_var[i].innerHTML
		div_var[i].innerHTML = "";
		var id = div_var[i].id;
		LoadCodePar(code, id, false, true);
		var in_pre = getElementsByName_iefix(id+"_input", 'pre');
		for (var j = 0, cj = in_pre.length ; j < cj ; j++)
		{
			var input = in_pre[j].innerHTML;
			in_pre[j].innerHTML = "";
			LoadIn(id, input, in_pre[j].id);
		}
		LoadPanel(id);
	}
	
	div_var = getElementsByName_iefix('simulateur_no_var', 'div');
	
	for (var i = 0, c = div_var.length ; i < c ; i++)
	{
		var code = div_var[i].innerHTML
		div_var[i].innerHTML = "";
		var id = div_var[i].id;
		LoadCodePar(code, id, true, false);
		var in_pre = getElementsByName_iefix(id+"_input", 'pre');
		for (var j = 0, cj = in_pre.length ; j < cj ; j++)
		{
			var input = in_pre[j].innerHTML;
			in_pre[j].innerHTML = "";
			LoadIn(id, input, in_pre[j].id);
		}
		LoadPanel(id);
	}

	div_var = getElementsByName_iefix('simulateur_nothing', 'div');
	for (var i = 0, c = div_var.length ; i < c ; i++)
	{
		var code = div_var[i].innerHTML
		div_var[i].innerHTML = "";
		var id = div_var[i].id;
		LoadCodePar(code, id, false, false);
		var in_pre = getElementsByName_iefix(id+"_input", 'pre');
		for (var j = 0, cj = in_pre.length ; j < cj ; j++)
		{
			var input = in_pre[j].innerHTML;
			in_pre[j].innerHTML = "";
			LoadIn(id, input, in_pre[j].id);
		}
		LoadPanel(id);
	}
	/**/
}

function Double2Str(x) { if (x == 1e500) return "inf"; return "" + x.toFixed(5); }
function Double2StrExpo(x) { if (x == 1e500) return "inf"; return "" + x.toPrecision(5); }

function RandomDouble()
{
	return (Math.random()*1000000000000.0 - 500000000000);
}
function RandomChar()
{
	return ParseChar(Math.random()*65536);
}
function RandomInt()
{
	return parseInt((Math.random()*65536*65535)-65536*65535/2);
}
function MUL(x, y)
{
	return ParseInt(x*y);
}
function SUB(x, y)
{
	return ParseInt(x-y);
}
function ADD(x, y)
{
	return ParseInt(x+y);
}
function DIV(x, y)
{
	return ParseInt(x/y);
}
function MOD(x, y)
{
	return ParseInt(Mod(x,y));
}

function Mod(x, y)
{
	return parseInt(x)%parseInt(y);
}

function ParseInt(x)
{
	var y = 256*256*256*256;
	var ans = Mod(x, y);
	if (ans > y/2) ans -= y;
	if (ans < -y/2) ans += y;
	return ans;
}

function Char2Int(c) { return parseInt(c.charCodeAt(0)); }

function ParseChar(x)
{
	var y = 256;
	var ans = Mod(x, y);
	return ans;
	if (ans > y/2) ans -= y;
	if (ans < -y/2) ans += y;
	return ans;
}
function ParseShort(x)
{
	var y = 256*256;
	var ans = Mod(x, y);
	if (ans > y/2) ans -= y;
	if (ans < -y/2) ans += y;
	return ans;
}


/***************************************************************************************/
var tab_lang = new Object();
tab_lang['local var'] 			= "Variables locales";
tab_lang['global var'] 			= "Variables globales";
tab_lang['error - simuIsReady'] = "Error, the function simuIsReady() does not exist!";
tab_lang['error - missing'] 	= "ERROR - add only the action type, missing argument";
tab_lang['error - call']		= "ERROR - this is not a call";
tab_lang['error - test']		= "ERROR - this is not a test";
tab_lang['a retourne']			= " a retourn&eacute; ";
tab_lang['stop']				= "Arr&ecirc;ter l'ex&eacute;cution";
tab_lang['start']				= "D&eacute;marrer l'ex&eacute;cution";
tab_lang['next']				= "Ex&eacute;cuter l'instruction";
tab_lang['input']				= "<B>Entr&eacute;e :&nbsp;</B>";
tab_lang['output']				= "<B>Sortie :</B>";
tab_lang['input too big']		= "Le programme n'a pu s'exécuter jusqu'à la fin.";
tab_lang['error read int']		= "Impossible de lire un entier\nLe programme va continuer de s'exécuter en considérant que la valeure lue est 0 mais ceci n'est pas un comportement normal!";
tab_lang['error read float']	= "Impossible de lire un float\nLe programme va continuer de s'exécuter en considérant que la valeure lue est 0 mais ceci n'est pas un comportement normal!";
tab_lang['error read double']	= "Impossible de lire un double\nLe programme va continuer de s'exécuter en considérant que la valeure lue est 0 mais ceci n'est pas un comportement normal!";
tab_lang['error read char']		= "Impossible de lire un char\nLe programme va continuer de s'exécuter en considérant que la valeure lue est 0 mais ceci n'est pas un comportement normal!";
tab_lang['error read long']		= "Impossible de lire un long long\nLe programme va continuer de s'exécuter en considérant que la valeure lue est 0 mais ceci n'est pas un comportement normal!";
tab_lang['READING ERROR']		= "Une erreur est survenue lors de l'exécution du programme, l'entrée n'est pas au bon format.\nAssurez vous bien de remplir l'entrée (ci-dessous) dans un format compatible avec ce qui va être lu par le programme, et cela avant le lancement de celui-ci : une fois le programme lancé, il vous sera impossible de la modifier.";
tab_lang['error - ACTION(int, int, variable, int)'] = "ERROR - invalid call to ACTION(int, int, variable, int)!";
tab_lang['error - ACTION(int, int, int, int)']		= "ERROR - invalid call to ACTION(int, int, int, int)!";
tab_lang['error - index out of range']				= "Vous essayez d'accéder en dehors du tableau";

tab_lang['set breakpoint'] 		= "Mettre/Retirer un breakpoint";
tab_lang['run to'] 				= "Ex&eacute;cuter le code jusque cette ligne";
tab_lang['execute'] 			= "Ex&eacute;cuter l'instruction";
tab_lang['execute out'] 		= "Ex&eacute;cuter jusqu'&agrave; la prochaine ligne";
tab_lang['execute end'] 		= "Ex&eacute;cuter jusqu'au prochain breakpoint";
tab_lang['del breakpoint'] 		= "Supprimer tous les breakpoints";

function simuTranslate(str)
{
	return tab_lang[str];
}
