﻿// Ovládání galerií vytvořených pomocí inCMS
// (C)2007 Špika David, Inexes

var galleries = {
	// Pole obsahující jednotlivé galerie na stránce
	items : new Array(),
	// Odkaz na popup okno
	win : null
	}	

// Inicializační metoda, spuštěná až po načtení stránky
addEvent(window,'onload','galleries.postInit();');
galleries.postInit = function () {
	var body = document.getElementsByTagName('body')[0];
	if (!getObj('overlay')) {
		var overlay = document.createElement('div');
		overlay.id = 'overlay';
		body.appendChild(overlay);
		addEvent('overlay','onclick','displayObj(\'overlay\',false);galleries.hideLightbox();');
		}
	if (!getObj('lightbox')) {
		var lightbox = document.createElement('div');
		lightbox.id = 'lightbox';
		body.appendChild(lightbox);
		addEvent('lightbox','onclick','displayObj(\'overlay\',false);galleries.hideLightbox();');
		}
	var links = getElementsByClass('a','preload');
	this.preloadImages = new Array();
	for (var i=0; i<links.length; i++) {
		this.preloadImages[i] = new Image();
		this.preloadImages[i].src = links[i].href;
		}
	this.testCPU();
	}

// Inicializační metoda, kterou volá každá galerie při načítání stránky
// parametry: ID hlavního DIVu každé galerie (div class="gallery" id="gallery-ID" kde ID je pořadí galerie na stránce); příznaky zobrazení volitelných údajů
galleries.init = function (mainBoxID,displayTitle,displayDate,displayAuthor,displayFileName) {
	this.items.length++;
	this.items[this.items.length-1] = new Object();
	var gallery = this.items[this.items.length-1];
	gallery.id = parseInt(mainBoxID.split('-')[1]);
	var mainBox = getObj(mainBoxID);
	gallery.leftControl = mainBox.getElementsByTagName('div')[0].getElementsByTagName('span')[0];
	gallery.rightControl = mainBox.getElementsByTagName('div')[0].getElementsByTagName('span')[mainBox.getElementsByTagName('div')[0].getElementsByTagName('span').length-2];
	gallery.limitBox = mainBox.getElementsByTagName('div')[0].getElementsByTagName('div')[0].getElementsByTagName('div')[0];
	gallery.contentBox = gallery.limitBox.getElementsByTagName('div')[0];
	gallery.limitWidth = gallery.limitBox.offsetWidth;
	gallery.contentWidth = -15;
	gallery.position = 0;
	gallery.pictures = gallery.contentBox.getElementsByTagName('img');
	for (var i=0; i<gallery.pictures.length; i++) {
		gallery.contentWidth += gallery.pictures[i].offsetWidth + 15;
		if (browser.IE6) {
			addEvent(gallery.pictures[i],'onmouseover','o.className += \' hover\';');
			addEvent(gallery.pictures[i],'onmouseout','o.className = o.className.replace(\' hover\',\'\');');
			}
		}
	setObjStyle(gallery.contentBox,'width',(gallery.contentWidth + 15) + 'px');
	gallery.overflowWidth = gallery.contentWidth - gallery.limitWidth;
	if (gallery.overflowWidth > 0) {
		gallery.rightControl.className += ' rightControl-active';
		}
	gallery.displayTitle = displayTitle;
	gallery.displayDate = displayDate;
	gallery.displayAuthor = displayAuthor;
	gallery.displayFileName = displayFileName;
	if (browser.IE6) {
		addEvent(gallery.rightControl,'onmouseover','if (o.className.indexOf(\'rightControl-active\')!=-1) o.className += \' hover\';');
		addEvent(gallery.rightControl,'onmouseout','o.className = o.className.replace(\' hover\',\'\');');
		addEvent(gallery.leftControl,'onmouseover','if (o.className.indexOf(\'leftControl-active\')!=-1) o.className += \' hover\';');
		addEvent(gallery.leftControl,'onmouseout','o.className = o.className.replace(\' hover\',\'\');');
		}
	addEvent(gallery.rightControl,'onmouseover','galleries.rightControlOnMouseOver(' + (this.items.length-1) + ');');
	addEvent(gallery.rightControl,'onclick','galleries.rightControlOnClick(' + (this.items.length-1) + ');');
	addEvent(gallery.rightControl,'onmouseout','galleries.stopMove();');
	addEvent(gallery.leftControl,'onmouseover','galleries.leftControlOnMouseOver(' + (this.items.length-1) + ');');
	addEvent(gallery.leftControl,'onclick','galleries.leftControlOnClick(' + (this.items.length-1) + ');');
	addEvent(gallery.leftControl,'onmouseout','galleries.stopMove();');
	}

