/*
	album.js
	
	v1r02beta, 2007-02-05, Christian Augustin

*/
/*
	JavaScript 1.3+, W3C DOM Level 1
	
	MSIE 5 (excl. Mac), Netscape 7, Mozilla 1.0, Firefox 1.0, Safari 1.1, Opera 7.0
	
	Requires
	- slides.js
	
	Changes
	2007-02-05 cma: Implementing new updateLayout() functionality.
	2006-03-17 cma: Further improvements; "deep" search for slides and lightbox.
	2006-03-14 cma: Configurable image replacement. This is v1r00!
	2006-03-14 cma: Improved lightbox styling with DIV and float.
	2006-03-13 cma: Switched from call-back function to global updateLayout().
	2006-01-24 cma: Initial setup, borrowing from other JavaScript modules ...
	
	An album contains the mandatory "slides" and "lightbox" DIVs.
	Without "slides" or "lightbox", the "album" DIV is ignored!
	
	The "lightbox" contains the preview images for the various slides.
	
	If the lightbox contains more images than slides in the slideshow,
	the spare images are ignored and not displayed. Less images in the lightbox
	lead to slides not selectable from the lightbox -- but from the slideshow
	itself (if slidesControl is visible or cycleSlidesOnClick is active).
	
	Control classes at lightbox:
	selectImage
	noSelectImage
	hoverImages
	noHoverImages
	
*/


/* ===========================
   Constructor function ...
=========================== */

function Album(obj) {
	if (!obj || !obj.firstChild) return void 0;
	if (!obj.className || !obj.className.match(/(^|\s)album(\s|$)/)) return void 0;
	
	var that = obj;
	
	/* Search for "slides" and "lightbox" ... */
	var elms = that.getElementsByTagName('div');
	if (!elms || !elms.length) return void 0;
	for (var e=0; e<elms.length; e++) {
		var elm = elms[e];
		if (!that.slides && elm.items)
			that.slides = elm;
		if (!that.lightbox && elm.className && elm.className.match(/(^|\s)lightbox(\s|$)/))
				that.lightbox = elm;
	}
	if (!that.slides || !that.lightbox) return void 0; /* Don't use an album without slides or lightbox! */
	
	that.n = Album.albums.length;
	that.sel = -1;
	Album.albums[that.n] = that;
	
	/* Get presets and options ... */
	
	that.selectImage = (that.lightbox.className.match(/(^|\s)selectImage(\s|$)/)) ? true
		: ((that.lightbox.className.match(/(^|\s)noSelectImage(\s|$)/)) ? false : Album.selectImage);
	
	that.hoverImages = (that.lightbox.className.match(/(^|\s)hoverImages(\s|$)/)) ? true
		: ((that.lightbox.className.match(/(^|\s)noHoverImages(\s|$)/)) ? false : Album.hoverImages);
	
	that.imgRegExps = {
		n: new RegExp(Album.replacements[0] + '([_.])'),
		h: new RegExp(Album.replacements[1] + '([_.])'),
		s: new RegExp(Album.replacements[2] + '([_.])')
	};
	
	that.imgReplace = {
		n: Album.replacements[0] + '$1',
		h: Album.replacements[1] + '$1',
		s: Album.replacements[2] + '$1'
	}
	
	
	/* Prepare lightbox and its images ... */
	
	if (!that.lightbox.firstChild) return void 0;
	var lbox = that.lightbox;
	var cont = document.createElement('div');
	cont.className = 'innerLightbox';
	lbox.insertBefore(cont, lbox.firstChild);
	lbox.items = new Array();
	var lbelm = cont.nextSibling;
	while (lbelm) {
		if (lbelm.nodeType == 1 && lbelm.tagName != '!'
		&& lbox.items.length < that.slides.items.length) {
			var d = cont.appendChild(document.createElement('div'));
			var lnk = d.appendChild(document.createElement('a'));
			lnk.appendChild(lbelm);
			lnk.href = 'javascript:Slides.showSlideInSlidesByIdx(' + lbox.items.length + ',' + that.slides.n + ')';
			lbox.items[lbox.items.length] = d;
			if (lbelm.tagName.toLowerCase() == 'img' && lbelm.src) {
				if (that.selectImage) (new Image()).src = lbelm.src.replace(that.imgRegExps.n, that.imgReplace.s);
				if (that.hoverImages) {
					lbelm._album = that;
					lbelm.onmouseover = Album.overImg;
					lbelm.onmouseout = Album.outImg;
					(new Image()).src = lbelm.src.replace(that.imgRegExps.n, that.imgReplace.h);
				};
			};

			lbelm = cont.nextSibling;
		} else if (lbelm.nodeType != 2) {
			// Cleanup whitespace and spare content ...
			var tmp = lbelm;
			lbelm = lbelm.nextSibling;
			lbox.removeChild(tmp);
		} else
			lbelm = lbelm.nextSibling;
	}
	
	/* Extend obj with prototype methods ... */
	for (var m in Album.prototype) that[m] = Album.prototype[m];
	
	that.updateLayout();
	
	return that;

}



