/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/** Objekt vykreslujici jeden obrazek */
var JSImage = function(parentid, name, align) {

	this.parentid = parentid;
	this.name = name;
	this.align = align == "right" ? "right" : "left";

	var gal = JSImageGallery 
	var tmp = JSSlideShow.imagemap[name];
	if(tmp == null)
		return; 

	var data = {};
	for(var key in tmp)
        data[key] = tmp[key];
        
	data.load = true;
	data.image = this;
	data.path = gal.imgurlprefix + escape(name) + gal.imgurlsuffix 
	
	this.image = data;
	JSImageGallery.list.push(this);

}

/* ------------------------------------------------------------------------- */
/** Zjisti, jestli je aktualni obrazek viditelny a pokud ano, zobrazi ho. */
JSImage.prototype.loadImages = function() {

	if(JSImageGallery.isLoadSemaphoreLocked())
		return;
	
	var This = this;
	var win = false;
	

	var img = this.image;
	if(!img.load)
		return;
		
	if(!win) win = $(window);
	if(!JSImageGallery.isVisible(img.image, win))
		return;
		
	var fn;
	fn = function() {
		var i = this.imageobj
		$(this).unbind("load", fn);
		$(this).unbind("error", fn);
		if(window.opera) i.root.css("visibility", "hidden");
		window.setTimeout(function() {
			if(window.opera) i.root.css("visibility", "");
			JSImageGallery.loadThumbsSemaphore = true;
			JSImageGallery.loadImages();
		},10);
	}

	if(JSImageGallery.isLoadSemaphoreLocked())
		return;

	JSImageGallery.loadThumbsSemaphore = false;
	img.image.bind("load", fn);
	img.image.bind("error", fn);
	img.image.attr("src", img.path);
	img.load = false;

}

/* ------------------------------------------------------------------------- */
/** Akce spustena pote, co je plne pristupny DOM. */
JSImage.prototype.ready = function() {

//<div class="img iright"><a href="#"><img src="test1.jpg" width="125" height="83" alt="" /></a></div>

	var This = this;
	this.div = $("#" + this.parentid);
	this.image.root = this.div;
	this.div.css("display", "none");
	if(!this.div.hasClass("img"))
		this.div.toggleClass("img");
	if(this.image.c != null) {
		this.div.toggleClass("img_text");
		this.div.attr("title", $(this.image.c).text());
	}


	if(this.align == "right") {
		if(this.div.hasClass("ileft"))
			this.div.toggleClass("ileft");
		if(!this.div.hasClass("iright"))
			this.div.toggleClass("iright");
	}
	else {
		if(this.div.hasClass("iright"))
			this.div.toggleClass("iright");
		if(!this.div.hasClass("ileft"))
			this.div.toggleClass("ileft");
	}


	var cell = $("<div class='d1'><span></span></div>");
	cell.appendTo(this.div);
	
	var img = this.image;
	var im = $("<img src='" + JSImageGallery.defimg + "' width='" + img.w
		 + "' height='" + img.h + "' alt='' />");

	im.appendTo(cell);
	im.get()[0].imageobj = img;
	im.css("cursor", "pointer");
	im.bind("click", function(e) { JSImageGallery.imageClick(this.imageobj); });
	
	img.image = im;
	this.div.css("display", "");

	JSSlideShow.appendImage(img);
	
}











/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/** Objekt vykreslujici galerii obrazku */
var JSImageGallery = function(parentid) {

	var This = this;
	this.parentid = parentid;
	this.keys = new Array();
	this.images = new Array();
	JSImageGallery.list.push(this);
	
}

/* ------------------------------------------------------------------------- */
JSImageGallery.prototype.appendImage = function(name) {
	
	var gal = JSImageGallery 
	var tmp = JSSlideShow.imagemap[name];
	if(tmp == null)
		return; 
	
	var data = {};
	for(var key in tmp)
        data[key] = tmp[key];
        
	data.load = true;
	data.gallery = this;
	data.path = gal.imgurlprefix + escape(name) + gal.imgurlsuffix 
	
	this.images.push(data);
	this.keys[name] = this.images.length - 1;
	this.index = this.images.length - 1;
	
}
JSImageGallery.prototype.ai = JSImageGallery.prototype.appendImage;

