var cTable = Class.create({
	initialize: function(_tipus, _template, _fokusz, _parent_fokusz, _blokk, _oldal, _container, _lapozo_container, _fejlec_container, _view, _reference) {
		this.tipus = _tipus;
		this.template = _template;
		this.fokusz = _fokusz;  // a blokkon beluli fokusz elem
		this.parent_fokusz = _parent_fokusz;   // az elozo blokk fokusza
		this.blokk = _blokk;
		this.oldal = _oldal;
		this.oldalSzam = 1;
		this.highlighted = 0;
		this.elemek = new Array();
		this.container = _container;  // a div, amibe a tartalmat kell raknom
		this.lapozo_container = _lapozo_container;  // a div, amibe a tartalmat kell raknom
		this.fejlec_container = _fejlec_container;  // a div, amibe a fejlecet kell raknom
		this.view = _view;   // ezzel tudunk hivatkozni a szulore
		this.reference = _reference;  // ezzel tudok olyan linket csinalni, ami erre a tablara hivatkozik
		this.style = new Array('info_box', 'info_box_hover');
		this.fejlec_szovegek = null;
	},
	putFocus: function(_id, is_user_action) {
		// fokuszba allitja, vagyis a kovetkezo blokkot ennek gyermekeivel kell feltolteni
		// persze csak ha van kovetkezo blokk, de errol gondoskodik a nezet
	
		// ha mar volt fokusz, akkor leszedjuk rola
		if (this.fokusz > 0) {
			var fokusz_elem = this.getItem(this.fokusz);
			if (fokusz_elem != null) {
				fokusz_elem.element.className = this.style[0];
			}
		}
		// ha nulla a kivalasztott elem, akkor a legelso megy fokuszba
		if (_id == 0) {
			if (this.elemek.length == 0) return;
			_id = this.elemek[0].azon;
		}
		var elem = this.getItem(_id);
		if (elem == null) {
			if (this.elemek.length == 0) return;
			_id = this.elemek[0].azon;
			elem = this.getItem(_id);
		}
		this.fokusz = _id;
		if (this.blokk < 1) {
			elem.element.className = this.style[1];
		}
		
		// kovetkezo blokk frissitese
		this.view.updateNextBlock(this.blokk+1, this.tipus, this.fokusz);
		
		// felvesszuk a kedvencek koze
		if (is_user_action) {
			elem.addToHistory();
		}
	},
	parseRet: function(ret) {
		// feldolgozzuk a kapott eredmenyt
		this.resizeFrame();
		var out = this.container;
		
		this.fokusz = ret.fokusz;
		this.tipus = ret.tipus;
		this.oldal = Math.max(ret.oldal, 1);
		
		// ha esetleg tipus csere volt, akkor a fejlecet atirjuk
		// TODO: ez ki kene emelni a nezetbe, mert attol fugg, nem a tablatol - felig megoldva
		if (this.fejlec_container != null) {
			if (this.fejlec_szovegek != null) {
				var szi = 0;
				for (szi=0; szi<this.fejlec_szovegek.length; szi++) {
					if (this.fejlec_szovegek[szi].tipus == this.tipus) {
						this.fejlec_container.innerHTML = this.fejlec_szovegek[szi].szoveg;
					}
				}
			} else {
				// regi methodus a kompatibilitas miatt
				if (this.tipus == 'movie') {
					if (this.blokk == 0) {
						this.fejlec_container.innerHTML = 'Mit szólsz ezekhez?';
					} else {
						this.fejlec_container.innerHTML = 'Ezeket értékelte';
					}
				} else if (this.tipus == 'ppl') {
					if (this.blokk == 0) {
						this.fejlec_container.innerHTML = 'Ők ajánlanak';
					} else {
						this.fejlec_container.innerHTML = 'Vélemények';
					}
				} else {
					this.fejlec_container.innerHTML = '';
				}
			}
		}
		if (ret.adat == null) ret.adat = new Array();
		
		for (i=0; i<ret.adat.length; i++) {
			// megadjuk az actionjeit
			// a putfocus
			ret.adat[i].onclick = this.reference + '.putFocus(' + ret.adat[i].azon + ', true)';
			var faj = ret.adat[i].azon;
			if (this.blokk != 0) {
				if (this.tipus == 'movie') {
					faj = ret.adat[i].film.azon;
				} else if (this.tipus == 'ppl') {
					faj = ret.adat[i].ajanlo.azon;
				} else {
					faj = ret.adat[i].azon;
				}
			}
			// put to pri
			ret.adat[i].onclick_pick = this.reference + '.putElementToPri(' + ret.adat[i].azon + ')';
			// adatlap
			ret.adat[i].onclick_details = this.reference + '.showElementDetails(' + ret.adat[i].azon + ')';
			// opinion
			ret.adat[i].onopinion0 = 'userer.makeOpinion(0, ' + ret.adat[i].azon + ')';
			ret.adat[i].onopinion1 = 'userer.makeOpinion(1, ' + ret.adat[i].azon + ')';
			
			// tooltip
			if (this.tipus == 'movie') {
				var tip = ret.adat[i];
				if (this.blokk != 0) {
					tip = ret.adat[i].film;
				}
				tip.url = 'movie=' + faj;
				tip.template = 'template_movie_tooltip'
				tooltipper.addTartalom(tip);
				ret.adat[i].tooltip_url = tip.url;
				if (this.blokk != 0) {
					ret.adat[i].film.tooltip_url = tip.url;
				}
			} else if (this.tipus == 'series') {
				var tip = ret.adat[i];
				if (this.blokk != 0) {
					tip = ret.adat[i].film;
				}
				tip.url = 'movie=' + faj;
				tip.template = 'template_movie_tooltip'
				tooltipper.addTartalom(tip);
				ret.adat[i].tooltip_url = tip.url;
				if (this.blokk != 0) {
					ret.adat[i].film.tooltip_url = tip.url;
				}
			} else {
				var tip = ret.adat[i];
				if (this.blokk != 0) {
					tip = ret.adat[i].ajanlo;
				}
				tip.url = 'assessor=' + faj;
				tip.template = 'template_assessor_tooltip'
				tooltipper.addTartalom(tip);
				ret.adat[i].tooltip_url = tip.url;
				if (this.blokk != 0) {
					ret.adat[i].ajanlo.tooltip_url = tip.url;
				}
			}
			
			// a kis linkek a thumbokon
			if (this.tipus == 'series') {
				ret.adat[i].onpopup_url = 'http://filmindex.hu/movie/'+faj;
			} else if (this.tipus == 'movie') {
				if (this.blokk == 0) {
					//ret.adat[i].onpopup_url = 'http://filmindex.hu/movie/'+faj;
					ret.adat[i].onpopup_url = '#datasheet-movie-'+faj+'';
					ret.adat[i].onclick_default = this.reference + ".elemek[" + i + "].toggleElementDetails('default')";
					ret.adat[i].onclick_description = this.reference + ".elemek[" + i + "].toggleElementDetails('description')";
					ret.adat[i].onclick_actor = this.reference + ".elemek[" + i + "].toggleElementDetails('actor')";
					ret.adat[i].onclick_unban = "userer.unbanMovie("+faj+", "+this.blokk+")";
					ret.adat[i].onclick_ban = "userer.banMovie("+faj+", "+this.blokk+")";
					ret.adat[i].onclick_need = this.reference + ".elemek[" + i + "].toggleElementDetails('need')";
					ret.adat[i].onclick_doassess = "userer.showRecom("+faj+");";
					ret.adat[i].onclick_list = this.reference + ".elemek[" + i + "].toggleElementDetails('list')";
				} else {
					ret.adat[i].onclick_default = this.reference + ".elemek[" + i + "].toggleElementDetails('default')";
					ret.adat[i].onclick_description = this.reference + ".elemek[" + i + "].toggleElementDetails('description')";
					ret.adat[i].onclick_actor = this.reference + ".elemek[" + i + "].toggleElementDetails('actor')";
					ret.adat[i].onclick_assess = this.reference + ".elemek[" + i + "].toggleElementDetails('assess')";
					ret.adat[i].onclick_unban = "userer.unbanMovie("+faj+", "+this.blokk+")";
					ret.adat[i].onclick_ban = "userer.banMovie("+faj+", "+this.blokk+")";
					ret.adat[i].onpopup_url = '#datasheet-movie-'+faj+'';
					//ret.adat[i].onpopup_url = 'http://filmindex.hu/movie/'+faj;
					ret.adat[i].onclick_need = this.reference + ".elemek[" + i + "].toggleElementDetails('need')";
					ret.adat[i].onclick_doassess = "userer.showRecom("+faj+");";
					ret.adat[i].onclick_list = this.reference + ".elemek[" + i + "].toggleElementDetails('list')";
				}
			} else {
				if (this.blokk == 0) {
					ret.adat[i].onclick_default = this.reference + ".elemek[" + i + "].toggleElementDetails('default')";
					ret.adat[i].onclick_know = this.reference + ".elemek[" + i + "].toggleElementDetails('know')";
					ret.adat[i].onclick_listen = "userer.makeAttend("+faj+", 1)";
					ret.adat[i].onclick_dontlisten = "userer.makeAttend("+faj+", 0)";
					ret.adat[i].onclick_im = this.reference + ".elemek[" + i + "].toggleElementDetails('im')";
					ret.adat[i].onpopup_url = '#datasheet-ppl-'+faj+'';
					//ret.adat[i].onpopup_url = 'http://filmindex.hu/ppl/'+faj;
				} else {
					ret.adat[i].onclick_default = this.reference + ".elemek[" + i + "].toggleElementDetails('default')";
					ret.adat[i].onclick_assess = this.reference + ".elemek[" + i + "].toggleElementDetails('assess')";
					ret.adat[i].onclick_know = this.reference + ".elemek[" + i + "].toggleElementDetails('know')";
					ret.adat[i].onclick_listen = "userer.makeAttend("+faj+", 1)";
					ret.adat[i].onclick_dontlisten = "userer.makeAttend("+faj+", 0)";
					ret.adat[i].onclick_im = this.reference + ".elemek[" + i + "].toggleElementDetails('im')";
					ret.adat[i].onpopup_url = '#datasheet-ppl-'+faj+'';
					//ret.adat[i].onpopup_url = 'http://filmindex.hu/ppl/'+faj;
				}
			}
		}
		templater.render(out, this.template, ret, this.afterParseRet.bind(this, ret));
	},	
	afterParseRet: function(ret) {
		// lekesseljuk
		this.elemek = new Array();
		for (i=0; i<ret.adat.length; i++) {
			var typ = this.tipus;
			if (this.blokk != 0) {
				typ += '_assess';
			}
			//var obj__ = $('obj_' + ret.adat[i].egyedi);
			var obj__ = null;
			var a = new cItem(obj__, ret.adat[i], typ);
			this.elemek.push(a);
		}
		// LAPOZO
		this.oldalSzam = ret.lapok.osszes;
		this.refreshPager();
		
		var _fokusz = ret.fokusz;
		// update cache
		var i = 0;
		for (i=0; i<this.elemek.length; i++) {
			var obj__ = $('obj_' + this.elemek[i].tree.egyedi);
			this.elemek[i].element = obj__;
			
			/*var ec = '#ffffff';
			if (((ret.fokusz == 0 && i == 0) || ret.fokusz == ret.adat[i].azon) && this.blokk == 0) {
				ec = '#EAEAEA';
			}
			new Effect.Highlight(obj__, {duration: 1+i, startcolor:'#FFFFCC', endcolor: ec});*/
		}
		
		// indicator
		universe.hideIndicator(this.blokk);
		
		if (ret.suggestion) {
			$suggestion = $$('.searchSuggestion');
			if ($suggestion) {
				var category = (ret.suggestion[0].category == 'creative' ? 'szinesz' : (ret.suggestion[0].category == 'serie' ? 'sorozatcim' : 'filmcim'));
				var keyword = ret.suggestion[0].text;
				$suggestion[0].observe('click', function() {
					$('search_text').value=keyword; 
					browserFilter.setSearchChkBox(category); 
					var tmpObj = browserFilter.getFilters('search'); 
					dispatcher.fireEvent('searchfilterchange', tmpObj); 
				});
			}
		}
		
		if (this.elemek.length == 0) {
			this.clearNextBlock();
			return;
		}
		
		// FOKUSZ
		this.putFocus(_fokusz, false);
	},
	showElementDetails: function(azon) {
		var elem = this.getItem(azon);
		elem.showElementDetails();
	},
	refreshContent: function(_tipus, _fokusz, _parent_fokusz) {
		// tipus valtas van, mondjuk mikor uj elem kerul a primer fokuszba az elozo blokkban
		this.tipus = _tipus;
		this.fokusz = _fokusz;
		this.parent_fokusz = _parent_fokusz;
		this.oldal = 1;
		var params = Object.toJSON(this.getFilters());
		var akcio = 2;
		var blokk = this.blokk+1;
		var id = this.fokusz;
		if (this.blokk > 0) {
			akcio = 1;
			id = this.parent_fokusz;
		} else {
			akcio = 2;
		}
		//alert('parameterek: '+params);
		var url = 'akcio='+akcio+'&blokk='+blokk+'&tipus='+_tipus+'&id='+id+'&oldal='+this.oldal+'&params='+params;
		this.view.requestRet(url, this.reference, this.blokk);
	},
	changePage: function(_oldal) {
		var blokk = this.blokk+1;
		var tipus = this.tipus;
		var params = Object.toJSON(this.getFilters());
		this.oldal = _oldal;
		var id = this.parent_fokusz;
		var akcio = 2;
		if (this.blokk == 0) {
			akcio = 2;
		} else {
			akcio = 1;
			tipus = this.view.switchType(this.tipus);
		}
		var url = 'akcio='+akcio+'&blokk='+blokk+'&tipus='+tipus+'&id='+id+'&oldal='+_oldal+'&params='+params;
		this.view.requestRet(url, this.reference, this.blokk);
	},
	refreshPager: function() {
		var osszes = this.oldalSzam;
		var out = this.lapozo_container;
		var lapok = [];
		var akt_page = this.oldal;
		
		// kozepen 5 szam jelenjen meg
		var jobb_offset = 2;
		var bal_offset = 1;
		
		// bal szelen 2, jobb szelen 1
		var bal_count = 2;
		var jobb_count = 1;
		
		// osszesen 10 szam plussz a 2 elvalaszto '...'
		var lapok_szama_kozepen_bal = bal_offset;
		var lapok_szama_kozepen_jobb = jobb_offset;
		if ((akt_page - lapok_szama_kozepen_bal) <= bal_count) {
			lapok_szama_kozepen_jobb += bal_count - (akt_page - lapok_szama_kozepen_bal) + 1;
		}
		if ((akt_page + lapok_szama_kozepen_jobb) >= osszes - jobb_count + 1) {
			lapok_szama_kozepen_bal += (akt_page + lapok_szama_kozepen_jobb) - (osszes - jobb_count + 1) + 1;
		}
		
		var jobb_elvalaszto = false;
		var bal_elvalaszto = false;
		var szakitas = false;
		var futo = 0;
		
		if (akt_page > 1) {
			opj = {};
			opj.exec = this.reference + '.changePage(' + (akt_page-1) + ')';
			opj.name = '<span style="font-size: 14px">←</span>';
			lapok[futo] = opj;
			futo++;
		}
		for (ko=1; ko<=osszes; ko++) {
			if (ko > bal_count && ko < akt_page - lapok_szama_kozepen_bal) {
				if (bal_elvalaszto) continue;
				szakitas = true;
				bal_elvalaszto = true;
			} else if (ko <= (osszes - jobb_count) && ko > akt_page + lapok_szama_kozepen_jobb) {
				if (jobb_elvalaszto) continue;
				szakitas = true;
				jobb_elvalaszto = true;
			}
			
			if (szakitas) {
				szakitas = false;
				lapok[futo] = {};
				lapok[futo].exec = "";
				futo++;
				continue;
			}
		
			opj = {};
			opj.exec = this.reference + '.changePage(' + ko + ')';
			opj.name = ko;
			if (ko == akt_page) {
				opj.selected = '1';
			} else {
				opj.selected = '0';
			}
			lapok[futo] = opj;
			futo++;
		}
		if (akt_page < osszes) {
			opj = {};
			opj.exec = this.reference + '.changePage(' + (akt_page+1) + ')';
			opj.name = '<span style="font-size: 14px">→</span>';
			lapok[futo] = opj;
			futo++;
		}
		var alma = {
			lapok: lapok
		};
		templater.render(out, 'template_lapozo', alma);
	},
	putElementToPri: function(_id) {
		var elem = this.getItem(_id);
		elem.addToHistory();
		this.view.putElementToPri(elem.child_type, elem.child_azon);
	},
	getItem: function(id) {
		var i=0;
		for (i=0; i<this.elemek.length; i++) {
			if (this.elemek[i].azon == id) return this.elemek[i];
		}
		return null;
	},
	resetAllElement: function() {   // osszes elemet ujrarajzolja, ez mondjuk bejelentkezes utan hasznos, mert ott uj funkcio gombok jelennek meg
		var ik = 0;
		for (ik=0; ik<this.elemek.length; ik++) {
			this.elemek[ik].toggleElementDetails('default');
		}
	},
	getAvailableHeight: function() {
		var top = getElementTopByRef(this.container);
		var maxHeight = document.documentElement.clientHeight;
		return (maxHeight - top - 40);
	},
	resizeFrame: function() {
		// if view gives -1 for available, skip this
		var avail = this.view.getAvailableHeight();
		if (avail == -1) return;
		// kinyujtjuk a lap aljaig
		var height = Math.max(avail, 2*175); // legalabb 2 thumb kiferjen egyenkent 175px magasak
		this.container.style.height = height+'px';
	},
	drawAttends: function() {						// mindenkinel frissiti az attendot
		if (this.tipus != 'movie') {
			var ik = 0;
			for (ik=0; ik<this.elemek.length; ik++) {
				var elem = this.elemek[ik];
				var opj = elem.tree;
				var faj = elem.tree.azon;
				if (this.blokk != 1) {
					faj = elem.tree.ajanlo.azon;
					opj = elem.tree.ajanlo;
				}
				var attend = userer.getMyAttend(faj);
				if (attend != null) {
					opj.attend = attend;
					elem.toggleElementDetails('default');
				}
			}
		}
		if (this.hasNextBlock()) {
			tablak[this.blokk].drawAttends();
		}
	},
	drawAttend: function(assessor_id, attend) {         // egy adott muksohoz tartozo elemeknel frissiti az attendot
		if (this.tipus != 'movie') {
			var i=0;
			for (i=0; i<this.elemek.length; i++) {
				var elem = this.elemek[i];
				var opj = elem.tree;
				var faj = elem.tree.azon;
				if (this.blokk != 0) {
					faj = elem.tree.ajanlo.azon;
					opj = elem.tree.ajanlo;
				}
				if (faj != assessor_id) continue;
				if (attend != null) {
					opj.attend = attend;
					elem.toggleElementDetails('default');
				}
			}
		}
		if (this.hasNextBlock()) {
			tablak[this.blokk].drawAttend(assessor_id, attend);
		}
	},
	// ez akkor kell, ha eppen velemenyt nyilvanitott, es frissiteni kell a thumbot
	updateOpinion: function(assess_id, opinion) {
		var i=0;
		for (i=0; i<this.elemek.length; i++) {
			if (this.elemek[i].tree.azon != assess_id) continue; 
			if (opinion == 1) {
				this.elemek[i].tree.opinion1 = parseInt(this.elemek[i].tree.opinion1)+1;
			} else {
				this.elemek[i].tree.opinion0 = parseInt(this.elemek[i].tree.opinion0)+1;
			}
			this.elemek[i].toggleElementDetails('default');
			break;
		}
	},
	updateOpinions: function() {
		for (var i=0; i < userer.opinions.length; i++) {
			this.updateOpinion(userer.opinions[i].assess_id, userer.opinions[i].opinion);
		}
	},
	clearThisBlock: function() {
		var ttt = new Object();
		ttt.lapok = new Object();
		ttt.lapok.osszes = 1;
		this.parseRet(ttt);
		this.clearNextBlock();
	},
	clearNextBlock: function() {
		this.view.clearNextBlock(this.blokk+1);
	},
	drawAttends: function() {						// mindenkinel frissiti az attendot
		if (this.tipus != 'movie') {
			var ik = 0;
			for (ik=0; ik<this.elemek.length; ik++) {
				var elem = this.elemek[ik];
				var opj = elem.tree;
				var faj = elem.child_azon;
				if (this.blokk != 0) {
					opj = elem.tree.ajanlo;
				}
				var attend = userer.getMyAttend(faj);
				if (attend != null) {
					opj.attend = attend;
					elem.toggleElementDetails('default');
				}
			}
		}
	},
	drawAttend: function(assessor_id, attend) {         // egy adott muksohoz tartozo elemeknel frissiti az attendot
		if (this.tipus != 'movie') {
			var i=0;
			for (i=0; i<this.elemek.length; i++) {
				var elem = this.elemek[i];
				var faj = elem.tree.chield_azon;
				if (faj != assessor_id) continue;
				var opj = elem.tree;
				if (this.blokk != 0) {
					opj = elem.tree.ajanlo;
				}
				if (attend != null) {
					opj.attend = attend;
					elem.toggleElementDetails('default');
				}
			}
		}
	},
	// ez akkor kell, ha eppen velemenyt nyilvanitott, es frissiteni kell a thumbot
	updateOpinion: function(assess_id, opinion) {
		var i=0;
		for (i=0; i<this.elemek.length; i++) {
			if (this.elemek[i].tree.azon != assess_id) continue; 
			if (opinion == 1) {
				this.elemek[i].tree.opinion1 = parseInt(this.elemek[i].tree.opinion1)+1;
			} else {
				this.elemek[i].tree.opinion0 = parseInt(this.elemek[i].tree.opinion0)+1;
			}
			this.elemek[i].toggleElementDetails('default');
			break;
		}
	}, 
	getFilters: function() {
		var ret = this.view.getFilters();
		if (this.blokk > 0) {
			// TODO: hack
			if (!ret.sorrend) {
				var s = $('velemeny_sorrend').value;
				ret.sorrend = s; 
			}
			ret.count_per_page *= 2;
		}		
		return ret;
	}
});


