if(!window.jQuery) alert('LetterBlock Reveal requires jQuery, which seems to be missing. If you\'re a user, try refreshing the page and/or complaining to the site operator. If you are the site operator, get on the stick.');
if(!window.LB) LB = {};
LB.reveal = function()
{
	var priv = this;
	var effect = 'fade';
	var speed = 'slow';
	var toInit = {
		radioSets: []
	};
	var allLinks;
	function show(el,callback)
	{
		if(!el.lb_revealing)
		{
			if(!callback) callback = function(){ };
			el.lb_revealing = true;
			switch(effect)
			{
				case 'slide':
					$(el).slideDown(speed,function(){ el.lb_revealing = false; callback(); });
					break;
				case 'fade':
					$(el).fadeIn(speed,function(){ el.lb_revealing = false; callback(); });
					break;
				case 'combo':
					$(el).show(speed,function(){ el.lb_revealing = false; callback(); });
					break;
				case 'none':
					$(el).css('display','');
					el.lb_revealing = false;
					callback();
			}
			$("input, textarea, select, button",el).removeAttr('disabled');
			$(el).trigger('lb_reveal');
			consequences(el,el.lb_visible = true);
		}
		return el;
	}
	function hide(el,callback)
	{
		if(!el.lb_hiding)
		{
			if(!callback) callback = function(){ };
			el.lb_hiding = true;
			switch(effect)
			{
				case 'slide':
					$(el).slideUp(speed,function(){ el.lb_hiding = false; callback(); });
					break;
				case 'fade':
					$(el).fadeOut(speed,function(){ el.lb_hiding = false; callback(); });
					break;
				case 'combo':
					$(el).hide(speed,function(){ el.lb_hiding = false; callback(); });
					break;
				case 'none':
					$(el).css('display','none');
					el.lb_hiding = false;
					callback();
			}
			$("input, textarea, select, button",el).attr('disabled','true');
			$(el).trigger('lb_hide');
			consequences(el,el.lb_visible = false);
		}
		return el;
	}
	function linkClick(e)
	{
		var t = document.getElementById(this.lb_target);
		if(t.lb_visible) hide(t);
		else
		{
			if(this.lb_radioSets)
			{
				var visible;
				var sets = this.lb_radioSets;
				for(var i=0; i<sets.length; i++)
				{
					visible = $(sets[i]).filter(function(){ return document.getElementById(this.lb_target).lb_visible; });
					if(visible.length > 0) visible.each(function(){ hide(document.getElementById(this.lb_target)); });	
				}
			}
			show(t);
		}
		return false;
	}
	function consequences(el,visible)
	{
		var id = el.id;
		allLinks.each(function(){
			if(this.lb_target==id) {
				if(visible) $(this).removeClass('lb-hiding').addClass('lb-revealing');
				else $(this).removeClass('lb-revealing').addClass('lb-hiding');
			}
		});
	}
	var pub = {
		initialize: function(){
			var trueEffect = effect;
			effect = 'none';
			var i, target;
			var rs = toInit.radioSets;
			for(i=0; i<rs.length; i++) jQuery(rs[i]).each(function(){ if(!this.lb_radioSets) this.lb_radioSets = []; this.lb_radioSets[this.lb_radioSets.length] = rs[i]; });
			var hash = location.hash.substr(1);
			allLinks = jQuery('a[@rel=reveal], a[@rel=hide]'); 
			allLinks.each(function(){
				if(this.lb_target = this.href.split('#')[1])
				{
					var target = document.getElementById(this.lb_target);
					if(this.rel.toLowerCase()=='reveal' && !/(^|\W)viewdefault(\W|$)/i.test(target.className)) hide(target);
					else show(target);
				}
			}).click(linkClick);
			effect = trueEffect;
			if(target = document.getElementById(hash)) show(target);
		},
		radioSet: function(q){
			toInit.radioSets[toInit.radioSets.length] = q;
		},
		effect: function(f){
			switch(f){
				case 'slide': case 'fade': case 'none': case 'combo':
					effect = f;
					return pub;
			}
			alert('LetterBlock Reveal effect set to invalid value \''+f+'\'.');
			return pub;
		},
		speed: function(s){
			speed = s;
			return pub;
		}
	};
	return pub;
}();

jQuery(LB.reveal.initialize);