function regEventHandler(eventName,elem,eventHandler)
{
	if(elem == null){
		alert("elem is null !!");
		return;
		}
	if(typeof addEventListener != "undefined")
		elem.addEventListener(eventName,eventHandler, false);
	else if(typeof attachEvent != "undefined")
		elem.attachEvent("on" + eventName,eventHandler);
}

function removeEventHandler(eventName,elem,eventHandler)
{
	if(typeof removeEventListener != "undefined")
		elem.removeEventListener(eventName,eventHandler, false);
	else if(typeof detachEvent != "undefined")
		elem.detachEvent("on" + eventName,eventHandler);
}


function getEventTarget(e)
{
	if(typeof e.target == "object")
		return e.target;
	else if(typeof e.srcElement == "object")
		return e.srcElement;
}

function preventDefault(e)
{
	if(typeof e.preventDefault != "undefined")
		e.preventDefault();
	else if(e.type != "mouseover")
		e.returnValue = false;
	else
		e.returnValue = true;
}

function getBodyElement()
{
	var htmlChilds = document.documentElement.childNodes;
	for(k = 0 ; k < htmlChilds.length ; k ++ ){
		if(htmlChilds[k].nodeName == "BODY")
			return htmlChilds[k];
	}
	return null;
}

function getScroll()
{
	if(self.pageYOffset){	// převzato z JQuery
    	scrollTop = self.pageYOffset;
		scrollLeft = self.pageXOffset;
    }else if(document.documentElement && document.documentElement.scrollTop){
		 scrollTop = document.documentElement.scrollTop;
		 scrollLeft = document.documentElement.scrollLeft;
    }else if(document.body){
		 scrollTop = document.body.scrollTop;
		 scrollLeft = document.body.scrollLeft;
    }else{
    	scrollTop = 0;
		scrollLeft = 0;
	}
	return  {scrollTop:scrollTop, scrollLeft:scrollLeft};
}

regEventHandler("click",document,openLargeBox);
regEventHandler("resize",window,handleResize);

function createLargeBox()
{
	bodyElem = getBodyElement();
	pageOverlay = document.createElement("DIV");
	pageOverlay.id = "page-overlay";
	pageOverlay.className = "none";
	bodyElem.appendChild(pageOverlay);
	caption = document.createElement("H3");
	button = document.createElement("SPAN");
	button.innerHTML = "Zavřít okno";
	largeImage = document.createElement("IMG");
	imageWrapper = document.createElement("DIV");
	imageWrapper.id = "image-wrapper";
	imageWrapper.appendChild(largeImage);

	forwardField = document.createElement("DIV");
	forwardField.id = "forward-field";
	forwardField.className = "forward-passive";
	backField = document.createElement("DIV");
	backField.id = "back-field";
	backField.className = "back-passive";
	regEventHandler("click",forwardField,moveLargeBox);
	regEventHandler("mouseover",forwardField,overField);
	regEventHandler("mouseout",forwardField,outOfField);
	regEventHandler("click",backField,moveLargeBox);
	regEventHandler("mouseover",backField,overField);
	regEventHandler("mouseout",backField,outOfField);
	imageWrapper.appendChild(forwardField);
	imageWrapper.appendChild(backField);

	largeBox = document.createElement("DIV");
	largeBox.id = "large-box";
	largeBox.className = "none";
	largeBox.appendChild(imageWrapper);
	largeBox.appendChild(button);
	largeBox.appendChild(caption);
	bodyElem.appendChild(largeBox);
}

function getGalGroupLinks(currGalGroup)
{
	var links = document.links;
	var galGroupLinks = new Array();
	var j = 0;
	var pattern  = /^([a-z0-9]+-)?[0-9]+-[0-9]+$/;
	for( var i = 0 ; i < links.length ; i ++ ){
		var linkRel = links[i].rel;
		if(linkRel && pattern.test(linkRel)){
			var galGroup = linkRel.split("-")[0];
			if(galGroup == currGalGroup){
				galGroupLinks[j] = links[i];
				j ++ ;
			}
		}
	}
	return galGroupLinks;
}

function getImageData(currLink)
{
	var largeImageData = currLink.rel.split("-");
	if(largeImageData.length < 2) 
		return null;
	var largeImageWidth = largeImageData[largeImageData.length - 2];
	var largeImageHeight = largeImageData[largeImageData.length - 1];
	var currGalGroup = largeImageData.length == 3 ? largeImageData[largeImageData.length - 3] : "SINGLE_FOTO";
	return {largeImageWidth:largeImageWidth, largeImageHeight:largeImageHeight, currGalGroup:currGalGroup };
}

function applyImageData(imageData, currLink, currImageThumb)
{
	largeImage.width = imageData.largeImageWidth; 
	largeImage.height = imageData.largeImageHeight;
	largeImage.src = currLink.href;
	caption.innerHTML = currImageThumb.alt;
	largeBox.style.width = imageData.largeImageWidth + "px";
}