/* ------------------------------------------------------------------------- */
/** Akce spustena pote, co je plne pristupny DOM. */
JSImageGallery.prototype.ready = function() {

	var This = this;
	this.gal = $("#" + this.parentid);
	this.gal.css("display", "none");
	if(!this.gal.hasClass("galerie"))
		this.gal.toggleClass("galerie");

	var cell = $("<div class='cell'></div>");
	cell.appendTo(this.gal);
	
	for(var i = 0; i < this.images.length; i++) {
		
		var img = this.images[i];
		var t1 = $("<div class='g1'></div>");
		var t2 = $("<div class='gimg'></div>");
		var t3 = $("<div><span></span></div>");
		var im = $("<img src='" + JSImageGallery.defimg + "' width='" + img.w
			 + "' height='" + img.h + "' alt='' />");
			 
		img.image = im;
		img.root = t1;

		im.appendTo(t3);
		t3.appendTo(t2);
		t2.appendTo(t1);
		t1.appendTo(cell);
		
		im.get()[0].imageobj = img;
		im.css("cursor", "pointer");
		im.bind("click", function(e) { JSImageGallery.imageClick(this.imageobj); });
		
		if(img.c) {
			t2.toggleClass("gimg_text");
			t2.attr("title", $(img.c).text());
			
		}

		JSSlideShow.appendImage(img);
		
	}
	
	this.gal.css("display", "");
//	this.gal.before($("<div class='galerie_pre'></div>"));
//	this.gal.after($("<div class='galerie_post'></div>"));
	
	$(window).bind("scroll", function(e) { JSImageGallery.loadImages(); });
	$(window).bind("resize", function(e) { JSImageGallery.loadImages(); });

}

/* ------------------------------------------------------------------------- */
/** Projede pole obrazku a ty, ktere jsou viditelne a pritom dosud nejsou
    natazene ze serveru, natahne. */
JSImageGallery.prototype.loadImages = function() {

	if(JSImageGallery.isLoadSemaphoreLocked())
		return;

	var This = this;
	var win = false;
	
	for(var i = 0; i < this.images.length; i++) {
	
		if(JSImageGallery.isLoadSemaphoreLocked())
			return;

		var img = this.images[i];
		if(!img.load)
			continue;
		
		if(!win) win = $(window);
		if(!JSImageGallery.isVisible(img.image, win))
			continue;
		
		var fn;
		fn = function() {
			var i = this.imageobj
			$(this).unbind("load", fn);
			$(this).unbind("error", fn);
			if(window.opera) i.root.css("visibility", "hidden");
			window.setTimeout(function() {
				if(window.opera) i.root.css("visibility", "");
				JSImageGallery.loadThumbsSemaphore = true;
				JSImageGallery.loadImages();
			},10);
		}

		if(JSImageGallery.isLoadSemaphoreLocked())
			return;

		JSImageGallery.loadThumbsSemaphore = false;
		img.image.bind("load", fn);
		img.image.bind("error", fn);
		img.image.attr("src", img.path);
		img.load = false;

	}

}


/* ------------------------------------------------------------------------- */
/** Funkce vyvolana po klepnuti na obrazek. */
/* ------------------------------------------------------------------------- */
JSImageGallery.imageClick = function(img) {

	if(JSSlideShow.current) {
		JSSlideShow.current.destroy();
		JSSlideShow.current = false;
	}

	try { JSSlideShow.current = new JSSlideShow(img.ssindex, img.name); }
	catch(e) { }
			
}


/* ------------------------------------------------------------------------- */
JSImageGallery.isLoadSemaphoreLocked = function() {
	return !JSImageGallery.loadThumbsSemaphore || !JSSlideShow.loadSemaphore
}


/* ------------------------------------------------------------------------- */
JSImageGallery.isVisible = function(img, win) {
	
	var pos = img.offset();
	var top = parseInt(pos.top);
	var bottom = top + parseInt(img.height());

	var win = $(window);
	var wtop = win.scrollTop();
	var wbottom = wtop + JSImageGallery.winHeight(win);

	if(top > wbottom)
		return false;

	if(bottom < wtop)
		return false;
	
	return true;
	
	
}


/* ------------------------------------------------------------------------- */
JSImageGallery.loadImages = function() {
	for(var i = 0; i < JSImageGallery.list.length; i++)
		JSImageGallery.list[i].loadImages(); 
}

/* ------------------------------------------------------------------------- */
/** Funkce osetrujici nespravny vysledek zjisteni vysky okna v prohlizecich
    zalozenych na WebKitu. */
JSImageGallery.winHeight = function(win) {

	if(!win)
		win = $(window);

	return $.browser.safari
		? document.documentElement.clientHeight
		: win.height();
	
}


/* ------------------------------------------------------------------------- */
/** Doplnkova funkce pro aktualizaci odkazu na seznam zapisku - pokud
    uzivatel vlezl na stranku ze seznamu blogpostu, nacteme query string
    a doplnime ho do odkazu pro navrat na seznam vcetne parametru. */
JSImageGallery.updateBackLink = function() {
	
	// Nacteni odkazu na seznam zapisku
	var link = $(".bpListLink");
	if(link.length < 1)
		return;

	// Pokud nemame referrer, rovnou skoncime...
	var ref = document.referrer;
	if(ref == null || ref == "")
		return;

	// ...stejne tak pokud neni querystring
	var arr = ref.split("?", 2);
	var qs = arr.length > 1 ? arr[1] : null;
	var url = arr[0];
	if(qs == null || qs == "")
		return;


	// Oddeleni sessionid a pripadneho nazvu stranky od URL	
	var suf = JSImageGallery.imgurlsuffix;
	if(suf != null && suf != "") {
		var pat = new RegExp(suf + "$")
		if(url.match(pat))
			url = url.substring(0, url.length - suf.length);
	}
	if(url.match(/\/index$/))
		url = url.substring(0, url.length - 5);

	// Zpracovani zakladu soucasneho URL
	var cUrl = document.URL.split("?", 2)[0]
	var pat = /^(.+\/)[^/]+\/[^/]*$/
	var m = cUrl.match(pat);
	if(m != null)
		cUrl = m[1];
	
	// Pokud se url == cUrl, znamena to, ze sem prisel navstevnik
	// z tittulky a tudiz upravime navratovy odkaz.
	if(url == cUrl)
		link.attr("href", link.attr("href") + "?" + qs);
	
	
	
	
	 
	

}


