$(function(){
	var Toggler = function(opts){
		var obj       = this;
		var defaults  = {};
		defaults.selector = '.toggle';
		defaults.lang     = {
			toggle_show: 'Show',
			toggle_hide: 'Hide'
		};
		
		// merge options with defaults
		var opts = $.extend({}, defaults, opts);	
		
		// toggleize .toggle divs and stuff
		$(opts.selector).each(function(index, trigger){
			var trigger = $(trigger);         // the trigger
			var dest_id = trigger.attr('rel');// the destination id
			
			if(typeof dest_id != 'string') return;
			
			var dest    = $('#' + dest_id) // the destination		
			
			if(dest.length == 0) return;
			
			// sets visibility to none by default
			dest.hide();
			
			// converts trigger tags into link if the are not so by default
			if(trigger.get(0).tagName != 'A'){
				var new_trigger = $(document.createElement('A'));
				new_trigger.html(trigger.html());
				trigger.html("");
				trigger.removeAttr('rel');
				trigger.append(new_trigger);
				
				var trigger = new_trigger;
			}
			trigger.attr('href', 'javascript:void(0)');
			trigger.attr('rel', dest_id);
			trigger.attr('title', opts.lang.toggle_show  + ' ' + trigger.text());
			
			// creates a flexible trigger indicator
			if(typeof opts.toggle_img_show != 'undefined'){
				var trigger_i = $(document.createElement('img'));
				trigger_i.attr('src', opts.toggle_img_show);
				trigger_i.attr('border', 0);
				trigger.prepend(trigger_i);			
			}
			
			// sets callback
			trigger.click(function(){
				var trigger   = $(this);
				var trigger_i = trigger.children('img');
				var dest      = $('#' + trigger.attr('rel'));
				
				var status_prev = dest.css('display'); 
				var status_next = status_prev == 'none'? '': 'none';
				
				// sets the new status
				status_next == ''? dest.fadeIn(300): dest.fadeOut(300);
				
				// updates trigger and indicator too
				trigger.attr('title', ((status_next == 'none'? opts.lang.toggle_show: opts.lang.toggle_hide) + ' ' + trigger.text()));
				
				if(typeof opts.toggle_img_show != 'undefined' && typeof opts.toggle_img_hide != 'undefined'){
					trigger_i.attr('src', status_next == 'none'? opts.toggle_img_show: opts.toggle_img_hide);		
				}
			})
		});
	};
	
	// extends jquery
	$.extend({
		toggler: function(opts){
			var toggler = new Toggler(opts);
		}
	});	
});
