Entity = {};
Entity.Array  = new Array('Elment', 'Beszur', 'Torol');
Entity.Elment = function()
{
	var raw = this.Becsomagol();
	Entity.uploader.upload('Entitás(mentés,' + this.name + ',Array(' + raw + '))');
}

function killEkezet(str)
{
	var convert =
	{
		'ö' : 'o',
		'ü' : 'u',
		'ó' : 'o',
		'ő' : 'o',
		'ú' : 'u',
		'é' : 'e',
		'á' : 'a',
		'ű' : 'u',
		'í' : 'i',
		'Ö' : 'O',
		'Ü' : 'U',
		'Ó' : 'O',
		'Ő' : 'O',
		'Ú' : 'U',
		'É' : 'E',
		'Á' : 'A',
		'Ű' : 'U',
		'Í' : 'I'
	};
	return str.replace(/[öüóőúéáűíÖÜÓŐÚÉÁŰÍ]/g, function(str) { return convert[str]; });
}

anyProperty = eval('/([A-Za-zöüóúáéíÖÜÓÚÁÉÍ_]+)([:)])(.*)/');

var myParseInt = function(s)
{
	var i = 0;
	for(var j = 0, l = s.length; j < l; ++j) i = i * 10 + (s.charCodeAt(j) - 48);
	return i;
}