/* ------------------------------------------------------------------------- */
/** Funkce volana pote, co je mozne zacist prochazet DOM. */
JSImageGallery.ready = function() {
	for(var i = 0; i < JSImageGallery.list.length; i++)
		JSImageGallery.list[i].ready(); 
	JSImageGallery.loadImages();
	JSSlideShow.ready();
	JSImageGallery.updateBackLink();	
}

JSImageGallery.list = new Array();
JSImageGallery.loadThumbsSemaphore = true;
$(document).ready(function() { JSImageGallery.ready(); });











/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/** Objekt zajistujici slideshow, jako parametr konstruktoru se udava pozice
    obrazku v seznamu obrazku. */
var JSSlideShow = function(index, name) { this.create(index, name); }
JSSlideShow.prototype.create = function(index, name) {

	// Protoze index nemusí platit (pokud slideshow pouziva jine razeni
	// obrazku, nez je razeni v galeriich nahledu), musime nejprve
	// zjistit spravny index odpovidajici nazvu
	var img = false;
	if(index != null && index < JSSlideShow.images.length) {
		img = JSSlideShow.images[index];
		if(img.name != name)
			img = false;
	}
	
	// Pokud nepodarilo hledani podle indexu, vyhledame obrazek podle jmena.
	if(!img) {
		for(var i = 0; i < JSSlideShow.images.length; i++) {
			if(JSSlideShow.images[i].name == name) {
				img = JSSlideShow.images[i];
				break;
			}
		}
	}
	
	if(!img)
		throw "Obrazek nenalezen.";
	

	// KHTML melo nejake problemy najit "body" a blbly kvuli tomu 
	// i dalsi funkce. Takze tady si ukladam informaci, ze je tohle
	// vyhledavani poskozene a ze se maji pouzivat nahradni metody.
	this.badSelectors = false;
	try { $("body") } catch(e) { this.badSelectors = true; }

	var This = this;
	var root = $("<div class='slideshow'></div>");
	
	$(this.badSelectors ? document.documentElement : "body").append(root)
	root.bind("click", function(e) {
		if(e.target && e.target.tagName.toLowerCase() == "a") return; 
		This.destroy();
	});
	root.bind("mousemove", function(e) {
		if(!This.chimg)
			This.showControls();
	});
	
	// Klavesove eventy je nutno navazat na document
	this.onkeydown1 = function(e) { This.onkeydown(e); }
	$(document).bind("keydown", this.onkeydown1);
	this.onkeypress1 = function(e) { This.onkeypress(e); }
	$(document).bind("keypress", this.onkeypress1);


	var domprefetch = $("<img />");
	domprefetch.bind("load", function(e) { This.onPrefetchLoad(); });
	domprefetch.bind("error", function(e) { This.onPrefetchLoad(); });

	var prefetchinfo = $("<div class='prefetchinfo'>Nacitam dalsi...</div>");
	root.append(prefetchinfo);

	var captionbox1 = $("<div class='captionbox1'></div>");
	var captionbox2 = $("<div class='captionbox2'></div>");
	root.append(captionbox1);
	captionbox1.append(captionbox2);
	captionbox1.visible = false;
	captionbox2.bind("click", function(e) {
		if(e.target && e.target.tagName.toLowerCase() == "a") return true; 
		e.stopPropagation();
	});

	var testCaptionbox1 = $("<div class='captionbox1'></div>");
	var testCaptionbox2 = $("<div class='captionbox2'></div>");
	testCaptionbox1.css("visibility", "hidden");
	testCaptionbox1.css("display", "none");
	root.append(testCaptionbox1);
	testCaptionbox1.append(testCaptionbox2);


	var namebox = $("<div class='namebox'></div>");
	namebox.text(JSSlideShow.images[index].name);
	if(JSSlideShow.images[index].exif) {
		namebox.text(JSSlideShow.images[index].name + " (EXIF)");
		namebox.css("cursor", "pointer");
	}
	else {
		namebox.text(JSSlideShow.images[index].name);
		namebox.css("cursor", "");
	}
	namebox.bind("click", function(e) {
		e.stopPropagation();
		This.renderExifbox();
	});
	root.append(namebox);


	var exifbox = $("<div class='exifbox'></div>");
	exifbox.bind("click", function(e) {
		This.destroyExifbox();
		e.stopPropagation();
	});
	root.append(exifbox);

	this.root = root;
	
	// Prvek IMG prednacitajici dalsi obrazek v poradi 
	this.domprefetch = domprefetch;
	// Box s informaci, ze se nacita dalsi obrazek
	this.prefetchinfo = prefetchinfo;
	// Aktualni index v seznamu obrazku
	this.index = img.ssindex;
	// Aktualne zobrazeny prvek IMG.
	this.domimg = false;
	// Obdelnik pro vykresleni nazvu obrazku
	this.namebox = namebox;
	// Obdelnik pro vykresleni informaci z EXIF
	this.exifbox = exifbox;
	// Obdelniky pro vykresleni popisku
	this.captionbox1 = captionbox1; 
	this.captionbox2 = captionbox2;
	this.testCaptionbox1 = testCaptionbox1; 
	this.testCaptionbox2 = testCaptionbox2;
	this.captionboxShow = !JSSlideShow.editMode; 
	// Pokud je nastaveno na true, nereaguje se na mousemove.
	// Kvuli Opere a MSIE, ktere pri prohazovani obrazku vyvola mousemove.
	this.chimg = false;
	// Rychlost efektu fadeIn a fadeOut
	this.showSpeed = 400;

	// Interval zobrazovani dalsich obrazku
	this.interval = 4;
	// Indikace, jestli je spustena slideshow nebo ne
	this.slideShow = false;
	// Timer pro prohazovani obrazku
	this.slideShowTimer = false;

	this.changeCaption();
	this.resize();

	var controls = this.createControls();
	// Box s ovladacimi prvky
	this.controls = controls;
	// Timer cekajici na skryti ovladacich prvku
	this.controlsTimer = false;
	root.append(controls);

	if(this.badSelectors)
		this.controls.css("display", "block");
	else
		this.controls.fadeIn(this.showSpeed);

	// Indikace, jestli jsou ovladaci prvky skryte nebo ne
	this.controls.hidden = false;
	// Doba (ms), po jejimz uplynuti bez toho, aby se hnula mys, jsou
	// skryty ovladaci prvky.
	this.controlsTimeout = 2000;
	this.controlsTimer = setTimeout(function() {
		This.hideControls();
	}, this.controlsTimeout);

}


