// debug function - console
var debugMode = true;
var Debug = null;
function debug(message) {
	if (debugMode) {
		var m = null;
		if ($chk(Debug)) {
			// add
			m = new Element('li', {
						'html' : message
					});
			m.inject(Debug, 'bottom');
		} else {
			// create
			Debug = new Element('ul', {
						'id' : 'debug'
					});
			Debug.inject(document.getElement('body'), 'top');
			m = new Element('li', {
						'html' : message
					});
			m.inject(Debug, 'bottom');
		}
	}
}

/*
 * Slimbox v1.7 - The ultimate lightweight Lightbox clone (c) 2007-2009
 * Christophe Beyls <http://www.digitalia.be> MIT-style license.
 */
var Slimbox = (function() {
	var F = window, n = Browser.Engine.trident4, u, g, G = -1, o, w, E, v, y, M, s, m = {}, t = new Image(), K = new Image(), I, a, h, q, J, e, H, c, A, L, x, i, d, C;
	F.addEvent("domready", function() {
				$(document.body).adopt($$(I = new Element("div", {
									id : "lbOverlay",
									events : {
										click : D
									}
								}), a = new Element("div", {
									id : "lbCenter"
								}), H = new Element("div", {
									id : "lbBottomContainer"
								})).setStyle("display", "none"));
				h = new Element("div", {
							id : "lbImage"
						}).injectInside(a).adopt(q = new Element("div", {
							styles : {
								position : "relative"
							}
						}).adopt(J = new Element("a", {
									id : "lbPrevLink",
									href : "#",
									events : {
										click : B
									}
								}), e = new Element("a", {
									id : "lbNextLink",
									href : "#",
									events : {
										click : f
									}
								})));
				c = new Element("div", {
							id : "lbBottom"
						}).injectInside(H).adopt(new Element("a", {
									id : "lbCloseLink",
									href : "#",
									events : {
										click : D
									}
								}), A = new Element("div", {
									id : "lbCaption"
								}), L = new Element("div", {
									id : "lbNumber"
								}), new Element("div", {
									styles : {
										clear : "both"
									}
								}))
			});
	function z() {
		var N = F.getScroll(), O = F.getSize();
		$$(a, H).setStyle("left", N.x + (O.x / 2));
		if (v) {
			I.setStyles({
						left : N.x,
						top : N.y,
						width : O.x,
						height : O.y
					})
		}
	}
	function l(N) {
		["object", n ? "select" : "embed"].forEach(function(P) {
					Array.forEach(document.getElementsByTagName(P),
							function(Q) {
								if (N) {
									Q._slimbox = Q.style.visibility
								}
								Q.style.visibility = N ? "hidden" : Q._slimbox
							})
				});
		I.style.display = N ? "" : "none";
		var O = N ? "addEvent" : "removeEvent";
		F[O]("scroll", z)[O]("resize", z);
		document[O]("keydown", p)
	}
	function p(O) {
		var N = O.code;
		return u.closeKeys.contains(N) ? D() : u.nextKeys.contains(N)
				? f()
				: u.previousKeys.contains(N) ? B() : false
	}
	function B() {
		return b(w)
	}
	function f() {
		return b(E)
	}
	function b(N) {
		if (N >= 0) {
			G = N;
			o = g[N][0];
			w = (G || (u.loop ? g.length : 0)) - 1;
			E = ((G + 1) % g.length) || (u.loop ? 0 : -1);
			r();
			a.className = "lbLoading";
			m = new Image();
			m.onload = k;
			m.src = o
		}
		return false
	}
	function k() {
		a.className = "";
		d.set(0);
		h.setStyles({
					backgroundImage : "url(" + o + ")",
					display : ""
				});
		q.setStyle("width", m.width);
		$$(q, J, e).setStyle("height", m.height);
		A.set("html", g[G][1] || "");
		L.set("html", (((g.length > 1) && u.counterText) || "").replace(/{x}/,
						G + 1).replace(/{y}/, g.length));
		if (w >= 0) {
			t.src = g[w][0]
		}
		if (E >= 0) {
			K.src = g[E][0]
		}
		M = h.offsetWidth;
		s = h.offsetHeight;
		var P = Math.max(0, y - (s / 2)), N = 0, O;
		if (a.offsetHeight != s) {
			N = i.start({
						height : s,
						top : P
					})
		}
		if (a.offsetWidth != M) {
			N = i.start({
						width : M,
						marginLeft : -M / 2
					})
		}
		O = function() {
			H.setStyles({
						width : M,
						top : P + s,
						marginLeft : -M / 2,
						visibility : "hidden",
						display : ""
					});
			d.start(1)
		};
		if (N) {
			i.chain(O)
		} else {
			O()
		}
	}
	function j() {
		if (w >= 0) {
			J.style.display = ""
		}
		if (E >= 0) {
			e.style.display = ""
		}
		C.set(-c.offsetHeight).start(0);
		H.style.visibility = ""
	}
	function r() {
		m.onload = $empty;
		m.src = t.src = K.src = o;
		i.cancel();
		d.cancel();
		C.cancel();
		$$(J, e, h, H).setStyle("display", "none")
	}
	function D() {
		if (G >= 0) {
			r();
			G = w = E = -1;
			a.style.display = "none";
			x.cancel().chain(l).start(0)
		}
		return false
	}
	Element.implement({
				slimbox : function(N, O) {
					$$(this).slimbox(N, O);
					return this
				}
			});
	Elements.implement({
				slimbox : function(N, Q, P) {
					Q = Q || function(R) {
						return [R.href, R.title]
					};
					P = P || function() {
						return true
					};
					var O = this;
					O.removeEvents("click").addEvent("click", function() {
								var R = O.filter(P, this);
								return Slimbox.open(R.map(Q), R.indexOf(this),
										N)
							});
					return O
				}
			});
	return {
		open : function(P, O, N) {
			u = $extend({
						loop : false,
						overlayOpacity : 0.8,
						overlayFadeDuration : 400,
						resizeDuration : 400,
						resizeTransition : false,
						initialWidth : 250,
						initialHeight : 250,
						imageFadeDuration : 400,
						captionAnimationDuration : 400,
						counterText : "{x} / {y}",
						closeKeys : [27, 88, 67],
						previousKeys : [37, 80],
						nextKeys : [39, 78]
					}, N || {});
			x = new Fx.Tween(I, {
						property : "opacity",
						duration : u.overlayFadeDuration
					});
			i = new Fx.Morph(a, $extend({
								duration : u.resizeDuration,
								link : "chain"
							}, u.resizeTransition ? {
								transition : u.resizeTransition
							} : {}));
			d = new Fx.Tween(h, {
						property : "opacity",
						duration : u.imageFadeDuration,
						onComplete : j
					});
			C = new Fx.Tween(c, {
						property : "margin-top",
						duration : u.captionAnimationDuration
					});
			if (typeof P == "string") {
				P = [[P, O]];
				O = 0
			}
			y = F.getScrollTop() + (F.getHeight() / 2);
			M = u.initialWidth;
			s = u.initialHeight;
			a.setStyles({
						top : Math.max(0, y - (s / 2)),
						width : M,
						height : s,
						marginLeft : -M / 2,
						display : ""
					});
			v = n || (I.currentStyle && (I.currentStyle.position != "fixed"));
			if (v) {
				I.style.position = "absolute"
			}
			x.set(0).start(u.overlayOpacity);
			z();
			l(1);
			g = P;
			u.loop = u.loop && (g.length > 1);
			return b(O)
		}
	}
})();

