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 from = new Array('ö','ü','ó','ú','á','é','í','Ö','Ü','Ó','Ú','Á','É','Í');
	var to   = new Array('o','u','o','u','a','e','i','O','U','O','U','A','E','I');
	var i;
	for(i = 0; i < from.length; ++i) str = str.replace(from[i], to[i]);
	return str;
}

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)
{
	var match;
	var obj;
	if (match = raw.match( /^NULL/ ))                              obj = null;
	else if (match = raw.match( /^Int\(([0-9]+)\)/ ))              obj = parseInt(match[1]);
	else if (match = raw.match( /^Float\(([0-9]+(\.[0-9]*)?)\)/ )) obj = parseInt(match[1]);
	else if (match = raw.match( /^(TRUE|FALSE)/ ))                 obj = match[1] == 'TRUE';
	else if (match = raw.match( /^String\("(([^"]|\\")*)"\)/ ))    obj = Tipus.rawToString(match[1]);
	else if (match = raw.match( /^Array\(/ ))
	{
		var subraw = raw.substr(6);
		var tombHossza = 6;
		var key, value;
		obj = new Array();
		while(subraw.charAt(0) != ')')
		{
			key = Tipus.Kicsomagol(subraw);
			subraw = subraw.substr(key.length);
			if (subraw.substr(0,2) != '=>') throw new Exception();
			subraw = subraw.substr(2);
			value = Tipus.Kicsomagol(subraw);
			subraw = subraw.substr(value.length);
			tombHossza += 2 + key.length + value.length;
			obj[key.obj] = value.obj;
			
			//alert('kozben'+obj);
			if (subraw.charAt(0) != ',' && subraw.charAt(0) != ')') throw new Exception();
			if (subraw.charAt(0) == ',') { subraw = subraw.substr(1), ++tombHossza; }
		}
		++tombHossza;
		match = new Array(raw.substr(0, tombHossza));
	}
	else if (match = raw.match( /^([A-Za-zöüóúáéíÖÜÓÚÁÉÍ]+)\(/ ))
	{
		var obj = eval('new ' + killEkezet(match[1]) + '();');
		var res = obj.Kicsomagol(raw);
		match = new Array(raw.substr(0, res.length));
	}
	else
	{
		alert(raw);
		throw new Exception();
	}
	//alert(obj);
	return {'obj' : obj, 'length' : 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.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()
{
	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('/^Fájl\\(/')))) throw new Exception();
		var fields = new Array('feltöltö', 'fájltípus', 'id', 'idöpont', 'név', 'útvonal', '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 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); });
//