/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.destroy = function() {

	this.ssStop();
	this.removeNode(this.root);
	$(document).unbind("keydown", this.onkeydown1);
	$(document).unbind("keypress", this.onkeypress1);
	JSSlideShow.loadSemaphore = true;
	JSSlideShow.current = false;
	JSImageGallery.loadImages();
	
	var url = window.location + ""; 
	var i = url.lastIndexOf("#");
	if(i < 0)
		return;

	url = url.substring(0, i);
	window.location = url + "#id=";
	 
}

/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.onkeydown = function(e) {

	var e = e ? e : window.event

	if(!e.ctrlKey && !e.altKey && e.keyCode == 27) {
		e.stopPropagation();
		e.preventDefault();
		if(!window.opera) this.destroy();
	}
	else if(!e.ctrlKey && !e.altKey && e.keyCode == 39) {
		this.ssStop();
		this.next();
	}
	else if(!e.ctrlKey && !e.altKey && e.keyCode == 37) {
		this.ssStop();
		this.previous();
	}

}


/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.onkeypress = function(e) {

	var e = e ? e : window.event

	if(!e.ctrlKey && !e.altKey && e.keyCode == 27) {
		e.preventDefault();
		if(window.opera) this.destroy();
	}
/*	
	else if(!e.ctrlKey && !e.altKey && e.keyCode == 39) {
		this.ssStop();
		this.next();
	}
	else if(!e.ctrlKey && !e.altKey && e.keyCode == 37) {
		this.ssStop();
		this.previous();
	}
*/
}


