// Gallery v1.1
// uses Dom : evt, cls

function Gallery() {
	var own                    = this;

	this.galleryFrameId        = "galleryFrame";
	this.galleryFrame          = null;
	this.detailFrameId         = "galleryDetailFrame";
	this.detailFrame           = null;
	this.galleryNavigationId   = "galleryNavigationFrame";
	this.galleryNavigation     = null;

	this.prevBtnId             = "galleryNavigation_prev";
	this.prevBtn               = null;
	this.prevBtnText           = "previous image";

	this.nextBtnId             = "galleryNavigation_prev";
	this.nextBtn               = null;
	this.nextBtnText           = "next image";

	this.listBtnId             = "galleryNavigation_prev";
	this.listBtn               = null;
	this.listBtnText           = "gallery";

	this.bodyCls_detailVisible = "js_galleryDetail";
	this.detailLinkClassName   = "galleryDetailLink";

	this.detailLinkNodes       = null;

	this.init = function() {
		try {
//			window.location = "#";	// move to top of page
			own.galleryFrame = document.getElementById(own.galleryFrameId);
			own.detailFrame = document.getElementById(own.detailFrameId);
			own.detailFrame.style.display = "none";
			initNavigation();
			initDetailView();
		} catch(ex) { exceptionWarning(ex, "gallery.init"); }
		return true;
	}

	var initNavigation = function() {
		var space              = document.createTextNode(" ");
		var frameContent       = document.createElement("div");
		var prevBtnTextNode    = document.createTextNode(own.prevBtnText);
		var nextBtnTextNode    = document.createTextNode(own.nextBtnText);
		var listBtnTextNode = document.createTextNode(own.listBtnText);

		own.galleryNavigation = document.getElementById(own.galleryNavigationId);
		own.galleryNavigation.style.display = "none";

		frameContent.className = "frameContent";
		own.galleryNavigation.appendChild(frameContent);
		own.prevBtn         = document.createElement("a");
		own.prevBtn.id      = own.prevBtnId;
		own.prevBtn.href    = "?";
		own.prevBtn.appendChild(prevBtnTextNode);

		frameContent.appendChild(own.prevBtn);
		frameContent.appendChild(space.cloneNode(true));

		own.nextBtn         = document.createElement("a");
		own.nextBtn.id      = own.nextBtnId;
		own.nextBtn.href    = "?";
		own.nextBtn.appendChild(nextBtnTextNode);

		frameContent.appendChild(own.nextBtn);
		frameContent.appendChild(space.cloneNode(true));

		own.listBtn         = document.createElement("a");
		own.listBtn.id      = own.listBtnId;
		own.listBtn.href    = "?";
		own.listBtn.appendChild(listBtnTextNode);
		frameContent.appendChild(own.listBtn);

		// next image action
		evt.add(own.nextBtn, "click", function(e) { e = evt.fix(e); own.showNext();	e.preventDefault(); } );

		// previous image action
		evt.add(own.prevBtn, "click", function(e) { e = evt.fix(e); own.showPrevious(); e.preventDefault(); } );

		// hide detail
		evt.add(own.listBtn, "click", function(e) { e = evt.fix(e); own.hideDetail(); cls.remove(document.body, own.bodyCls_detailVisible); e.preventDefault(); } );
	}

	var initDetailView = function() {
		var i; // Int iterator
		if (own.detailFrame) {
			own.detailLinkNodes = new Array();
			var anchors = elm.getByTag("a");
			for (i = 0; i < anchors.length; i++)
				if (cls.has(anchors[i], own.detailLinkClassName)) {
					// show detail
					own.detailLinkNodes[own.detailLinkNodes.length] = anchors[i];
					evt.add(anchors[i], "click", function(e) { e = evt.fix(e); own.viewDetail(e); cls.add(document.body, own.bodyCls_detailVisible); e.preventDefault(); } );
				}
		}
	}

	var createDetail = function(imageLink,imageThumbnail) {
		// create image
		var detailImage = document.createElement("img");
		var detailImages = own.detailFrame.getElementsByTagName("img");
		if(detailImages.length > 0)
			own.detailFrame.replaceChild(detailImage,detailImages[0]);
		detailImage.setAttribute("src", imageLink.href);
		// set alt
		if (imageThumbnail.alt) detailImage.setAttribute("alt", imageThumbnail.alt);
		else if(detailImage.title) detailImage.setAttribute("alt", imageThumbnail.title);
		else if(imageLink.title) detailImage.setAttribute("alt", imageLink.title);
		// set title
		if (imageThumbnail.title) detailImage.setAttribute("title", imageThumbnail.title);
		else detailImage.setAttribute("title", detailImage.alt);
		// view image
		if (detailImages.length == 0)
			own.detailFrame.appendChild(detailImage);
		own.galleryFrame.style.display = "none";
		own.detailFrame.style.display = "block";
		cls.add(document.body, own.bodyCls_detailVisible);
		evt.add(detailImage, "click", function(e){ e = evt.fix(e); own.clickDetail(e); e.preventDefault(); });
		own.galleryNavigation.style.display = "block";
	}

	this.clickDetail = function(e) {
		own.hideDetail();
	}

	this.viewDetail = function(e) {
		e = evt.fix(e);
		window.location.replace("#");
		// find anchor
		var imageLink = e.target;
		while(imageLink.tagName.toLowerCase() != "a") {
			imageLink = imageLink.parentNode;
		}
		createDetail(imageLink, e.target);
	}

	this.hideDetail = function() {
		own.detailFrame.style.display = "none";
		own.galleryNavigation.style.display = "none";
		own.galleryFrame.style.display = "block";
		cls.remove(document.body, own.bodyCls_detailVisible);
	}

	this.showNext = function() {
		var i; // Int iterator
		var thumbnails;
		
		// find current image source
		var detailImages = own.detailFrame.getElementsByTagName("img");
		var imageSrc = detailImages[0].src;
		
		// find thumbnail
		var imagePosition = 0;
		var imageLink = null;
		for (i = 0; i < own.detailLinkNodes.length; i++) {
			imageLink = own.detailLinkNodes[i];
			if(imageSrc == imageLink.href) {
				imagePosition = i+1;
				break;
			}
		}
		if (imagePosition >= own.detailLinkNodes.length) imagePosition = 0;
		imageLink = own.detailLinkNodes[imagePosition];
		thumbnails = imageLink.getElementsByTagName("img");
		if (thumbnails != null)
			createDetail(imageLink, thumbnails[0]);
		if (document.recalc) document.recalc();	// IE recover after document manipulations
	}

	this.showPrevious = function() {
		var i; // Int iterator
		var thumbnails;
		
		// find current image source
		var detailImages = own.detailFrame.getElementsByTagName("img");
		var imageSrc = detailImages[0].src;
		
		// find thumbnail
		var imagePosition = 0;
		var imageLink = null;
		for (i = 0; i < own.detailLinkNodes.length; i++) {
			imageLink = own.detailLinkNodes[i];
			if(imageSrc == imageLink.href) {
				imagePosition = i-1;
				break;
			}
		}
		if (imagePosition < 0) imagePosition = own.detailLinkNodes.length - 1;
		imageLink = own.detailLinkNodes[imagePosition];
		thumbnails = imageLink.getElementsByTagName("img");
		if (thumbnails != null)
			createDetail(imageLink, thumbnails[0]);
		if (document.recalc) document.recalc();	// IE recover after document manipulations
	}
}

var gallery = new Gallery();
