/**
* ZÁKLADNÍ FUNKCE
* (automaticky přidáno na frontend i do administrace)
*/


/**
* Zvýrazní komentář (přidá class "cHili")
*
* @param (integer) ID komentáře na aktuální stránce
*/
var lastcom;
function cc(id){
	var o;
	if(lastcom) lastcom.className=lastcom.className.replace(/( +|^)cHili( +|$)/,'');
	if(o=$('komentar'+id)){
		o.className+=' cHili';
		lastcom=o;
		document.location.hash='#komentar'+id; // provede scroll na komentář
		return false;
	}
}



/**
* Vrací objekt
*
* @param (string) ID objektu
*/
function $(o){
	return document.getElementById(o);
}


//----------------------------------------------------- EVENTS
/**
* addLoadEvent - přidá funkci, která se provede po načtení stránky
*
* @param (function) funkce
*/
function addLoadEvent(fn){
	var oldonload = window.onload;
	if(typeof window.onload != 'function'){
		window.onload = fn;
	}else{
		window.onload = function(){
			if(oldonload){oldonload.call();}
			fn();
		}
	}
}


/**
* Provádí se při každém načtení stránky
* 1) pokud je v URL "#komentar123" (kde 123 je ID komentáře), pak se ho pokusí na stránce najít a zvýraznit
* 2) pokud je v URL "#foto123" (kde 123 je ID fotky v galerii), pak se ji pokusí najít a otevřít v popup okně
*/
function wload(){
	var s=document.location.hash, o; // HASH
	if(s && (s=s.substring(1)) ){
		if(s!='komentare' && s.substring(0,8)=='komentar'){
			cc(s.substring(8)); // zvyrazni komentar
		}
		else if(s.substring(0,4)=='foto' && (s=s.substring(4)) && s==parseInt(s) && (s=$('ph'+s)) && typeof s.onclick!='undefined'){
			s.onclick(); // otevře popup okno s fotkou
		}
	}
}
addLoadEvent(wload); // provádíme při každém načtení stránky



/**
* addEvent - přidá event
*
* @param (object) objekt
* @param (string) událost - např. "click", "mouseover", "mousedown", "enter"
* @param (function) funkce - uvnitř, které "this" je volaný objekt
*/
function addEvent(o, n, f){
	if(n == 'enter'){ // vlastni event: "onEnter"
		n = 'keypress';
		fx = f;
		f = function(e){
			if(e.keyCode == 13){
				fx.call(o, e);
				e.preventDefault ? e.preventDefault() : e.returnValue = false;
			}
		};
	}
	if(o.attachEvent){
		if(!o['x'+n+f]){
			o['x'+n+f] = function(){f.call(o, window.event);}
			o.attachEvent('on'+n, o['x'+n+f]);
		}
	}else
		o.addEventListener(n, f, false);
}

/**
* removeEvent - odebere event
*
* @param (object) objekt
* @param (string) událost - např. "click", "mouseover", "mousedown", "enter"
* @param (function) funkce - uvnitř, které "this" je volaný objekt
*/
function removeEvent(o, n, f){
	if(o.detachEvent){
		if(o['x'+n+f]){
			o.detachEvent('on'+n, o['x'+n+f]);
			o['x'+n+f] = null;
		}
	}else
		o.removeEventListener(n, f, false);
}


//----------------------------------------------------- FOTKY
var dcl; // (bool) probíhá redirect na jinou stránku

/**
* Přepínání fotek pomocí kláves (šipky vpravo vlevo)
*/
function fnArrows(e){
	if(!e) e=window.event;
	var k=e.keyCode, o=e.target?e.target:e.srcElement;
	if(o && o.nodeName=='INPUT' || o.nodeName=='TEXTAREA')return; // pokud píše do INPUTU tak nepřepínáme
	if(dcl) return false; // probíhá redirect
	
	if(k==27) ph.hide(); // ESC
	
	else if(k==37||k==39){ // VLEVO, VPRAVO
		dcl=1;
		if(top.ph.on){ // JS GALERIE - zobrazuje se (ph.on=0 znamená, že je schovaná)
			top.ph.get(k == 37 ? -1 : 1);
		}
		else if(o=$(k == 37 ? 'btnPrev2' : 'btnNext2')){ // STRÁNKOVÁ GALERIE
			if(o.onclick){
				o.onclick(); // tlačítko předchozí/další má "onclick" v administraci
			}else{
				window.location.href = o.href; // na frontendu má jenom "href"
			}
		}
	}
}