/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.createControls = function() {
	
	var This = this;
	var controls = $("<div class='controls'></div>");
	this.controls = controls;
	controls.bind("click", function(e) { e.stopPropagation(); });
	controls.bind("mousemove", function(e) {
		e.stopPropagation();
		if(This.controlsTimer) {
			clearTimeout(This.controlsTimer);
			This.controlsTimer = false;
		}
	});

	var previous = $("<span class='previous'></span>");
	controls.append(previous);

	var next = $("<span class='next'></span>");
	controls.append(next);

	var play = $("<span class='play'></span>");
	play.css("display", JSSlideShow.editMode ? "none" : "");
	controls.append(play);

	var pause = $("<span class='pause'></span>");
	pause.css("display", "none");
	controls.append(pause);

	var plus = $("<span class='plus'></span>");
	plus.css("display", JSSlideShow.editMode ? "none" : "");
	controls.append(plus);

	var interval = $("<span class='interval'>" + this.interval + " sec</span>");
	interval.css("display", JSSlideShow.editMode ? "none" : "");
	controls.append(interval);

	var minus = $("<span class='minus'></span>");
	minus.css("display", JSSlideShow.editMode ? "none" : "");
	controls.append(minus);

	var captions = $("<span class='toggleCaptions'></span>");
	captions.text(this.captionboxShow
		? JSSlideShow.resources.captionboxHide
		: JSSlideShow.resources.captionboxShow);
	captions.css("display", JSSlideShow.editMode ? "none" : "");
	controls.append(captions);

	this.createControlsEdit();

	var close = $("<span class='close'></span>");
	controls.append(close);

	previous.bind("click", function() {
		This.ssStop();
		This.previous();
	});
	next.bind("click", function() {
		This.ssStop();
		This.next();
	});
	close.bind("click", function() { This.destroy(); })

	play.bind("click", function() {
		This.ssStart();
	});
	pause.bind("click", function() {
		This.ssStop();
	});

	plus.bind("click", function() {
		This.addInterval(1);
		interval.text(This.interval + " sec");
	});
	minus.bind("click", function() {
		This.addInterval(-1);
		interval.text(This.interval + " sec");
	});

	captions.bind("click", function() {
		This.toggleCaptionboxShow();
		This.empty(captions);
		captions.text(This.captionboxShow
			? JSSlideShow.resources.captionboxHide
			: JSSlideShow.resources.captionboxShow);
	});

	controls.play = play;
	controls.pause = pause;
	controls.next = next;
	controls.previous = previous;

	return controls;

}

/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.createControlsEdit = function() { }


/* ------------------------------------------------------------------------- */
/** Vykresli box s informacemi z EXIF metadat */
JSSlideShow.prototype.renderExifbox = function() {

	this.destroyExifbox();
	var exifbox = this.exifbox;
	exifbox.html("");
	
	var image = JSSlideShow.images[this.index];
	var exif = image.exif;
	if(!exif)
		return;

	var lat = null, lon = null;
	var table = $("<div></div>")
	for(key in exif) {
	
		if(key == "exLat") { lat = exif[key]; continue; }
		if(key == "exLon") { lon = exif[key]; continue; }
	
		var resKey = JSSlideShow.resources[key];
		var row, cell;
		row = $("<div></div>");

		cell = $("<span></span>");
		cell.text((resKey ? resKey : key) + ":");
		row.append(cell);

		cell = $("<span></span>");
		cell.text(exif[key]);
		row.append(cell);

		table.append(row);

	}
	
	// GPS pozice
	var lat2 = null, lon2 = null;
	if(lat != null && lon != null) {
		var conv = function(l) {
			var m = l.match(/([\.\d]+)([WENS])/)
			var deg, min, sec, ref;
			var f = parseFloat(m[1]);
			deg = Math.floor(f);
			min = Math.floor(f = ((f - deg) * 60))
			sec = Math.round((f - min) * 60 * 100) / 100
			ref = m[2];
			return deg + "&#176; " + min + '" ' + sec + "' " + ref; 
		}
		try { lat2 = conv(lat); } catch(err) { }
		try { lon2 = conv(lon); } catch(err) { }
	}
	if(lat2 != null && lon2 != null) {

		var link = $("<a href=''></a>");
		link.html(lat2 + ", " + lon2);
		link.attr("href", "http://maps.google.com/maps?geocode=&q=" + lat + "," + lon);
		//link.bind("click", function(e) { e.stopPropagation(); });

		var resKey = JSSlideShow.resources["exPosition"];
		var row, cell;
		row = $("<div></div>");

		cell = $("<span></span>");
		cell.text(resKey + ":");
		row.append(cell);

		cell = $("<span></span>");
		cell.append(link);
		row.append(cell);

		table.append(row);
		
	}
	
	exifbox.append(table);
	exifbox.fadeIn(this.showSpeed);
	this.namebox.css("display", "none");

}


/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.destroyExifbox = function() {
	var exifbox = this.exifbox;
	this.namebox.css("display", "");
	exifbox.fadeOut(this.showSpeed);
}

/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.showControls = function() {

	var This = this;
	if(this.controlsTimer) {
		clearTimeout(this.controlsTimer);
		this.controlsTimer = false;
	}

	if(this.controls.hidden) {
	
		this.controls.hidden = false;
		if(this.badSelectors)
			this.controls.css("display", "block");
		else
			this.controls.fadeIn(this.showSpeed);
			
		if(this.root.hasClass("hideCursor"))
			this.root.toggleClass("hideCursor");
			
	}
	
	this.controlsTimer = setTimeout(function() {
		This.hideControls();
	}, this.controlsTimeout);
	
}


/* ------------------------------------------------------------------------- */
JSSlideShow.prototype.hideControls = function() {

	if(this.badSelectors)
		this.controls.css("display", "none");
	else
		this.controls.fadeOut(this.showSpeed);

	this.controls.hidden = true;
	this.controlsTimer = true;

	if(!this.root.hasClass("hideCursor"))
			this.root.toggleClass("hideCursor");

}


/* ------------------------------------------------------------------------- */
/** Zvetsi interval prohazovani obrazku o zadanou hodnotu (muze byt
    i zaporna). Pokud by byl vysledny interval mensi nez 2 sekundy, nastavi
    ho na 2. */