var Gallery = new Class({
	Implements : [Options, Events],
	options : {
		id : null,
		step : 4
	},
	container : null,
	framesContainer : null,
	frames : null,
	wrapper : null,
	previousTrigger : null,
	nextTrigger : null,
	current : 0,
	counter : null,
	initialize : function(options) {
		this.setOptions(options);
		this.build();
		this.setTriggers();
	},
	build : function() {
		var gallery = this;
		this.container = new Element('div', {
					'class' : 'gallery-container'
				});
		this.wrapper = new Element('div', {
					'class' : 'gallery-wrapper'
				});
		this.framesContainer = $(this.options.id);
		this.wrapper.wraps(this.framesContainer);
		this.container.wraps(this.wrapper);
		this.previousTrigger = new Element('a', {
					'class' : 'previous-trigger no-previous',
					'html' : '<span>&laquo;</span>',
					'href' : '#'
				});
		this.nextTrigger = new Element('a', {
					'class' : 'next-trigger',
					'html' : '<span>&raquo;</span>',
					'href' : '#'
				});
		this.previousTrigger.inject(this.container, 'top');
		this.nextTrigger.inject(this.container, 'bottom');
		this.frames = this.framesContainer.getElements('div.gallery-item');
		this.frames.each(function(item) {
					item.getElement('a').addClass('lightbox').setProperty(
							'rel', 'lightbox' + gallery.options.id);
				});
		this.counter = new Element('div', {
			'class' : 'frames-counter',
			'html' : (this.current + 1)
					+ '&nbsp;-&nbsp;'
					+ (((this.current + this.options.step) > this.frames.length)
							? this.frames.length
							: (this.current + this.options.step)) + ' / '
					+ this.frames.length
		});
		this.counter.inject(this.nextTrigger, 'after');
		if(this.frames.length <= this.options.step){
			this.previousTrigger.addClass('disabled');
			this.nextTrigger.addClass('disabled');
			this.counter.addClass('disabled');
		}
	},
	updateCounter : function() {
		this.counter
				.set(
						'html',
						(this.current + 1)
								+ '&nbsp;-&nbsp;'
								+ (((this.current + this.options.step) > this.frames.length)
										? this.frames.length
										: (this.current + this.options.step))
								+ ' / ' + this.frames.length);
	},
	setTriggers : function() {
		var gallery = this;
		this.nextTrigger.addEvent('click', function(evt) {
					if (evt) {
						evt.stop();
					}
					gallery.next();
				});
		this.previousTrigger.addEvent('click', function(evt) {
					if (evt) {
						evt.stop();
					}
					gallery.previous();
				});
	},
	next : function() {
		if ((this.current + this.options.step) <= this.frames.length) {
			this.nextTrigger.removeClass('no-next');
			this.current += this.options.step;
			this.framesContainer.morph({
						'margin-left' : -this.frames[this.current]
								.getPosition(this.framesContainer).x
					});
			this.updateCounter();
			this.previousTrigger.removeClass('no-previous');
			if ((this.current + this.options.step) > this.frames.length) {
				this.nextTrigger.addClass('no-next');
			}
		} else {
			this.nextTrigger.addClass('no-next');
		}
	},
	previous : function() {
		if ((this.current - this.options.step) >= 0) {
			this.previousTrigger.removeClass('no-previous');
			this.current -= this.options.step;
			this.framesContainer.morph({
						'margin-left' : -this.frames[this.current]
								.getPosition(this.framesContainer).x
					});
			this.updateCounter();
			this.nextTrigger.removeClass('no-next');
			if ((this.current - this.options.step) < 0) {
				this.previousTrigger.addClass('no-previous');
			}
		} else {
			this.previousTrigger.addClass('no-previous');
		}
	}
});

// JavaScript Document
window.addEvent('domready', function() {
			$$('div.gallery').each(function(item, index) {
						var gallery = new Gallery({
									'id' : item.getProperty('id')
								});

					});
			$$('div.gallery-item a.lightbox').slimbox({
						loop : true,
						overlayOpacity : 0
					}, null, function(el) {
						return (this == el)
								|| ((this.rel.length > 8) && (this.rel == el.rel));
					});
			
		});