// Metoda otestuje rychlost počítače
// do this.testResult uloží časovou prodlevu
galleries.testCPU = function () {
	if (!this.testStartTime) {
		this.testStartTime = new Date();
		this.setOpacity('page',50);
		this.setOpacity('page',100);
		setTimeout('galleries.testCPU();',0);
		}
	else {
		this.testStopTime = new Date();
		this.testResult = this.testStopTime - this.testStartTime;
		}
	}

// Metoda spuštěná při najetí myši na pravou šipku
// parametry: pořadí galerie na stránce
galleries.rightControlOnMouseOver = function (number) {
	var gallery = this.items[number];
	if (gallery.rightControl.className.indexOf('rightControl-active') == -1) return;
	if (gallery.leftControl.className.indexOf('leftControl-active') == -1) 
		gallery.leftControl.className += ' leftControl-active';
	galleries.rightMove(number);
	clearInterval(this.timer);
	this.timer = setInterval('galleries.rightMove(' + number + ')',40);
	}

// Metoda volaná cyklicky, posouvá galerii doleva
// parametry: pořadí galerie na stránce
galleries.rightMove = function (number) {
	var gallery = this.items[number];
	var rightRemaining = gallery.overflowWidth + gallery.position;
	if (rightRemaining < 5) {
		gallery.position -= rightRemaining;
		this.stopMove();
		gallery.rightControl.className = 'rightControl';
		}
	else gallery.position -= 5;
	setObjStyle(gallery.contentBox,'left',(gallery.position) + 'px');
	}

// Metoda spuštěná při kliknutí na pravou šipku
// parametry: pořadí galerie na stránce
galleries.rightControlOnClick = function (number) {
	var gallery = this.items[number];
	if (gallery.rightControl.className.indexOf('rightControl-active') == -1) return;
	var rightRemaining = gallery.overflowWidth + gallery.position;
	gallery.position -= rightRemaining;
	this.stopMove();
	gallery.rightControl.className = 'rightControl';
	setObjStyle(gallery.contentBox,'left',(gallery.position) + 'px');
	}

// Metoda spuštěná při najetí myši na levou šipku
// parametry: pořadí galerie na stránce
galleries.leftControlOnMouseOver = function (number) {
	var gallery = this.items[number];
	if (gallery.leftControl.className.indexOf('leftControl-active') == -1) return;
	if (gallery.rightControl.className.indexOf('rightControl-active') == -1) 
		gallery.rightControl.className += ' rightControl-active';
	galleries.leftMove(number);
	clearInterval(this.timer);
	this.timer = setInterval('galleries.leftMove(' + number + ')',40);
	}

// Metoda volaná cyklicky, posouvá galerii doprava
// parametry: pořadí galerie na stránce
galleries.leftMove = function (number) {
	var gallery = this.items[number];
	if (gallery.position > -5) {
		gallery.position = 0;
		this.stopMove();
		gallery.leftControl.className = 'leftControl';
		}
	else gallery.position += 5;
	setObjStyle(gallery.contentBox,'left',(gallery.position) + 'px');
	}