/**
* Třída pro zobrazení fotek
*/
var ph = {
	/**
	* ZOBRAZÍ FOTKU
	*
	* @param (object) A tag, na který se kliká (tzn. "this") a obsahuje IMG obrázek
	*        /nebo (array) hodnoty IMG atributů - pro interní použití, viz. funkce ph.get() "stránková galerie"
	* --- ostatní jsou nepovinné ---
	* @param (int) mw - největší skutečná šířka obrázku
	* @param (int) mh - největší skutečná výška obrázku
	* @param (string) ID elementu, který obsahuje všechny fotky, pokud se jedná o fotogalerii
	*        nebo (integer) 1 - jako kontext se vezme první DIV otec A tagu, na který se kliká
	* @param (string) typ zobrazení:
	*                 2 = popisy fotek jsou v DIVu (tak to má "více fotek za sebou")
	*                 3 = stránková galerie => PHD
	*                 5 = no-resize
	*/
	show : function(a, mw, mh, ct, type)
	{
		if(window.event && window.event.shiftKey==1) return true; // jen pro IE
		
		var t=top.ph, d=top.document, db=d.body, s,
			img = a.nodeName == 'A' ? a.getElementsByTagName('IMG')[0] : a,
			o, p;
		
		window.focus(); // zrusi pripadnou selekci
		
		s = mw ? img.src.replace(/\/photo\d*\//,'/photo#/') : a.href; // použijeme pak vhodnou velikost dle velikosti okna
		
		// ID fotky - první dva znaky jsou vždy "ph"
		// a.id může být prázdné - používá se jen v případě fotogalerie
		id = a.id.substring(2);
		
		if(t.tpr){ // pouze automatický preload následující fotky (probíhá na pozadí)
			t.preload(s, mw, mh, null, null, id);
			return t.tpr=0;
		}
		
		t.u = s; // celé URL fotky, kde "#" bude nahrazeno rozměrem
		
		
		//----------------------------- INIT
		if(!t.init)
		{
			t.init = 1; // provedeme jen jednou
			
			//--- popMask
			t.mask = d.createElement('div');
			t.mask.id = 'popMask';
			t.mask.onclick = t.hide;
			db.appendChild(t.mask);
			
			//--- phImg
			o = d.createElement('div');
			o.id = 'phImgWW';
			o.innerHTML = '<div id="phImgW"><img id="phImg"><div id="phTitle"></div></div>';
			o.onclick = t.hide;
			db.appendChild(o);
			t.imgww = top.$('phImgWW');
			t.imgw = top.$('phImgW');
			t.img = top.$('phImg'); // IMG tag
			t.title = top.$('phTitle');
			
			o = d.createElement('div'); // delší popis fotky
			o.id = 'phDesc';
			db.appendChild(o);
			t.desc = top.$('phDesc');
			
			// eventy
			addEvent(window,'resize',t.rps);
			addEvent(window,'afterRestore',t.rps);
			addEvent(window,'beforeRestore',t.rps);
			
			t.nodesc = 0; // výchozí = popis zobrazovat
		}
		
		//--- nastavíme kurzor
		if(window.opera) s='pointer';
		else if(navigator.userAgent.indexOf("Firefox")>-1) s='-moz-zoom-out';
		else s='url(http://b.wz.cz/css/all/zoomout.cur)';
		t.imgww.style.cursor = s;
		t.mask.style.cursor = s;
		
		
		t.a = a; // A tag
		t.ty = type; // typ galerie
		t.id = id; // ID fotky
		t.ct = 0; // (integer) 0 pokud nejde o galerii /nebo (array) seznam všech IMG tagů v galerii
		t.total = 0; // (integer) počet fotek v galerii
		
		t.bmargin = 0; // rezerva z horní strany okna 
		
		
		//--- fotky v galerii
		if(ct)
		{
			t.curr = 0; // aktuální pozice fotky
			
			if(!t.bar) // lišta s tlačítky (předchozí, další, slideshow)
			{
				t.bar = d.createElement('div');
				t.bar.id = 'phBarW';
				t.bar.innerHTML = '<div id="phBar">'
					+'<a href="#slideshow" id="phSlideBtn" onclick="return ph.slide()" class="btn-slide"><em>SLIDESHOW</em></a>'
					+'<a href="#predchozi" onclick="return ph.get(-1)" class="btn-prev" id="phPrev" title="na klávesnici šipka vlevo"><em>Předchozí</em></a>'
					+'<span id="phPos"></span>'
					+'<a href="#dalsi" onclick="return ph.get(1)" class="btn-next" id="phNext" title="na klávesnici šipka vpravo"><em>Další</em></a>'
					+'<a href="#popis" onclick="this.style.visibility=\'hidden\';ph.desc.style.display=\'block\';ph.nodesc=0;return false;" class="btn-desc" id="phDescBtn"><em>POPIS</em></a>'
					+'</div>';
				db.appendChild(t.bar);
				
				t.descbtn = top.$('phDescBtn'); // tlačítko pro zobrazení rozšířeného popisu fotky
				
				addEvent(document, 'keydown', fnArrows); // přidáme ovládání šipkama
			}
			
			if(t.ty == 3){ // STRÁNKOVÁ GALERIE
				t.pid = ct; // jako 'ct' se předává ID příspěvku
				
				// je definována globální proměnná ve tvaru:
				// var phd#[pořadí_fotky] = [ photo_id, max_w, max_h, URL, titulek ];
				// (kde # je ID příspěvku)
				eval('o=phd'+ct); // obsahuje seznam všech fotek ve fotogalerii
			}
			else{ // JS GALERIE
				o = ct == 1 ? getParent(img, 'DIV') : $(ct);
				o = o.getElementsByTagName('A'); // projdeme A tagy (thumbnails)
			}
			
			if((t.total = o.length) > 1) // máme více jak 1 fotku
			{
				t.ct = [];
				j=0;
				for(i=0;i<t.total;i++){ // procházíme každou fotku a hledáme, na které jsme pozici
					p=o[i];
					if(t.ty == 3){ // STRÁNKOVÁ GALERIE
						t.ct[j]=p;
						if(p[0] == id) t.curr = j; // p[0] ve tvaru "#" (ID fotky)
						j++;
					}
					else{ // JS GALERIE
						t.ct[j]=p;
						if(p.id == a.id) t.curr=j; // p.id ve tvaru "ph#" (ID fotky)
						j++;
					}
				}
				
				t.bmargin = 35; // rezerva z horní strany okna (= výška baru v "px")
				
				window.onscroll=function(){ // při skrolování posouváme
					var stop=getScrollTop();
					t.bar.style.top=stop+'px'; // bar
					t.desc.style.top=stop+'px'; // rozšířený popis
				};
			}
		}
		
		t.tt = img.alt; // název fotky
		
		
		if(!t.on){ // okno nebylo zobrazeno
			if(t.bmargin) t.descbtn.style.visibility = 'hidden';
			t.title.style.display = (t.title.innerHTML = t.tt) ? 'block' : 'none';
		}
		
		ph.preloader(img); // ukážeme preloader na miniatuře
		
		t.on = 1; // (ph.on) 0=galerie je vypnutá / 1=čekáme na načtení fotky / 2=zobrazeno
		
		t.mw = mw;
		t.mh = mh;
		if(t.pr && t.pr.onload) t.pr.onload=function(){}; // pokud se nějaká fotka stále načítá - vynulujeme
		t.pr = new Image();
		
		t.sz = t.preload(t.u, mw, mh, ph.f, t.pr, t.id); // spustíme preload
		
		return false; // odkaz
	},
	/**
	* Zobrazí animovaný preloader na miniatuře
	*
	* @param (object) IMG miniatura
	*/
	preloader : function(obj)
	{
		var t=ph, o, xy, tw=40, th=40, type, z;
		
		o = $('phPre');
		if(!o){
			o = document.createElement('div');
			o.id = 'phPre';
			o.className = 'phPreloader';
			document.body.appendChild(o);
		}
		
		if(top.ph.on == 2){ // JS okno je zobrazeno - preloader zobrazíme vlevo nahoře
			o=top.$('phPre');
			if(!o){
				o = top.document.createElement('div');
				o.id = type;
				o.className = 'phPreloader';
				top.document.body.appendChild(o);
			}
			
			obj = t.imgw;
			xy = [getScrollLeft(top),getScrollTop(top)];
		}else{
			xy = findOffset(obj);
			tw = obj.offsetWidth;
			th = obj.offsetHeight;
		}
		
		o.style.left = xy[0]+'px';
		o.style.top = xy[1]+'px';
		o.style.width = tw+'px';
		o.style.height = th+'px';
		o.style.display = 'block';
		
		if(t.lo && t.lo!=o) t.lo.style.display = 'none';
		
		t.lo = o; // abychom ho pak mohli schovat
	},
	/**
	* Provede preload obrázku
	*
	* @param (string) URL - kde "#" bude nahrazeno vhodnou velikostí
	* @param (integer) mw - největší skutečná šířka obrázku
	* @param (integer) mh - největší skutečná výška obrázku
	* @param (function) funkce po načtení obrázku
	* @param (object) im - pokud nebude zadán, pak bude vytvořen "new Image()"
	* @param (integer) ID fotky - zašle AJAX požadavek a uloží delší popis fotky do "ph.txts[id]"
	*/
	preload : function(u, mw, mh, onload, im, id)
	{
		var t=top.ph, sz;
		
		if(!im) im = new Image();
		im.onerror = function(){alert('Obrázek se nepodařilo načíst :-(');t.lo.style.display='none'};
		
		if(mw) u = u.replace('#', (sz=t.size(mw, mh)));
		
		if(onload) im.onload = function(){onload(im)}; // pozor, eventy se nemazou!!
		
		if(!t.txts) t.txts=[];
		if(id && typeof t.txts[id] == 'undefined' && t.ty!=2){ // pokud je type=2 pak jsou popisy fotek v <div> ("velké fotky za sebou")
			get('/scripts/photos.php?id='+id+'&a=desc', function(s){t.txts[id]=s;}); // vrací dlouhý popis fotky
		}
		
		im.src = u;
		
		return sz;
	},
	/**
	* Obrázky byl načten => zobrazíme
	*/
	f : function()
	{
		var t=top.ph, i, o, s;
		
		if(!t.on) return; // zavřel popup
		
		dcl = 0; // umožníme klikat na klávesnici
		
		if(t.is){ // SLIDESHOW
			clearTimeout(t.is);
			if(t.slideStart == t.curr) t.slide(); // konec slideshow
			else{
				if(t.slideStart<0) t.slideStart = t.curr;
				t.is = setTimeout(function(){t.get(1);}, 2500);
			}
		}
		
		if(t.bmargin) top.$('phPos').innerHTML = '<b>'+(t.curr+1)+'</b><em>/</em>'+t.total;
		
		t.img.style.visibility='hidden';
		t.img.src = t.pr.src; // obrazek
		t.img.height = t.pr.height;
		t.img.width = t.pr.width;
		
		t.img.style.visibility='visible'; // zobrazíme obrázek
		ph.lo.style.display = 'none'; // schovame preloader
		
		t.on = 2; // obrázek načten => fotka zobrazena
		
		//--- zobrazíme popis
		t.setDesc(t.desc, t.descbtn);
		
		//--- titulek
		t.title.style.display = (t.title.innerHTML = t.tt) ? 'block' : 'none';
		
		t.mask.style.display = 'block';
		t.imgww.style.display = 'block';
		
		if(t.bmargin){
			t.bar.style.display = 'block';
			t.get(1, 1); // na pozadí necháme načítat následující fotku
		}
		
		t.rp(); // provede resize obrázku
		
		if(t.id){
			if(t.ty != 3){ // neprovádíme u stránkové galerie
				document.location.hash = '#foto'+t.id; // do odkazového řádku přidáme anchor
			}
			// přičteme fotce návštěvu
			get('/scripts/photos.php?id='+t.id+'&a=visit');
		}
	},
	/**
	* Přepne na další fotku ve fotogalerii (JS okno musí být zobrazeno)
	*
	* @param (integer) číslo fotky od aktuální pozice, např. 1 = další fotka, -1 = předchozí
	* @param (bool) pokud TRUE, pak se jedná o tichý preload na pozadí
	*/
	get : function(j, background_preload)
	{
		var t=top.ph, p, o, i;
		
		window.focus(); // zrusi pripadnou selekci + nutne pro KeyDown
		
		if(t.on==2 || background_preload) // pokud je obrázek načten / jde o tichý preload
		{
			p = t.ct;
			
			j+= t.curr;
			if(j<0) j=p.length+j;
			else if(j>=p.length) j-=p.length;
			
			o = p[j];
			
			if(typeof o!='undefined') // fotka nalezena
			{
				if(background_preload) t.tpr = 1; // jedná se o automatický preload na pozadí
				
				if(t.ty == 3){ // STRÁNKOVÁ GALERIE
					// pro zobrazení fotky nemůžeme použít 'onclick'
					// protože fotka není na stránce (je tam jenom jedna - ta aktuální), o fotkách máme pouze údaje v JS array
					t.show({'curr' : j, 'src' : o[3], 'alt' : o[4], 'id' : 'ph'+o[0] }, o[1], o[2], t.pid, 3);
				}
				else{ // JS GALERIE
					o.onclick(); // klikneme na thumbnail
				}
			}
		}
		return false; // odkaz
	},
	/**
	* Při každé změně obrázku - provede zarovnání a dodatečnou úpravu rozměrů
	*/
	rp : function()
	{
		var t=top.ph;
		if(t.on && t.ty == 5){
			var stop=getScrollTop();
			t.imgww.style.top = stop+'px';
		}
		if(t.on && t.ty != 5){
			var wh=innerSize(1), w=wh[0], h=wh[1], w3, h3, c=1, i, stop=getScrollTop(), wraph;
			
			if(typeof t.mw == 'undefined'){
				// obrazek, který nemá více rozměrů => možná se nevejde do okna
				w3 = t.pr.width+50;
				h3 = t.pr.height+70;
				
				if(w3 > w) c = w3 / w; // koef zmenseni
				if(h3 / c > h) c = h3 / h;
				
				if(c != 1){ // příliš velký => natvrdo změníme rozměry
					t.img.style.width = t.pr.width / c + 'px';
					t.img.style.height = t.pr.height / c + 'px';
					wh = innerSize(1); // obrázek byl předtím přes celé okno a změnil hodnoty innerSize()
					w = wh[0];
					h = wh[1];
				}
			}
			
			// 120px je minimální rozměr frámu fotky
			t.imgw.style.width = (t.img.width > 120 ? t.img.width+2 : 120)+'px'; // 2 = border
			
			var wraph = t.imgww.offsetHeight;
			
			i = (h-wraph)/2;
			t.imgww.style.top = stop+i+'px';
			
			var ih = wh[1];
			t.mask.style.height = (ih > document.body.offsetHeight ? ih : document.body.offsetHeight)+t.bmargin+'px';
			
			if(t.bmargin){
				t.bar.style.top=stop+'px';
				t.desc.style.top=stop+'px';
			}
		}
	},
	/**
	* Došlo ke změně velikosti okna
	*/
	rps : function(){
		var t=top.ph, s;
		if(t.on){
			if(t.mw > 0){
				s=t.size(t.mw, t.mh);
				if(s!=t.sz){ // vybereme jiný rozměr fotky
					t.sz=s;
					t.pr.src = t.u.replace('#', s);
				}
			}
			t.rp();
		}
	},
	/**
	* Schováme okno s fotkou
	*/
	hide : function()
	{
		var t=top.ph;
		
		if(t.is) t.slide(1);
		
		if(t.on){
			t.on = 0;
			t.imgww.style.display='none';
			if(t.bar) t.bar.style.display='none';
			t.desc.style.display='none';
			
			if(t.is) t.slide(1);
			
			if(t.ty == 3){ // STRÁNKOVÁ GALERIE
				var a, b, i, j;
				
				a = 'foto='+t.u.substring(t.u.lastIndexOf('/')+1);
				
				b = document.location.href;
				j = b.lastIndexOf('foto=');
				if( (i=j) > 0 && (b=b.substring(i)) && (i=b.lastIndexOf('#')) > 0 ) b=b.substring(0,i);
				
				if(a != b){
					if(j > 0) a = document.location.href.replace(/foto=[^&]+/, a);
					else a = '?'+a;
					
					setTimeout(function(){document.location.href=a;}, 0); // provedeme přesměrování
					t.mask.style.cursor = 'wait';
					return;
				}
			}
			else if(t.id){
				document.location.hash = '#foto'; // změníme anchor
			}
			t.mask.style.display='none';
		}
	},
	/**
	* Vrací vhodný rozměr pro fotku
	*/
	size : function(mw, mh)
	{
		var t=top.ph, wh=innerSize(1), w=wh[0]-20, size, h=wh[1];
		
		if(mw<w) w=mw;
		if(mh<h) h=mh;
		
		if(w<1280 && h<1024){
			if(w<1024 && h<768){
				if(w<800 && h<600) size='512384';
				else size='800600';
			}else size='1024768';
		}else size='12801024';
		
		return size;
	},
	/**
	* Zapne/vypne slideshow
	*
	* @param (bool) pokud TRUE, pak vypne
	*/
	slide : function(off)
	{
		var t=top.ph, o=$('phSlideBtn');
		
		if(o.className.indexOf('on')>-1 || off){ // VYPNEME
			o.className=o.className.replace(/ ?on/,'');
			clearInterval(t.is);
			t.is = 0;
			t.mask.className = '';
		}
		else{ // ZAPNEME
			o.className+=' on';
			t.nodesc = 1;
			t.desc.style.display = 'none';
			t.mask.className = 'off';
			
			if(t.on==1){ // obrázek se načítá
				t.slideStart = -1;
				t.is = 1; // po načtení obrázku se spustí slide
			}else{
				t.slideStart = t.curr;
				t.is = setTimeout(function(){t.get(1);}, 2500);
			}
		}
		return false;
	},
	/**
	* Nastaví dlouhý popis fotky
	*
	* @param (object) DIV, kde se zobrazuje popis
	* @param (object) nepovinné - tlačítko, které de/aktivuje zobrazení popisu
	*/
	setDesc : function(o, obtn)
	{
		var t=top.ph;
		
		o.style.display = 'none';
		if(obtn) obtn.style.visibility = 'hidden';
		var shDesc = function(i){
			var s=t.txts[t.id]; // dlouhý text se volá ajaxem už při načítání fotky, ale nemusí být ještě k dispozici
			
			if(typeof s!='undefined' || t.ty == 2){
				// dlouhý popis byl načten /nebo fotka byla zobrazena
				if(t.ty == 2 && (s=$('phdesc'+t.id))) s=s.innerHTML; // dlouhý popis byl uložen v DIV
				if(s){
					if(ph.on && ph.nodesc && obtn) obtn.style.visibility = 'visible';
					else{
						o.style.display = 'block';
						o.innerHTML = (obtn && !top.noDescBtn?'<div id="phHide"><input type="button" value="SCHOVAT" onclick="ph.desc.style.display=\'none\';ph.descbtn.style.visibility=\'visible\';ph.nodesc=1;"></div>':'')+s;
					}
				}
			}
			else if(i<30){ // opakujeme 30x každých 200 ms
				setTimeout(function(){shDesc(i++)}, 200);
			}
		}
		shDesc(0);
	}
}
//####################################################################################


/**
* Najde parent objekt
*
* @object (object) dítě hledaného objektu
* @string (string) typ elementu, např. "TD"
* @string (string) nepovinné - třída elementu
* @string (integer) nepovinné - minimální úroveň objektu, např. <div id="uroven_2"><div id="uroven_1"><span id="nas_objekt"></span></div></div>
* @string (integer) nepovinné - maximální úroveň
* @return (object) objekt / (bool) false
*/
function getParent(o, el, classval, level, deep){
	var i=0;
	el=el.toLowerCase();
	if(!level)level=0;
	while(o){
		if(i>=level && o.nodeName.toLowerCase()==el && (!classval || (o.className && o.className.indexOf(classval) > -1))) return o;
		if(i>=deep)break;
		i++;
		o=o.parentNode;
	}
	return false;
}

/**
* Vrátí pozici objektu
*
* @param (object) objekt
* @param (string) nepovinné - třída nadřazeného objektu, u kterého se má skončit (pozice objektu je k němu relativní)
* @return (array) x, y
*/
function findOffset(o,clname){
	var x=y=0;
	do{
		if(!o || o.className==clname) break;
		y+=o.offsetTop;
		x+=o.offsetLeft;
	}while(o = o.offsetParent);
	return [x, y];
}

/**
* Vrací velikost okna (document)
*
* @param (bool) pokud TRUE, pak 'top.window', jinak aktuální 'window'
* @return (array) w, h
*/
function innerSize(boolTop){
	var w, h, s = boolTop ? top.window : window;
	if(s.innerHeight){
		w=s.innerWidth;
		h=s.innerHeight;
	}else{
		w=s.document.documentElement.clientWidth;
		h=s.document.documentElement.clientHeight;
	}
	return [w, h];
}

/**
* Aktuální pozice skrolování zhora
*
* @param (window) nepovinné - výchozí je "window"
* @return (integer)
*/
function getScrollTop(w){
	if(!w) w = window;
	var p = w.document.documentElement.scrollTop;
	return p > 0 ? p : w.document.body.scrollTop;
}

/**
* Aktuální pozice skrolování zleva
*
* @param (window) nepovinné - výchozí je "window"
* @return (integer)
*/
function getScrollLeft(w){
	if(!w) w = window;
	var p = w.document.documentElement.scrollLeft;
	return p > 0 ? p : w.document.body.scrollLeft;
}

/**
* Nastaví "opacity" (průhlednost) objektu
*
* @param (object) objekt
* @param (integer) 0-10 (0=průhledný)
*/
function setOpacity(o,v){
	o.style.opacity = v/10;
	o.style.filter = 'alpha(opacity='+v*10+')';
}

/**
* Schová/zobrazí SELECT objekty pokud jde o IE 6 - tam totiž nešly nijak překrýt (bug)
*
* @param (bool) pokud TRUE, pak se zobrazí, jinak se schovají
* @param (document) nepovinné - výchozí je top.document
*/
function IEinputs(sh,d){ // používám taky v TinyMCE
	if(window.XMLHttpRequest){// IE 7, mozilla, safari, opera 9
	}else{ // IE6-
		var els;
		if(!d)d=top.document;
		if(!(els=d.getElementsByTagName('select'))) return;
		for(var i=0;i<els.length;i++) els[i].style.visibility=sh?'visible':'hidden';
	}
}


//------------------------------------------------
/**
* Zašle AJAX požadavek - GET metodou
*
* @param (string) celá URL
* --- níže nepovinné ---
* @param (function) funkce, která se má provést po splnění požadavku, např.: function(server_response){ alert(server_response); }
* @param (string) zpráva, která se má zobrazit během provádění požadavku - vyžaduje třídu "message" (admin.js)
* @param (bool) pokud TRUE, pak se zpráva zobrazí přes celé okno a zablokuje tak provádění dalších úkonů
*/
function get(uri, fx, msg, fullscreen){
	var A;
	if(window.XMLHttpRequest)
		A = new XMLHttpRequest();
	else if(window.ActiveXObject){
		try {
			A = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				A = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if(!A) return alert('Váš prohlížeč tuto funkci nepodporuje.');
	
	if(msg) message.show(msg, fullscreen);
	
	// URL ukládáme, aby při několikanásobném zaslání požadavku byla uživatelská funkce provedena pouze jednou
	// a taky, aby mohl být požadavek dodatečně zrušen
	_g[uri]=0;
	
	A.open('GET', uri+'&'+Math.random(), true);
	A.onreadystatechange=function(){
		if(A.readyState==4 && _g[uri] == 0){
			_g[uri]=1;
			if(msg) message.hide();
			if(A.status==200){
				if(fx) fx(A.responseText); // uživatelská funkce
				else if(A.responseText){
					alert(A.responseText); // nemáme uživatelskou funkci, přesto je nějaká odpověď => alert()
				}
			}
		}
	};
	A.send(null);
}

/**
* Zruší probíhající GET požadavek
*
* @param (string) celá URL
*/
var _g=[];
function cancel(uri){
	_g[uri]=1;
}


//------------------------------------------------
/**
* Přidá k objektu TEXTAREA kontrolu maximální délky znaků + automatické přizpusobování výšky dle obsahu
*
* @param (object) textarea
* @param (integer) maximální počet znaků
*/
function textres(objname, maxchars){
	var o = $(objname), minrows = o.rows; // mimimální počet řádků
	o.style.overflow = 'hidden';
	o.style.height = '';
	addEvent(o, 'keydown', function(){textrescb(o, minrows, maxchars)});
	addEvent(o, 'keyup', function(){textrescb(o, minrows, maxchars)}); // stisk backspace/enter zaregistruje az po UP
	textrescb(o, minrows, maxchars);
}

/**
* Callback k textres() - provádí se při každém stisku klávesy
*/
function textrescb(o, minrows, maxchars){
	var cols = o.cols, str = o.value, r = str.split("\n"), rows = r.length, rlen, chars = 0, i;
	
	for(i=0; i<rows; i++){ // procházíme řetězec oddělený \n (tzn. řádky)
		if(!r[i]) continue;
		rlen = r[i].length;
		chars+=rlen; // spočítáme počet znaků
		if(rlen > cols+1){
			// příliš dlouhé slovo, které neobsahuje \n
			rows+= Math.ceil(r[i].length / cols)-1;
		}
	}
	rows++; // IE spočítá správně \r, a to zase neumí Firefox; IE s \n nezapočte poslední řádek, proto +1
	
	o.rows = rows < minrows ? minrows : rows; // minimální počet řádků
	
	// používáme neproporcionální písmo a tak se může stát, že se na jeden řádek vejde
	// méně/více znaků než je určeno v atributu "cols" => mohl by se zobrazit posuvnik
	while(o.scrollHeight > o.offsetHeight) o.rows++;
	
	if(maxchars > 0) {
		// překročen počet znaků
		// DIV 'maxlen' obsahuje chybovou zprávu
		// SPAN 'maxlenNum' obsahuje o kolik znaků bylo překročeno
		if(maxchars < chars) {
			o.style.borderColor='#CC0000';
			$('maxlen').style.display='block'; 
			$('maxlenNum').innerHTML=(chars-maxchars);
		} else if(o.style.borderColor='#CC0000') {
			o.style.borderColor='';
			$('maxlen').style.display='none';
		}
	}
};


//------------------------------------------------
/**
* Nastaví COOKIE
*
* @param (string) název
* @param (string) hodnota
* @param (integer) počet minut do expirace
* @param (string) path
* @param (string) domain
* @param (string) secure
*/
function setCookie(name, value, expires, path, domain, secure){
	var today = new Date();
	today.setTime(today.getTime());
	if(expires) expires *= 1000 * 60; // minutes (miliseconds)
	var expires_date = new Date(today.getTime()+expires);
	document.cookie = name + "=" +escape( value ) +
	( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
	( ( path ) ? ";path=" + path : "" ) +
	( ( domain ) ? ";domain=" + domain : "" ) +
	( ( secure ) ? ";secure" : "" );
}

/**
* Vrací hodnotu COOKIE
*
* @param (string) název
* @return (string) hodnota
*/
function getCookie(name){
	var nameEQ = name+'=';
	var cookie_value = '';
	var ca = unescape(document.cookie);
	ca = ca.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i].replace(/^\s+|\s+$/g, '');
		if(c.indexOf(nameEQ) == 0) {
			cookie_value = c.substring(nameEQ.length,c.length);
			break;
		}
	}
	return cookie_value ? cookie_value : null;
}

/**
* Ověří, zda jsou COOKIES podporovány
*/
function cookiesRequired(o, msg){
	setCookie('test', 'enabled', 60, '/', '', '');
	if(!getCookie('test')) {
		$(o).innerHTML=msg ? msg : 'Pro přidávání komentářů je nutno v prohlížeči povolit COOKIES.';
	}
}

//------------------------------------------------
/**
* JSTAB se používá pro přepínání záložek na stránce "O mně" : /content/page_profile.php
*/
var jstab={
	/**
	* init - Aktivuje záložky (přidá onclick a class atributy)
	*
	* @param (integer) číslo DIV elementu, jehož ID začíná na 'jstab' a který obsahuje záložky ve tvaru:
	*
	* <div class="jstabw"><div class="jstab" id="jstab#"> <!-- # je číslo do funkce init() -->
	*
	* <h3 class="jstabnav first"><a href="#" id="tab11">Záložka</a></h3><div id="ttab11" class="jstabitem"><div class="jstabitemin">
	* <p>text</p>
	* </div></div>
	* <h3 class="jstabnav first"><a href="#" id="tab50">Záložka 2</a></h3><div id="ttab50" class="jstabitem"><div class="jstabitemin">
	* <p>text 2</p>
	* </div></div>
	*
	* </div></div>
	*/
	init : function(id){
		jstab.o=$('jstab'+id);
		var o, a, r=jstab.o.getElementsByTagName('A'), i, f;
		for(i=0; i<r.length; i++){
			a = r[i];
			if(o=document.getElementById('t'+a.id)){
				a.onclick = function(){jstab.c(this);return false;};
				if(!f) f=a;
				o.className = 'jstabitem2';
				o.style.display = 'none';
			}
		}
		jstab.c(f);
	},
	/**
	* Kliknutí na záložku
	*
	* @param (object) A tag, tzn. "this"
	*/ 
	c : function(a){
		var id = a.id, o;
		if(!jstab.on || jstab.on.id != id){
			if(jstab.on){
				jstab.on.className = '';
				$('t'+jstab.on.id).style.display = 'none';
			}
			jstab.on = a;
			a.className = 'on';
			o = $('t'+a.id);
			o.style.display = 'block';
			
			var h1=o.offsetHeight, h2=jstab.o.offsetHeight, m = h1>h2?h1:h2-1;
			
			jstab.o.style.height = m+1+'px';
			
			o.style.height = m+'px';
		}
	}
}


//------------------------------------------------
/**
* Časovač
*/
var gtimer = {
	/**
	* Přidá funkci a spustí časovač
	*
	* Příklad použití:
	* gtimer.add(500, 'sin', function(n){ $('foobar').style.width=n+'px'; }, 0, 100, function(){ alert('Animace dokončena, objekt má 100px'); });
	*
	* @param (integer) délka trvání v ms
	* @param (string) typ časovače - sqsin, sin, cos, lin
	* @param (function) uživatelská funkce, kde první argument znamená hodnotu
	* @param (integer) počáteční hodnota
	* @param (integer) konečná hodnota
	* --- další nepovinné ---
	* @param (function) funkce po skončení časovače
	* @param (string) volitelné UID časovače
	* @param (bool) pokud TRUE, pak se akce nespustí (nutno provést manuálně)
	*
	* @return (integer) ID časovače
	*/
	add : function(duration, type, fx, nStart, nEnd, donefx, uid, dontStart){
		var t=this;
		if(typeof t.idcounter=='undefined') t.idcounter = 0;
		if(typeof t.actions=='undefined') t.actions = [];
		if(typeof t.starttime=='undefined') t.starttime = [];
		if(typeof t.done=='undefined') t.done = []; // uklada se sem done(id) nebo done(id,i)
		if(typeof t.uid2id=='undefined') t.uid2id = [];
		
		var act, ta = t.actions, id, i=0, nDiff = (nEnd > nStart) ? nEnd-nStart : nStart-nEnd;
		
		if(uid && t.uid2id[uid]>0){
			if(!dontStart) t.stopUID(uid);
			id = t.uid2id[uid];
		}else{
			id = ++t.idcounter;
			if(uid) t.uid2id[uid] = id;
		}
		
		act = [duration, type, fx, nStart, nEnd, nDiff];
		if(ta[id]){
			i=ta[id].length;
			ta[id][i] = act;
		}else
			ta[id] = [act];
		
		if(donefx) t.done[id+','+i] = donefx;
		
		if(!dontStart) t.start(id);
		
		return id;
	},
	/**
	* Zastavení časovače
	*
	* @param (string) UID časovače
	* @param (bool) pokud TRUE, pak stopne a ještě zavolá uživatelskou funkci s finálními hodnotami
	*/
	stopUID : function(uid, forceFinish){
		var t=this;
		if(typeof t.uid2id!='undefined' && t.uid2id[uid]>0) t.stop(t.uid2id[uid], forceFinish);
	},
	/**
	* Spustí časovač
	*
	* @param (string) UID časovače
	*/
	startUID : function(uid){
		var t=this;
		if(typeof t.uid2id!='undefined' && t.uid2id[uid]>0) t.start(t.uid2id[uid]);
	},
	/**
	* Zastaví časovač podle ID
	*
	* @param (integer) ID časovače
	* @param (bool) pokud TRUE, pak stopne a ještě zavolá uživatelskou funkci s finálními hodnotami
	*/
	stop : function(id, forceFinish){ // forceFinish TODO
		var t=this, i, ta=t.actions;
		if(ta[id]){
			if(forceFinish){
				for(i=0; i<ta[id].length; i++) t._finish_i(id,i);
			}
			ta[id]=0;
		}
	},
	/**
	* Spustí časovač podle ID
	*
	* @param (integer) ID časovače
	*/
	start : function(id){
		var t=this, u;
		t.starttime[id] = new Date().getTime();
		if(!t.intID) t.intID = window.setInterval(function(){t._timer();}, 20); // spustíme hlavní interval
	},
	/**
	* Tato funkce ukončí časovač
	*
	* @param (integer) ID časovače
	* @param (integer) číslo akce / funkce
	*/
	_finish_i : function(id, i){
		var t=this, ta=t.actions;
		if(!ta[id][i]) return;
		movement = ta[id][i][4];
		ta[id][i][2](movement); // uživatelská funkce
		ta[id][i] = 0;
		if(t.done[id+','+i]){ // po skončení časovače
			t.done[id+','+i]();
			t.done[id+','+i] = 0;
		}
	},
	/**
	* Tato funkce se provádí dle intervalu každých 20 ms
	* Projde všechny spuštěné a aktivní časovače a volá jejich uživatelské funkce s aktuálními hodnotami
	*/
	_timer : function(){
		var i, id, elapsed, progress, movement=0, absmoved=0, t=this, ta=t.actions;
		
		var now = new Date().getTime();
		
		for(id in ta){ // procházíme časovače
			if(ta[id] === 0) continue;
			
			moved = 0;
			
			for(i=0; i<ta[id].length; i++){ // procházíme každou nastavenou akci pro daný časovač
				if(!ta[id][i]) continue;
				
				elapsed = now - t.starttime[id];
				if(ta[id][i][0] <= elapsed){ // konec akce
					t._finish_i(id, i);
				}
				else{ // posuneme
					moved=1;
					absmoved=1;
					progress = ta[id][i][0] / elapsed;
					
					if(ta[id][i][1] == 'sqsin')
						movement = Math.sqrt(Math.cos((1-1/progress)*Math.PI/2)) * ta[id][i][5];
					else if(ta[id][i][1] == 'sin')
						movement = Math.cos((1-1/progress)*Math.PI/2) * ta[id][i][5]; // tady mam neco spatne
					else if(ta[id][i][1] == 'cos')
						movement = Math.sin((1/progress)*Math.PI/2) * ta[id][i][5];
					else
						movement = ta[id][i][5] / progress;
					
					movement = Math.round(movement*1000)/1000;
					movement = (ta[id][i][3] > ta[id][i][4]) ? ta[id][i][3] - movement : ta[id][i][3] + movement;
					
					ta[id][i][2](movement); // voláme uživatelskou funkci
				}
			}
			if(!moved){ // nedošlo k posunu
				ta[id] = 0; // tato skupina (časovač) se už nebude procházet
				if(t.done[id]){
					t.done[id](); // voláme funkci při ukončení animace
					t.done[id] = 0;
					absmoved = 1; // ve volané funkci může byt další gtimer, takže ho teď nesmíme zastavit
				}
			}
		}
		if(!absmoved) t.die(); // pokud se nic nepohlo => koncime
	},
	/**
	* Odstraní hlavní interval a všechno vynuluje
	*/
	die : function(){
		var t=this;
		window.clearInterval(t.intID);
		t.intID = 0;
		t.actions = [];
		t.starttime = [];
		t.done = [];
	}
}


//------------------------------------------------
/**
* Interaktivní stránkování v modulech
* Příklad:
* (ID bloku je libovolné, v tomto příkladu 'abc1')

<div class="wpg"><div class="pg" id="abc1">
OBSAH PRVNÍ STRANY
</div></div>
<div class="wpgbtn"><div class="pgbtn">
<a href="#" id="abc1_next" onclick="return slide(this,'server_page.php?')">DALŠÍ</a>
<a href="#" id="abc1_prev" onclick="return slide(this,'server_page.php?')">PŘEDCHOZÍ</a>
</div></div>

* Po kliknutí na další/předchozí se do bloku "abc1" vloží vrácený obsah ze "server_page.php?p=#" (kde # je číslo strany)
* Pokud server vrátí odpověď 1, pak to znamená, že máme k dispozici další stranu - pokud není, pak se tlačítko DALŠÍ schová
*
* @param (object) A tag "předchozí" / "další"
* @param (string) celá URL adresa pro vložení obsahu včetně ? nebo & na konci
* @param (bool) pokud TRUE, pak se jedná o bigslide (fotky galerií v jednom řádku), viz. /content/posts.php
*
* @see /content/posts.php
*
* @return (bool) false
*/
var _pg=[];

function slide(o, url, type)
{
	if(type==1){
		if(o.className.substring(o.className.length-1)=='d' || ph.lo && ph.lo.style.display=='block') return;
	}
	else if(o.className == 'aloading') return false;
	
	var id=o.id.replace(/_.*/,'');
	var i=(o.id==id+'_prev') ? -1 : 1;
	
	if(typeof _pg[id] == 'undefined') _pg[id]=0; // aktualni strana
	
	if((p=$(id+(i == 1 ? '1' : '2'))) && p.className == 'aloading'){
		p.className='';
		p.href='#';
		cancel('/scripts/'+url+'p='+(_pg[id]-i)); // zrusime tuto akci, budeme listovat na opacnou stranu
	}
	
	var npg=_pg[id]+i, a=$(id), c=getParent(a,'DIV', null, 1), b;
	
	if(npg<0) return false;
	
	if(type) ph.preloader(c);
	else{
		o.className = 'aloading';
		o.removeAttribute('href');
	}
	
	get('/scripts/'+url+'p='+npg, function(r)
	{
		if(!type){
			o.className='';
			o.href='#';
		}
		if(type && r.indexOf('ph.lo')<0) ph.lo.style.display='none';
		if(!r){
			if(type) $(id+'_next').className='bigslide-next bigslide-next-disabled';
			else $(id+'_next').style.display='none';
			return;
		}
		if(!type) setCookie('slide'+id, npg, 60, '/');
		
		gtimer.stopUID(id, 1); // dokončíme animaci, pokud nějaká probíhá
		
		if(o=$(id+'_prev')){
			if(type) o.className=npg>0?'bigslide-prev':'bigslide-prev bigslide-prev-disabled';
			else o.style.display=npg>0?'inline-block':'none';
		}
		var next = r.substring(0,1)=='1';
		if(type) $(id+'_next').className=next?'bigslide-next':'bigslide-next bigslide-next-disabled';
		else $(id+'_next').style.display=next?'inline-block':'none';
		
		r=r.substring(1);
		
		if(!(b=$(id+'B'))){
			// vytvoříme druhý obsahový element,
			// který bude sloužit jako druhá strana, na kterou animujeme
			b=document.createElement('DIV');
			b.id=id+'B';
			b.className='pg';
			c.appendChild(b);
			b.style.left='100%';
			b.style.position='absolute';
			a.style.position='absolute';
			c.style.height=a.offsetHeight+'px';
		}else{
			if(b.offsetLeft == 0){
				var t=b;
				b=a;
				a=t;
			}
		}
		
		var w=b.offsetWidth, ndir=_pg[id]<npg;
		
		b.innerHTML=r; // nový obsah
		
		gtimer.add(750, 'sin', function(n){ // posouváme obě stránky a přecházíme na druhou
			if(ndir){
				a.style.left=-n+'px';
				b.style.left=w-n+'px';
			}else{
				a.style.left=n+'px';
				b.style.left=n-w+'px';
			}
		}, 0, w, null, id);
		
		rsz(c, b.offsetHeight); // plynule upraví výšku elementu, protože se změnil obsah
		
		_pg[id]=npg; // upravíme číslo strany
	});
	
	return false;
}

/**
* Plynule změní výšku objektu
*
* @param (object) objekt
* @param (integer) nová výška objektu
*/
function rsz(o, to){
	gtimer.add(500, 'sin', function(n){o.style.height=n+'px';}, o.offsetHeight, to);
}


//------------------------------------------------ ANKETY
/**
* HLASUJ
*
* @param (integer) ID ankety
* @param (string) celá URL, kam má být zaslán AJAX požadavek
* @param (integer) maximální počet odpovědí (obvykle 1)
* @param (string) instance ankety (nestačí ID ankety, neboť jedna anketa může být na stránce vícekrát!)
*
* @return (bool) false
*/
function vote(id, url, maxopts, inst)
{
	var opts = 0, pollAns=[], els = $('anketa'+id+inst).getElementsByTagName('input'), i, d;
	
	for(i=0; i<els.length; i++){
		if(els[i].name=='ansid[]' && els[i].checked){
			pollAns[opts]=els[i].value;
			opts++;
		}
	}
	if(opts==0 || opts>maxopts){
		if(opts==0)
			alert('Nejdříve vyber svou odpověď.');
		else
			alert('Vyber maximálně '+maxopts+' možnosti.');
		return false;
	}
	
	var d=$('jsloading'+id+inst);
	if(!d){
		d=document.createElement('div');
		d.id='jsloading'+id+inst;
		d.className='jsloading';
		d.innerHTML='odesílám...';
		$('pollfooter'+id+inst).appendChild(d);
	}else
		d.style.display='block';
	
	$('subvote'+id+inst).style.display='none';
	
	get(url+'&js=1&ansid[]='+pollAns.join('&ansid[]='), function(r){voted(r,id,inst);});
	
	return false;
}

/**
* Hlasování ankety bylo uloženo
* (dostali jsme odpověď od serveru)
*
* @param (string) odpověď serveru - tzn. aktuální výsledky hlasování
* @param (integer) ID ankety
* @param (string) instance ankety
*/
function voted(r, id, inst)
{
	$('jsloading'+id+inst).style.display='none';
	if(!r){
		$('subvote'+id+inst).style.display='block';
		return alert('Došlo k chybě! Prosím zkus hlasovat znovu.');
	}
	r = r.split(',');
	
	var thanks = document.createElement('DIV');
	thanks.className='poll-thanks';
	thanks.innerHTML = '...díky za hlas!';
	$('pollfooter'+id+inst).appendChild(thanks);
	
	var o=$('polltotal'+id+inst);
	o.innerHTML = r[0]; // celkový počet hlasů
	
	var a, els, fade, p, pb, pl, i, j=1;
	
	a = $('anketa'+id+inst);
	if(a.className.indexOf('poll-hidden')>-1) fade=1; // výsledky nebyly vidět => provedeme efekt rozsvícení
	a.className = 'poll poll-voted';
	
	els = a.getElementsByTagName('input'); // odpovědi
	for(i=0; i<els.length; i++)
	{
		if(els[i].name=='ansid[]') // procházíme každou odpověď a nastavujeme časovač
		{
			poll_reg(els[i].value+inst, parseInt(r[j]), fade, id);
			j++;
		}
	}
	gtimer.startUID('p'+id); // nyní spustíme animaci všech sloupců odpovědí v dané anketě
}

/**
* Nastaví časovač pro upravení velikosti grafického sloupce u jedné odpovědi
*
* @param (integer) číslo odpovědi dané ankety
* @param (integer) velikost v procentech
* @param (integer) pokud TRUE, pak bude přidán efekt rozsvícení (z neprůhledné do viditelné)
*                  to se používá pokud výsledky nebyly před hlasováním vidět
* @param (integer) číslo odpovědi v anketě
*/
function poll_reg(k, perc, fade, id)
{
	var p=$('pipe'+k), pb=$('pipebar'+k), pl=$('pipelbl'+k), curr=parseInt(pb.style.width);
	if(!curr) curr=0;
	if(perc != curr){
		if(fade){
			setOpacity(p, 0);
			gtimer.add(500, 'cos', function(n){setOpacity(p,n)}, 0, 10, 0, 'p'+id, 1);
		}
		gtimer.add(1000, 'sin', function(n){n=Math.round(n);pb.style.width=n+'%';pl.innerHTML=n+'%';}, curr, perc, 0, 'p'+id, 1);
	}
}
