/**
*
* JavaScript knihovna s metodami pro práci s obrázky
*
* @package		sllibs3
* @subpackage	jslibs
* @version		$Id: sl.image.js 16660 2010-04-29 11:30:15Z michal $
* @encoding		UTF-8
* @author		Michal Kouďa <michal.kouda@e4you.cz>
* @copyright	(c) e4you spol. s r.o. 2002-2010, <design@e4you.cz>
*
* Obsah tohoto souboru je majetkem e4you spol. s r.o. Jeho kopírování,
* pozměňování, šíření a jakékoli další využití je možné výhradně
* se souhlasem e4you spol. s r.o.
*
*/

/// pokud není knihovna označena jako natažená, načteme ji
if(!sl.loaded['sl.image.js']) {

	/// vložíme potřebné knihovny
	sl.require('sl.dom.js');
	sl.require('sl.http.js');
	sl.require('sl.effect.js');

	/// definujeme modul a jeho metody
	sl.image = {


		/**
		* Objekt s plnou verzí obrázku
		*
		* @var object
		*/
		full_size_box: null,


		/**
		* Plná verze obrázku
		*
		* @var object
		*/
		image_object: null,


		/**
		* Objekt s křížkem pro zavření obrázku
		*
		* @var object
		*/
		close_object: null,


		/**
		* Identifikátor intervalu pro posun náhledů v kompaktní galerii
		*
		* @var object
		*/
		thumbs_move_interval: null,


		/**
		* Čas (v milisekundách), po kterém proběhne ztmavení mizejícího obrázku
		* @var integer
		*/
		dimming_time: 100,


		/**
		* Krok o který bude ztmaven, mizející obrázek
		* @var float
		*/
		dimming_step: 0.3,


		/**
		* Čas (v milisekundách), po kterém proběhne jeden krok změny průhlednosti obrázku
		* @var integer
		*/
		opacity_time: 100,


		/**
		* Krok o který bude průhlednost změněna
		* @var float
		*/
		opacity_step: 0.3,

		/** Text pro tlačítko rotující obrázek vlevo */
		rotate_to_left_text: 'Rotate left',

		/** Text pro tlačítko rotující obrázek vpravo */
		rotate_to_right_text: 'Rotate right',



		/**
		* Zobrazí náhled obrázku, jehož jméno je předáno jako parametr
		* @param string jméno obrázku který chceme zobrazit
		* @param string popis obrázku
		*/
		preview: function (picture, comment) {

			try {
				if(this.previewWindow) {
					this.previewWindow.close();
				}
			} catch (error) {}

			this.previewWindow = window.open('','picturedetail','resizable=no,location=no,status=no,scrollbars=no');

			with(this.previewWindow) {

				document.open();
				document.write('<html>\n<head>\n\t<title>' + comment + '</title>\n\t<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n</head>\n');
				document.write('<body style="background-color:#333; color:#eee; margin:.4em; text-align:center;">');
				document.write('<img id="image" src="' + picture + '" alt="' + comment + '" onclick="window.close();">');

				if(comment) {
					document.write('<div id="description">' + comment + '</div>\n');
				}

				document.write('</body>\n</html>\n');
				document.close();

				if(document.images[0]) {

					document.images[0].onload = function () {

						var document_width = document.images[0].width + 20;
						var document_height = document.images[0].height + 40;
						if(comment) {
							document_height += 16;
						}
						resizeTo(document_width, document_height);

					}

					document.images[0].onload();

				}

				focus();

			}

		},

		/**
		 * Nastaví obrázkům v rámci předaného objektu událost onclick,
		 * která otevře plnou verzi obrázku
		 *
		 * @param object_id string Css id elementu, v jehož rámci vyhledáme obrázky
		 * @param baseuri string Baseuri
		 * @param thumbs_dir string Adresář s náhledy obrázků
		 * @param full_size_dir strint Adresář s plnými verzemi obrázků
		 */
		initFullSizePreview: function(object_id,baseuri,thumbs_dir,full_size_dir) {
			try {
				/// zjistíme, jestli je předán adresář s náhledy a plnými velikostmi obrázků, jinak nastavíme defaultní hodnoty
				thumbs_dir = thumbs_dir ? thumbs_dir : 'thumbs';
				full_size_dir = full_size_dir ? full_size_dir : 'full-size';
				/// regulární výraz, jehož pomocí identifikujeme obrázky, které se mají otevřít v novém okně
				/// jsou to obrázky uložené v předaném adresáři s náhledy
				image_regexp = thumbs_dir+'/([0-9a-z-]+\.[a-z]{3})';
				/// zjistíme si obrázky obsažené v předaném elementu
				object_images = sl.dom.getElement(object_id).getElementsByTagName('IMG');
				/// projdeme je a pokud vyhovují regulárnímu výrazu, nastavíme jim událost onclick
				for (var i=0;i<object_images.length; i++) {
					if (object_images[i].src.match(image_regexp)) {
						object_images[i].style.cursor='pointer';
						object_images[i].onclick = function() {
							///sl.image.preview(baseuri+'images/'+full_size_dir+'/'+this.src.match(image_regexp)[1]);
							sl.image.showFullSize(baseuri+'images/'+full_size_dir+'/'+this.src.match(image_regexp)[1]);
						}
					}
				}
			} catch (e) { }
		},


		/**
		* Zobrazí plnou velikost obrázku v pozicovaném divu
		*
		* @param string image_src  cesta k obrázku
		* @param string description popis obrázku
		*
		* @todo lokalizovat
		*/
		showFullSize: function(image_src,description) {

			/// popis je nepovinný parametr
			description = description ? description : '';

			/// pokud již existuje objekt s plnou verzí obrázku, skryjeme ho
			if (sl.full_size_box) {
				window.top.document.body.removeChild(sl.full_size_box);
			}

			/// vytvoříme element a nastavíme jeho vlastnosti
			sl.full_size_box = window.top.document.createElement('div');

			/// aplikujeme na objekt sl.effect_factory (půjde jednoduše centrovat)
			new sl.effect_factory(sl.full_size_box);

			/// vložíme element do dokumentu
			window.top.document.body.appendChild(sl.full_size_box);
			sl.full_size_box.id = 'slImageFullSize';

			sl.full_size_box.style.position = 'absolute';
			sl.full_size_box.style.visibility = 'hidden';
			sl.full_size_box.innerHTML = "<img src='"+image_src+"' >  ";
			sl.full_size_box.innerHTML += '<div id="slImageDescription">' + description + '</div>\n';
			sl.full_size_box.innerHTML += "<div id='slImageClose'></div> ";

			/// pokud je zadán URL handler pro úpravu fotografií
			if(sl.image.image_edit_url) {
				/// vložíme kód pro zobrazení upravu fotografií

				var editbox = "<div id='slImageEdit'>";
				editbox += "<a class='rotateRight' title='" + sl.image.rotate_to_right_text + "' ";
				editbox += "onclick=\"sl.image.edit('" + image_src + "','rotate','right')\"></a>";
				editbox += "<a class='rotateLeft' title='" + sl.image.rotate_to_left_text + "' ";
				editbox += "onclick=\"sl.image.edit('" + image_src + "','rotate','left')\"></a>";
				editbox += "</div> ";

				sl.full_size_box.innerHTML += editbox;
			}

			/// zjistíme vlastnosti obrázku a 'křížku' pro zavření obrázku
			sl.image.image_object = sl.full_size_box.getElementsByTagName('IMG')[0];

			var new_image = new Image();

			new_image.onload = function() { sl.image.setFullSizeBox() };
			new_image.src = image_src;

		},


		/**
		 * Nastaví atributy elementu pro zobrazení plné verze obrázku
		 */
		setFullSizeBox: function () {

			if (sl.full_size_box) {

				sl.full_size_box.width = sl.image.image_object.width+30;
				sl.full_size_box.style.width = sl.full_size_box.width+'px';
				sl.full_size_box.style.padding = '15px';

				/// vycentrujeme box na obrazovce
				sl.full_size_box.effect_factory.center();

				/// přidáme 'obálce' drag&drop
				sl.dragAndDrop.initElement(sl.full_size_box);

				/// nastavíme nad obrázkem a křížkem kurzor 'ruku' a na kliknutí událost - zavření obrázku
				sl.image.close_object = sl.dom.getElement('slImageClose', window.top.document);
				sl.image.close_object.onclick = sl.image.hideImage;
				sl.image.close_object.style.cursor = 'pointer';
				sl.image.image_object.onclick = sl.image.hideImage;
				sl.image.image_object.style.cursor = 'pointer';

				/// zobrazíme
				sl.full_size_box.style.display = 'block';
				sl.full_size_box.style.visibility = 'visible';
			}
		},


		/**
		 * Skryje plnou verzi obrázku
		 *
		 * @todo udělat variantně skrytí pomocí "stmívání" a bez něj
		 */
		hideImage: function () {
			if (sl.full_size_box) {
				sl.full_size_box.effect_factory.dim();
			}
		},


		/**
		 * Načte obrázek pro zobrazení v kompaktní galerii a zobrazí ho
		 *
		 * @param src string Cesta k obrázku
		 */
		showCompactGalleryImage: function(src) {

			/// načteme nový obrázek, abychom mohli zjistit jeho vlastnosti
			var new_image = new Image();

			/// je-li zcela načten, zavoláme funkci, která ho zobrazí
			new_image.onload = function() { sl.image.setCompactGalleryImage(new_image) };

			/// tím, že src nastavíme až po onload zamezíme načítání obrázku z cache a problémům s IE 7
			new_image.src = src;
		},


		/**
		 * Zobrazí obrázek, předaný jako parametru, v kompaktní galerii
		 * Před zobrazením přizpůsobí jeho velikost oknu
		 *
		 * @param new_image object Objekt s obrázkem, který se má zobrazit
		 */
		setCompactGalleryImage: function(new_image) {

			/// objekt s aktuálně zobrazeným obrázkem, který budeme nahrazovat za nový
			var current_image = sl.dom.getElement('compact_gallery_main_image')

			var image_window = sl.dom.getElement('compact_gallery_full_size');

			var opacity_interval = null;

			/// aktuální průhlednost
			var current_opacity = 0;
			/// pro IE
			if (current_image.style.filter!=undefined) {
				current_image.style.filter = 'alpha(opacity=0)';
			/// pro slušné prohlížeče
			} else {
				current_image.style.opacity = current_opacity;
			}

			/// pokud se obrázek nevejde do zobrazovacího rámce, upravíme jeho velikost
			if ( (new_image.height > image_window.offsetHeight)  || (new_image.width > image_window.offsetWidth) ) {
				/// je-li šířka větší než výška nebo je výška obrázku menší než výška okna
				if (new_image.width>=new_image.height || new_image.height <=image_window.offsetHeight) {
					/// nastavíme šířku podle okna a dopočítáme výšku
					new_image.height = Math.round(image_window.offsetWidth*(new_image.height/new_image.width));
					new_image.width  = image_window.offsetWidth;
				} else {
					/// jinak nastavíme výšku podle okna a dopočítáme šířku
					new_image.width = Math.round(image_window.offsetHeight*(new_image.width/new_image.height));
					new_image.height  = image_window.offsetHeight;
				}
			}

			/// aktualizujeme velikost stávajícího obrázku
			current_image.style.height = new_image.height+'px';
			current_image.style.width = new_image.width+'px';
			current_image.src = new_image.src;

			clearInterval(opacity_interval);

			/// spustíme anonymní funkci, která zajistí přechod od nulové do plné průhlednosti
			/// @todo - část kódu pro skrytí objektu pomocí průhlednosti - vytvořit novou knihovnu sl.effect a přesunout do ní
			opacity_interval = setInterval(function() {
				/// pokud jsme dosáhli plné viditelnosti
				if (current_opacity >= 1) {
					/// zastavíme provádění funkce
					clearInterval(opacity_interval);
				}

				/// průhlednost 0-1 (používá vše kromě IE)
				current_opacity = current_opacity + sl.image.opacity_step;

				/// pro IE
				if (current_image.style.filter!=undefined) {
					current_image.style.filter = 'alpha(opacity=' + (current_opacity * 100) + ')';
				/// pro slušné prohlížeče
				} else {
					current_image.style.opacity =  current_opacity ;
				}
			}, sl.image.opacity_time);

		},


		/**
		 * Provede posunutí náhledů v kompaktní galerii
		 *
		 * @param direction string Určuje směr posunu (left|right)
		 */
		moveThumbs: function(direction) {

			/// vytvoříme objekt s dom elementem, maskujícím náhledy
			var preview_box = sl.dom.getElement('compact_gallery_preview');
			/// vytvoříme objekt s dom elementem, který budeme posouvat, obsahujícím náhledy
			var thumbs_box = sl.dom.getElement('compact_gallery_thumbs');

			/// sečteme šírku všechn náhledů a tak zjistíme jejich celkovou šírku
			/// @todo - ještě bychom měli započítávat margin
			var thumbs_width = 0;
			var thumbs = thumbs_box.getElementsByTagName('IMG');
			for (var i=0 ; i<thumbs.length ; i++ ) {
				thumbs_width = thumbs_width+thumbs[i].offsetWidth;
			}

			/// nastavíme výchozí pozici náhledů
			var counter = thumbs_box.style.left=='' ? 0 : parseInt(thumbs_box.style.left) ;

			/// preventivně zastavíme posnu, který již případně může probíhat
			clearInterval(sl.image.thumbs_move_interval);

			/// zahájíme posun
			sl.image.thumbs_move_interval = setInterval(function() {

				/// posun vlevo
				if (direction=='left') {
					//if (counter <= 0-thumbs_width+(preview_box.offsetWidth/(1.4+(thumbs[1].offsetWidth/1000))) ) {
					if (counter <= 0-thumbs_width+(preview_box.offsetWidth/(1.4+(thumbs[1].offsetWidth/1000))) ) {
						clearInterval(sl.image.thumbs_move_interval);
					} else {
						counter = counter - 4;
					}

				/// posun vpravo
				} else {
					if ((counter >= thumbs_width - preview_box.offsetWidth*thumbs_width/(0.028*(thumbs[1].offsetWidth))) && (counter >=0)){

						clearInterval(sl.image.thumbs_move_interval);
					} else {
						counter = counter + 4;
					}
				}
				thumbs_box.style.left = counter+'px';
			}, 30);

		},


		/**
		 * Zastaví posouvání náhledů v kompaktní galerii
		 *
		 */
		stopThumbs: function() {
			clearInterval(sl.image.thumbs_move_interval);
		},


		/**
		* Odešle požadavek na editaci fotografie a pokud je vrácen úspěch reloaduje fotografii
		*
		* @param string _name jméno souboru s obrázkem který má být editován
		* @param string _action akce, která má být s fotografií provedena
		* @param string _parameters parametry akce
		*
		* @todo lokalizovat
		*/
		edit: function(_name, _action, _parameters) {

			/// pokud neni zadano URI handleru pro editaci fotografii
			if(!sl.image.image_edit_url) {
				/// generujeme vyjimku
				throw new Error('Image edit handler uri not set!');
			}

			/// zaregistrujeme HTTP handler pro upravení fotografiepro získání dat návštěv
			sl.http.request(
				sl.image.image_edit_url
					+ '?name=' + escape(_name)
					+ '&action=' + escape(_action)
					+ '&parameters=' + escape(_parameters),
				function (_data) {
					/// pokud editace proběhla úspěšně a je otevřené okno s obrázkem
					/// provedeme reload obrázku
					if(_data=='OK' && sl.image.image_object) {
						/// zjistíme si nové uri - aktuální + za něj přiopojíme čas aby se obrazek reloadoval
						var image_uri = sl.image.image_object.src.split('?')
						var _date = new Date();

						/// přizpůsobíme velikost okna načtenému obrázku
						sl.image.image_object.onload = function() { sl.image.setFullSizeBox() };
						sl.image.image_object.src = image_uri[0] + '?' + _date.getTime();
					} else if (_data!='') {
						alert (_data);
					}
				}
			);

		}

	}

	/// označíme knihovnu jako načtenou
	sl.loaded['sl.image.js'] = true;
}