Tipus = {};
Tipus.from = new Array('\\"', '\\n', '\\r', '\\t');
Tipus.to   = new Array('"',   "\n",   "\r",  "\t");
Tipus.rawToString = function(str) { for(var i = 0; i < Tipus.from.length; ++i) str = str.replace(Tipus.from[i], Tipus.to[i]); return str; }
Tipus.rawOfString = function(str) { for(var i = 0; i < Tipus.from.length; ++i) str = str.replace(Tipus.to[i], Tipus.from[i]); return str; }
Tipus.Kicsomagol = function(raw)
{
	if (raw.substr(0,8) == 'String("')
	{
		
		var i = raw.indexOf('"',8) - 6;
		while(raw.charAt(8+i-3) == '\\') {
			var i = raw.indexOf('"',8+i) - 6;
		}
		var ret = new Object();
		ret.obj = unescape(eval(raw.substr(7, i)));
		ret.length = i + 8;
		return ret;
	}
	else if (raw.substr(0,4) == 'Int(')
	{
		var s = raw.substr(4);
		var i = s.indexOf(')');
		var ret = new Object();
		ret.obj = parseInt(s.substr(0,i), 10);
		ret.length = i + 5;
		return ret;
	}
	else if (raw.substr(0,5) == 'Bool(')
	{
		var s = raw.substr(5);
		var i = s.indexOf(')');
		var ret = new Object();
		ret.obj = s.substr(0,i);
		ret.length = i + 6;
		return ret;
	}
	else if (raw.substr(0,5) == 'Fájl(') { return Fajl_Kicsomagol(raw); }
	else if (raw.substr(0,6) == 'Array(')//match = raw.match( /^Array\(/ ))
	{
		
		var tombHossza = 6;
		var obj = new Array();
		for(var subraw = raw.substr(6); subraw.charAt(0) != ')';)
		{
			var key = Tipus.Kicsomagol(subraw);
			var klength = key.length;
			subraw = subraw.substr(klength);
			if (subraw.substr(0,2) != '=>') throw new Exception();
			subraw = subraw.substr(2);
			var value = Tipus.Kicsomagol(subraw);
			var vlength = value.length;
			subraw = subraw.substr(vlength);
			tombHossza += 2 + klength + vlength;
			
			if (subraw.charAt(0) == ',') { subraw = subraw.substr(1), ++tombHossza; }
			else if (subraw.charAt(0) != ')') throw new Exception();
			
			obj[key.obj] = value.obj;
		}
		return { obj : obj, length : ++tombHossza };
	}
	else if (raw.substr(0,4) == 'NULL')                            { return { obj : null,                 length : 4 }; }
	else if (match = raw.match( /^Float\(([0-9]+(\.[0-9]*)?)\)/ )) { return { obj : parseFloat(match[1]), length : match[0].length }; }
	else if (match = raw.match( /^(TRUE|FALSE)/ ))                 { return { obj : match[1] == 'TRUE',   length : match[0].length }; }
	else if (match = raw.match( /^([A-Za-zöüóúáéíÖÜÓÚÁÉÍ]+)\(/ ))
	{
		var obj = eval('new ' + killEkezet(match[1]) + '();');
		var res = obj.Kicsomagol(raw);
		xlength = res.length;
	}
	else
	{
		alert(raw);
		throw new Exception();
	}
	//alert(obj);
	return {'obj' : obj, 'length' : xlength };//match[0].length };
}

Tipus.Becsomagol = function(obj)
{
	var raw;
	if (obj === null)                  raw = 'NULL';
	else if (typeof(obj) == 'boolean') raw = obj ? 'TRUE' : 'FALSE';
	else if (typeof(obj) == 'number')
	{
		if (obj.toString().match(/\./) === null) raw = 'Int(' + obj + ')';
		else raw = 'Float(' + obj + ')';
	}
	else if (typeof(obj) == 'string')  raw = 'String("' + Tipus.rawOfString(obj) + '")';
	else if (obj.isArray())
	{
		var elems  = new Array();
		for (i in obj) if (!Array.prototype.extentions.inArray(i)) elems.push(Tipus.Becsomagol(i) + '=>' + Tipus.Becsomagol(obj[i]));
		raw = 'Array(' + elems.join(',') + ')';
	}
	else raw = obj.Becsomagol();
	return raw;
}

Minta = {};
Minta.Egyenlo = 0;
Minta.Nagyobb = 1;
Minta.Kisebb  = 2;
Minta.Minta   = 3;
Minta.KisebbVagyEgyenlo = 4;
Minta.NagyobbVagyEgyenlo = 5;
Minta.NemEgyenlo = 6;

Minta.Es   = 0;
Minta.Vagy = 1;


function DirektMinta(values, relations, glue)
{
	this.values = values;
	this.relations = relations;
	this.glue = glue;
	this.Becsomagol = function() { return 'DirektMinta(értékek:' + Tipus.Becsomagol(this.values) + ',relációk:' + Tipus.Becsomagol(this.relations) + ',összekapcsolók:' + Tipus.Becsomagol(this.glue) + ')'; }
}

function Fajltipusok()
{
	this.Kivalaszt = function(arr, onsuccess, onerror)
	{
		var msg = 'Entitás(lekérdezés,Fájltípus,' + Tipus.Becsomagol(arr) + ')';
		var loader = new staticDataLoader(honlap + 'ajax.php?kiszolgalo=' + msg, function(raw, param) { onsuccess(Tipus.Kicsomagol(raw).obj); }, onerror);
		loader.loadData();
	}
	this.Kicsomagol = function(raw) { return { 'obj' : this, 'length' : 'Fajltipusok()'.length}; }
}

function Fajltipus()
{
	for (prop in Entity.Array) this[Entity.Array[prop]] = Entity[Entity.Array[prop]];
	this.name = 'Fájltípus';
	this.Kicsomagol = function(raw)
	{
		var match;
		var teljesHossz;
		if (!(match = raw.match(eval('/^Fájltípus\\(/')))) throw new Exception();
		var fields = new Array('id', 'név', 'mime', 'kezelö');
		teljesHossz = match[0].length;
		raw = raw.substr(teljesHossz);
		while(raw.charAt(0) != ')')
		{
			var index;
			if (!(match = raw.match(eval('/([A-Za-zöüóúáéíÖÜÓÚÁÉÍ_]+)([:)])(.*)/'))) || (-1 == (index = fields.indexOf(match[1])))) throw new Exception();
			fields = fields.removeAt(index);
			var res = Tipus.Kicsomagol(match[3]);
			var elemHossza = match[1].length + 1 + res.length;
			teljesHossz += elemHossza;
			raw = raw.substr(elemHossza); 
			if (raw.charAt(0) != ',' && raw.charAt(0) != ')') throw new Exception();
			if (raw.charAt(0) == ',') { raw = raw.substr(1), ++teljesHossz; }
			eval('this.' + match[1] + ' = res.obj;');
		}
		++teljesHossz;
		return { 'obj' : this, 'length' : teljesHossz };
	}
}

function Fajlok()
{
	var self = this;
	this.KivalasztKepeket = function(onsuccess, onerror)
	{
		var minta = new DirektMinta(new Array('image/jpeg', 'image/png', 'image/gif'), new Array(Minta.Egyenlo, Minta.Egyenlo, Minta.Egyenlo), new Array(Minta.Vagy, Minta.Vagy));
		var kezelo = new Fajltipusok();
		kezelo.Kivalaszt({ 'mime' : minta, 'assocArray' : true }, function(t)
		{
			var minta = new DirektMinta(new Array(t[0].id, t[1].id, t[2].id), new Array(Minta.Egyenlo, Minta.Egyenlo, Minta.Egyenlo), new Array(Minta.Vagy, Minta.Vagy));
			self.Kivalaszt({ 'fájltípus' : minta, 'assocArray' : true }, onsuccess, onerror);
		}, onerror);
	}
	this.KivalasztAnimaciokat = function(onsuccess, onerror)
	{
		var minta = new DirektMinta(new Array('application/x-shockwave-flash'), new Array(Minta.Egyenlo), new Array());
		var kezelo = new Fajltipusok();
		kezelo.Kivalaszt({ 'mime' : minta, 'assocArray' : true }, function(t)
		{
			var minta = new DirektMinta({ '0' : t[0].id, 'assocArray' : true }, { '0' : Minta.Egyenlo, 'assocArray' : true }, new Array());
			self.Kivalaszt({ 'fájltípus' : minta, 'assocArray' : true }, onsuccess, onerror);
		}, onerror);
	}
	this.KivalasztOsszeset = function(onsuccess, onerror)
	{
		var msg = 'Entitás(lekérdezés,Fájl,' + Tipus.Becsomagol(new Array()) + ')';
		var loader = new staticDataLoader(honlap + 'ajax.php?kiszolgalo=' + msg, function(raw, param) { onsuccess(Tipus.Kicsomagol(raw).obj); }, onerror);
		loader.loadData();
	}
	//----------------------
	
	//-----------------------
	this.Kivalaszt = function(arr, onsuccess, onerror)
	{
		var msg = 'Entitás(lekérdezés,Fájl,' + Tipus.Becsomagol(arr) + ')';
		var loader = new staticDataLoader(honlap + 'ajax.php?kiszolgalo=' + msg, function(raw, param) { onsuccess(Tipus.Kicsomagol(raw).obj); }, onerror);
		loader.loadData();
	}
	this.Kicsomagol = function(raw) { return { obj : this, length : 'Fajlok()'.length}; }
}

function Fajl_Kicsomagol(raw)
{
	var teljesHossz = 5;
	var obj = new Object();
	for (var subraw = raw.substr(teljesHossz); subraw.charAt(0) != ')';)
	{
		var d = subraw.indexOf(':');
		var prop = subraw.substr(0,d);
		var res = Tipus.Kicsomagol(subraw.substr(d + 1));
		var elemHossza = prop.length + 1 + res.length;
		if (subraw.charAt(elemHossza) == ',') ++elemHossza;
		else if (subraw.charAt(elemHossza) != ')') throw new Exception();
		teljesHossz += elemHossza;
		subraw = subraw.substr(elemHossza);
		obj[prop] = res.obj;
	}
	++teljesHossz;
	return { obj : obj, length : teljesHossz };
}

function Fajl()
{
	this.name = 'Fájl';
	this.Kicsomagol = function(raw) { return Fajl_Kicsomagol(raw, this); }
}

function Termekek()
{
	var self = this;
	this.Kivalaszt = function(arr, onsuccess, onerror)
	{
		var msg = 'Entitás(lekérdezés,Termék,' + Tipus.Becsomagol(arr) + ')';
		var loader = new staticDataLoader(honlap + 'ajax.php?kiszolgalo=' + msg, function(raw, param) { onsuccess(Tipus.Kicsomagol(raw).obj); }, onerror);
		loader.loadData();
	}
	this.Kicsomagol = function(raw) { return { 'obj' : this, 'length' : 'Termékek()'.length}; }
}

function Termek()
{
	for (prop in Entity.Array) this[prop] = Entity[prop];
	this.name = 'Termék';
	this.Kicsomagol = function(raw)
	{
		var match;
		var teljesHossz;
		if (!(match = raw.match(eval('/^Termék\\(/')))) throw new Exception();
		var fields = new Array('id', 'azonosító', 'kód', 'ár', 'áfa', 'vámtarifaszám', 'állapot', 'idöpont', 'nyelv', 'név', 'leírás', 'kezelö');
		teljesHossz = match[0].length;
		raw = raw.substr(teljesHossz);
		while(raw.charAt(0) != ')')
		{
			var index;
			if (!(match = raw.match(eval('/([A-Za-zöüóúáéíÖÜÓÚÁÉÍ_]+)([:)])(.*)/'))) || (-1 == (index = fields.indexOf(match[1])))) { alert(match); throw new Exception(); }
			fields = fields.removeAt(index);
			var res = Tipus.Kicsomagol(match[3]);
			var elemHossza = match[1].length + 1 + res.length;
			teljesHossz += elemHossza;
			raw = raw.substr(elemHossza);
			if (raw.charAt(0) != ',' && raw.charAt(0) != ')') throw new Exception();
			if (raw.charAt(0) == ',') { raw = raw.substr(1), ++teljesHossz; }
			eval('this.' + match[1] + ' = res.obj;');
		}
		++teljesHossz;
		return { 'obj' : this, 'length' : teljesHossz };
	}
}

// ********************************************************
// var x = new Termekek();
// x.Kivalaszt({ 'id' : 2, 'assocArray' : true }, function(x) { var z,g = ''; for (z in x[0]) g += z + ':' + x[0][z] + "\n"; alert(g); });
//

function Mappak()
{
	var self = this;
	this.Kivalaszt = function(arr, onsuccess, onerror)
	{
		var msg = 'Entitás(lekérdezés,Mappa,' + Tipus.Becsomagol(arr) + ')';
		var loader = new staticDataLoader(honlap + 'ajax.php?kiszolgalo=' + msg, function(raw, param) { onsuccess(Tipus.Kicsomagol(raw).obj); }, onerror);
		loader.loadData();
	}
	this.Kicsomagol = function(raw) { return { 'obj' : this, 'length' : 'Mappák()'.length}; }
}

function Mappa()
{
	for (prop in Entity.Array) this[prop] = Entity[prop];
	this.name = 'Fájl';
	this.Kicsomagol = function(raw)
	{
		var match;
		var teljesHossz;
		if (!(match = raw.match(eval('/^Mappa\\(/')))) throw new Exception();
		var fields = new Array('id', 'név', 'kezelö');
		teljesHossz = match[0].length;
		raw = raw.substr(teljesHossz);
		while(raw.charAt(0) != ')')
		{
			var index;
			if (!(match = raw.match(eval('/([A-Za-zöüóúáéíÖÜÓÚÁÉÍ_]+)([:)])(.*)/'))) || (-1 == (index = fields.indexOf(match[1])))) { alert(raw); throw new Exception(); }
			fields = fields.removeAt(index);
			var res = Tipus.Kicsomagol(match[3]);
			var elemHossza = match[1].length + 1 + res.length;
			teljesHossz += elemHossza;
			raw = raw.substr(elemHossza);
			if (raw.charAt(0) != ',' && raw.charAt(0) != ')') throw new Exception();
			if (raw.charAt(0) == ',') { raw = raw.substr(1), ++teljesHossz; }
			eval('this.' + match[1] + ' = res.obj;');
		}
		++teljesHossz;
		return { 'obj' : this, 'length' : teljesHossz };
	}
}

function Kategoriak()
{
	var self = this;
	this.Kivalaszt = function(arr, onsuccess, onerror)
	{
		var msg = 'Entitás(lekérdezés,Kategória,' + Tipus.Becsomagol(arr) + ')';
		var loader = new staticDataLoader(honlap + 'ajax.php?kiszolgalo=' + msg, function(raw, param) { onsuccess(Tipus.Kicsomagol(raw).obj); }, onerror);
		loader.loadData();
	}
	this.Kicsomagol = function(raw) { return { 'obj' : this, 'length' : 'Kategóriák()'.length}; }
}

function Kategoria()
{
	for (prop in Entity.Array) this[prop] = Entity[prop];
	this.name = 'Kategória';
	this.Kicsomagol = function(raw)
	{
		var match;
		var teljesHossz;
		if (!(match = raw.match(eval('/^Kategória\\(/')))) throw new Exception();
		var fields = new Array('id', 'azonosító', 'szülö', 'kép', 'sorrend', 'nyelv', 'név', 'leírás', 'kezelö', 'szerkesztésAlatt');
		
		teljesHossz = match[0].length;
		raw = raw.substr(teljesHossz);
		while(raw.charAt(0) != ')')
		{
			var index;
			//if (!(match = raw.match(eval('/([A-Za-zöüóúáéíÖÜÓÚÁÉÍ_]+)([:)])(.*)/'))) || (-1 == (index = fields.indexOf(match[1])))) { alert(raw); throw new Exception(); }
			if (!(match = raw.match(eval('/([A-Za-zöüóúáéíÖÜÓÚÁÉÍ_]+)([:)])(.*)/')))) { alert(raw); throw new Exception(); }
			//alert(match[1]);
			if (-1 == (index = fields.indexOf(match[1]))) {  throw new Exception(); }
			//alert(match[3].search("Bool"));
			fields = fields.removeAt(index);
			//if(match[3].search("Bool") == -1) {
			
			var res = Tipus.Kicsomagol(match[3]); 
			var elemHossza = match[1].length + 1 + res.length;
			teljesHossz += elemHossza;
			raw = raw.substr(elemHossza);
			if (raw.charAt(0) != ',' && raw.charAt(0) != ')') throw new Exception();
			if (raw.charAt(0) == ',') { raw = raw.substr(1), ++teljesHossz; }
			eval('this.' + match[1] + ' = res.obj;');
			
		}
		++teljesHossz;
		return { 'obj' : this, 'length' : teljesHossz };
	}
}