JSSlideShow.prototype.addInterval = function(incr) {

	var i = this.interval + incr;
	if(i < 2 && this.interval == 2)
		return;

	this.interval = Math.max(i, 2);
	if(this.slideShow) {
		this.ssStop();
		this.ssStart();	
	}

}



/* ------------------------------------------------------------------------- */
/** Spusti slideshow */
JSSlideShow.prototype.ssStart = function() {

	var This = this;
	if(this.slideShowTimer)
		clearTimeout(this.slideShowTimer);
		
	this.slideShow = true;
	this.slideShowTimer = setTimeout(function() {
		This.next();
	}, this.interval * 1000);

	this.controls.play.css("display", "none");
	this.controls.pause.css("display", "");

}

/* ------------------------------------------------------------------------- */
/** Zastavi slideshow */
JSSlideShow.prototype.ssStop = function() {

	if(this.slideShowTimer)
		clearTimeout(this.slideShowTimer);

	this.slideShowTimer = false;
	this.slideShow = false;

	this.controls.pause.css("display", "none");
	if(!JSSlideShow.editMode)
		this.controls.play.css("display", "");

}

/* ------------------------------------------------------------------------- */
/** Akce volana po zmene velikosti okna. */
JSSlideShow.prototype.resize = function() {

	// Velikost a pozice zakladniho boxu
	var win = $(window)
	var top  = 0;
	var left = 0;
	var width  = win.width();
	var height = JSImageGallery.winHeight(win)
	var margin = 0;
	var border = JSSlideShow.border;
	
	top += margin;
	left += margin;
	width -= 2 * (border + margin);
	height -= 2 * (border + margin);

	var root = this.root;
	root.css("width", width + "px");
	root.css("height", height + "px");
	root.css("top", top + "px");
	root.css("left", left + "px");

	this.boxwidth = width;
	this.boxheight = height;
	// Velikost a pozice obrazku
	this.setImagePosition();
	// Zruseni exifboxu
	this.destroyExifbox();
}


/* ------------------------------------------------------------------------- */
/** Vrati rozmery obrazku urceneho indexem odpovidajici rozmerum okna. */
JSSlideShow.prototype.calculateSize = function(index) {

	var This = this;
	var win = $(window)
	var margin = JSSlideShow.margin;
	var border = JSSlideShow.border;
	var width  = win.width() - 2 * (border + margin);
	var height = JSImageGallery.winHeight(win) - 2 * (border + margin)


	var margin = 10;
	var iwidth = width - 2 * margin;
	var iheight = height - 2 * margin;

	var cheight = 0;
	var image = JSSlideShow.images[index];
	if(image.hasOwnProperty("c") && this.captionboxShow) {

		var cb1 = this.testCaptionbox1;
		var cb2 = this.testCaptionbox2; 
		
		this.empty(cb2);
		cb2.append(image.c);
		cb1.css("display", "block");
		var cheight = JSImageGallery.winHeight() - cb1.position().top;
		cb1.css("display", "none");
		
		cheight = Math.round(cheight)
		if(cheight > JSSlideShow.maxcheight)
			cheight = 0;

	}
	if(cheight > 0)
		iheight = iheight - cheight + margin;

	var size = JSSlideShow.calculateSize(image, iwidth, iheight);
	size.cheight = cheight;
	size.margin = margin;
	
	return size;
	
}

/* ------------------------------------------------------------------------- */
/** Nastavi spravnou pozici a velikost obrazku. */
JSSlideShow.prototype.setImagePosition = function() {

	var This = this;
	var image = JSSlideShow.images[this.index];
	var size = this.calculateSize(this.index);
	if(!this.domimg || this.iw != size.width || this.ih != size.height) {

		var url = JSSlideShow.imgurlprefix + size.width + "/"
			 + size.height + "/" + escape(image.name)
			 + JSSlideShow.imgurlsuffix;

		var img = $("<img class='img' alt='' />");

		if(this.slideShowTimer)
			clearTimeout(this.slideShowTimer);

		this.chimg = true;
		JSSlideShow.loadSemaphore = false;
		img.bind("load", function(e) { This.onload(); });
		img.bind("error", function(e) { This.onload(); });
		img.css("position", "absolute");
		img.attr("width",  size.width);
		img.attr("height", size.height);
		img.attr("src", url);
		img.bind("click", function(e) {
			This.chimg = true;
			e.stopPropagation();
			This.ssStop();
			This.next();
		});		

		var olddomimg = this.domimg;		
		this.domimg = img;
		this.iw = size.width;
		this.ih = size.height;
		this.root.append(img);

		if(olddomimg)
			this.removeNode(olddomimg);
	
		// Tohle tu je jenom kvuli Opere, jinak obcas buhviproc
		// nezobrazi obrazek 
		this.prefetchinfo.css("display", "block");
		this.prefetchinfo.css("visibility", "hidden");

		// jeste zmenime URL kvuli primym odkazum...	
		this.changeUrl();

	}
	
	var width = This.domimg.outerWidth();
	var height = This.domimg.outerHeight();
	var left = Math.round((This.boxwidth - width) / 2);
	// Pokud byla zohlednena vyska popisku (size.cheight), zapocitame
	// jednak ji, jednak okraj... 
	var top = This.boxheight - height - size.cheight;
	if(size.cheight > 0) top += size.margin;
	top = Math.round(top / 2);
	This.domimg.css("left", left + "px");
	This.domimg.css("top", top + "px");
	
	setTimeout(function() { This.chimg = false; }, 10);

}