function  setPositionLargeBox()
{
	var left = Math.round((document.documentElement.clientWidth - largeBox.offsetWidth)/2);
	var top = Math.round((document.documentElement.clientHeight - largeBox.offsetHeight)/2);
	if(top < 2) top = 2;
	var leftdiff = 0;
	if(left < 2) leftdiff = left - 4;
	var scrollState =  new getScroll();
	largeBox.style.top = (top + scrollState.scrollTop).toString() + "px" ;
	largeBox.style.left = (left + leftdiff + scrollState.scrollLeft).toString() + "px" ;
}

function openLargeBox(e)
{
	var target = getEventTarget(e);				// ověření požadavku
	if(target.nodeName == "IMG" && target.parentNode.nodeName == "A"){
		var currLink = target.parentNode;
		var currImageThumb = target;
	}else if(target.nodeName == "A"){
		linkChilds = target.childNodes;
		for(k = 0 ; k < linkChilds.length ; k ++ ){
			if(linkChilds[k].nodeName == "IMG"){
				var currImageThumb = linkChilds[k];
				var currLink = target;
			}
		}
	}
	if(!currLink || !currImageThumb) return;		
	if(!/^([a-z0-9]+-)?[0-9]+-[0-9]+$/.test(currLink.rel)) return;

	var imageData = new getImageData(currLink);
	galGroupLinks = imageData.currGalGroup == "SINGLE_FOTO" ? new Array() : getGalGroupLinks(imageData.currGalGroup);
	currIndex = false;
	for( var i = 0 ; i < galGroupLinks.length ; i ++ ){
		if(galGroupLinks[i].href == currLink.href)
			currIndex = i ;
	}
	forwardIndex = (currIndex !== false && currIndex < galGroupLinks.length -1 ) ? currIndex + 1 : false;
	backIndex = ( currIndex > 0 ) ? currIndex - 1 : false;

	if(typeof(bodyElem) == "undefined")		// konstrukce okna
		createLargeBox();
	pageOverlay.style.visibility = "hidden";	// zneviditelnění
	largeBox.style.visibility = "hidden";
	pageOverlay.className = "block";	
	largeBox.className = "block";
	forwardField.style.cursor = "";				// nulování pro typ SINGLE_FOTO
	backField.style.cursor = "";		

	applyImageData(imageData, currLink, currImageThumb);
	setPositionLargeBox();

	pageOverlay.style.width = document.documentElement.scrollWidth + "px";
	pageOverlay.style.height = document.documentElement.scrollHeight + "px";
	largeBox.style.visibility = "";			// zviditelnění
	pageOverlay.style.visibility = "";
	removeEventHandler("click",document,openLargeBox);
	regEventHandler("click",button,closeLargeBox);
	regEventHandler("click",pageOverlay,closeLargeBox);
	preventDefault(e);
}

function overField(e)
{
	var target = getEventTarget(e);
	if(target.id == "forward-field" && forwardIndex !== false)
		target.className = "forward-active";
	else if(target.id == "back-field" && backIndex !== false)
		target.className = "back-active";
	else if(forwardIndex === false && backIndex === false)		// SINGLE_FOTO
		target.style.cursor = "pointer";
}
function outOfField(e)
{
	var target = getEventTarget(e);
	if(target.id == "forward-field")
		target.className = "forward-passive";
	else if(target.id == "back-field")
		target.className = "back-passive";
}

function moveLargeBox(e)
{
	if(forwardIndex === false && backIndex === false){
		closeLargeBox();
		return;
	}
	target = getEventTarget(e);
	var nextIndex = false;
	if(target.id == "forward-field" && forwardIndex !== false)
		nextIndex = forwardIndex;
	else if(target.id == "back-field" && backIndex !== false)
		nextIndex = backIndex;
	if(nextIndex === false)  return;

	var currLink = galGroupLinks[nextIndex];		//  pro nová data do HTML dokumentu
	var childs = currLink.childNodes;
	for(var i = 0 ; i < childs.length ; i ++ ){
		if(childs[i].nodeName == "IMG"){
			var currImageThumb = childs[i];
			break;
		}
	}

	var imageData = new getImageData(currLink);
	applyImageData(imageData, currLink, currImageThumb);
	setPositionLargeBox();

	currIndex = nextIndex;			// aktualizace indexů
	forwardIndex = (currIndex !== false && currIndex < galGroupLinks.length -1 ) ? currIndex + 1 : false;
	backIndex = ( currIndex > 0 ) ? currIndex - 1 : false;
	if(forwardIndex === false)
		forwardField.className = "";
	if(backIndex === false)
		backField.className = "";
}

function closeLargeBox()
{
	largeBox.className = "none";
	largeImage.src = "";
	pageOverlay.className = "none";
	regEventHandler("click",document,openLargeBox);
	removeEventHandler("click",button,closeLargeBox);
	removeEventHandler("click",largeImage,closeLargeBox);
}

function handleResize()
{
	var pageOverlay = document.getElementById("page-overlay");
	if(pageOverlay != null){
		pageOverlay.style.width = document.documentElement.scrollWidth + "px";
		pageOverlay.style.height = document.documentElement.scrollHeight + "px";
	}
}