// Metoda spuštěná při kliknutí na levou šipku
// parametry: pořadí galerie na stránce
galleries.leftControlOnClick = function (number) {
	var gallery = this.items[number];
	if (gallery.leftControl.className.indexOf('leftControl-active') == -1) return;
	gallery.position = 0;
	this.stopMove();
	gallery.leftControl.className = 'leftControl';
	setObjStyle(gallery.contentBox,'left',(gallery.position) + 'px');
	}

// Metoda zastaví posouvání (vynuluje časovač)
galleries.stopMove = function () {
	clearInterval(this.timer);
	}

// Metoda na otevření nového popup okna (pokud takto otevřené okno již existuje, dojde k jeho přepsání)
// parametry: url, šířka obrázku, výška obrázku
galleries.popup = function (src,width,height) {
	if (this.win) this.win.close();
	width += 20;
	height += 120;
	if (width < 400)  width = 400;
	if (height < 300) height = 300;
	if (width > 800 || height > 600) var s = 'scrollbars=yes';
	else var s = 'scrollbars=no';
	if (width > 800)  width = 800;
	if (height > 600) height = 600;
	var p = 'toolbar=no,menubar=no,location=no,resizable=yes,directories=no,status=no,width=' + width + ',height=' + height + ',left=' + (screen.availWidth/2-width/2) + ',top=' + (screen.availHeight/2-height/2) + ',' + s;
	this.win = window.open(src,'',p);
	this.win.focus();
	return false;
	}

// Metoda vrátí aktuální velikost okna
galleries.windowSize = function () {
	if (document.documentElement && document.documentElement.clientWidth) {
		var size = { width : document.documentElement.clientWidth, height : document.documentElement.clientHeight };
		return size;
		}
	else if (document.body && document.body.clientWidth) {
		var size = { width : document.body.clientWidth,	height : document.body.clientHeight };
		return size;
		}
	else var size = { width : 0, height : 0 };
	return size;
	}