/* ------------------------------------------------------------------------- */
/** Zmena URL po prohozeni obrazku */
JSSlideShow.prototype.changeUrl = function() {

	var url = window.location + ""; 
	var i = url.lastIndexOf("#");
	if(i > -1)
		url = url.substring(0, i);
	
	var img = JSSlideShow.images[this.index];
	url += "#id=" + this.index + "&name=" + escape(img.name)

	window.location = url;

}

/* ------------------------------------------------------------------------- */
/** Prohodi aktualni obrazek za dalsi v poradi */
JSSlideShow.prototype.next = function() {
	var newindex = this.index + 1;
	if(newindex >= JSSlideShow.images.length)
		newindex = 0; 
	this.change(newindex);
}



/* ------------------------------------------------------------------------- */
/** Prohodi aktualni obrazek za predchozi v poradi */
JSSlideShow.prototype.previous = function() {
	var newindex = this.index - 1;
	if(newindex < 0)
		newindex = JSSlideShow.images.length - 1; 
	this.change(newindex);
}


/* ------------------------------------------------------------------------- */
/** Prohodi aktualni obrazek za obrazek odpovidajici zadanemu indexu. */
JSSlideShow.prototype.change = function(newindex) {

	this.destroyExifbox();

	if(newindex == this.index)
		return;

	this.iw = this.ih = false;
	this.index = newindex;
	this.changeCaption();
	this.setImagePosition();
	
	var image = JSSlideShow.images[this.index]
	if(image.exif) {
		this.namebox.text(image.name + " (EXIF)");
		this.namebox.css("cursor", "pointer");
	}
	else {
		this.namebox.text(image.name);
		this.namebox.css("cursor", "");
	}
	this.namebox.css("display", "");
		
}


/* ------------------------------------------------------------------------- */
/** Prehodi text popisku. */
JSSlideShow.prototype.changeCaption = function() {

	var img = JSSlideShow.images[this.index];
	if(img.hasOwnProperty("c") && img.c) {
		if(this.captionbox1.visible)
			this.empty(this.captionbox2);
		this.captionbox2.append(img.c);
		this.captionbox1.visible = true;
		this.captionbox1.css("display", this.captionboxShow ? "block" : "none");
	}
	else if(this.captionbox1.visible) {
		this.captionbox1.visible = false;
		this.captionbox1.css("display", "none");
		this.empty(this.captionbox2);
	}

}


/* ------------------------------------------------------------------------- */
/** Zmeni viditelnost popisku. */
JSSlideShow.prototype.toggleCaptionboxShow = function() {
	this.captionboxShow = !this.captionboxShow;
	this.changeCaption();
	this.resize();
	if(JSSlideShow.loadSemaphore)
		this.onload();
}

/* ------------------------------------------------------------------------- */
/** Prednacteni dalsiho obrazku. */
JSSlideShow.prototype.prefetch = function() {

	var nextindex = this.index + 1;
	if(nextindex >= JSSlideShow.images.length)
		nextindex = 0; 

	var image = JSSlideShow.images[nextindex];
	var size = this.calculateSize(nextindex);
	var url = JSSlideShow.imgurlprefix + size.width + "/"
		 + size.height + "/" + escape(image.name)
		 + JSSlideShow.imgurlsuffix;

	if(this.domprefetch.attr("src") == url)
		return;

	this.prefetchinfo.css("display", "block");
	this.prefetchinfo.css("visibility", "");
	this.domprefetch.attr("src", url);

}

/* ------------------------------------------------------------------------- */
/** Funkce volana po dokonceni nacitani obrazku. */
JSSlideShow.prototype.onload = function() {

	this.prefetchinfo.css("display", "");
	this.prefetchinfo.css("visibility", "");
	this.prefetch();
	
	if(this.slideShow)
		this.ssStart();

}


/* ------------------------------------------------------------------------- */
/** Funkce volana po dokonceni nacitani dalsiho obrazku. */
JSSlideShow.prototype.onPrefetchLoad = function() {
	this.prefetchinfo.css("display", "");
	this.prefetchinfo.css("visibility", "");
	JSSlideShow.loadSemaphore = true;
	JSImageGallery.loadImages();
}


/* ------------------------------------------------------------------------- */
/** Funkce pro odstraneni prvku ze stromu DOM - opravuje chybu pri pouziti
    standardni funkce jQuery v Konqueroru. */