/* =======================
   Instance methods ...
======================= */

Album.prototype.updateLayout = function() {
	if (typeof this.sel != 'undefined') var a = this
	else if (this._album) var a = this._album
	else return;
	if (a.slides && a.lightbox) {
		if (a.sel > -1 && a.sel != a.slides.vis) {
			var pd = a.lightbox.items[a.sel];
			pd.className = '';
			var pimg = pd.firstChild.firstChild;
			if (pimg.tagName.toLowerCase() == 'img' && pimg.src && a.selectImage) {
				pimg.src = pimg.src.replace(a.imgRegExps.s, a.imgReplace.n);
			};
		};
		a.sel = (a.slides.vis < a.lightbox.items.length) ? a.slides.vis : -1;
		if (a.sel != -1) {
			var ad = a.lightbox.items[a.sel];
			ad.className = 'selected';
			var aimg = ad.firstChild.firstChild;
			if (aimg.tagName.toLowerCase() == 'img' && aimg.src && a.selectImage) {
				aimg.src = aimg.src.replace(a.imgRegExps.n, a.imgReplace.s);
				aimg.src = aimg.src.replace(a.imgRegExps.h, a.imgReplace.s);
			};
		};
	};
	var p = this.parentNode;
	while (p) {
		if (p.updateLayout) {
			p.updateLayout();
			break;
		};
		p = p.parentNode;
	};
};



/* ==========================
   Class properties ...
========================== */

Album.albums = new Array();

/* Presets ... */

Album.selectImage = true;
Album.hoverImages = true;
Album.replacements = ['_normal', '_hover', '_selected'];

if ((typeof presets != 'undefined') && presets.Album) {
	if (typeof presets.Album.selectImage != 'undefined') Album.selectImage = presets.Album.selectImage;
	if (typeof presets.Album.hoverImages != 'undefined') Album.hoverImages = presets.Album.hoverImages;
	if (typeof presets.Album.replacements != 'undefined') Album.replacements = presets.Album.replacements;
}



/* ====================
   Class methods ...
==================== */

Album.findObjects = function() {
	if (!document.getElementsByTagName) return;
	var divs = document.getElementsByTagName('div');
	var albums = new Array();
	if (divs) {
		for (var i=0; i<divs.length; i++) {
			var n = divs[i];
			if (n.className && n.className.match(/(^|\s)album(\s|$)/)) albums[albums.length] = n;
		}
	};
	if (albums.length) {
		for (var j=albums.length-1; j>-1; j--) new Album(albums[j]);
	};
}

Album.overImg = function() {
	this.src = this.src.replace(this._album.imgRegExps.n, this._album.imgReplace.h);
}

Album.outImg = function() {
	this.src = this.src.replace(this._album.imgRegExps.h, this._album.imgReplace.n);
}

Album.updateLayout = function() {
	for (var i=0; i<Album.albums.length; i++) {
		Album.albums[i].updateLayout();
	/*
		var a = Album.albums[i];
		if (!a.slides || !a.lightbox) continue;
		if (a.sel > -1 && a.sel != a.slides.vis) {
			var pd = a.lightbox.items[a.sel];
			pd.className = '';
			var pimg = pd.firstChild.firstChild;
			if (pimg.tagName.toLowerCase() == 'img' && pimg.src && a.selectImage) {
				pimg.src = pimg.src.replace(a.imgRegExps.s, a.imgReplace.n);
			}
		};
		a.sel = (a.slides.vis < a.lightbox.items.length) ? a.slides.vis : -1;
		if (a.sel == -1) continue;
		var ad = a.lightbox.items[a.sel];
		ad.className = 'selected';
		var aimg = ad.firstChild.firstChild;
		if (aimg.tagName.toLowerCase() == 'img' && aimg.src && a.selectImage) {
			aimg.src = aimg.src.replace(a.imgRegExps.n, a.imgReplace.s);
			aimg.src = aimg.src.replace(a.imgRegExps.h, a.imgReplace.s);
		}
	*/
	};
};


/* =================
   Initialize ...
================= */

if (document.getElementsByTagName 
	&& document.createElement
	&& (!window.opera || document.createDocumentFragment)
	&& !(!window.opera && navigator.userAgent.match(/MSIE 5\..*Mac/))) {
	
	Album.initComplete = false;
	
	Album.init = function() {
		Album.findObjects();
		Album.initComplete = true;
		return true;
	}
	
	if (window.onDomReady) {
		window.onDomReady(Album.init);
	} else if (typeof pageComplete == 'function') {
		Album.oldPageComplete = pageComplete || function(){};
		pageComplete = function() {
			Album.oldPageComplete();
			Album.init();
		};
	} else {
		Album.oldOnload = window.onload || function(){};
		window.onload = function() {
			Album.oldOnload();
			Album.init();
		};
	};


}

/* End of album.js */