// Metoda vrátí aktuální pozici stránky
galleries.pagePosition = function () {
	var left = (window.pageXOffset) ? window.pageXOffset
		: (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft
		: (document.body) ? document.body.scrollLeft
		: 0;
	var top = (window.pageYOffset) ? window.pageYOffset
		: (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop
		: (document.body) ? document.body.scrollTop
		: 0;
	var position = { x : left, y : top };
	return position;
	}

// Metoda vrátí aktuální velikost stránky
galleries.pageSize = function () {
	var w = (window.innerWidth && window.scrollMaxX) ? window.innerWidth + window.scrollMaxX
		: (document.body.scrollWidth > document.body.offsetWidth) ? document.body.scrollWidth
		: document.body.offsetWidth;
	var h = (window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY
		: (document.body.scrollHeight > document.body.offsetHeight) ? document.body.scrollHeight
		: document.body.offsetHeight;
	if (w < this.windowSize().width) w = this.windowSize().width;
	if (h < this.windowSize().height) h = this.windowSize().height;
	var size = { width : w, height : h };
	return size;
	}

// Metoda nastaví pozici vysvíceného boxu na prostředek okna
addEvent(window,'onresize','galleries.lightboxPosition();');
galleries.lightboxPosition = function () {
	if (getObj('overlay') && getObj('lightbox')) {
		var top = (this.windowSize().height - getObj('lightbox').offsetHeight)/3.2 + this.pagePosition().y;
		var left = (this.windowSize().width - getObj('lightbox').offsetWidth)/2 + this.pagePosition().x;
		if (top < this.pagePosition().y + 10) top = this.pagePosition().y + 10;
		if (left < 10) left = 10;
		setObjStyle('lightbox','top',top + 'px');
		setObjStyle('lightbox','left',left + 'px');
		if (browser.IE) {
			setObjStyle('overlay','width',(this.pageSize().width) + 'px');
			setObjStyle('overlay','height',(this.pageSize().height) + 'px');
			}
		}
	}

// Metoda zobrazí vysvícený box (detail galerie)
galleries.showLightbox = function (number,src,width,height,title,date,author,fileName,description) {
	for (var i=0; i<this.items.length; i++) {
		if (this.items[i].id == number) {
			var gallery = this.items[i];
			break;
			}
		}
	if (browser.IE6) setObjStyleByClass('select','','visibility','hidden');
//	setObjStyleByClass('object','','visibility','hidden');
//	setObjStyleByClass('embed','','visibility','hidden');
	var tempHTML = '<div id="lightbox-closer"></div>';
	if (gallery.displayTitle) tempHTML += '<h2 style="width:' + (width-33) + 'px">' + title + '</h2>';
	tempHTML += '<img src="' + src + '" width="' + width + '" height="' + height + '" alt="" />';
	if (gallery.displayDate || gallery.displayAuthor) {
		tempHTML += '<p class="dateAuthor" style="width:' + (width-6) + 'px">';
		if (gallery.displayDate) tempHTML +=  '<span class="date">' + date + '</span>';
		if (gallery.displayDate && gallery.displayAuthor) tempHTML += '&nbsp;|&nbsp;'
		if (gallery.displayAuthor) tempHTML +=  '<span class="author">' + author + '</span>';
		tempHTML += '</p>';
		}
	if (gallery.displayTitle && description && description != '') tempHTML += '<p class="description" style="width:' + (width-6) + 'px">' + description + '</p>';
	if (gallery.displayFileName) tempHTML += '<p class="fileName" style="width:' + (width-6) + 'px">' + fileName + '</p>';
	getObj('lightbox').innerHTML = tempHTML;
	displayObj('lightbox',true);
	this.lightboxPosition();
	this.transCounter = 0;
	this.transShowLocked = false;
	this.transHideLocked = false;
//	this.slowCPU = false;
	this.slowCPU = this.testResult > 500;
//	alert(this.testResult);
	this.transShowLightbox();
	return false;
	}

// Metoda postupně zobrazí vysvícený box
galleries.transShowLightbox = function () {
	if (this.transHideLocked) return;
	if (this.slowCPU) this.transCounter = 10;
	this.setOpacity('lightbox',(10*this.transCounter));
	if (this.transCounter < 10) {
		this.transShowLocked = true;
		this.transCounter++;
		this.transTimer = setTimeout('galleries.transShowLightbox();',0);
		}
	else if (this.transCounter == 10) {
		showObj('lightbox-closer',true);
		this.transCounter = (this.slowCPU) ? 10 : 0;
		displayObj('overlay',true);
		this.transShowLocked = false;
		}
	}

// Metoda postupně skryje vysvícený box
galleries.hideLightbox = function () {
	if (this.transShowLocked) return;
	if (this.slowCPU) this.transCounter = 11;
	this.setOpacity('lightbox',(this.transCounter > 9) ? 0 : 100-10*(this.transCounter+1));
	if (this.transCounter == 0) showObj('lightbox-closer',false);
	if (this.transCounter < 11) {
		this.transHideLocked = true;
		this.transCounter++;
		this.transTimer = setTimeout('galleries.hideLightbox();',0);
		}
	else if (this.transCounter == 11) {
		displayObj('lightbox',false);
		if (browser.IE6) setObjStyleByClass('select','','visibility','visible');
//		setObjStyleByClass('object','','visibility','visible');
//		setObjStyleByClass('embed','','visibility','visible');
		this.transCounter = (this.slowCPU) ? 11 : 0;
		this.transHideLocked = false;
		}
	}

// Metoda nastaví průhlednost html prvku
// parametry: html prvek (nebo jeho ID), hodnota průhlednosti 0-100
galleries.setOpacity = function (obj,val) {
	var o = getObj(obj);
	if (browser.IE) o.style.filter = (val == 100) ? 'none' : 'alpha(opacity=' + val + ')';
	else {
		o.style.MozOpacity = val/100;
		o.style.KHTMLOpacity = val/100;
		o.style.opacity = val/100;
		}
	}