function getElementsByClassName(node, classname) {
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

var lightbox = Class.create();
lightbox.prototype = {
	yPos : 0,
	xPos : 0,

	initialize: function(ctrl, changer) {
		this.content = ctrl.href;
		ctrl.onclick = (changer) ? this.switchContent : this.activate;
		ctrl.content = this;
		ctrl.href = "javascript:void(0);";
	},

	// Turn everything on - mainly the IE fixes
	activate: function(){
		if (!$('lightbox')) return false;
		if (window.attachEvent && !document.opera) {
			this.content.prepareIE('100%');
			this.content.hideSelects('hidden');
		}
		overlayFx.hidden = false;
		overlayFx.overlay.custom(0,0.8);
		overlayFx.loading.custom(0,0.8);
		this.content.loadInfo();
		return false;
	},

	switchContent: function(){
		if (!$('lightbox')) return false;
		overlayFx.hidden = false;
		overlayFx.content.custom(1,0);
		overlayFx.loading.custom(0,0.8);
		this.content.loadInfo();
		return false;
	},

	// Ie requires height to 100% and overflow hidden or else you can scroll down past the lightbox
	prepareIE: function(height){
		document.body.style.height = height;
		document.body.style.overflow = 'visible';
		$('lightbox').style.overflow = 'visible';
	},

	// In IE, select elements hover on top of the lightbox
	hideSelects: function(visibility){
		var selects = document.getElementsByTagName('select');
		for(i = 0; i < selects.length; i++)
			selects[i].style.visibility = visibility;
	},

	// Taken from lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
	getScroll: function(){
		if (self.pageYOffset) {
			this.yPos = self.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){
			this.yPos = document.documentElement.scrollTop; 
		} else if (document.body) {
			this.yPos = document.body.scrollTop;
		}
	},
	
	// Begin Ajax request based off of the href of the clicked linked
	loadInfo: function() {
		new Ajax(this.content, {method: 'get', onComplete: this.processInfo}).request();
	},

	// Display Ajax response
	processInfo: function(response){
		if (overlayFx.hidden)
			return;
		if (lightboxinnerHTML == '<div id="lbContent">'+response+'</div>') {
			$('lightbox').innerHTML = lightboxinnerHTML;
		} else {
			$('lightbox').innerHTML = '<div id="lbContent">'+response+'</div>';
			var lbActions = getElementsByClassName($('lightbox'), 'lbAction');
			for (i = 0; i < lbActions.length; i++) {
				if (lbActions[i].rel == 'close') {
					lbActions[i].onclick = hideLightboxBox;
				} else {
					new lightbox(lbActions[i], true);
				}
			}
			lightboxinnerHTML = $('lightbox').innerHTML;
		}
		if (!overlayFx.hidden) {
			checkBodyHeight();
			overlayFx.loading.clearTimer();
			overlayFx.content.clearTimer();
			overlayFx.loading.custom(0.8,0);
			overlayFx.content.custom(0,1);
			window.scrollTo(0,0);
			window.setTimeout(checkBodyHeight, 200);
		}
	}
};

window.addEvent('load', initLightboxBox);

var overlayFx = new Object(), lightboxinnerHTML;
function initLightboxBox() {
	var overlay  = document.createElement('div');
	overlay.id   = 'overlay';
	overlay.style.display = 'block';
	overlay.onclick = hideLightboxBox;
	var loadhtml = document.createElement('div');
	loadhtml.id  = 'lbLoadMessage';
	var lbhtml   = document.createElement('div');
	lbhtml.id    = 'lightbox';
	overlayFx.overlay = new Fx.Opacity(overlay, { duration: 250, onComplete: function () { checkLightboxOpacity(this, $('overlay'), 'none', true); }, onStart: function () { checkLightboxOpacity(this, $('overlay'), 'block'); } });
	overlayFx.loading = new Fx.Opacity(loadhtml, { duration: 250, onComplete: function () { checkLightboxOpacity(this, $('lbLoadMessage'), 'none', true); }, onStart: function () { checkLightboxOpacity(this, $('lbLoadMessage'), 'block'); } });
	overlayFx.content = new Fx.Opacity(lbhtml, { duration: 250, onComplete: function () { checkLightboxOpacity(this, $('lightbox'), 'none', true); }, onStart: function () { checkLightboxOpacity(this, $('lightbox'), 'block'); } });
	hideLightboxBox();
	document.body.appendChild(overlay);
	document.body.appendChild(loadhtml);
	document.body.appendChild(lbhtml);
}

function hideLightboxBox(leaveDisplay) {
	overlayFx.hidden = true;
	if ($('lightbox')) $('lightbox').innerHTML = '';
	if (window.attachEvent && !window.opera) document.body.style.height = '';
	overlayFx.loading.set(0);
	overlayFx.content.set(0);
	overlayFx.overlay.set(0);
	if (leaveDisplay || this && this.rel == 'close')
		$('overlay').style.display = $('lbLoadMessage').style.display = $('lightbox').style.display = 'none';
	return false;
}

function checkLightboxLinks(chkElem) {
	var lbox = getElementsByClassName(chkElem, 'lbOn');
	for (var m = 0; m < lbox.length; m++)
		new lightbox(lbox[m]);
}
function checkLightboxOpacity(lbObject, checkElem, dispValue, hideLb) {
	if (hideLb && overlayFx.hidden) hideLightboxBox(true);
	if (checkElem.style.opacity == 0)
		checkElem.style.display = dispValue;
	else if (checkElem.style.opacity == 1)
		checkElem.style.filter = '';
}

function checkBodyHeight() {
	var tmpScroll = document.body.scrollHeight;
	if (window.attachEvent && !window.opera)
		document.body.style.height = (tmpScroll < $('lightbox').scrollHeight ? ($('lightbox').scrollHeight + 60) : tmpScroll + 60) + 'px';
}