JSSlideShow.prototype.removeNode = function(node) {
	var nodes = node.get();
	for(var i = 0; i < nodes.length; i++)
		nodes[i].parentNode.removeChild(nodes[i]);
}


/* ------------------------------------------------------------------------- */
/** Funkce pro odstraneni potomku ze stromu DOM - opravuje chybu pri pouziti
    standardni funkce jQuery v Konqueroru. */
JSSlideShow.prototype.empty = function(node) {
	var nodes = node.get();
	for(var i = 0; i < nodes.length; i++)
		while(nodes[i].childNodes.length > 0)
			nodes[i].removeChild(nodes[i].childNodes[0]);
}


/* ------------------------------------------------------------------------- */
/** Akce volana po zmene velikosti okna - zavola funkci resize()
    u aktivniho objektu. */
JSSlideShow.resize = function() {

	if(!JSSlideShow.current)
		return;

	if(JSSlideShow.timer)
		clearTimeout(JSSlideShow.timer);
		
	JSSlideShow.timer = setTimeout(function() {
		JSSlideShow.timer = false;
		if(JSSlideShow.current)
			JSSlideShow.current.resize();
	}, 100);

}


/* ------------------------------------------------------------------------- */
/** Funkce pro prepocitani rozmeru obrazku na povolenou velikost. */
JSSlideShow.calculateSize = function(img, mw, mh) {

	var b = true;
	for(var i = JSSlideShow.allowedWidths.length - 1; i >= 0; i--) {
		if(mw > JSSlideShow.allowedWidths[i]) {
			mw = JSSlideShow.allowedWidths[i]
			b = false;
			break;
		}
	}
	if(b) mw = JSSlideShow.allowedWidths[0];

	var b = true;
	for(var i = JSSlideShow.allowedHeights.length - 1; i >= 0; i--) {
		if(mh > JSSlideShow.allowedHeights[i]) {
			mh = JSSlideShow.allowedHeights[i]
			b = false;
			break;
		}
	}
	if(b) mh = JSSlideShow.allowedHeights[0];
	
	var w = img.ow;
	var h = img.oh;
	
	if(w <= mw && h <= mh)
		return { width: w, height: h };

	var ratiow = parseFloat(mw) / parseFloat(w);
	var ratioh = parseFloat(mh) / parseFloat(h);
	var ratio = Math.min(ratiow, ratioh);
	
	return {
		width:  Math.round(w * ratio),
		height: Math.round(h * ratio)
	}
	
}


/* ------------------------------------------------------------------------- */
/** Prida do slideshow dalsi obrazek. */
JSSlideShow.appendImage = function(img) {
	var index = JSSlideShow.images.length;
	JSSlideShow.images[index] = img;
	img.ssindex = index;
	return index;
}

/* ------------------------------------------------------------------------- */
/** Funkce volana pote, co je mozno prochazet DOMem. */
JSSlideShow.ready = function() {

	// Pokud je v URL obsazena i informace o tom, ktery obrazek se
	// ma zvetsit, zvetsime ho...
	var url = window.location + ""; 
	var i = url.lastIndexOf("#");
	if(i < 0)
		return;
		
	var s = url.substring(i + 1, url.length);
	var m = s.match(/^id=(\d+)&name=(.+)$/);
	if(m == null)
		return;

	var index = m[1];
	var name = unescape(m[2]);
	var img = false;
	
	// Nejdriv se pokusime vyhledat obrazek podle indexu		
	if(index < JSSlideShow.images.length) {
		img = JSSlideShow.images[index];
		if(img.name != name)
			img = false;
	}
	
	// Pokud se to nezdari, najdeme prvni obrazek odpovidajici jmenu.
	if(!img) {
		for(var i = 0; i < JSSlideShow.images.length; i++) {
			if(JSSlideShow.images[i].name == name) {
				img = JSSlideShow.images[i];
				break;
			}
		}
	}
	
	if(img)
		JSSlideShow.current = new JSSlideShow(img.ssindex, img.name);

}

/* ------------------------------------------------------------------------- */
/** Je predavan objekt s nasledujicimi vlastnostmi:
	name: nazev souboru
	path: cesta ke stazeni nahledu
	w: sirka nahledu
	h: vyska nahledu
	ow: sirka originalu
	oh: vyska originalu
	caption: popisek (volitelne) */
JSSlideShow.appendImageMap = function(img) {
	JSSlideShow.imagemap[img.name] = img;
}

JSSlideShow.ai = JSSlideShow.appendImageMap;
JSSlideShow.loadSemaphore = true;
JSSlideShow.current = false;
JSSlideShow.timer = false;
JSSlideShow.margin = 10;
JSSlideShow.border = 2;
JSSlideShow.maxcheight = 70;
JSSlideShow.images = new Array();
JSSlideShow.imagemap = new Array();
JSSlideShow.editMode = false; 
JSSlideShow.resources = {
	captionboxShow: "Zobrazit popisky",
	captionboxHide: "Skryt popisky"
};

$(window).bind("resize", function(e) { JSSlideShow.resize(); }); 

