/*!
* Show / Hide
* @author: Trevor Morris (trovster)
* @published: 27/07/2009
*/
if(typeof jQuery != "undefined") {	
	(function($){
		$.fn.extend({
			showHide: function(options) {
				var settings = $.extend({}, $.fn.showHide.defaults, options);
				
				return this.each(function() {
					var $$, o, $p, $a, $div, $link;
					
					$$	= $(this);
					o	= $.metadata ? $.extend({}, settings, $$.metadata()) : settings;
					
					$p 		= $('<p></p>').addClass('more').attr('id', 'view');
					$a 		= $('<a></a>').attr('href', '#more').text(o[o.state].text);
					$div	= $$.closest('.toggle-container');
					$link	= $('.toggle-link', $div);
					
					$$.hide();
					$link.append($p.append($a));
					
					// fix any missing defaults
					if(typeof o.show.duration === 'undefined') {
						o.show.duration = $.fn.showHide.defaults.show.duration;
					}
					if(typeof o.show.easing === 'undefined') {
						o.show.easing = $.fn.showHide.defaults.show.easing;
					}
					if(typeof o.show.text === 'undefined') {
						o.show.text = $.fn.showHide.defaults.show.text;
					}
					
					if(typeof o.hide.duration === 'undefined') {
						o.hide.duration = $.fn.showHide.defaults.hide.duration;
					}
					if(typeof o.hide.easing === 'undefined') {
						o.hide.easing = $.fn.showHide.defaults.hide.easing;
					}
					if(typeof o.hide.text === 'undefined') {
						o.hide.text = $.fn.showHide.defaults.hide.text;
					}
					
					$a.bind('click.showHide', o, clickShowHide);
				});
			}
		});
				
		// defaults
		$.fn.showHide.defaults = {
			show: {
				duration: 	750,
				easing:		'linear',
				text: 		'Click here to view more'
			},
			hide: {
				duration: 	500,
				easing:		'linear',
				text: 		'Click here to show less'
			},
			duration: 	750, // for scrolling
			state: 		'show'
		};
		
		// private functions
		function debug(o) {
			if(window.console && window.console.log) {
				window.console.log(o);
			}
		}
		
		function clickShowHide(event) {
			var $$, $toggle;
				
			$$		= $(event.target);
			$toggle	= $$.closest('.toggle-container').find('.toggle-more');
			$link	= $$.closest('.toggle-link');
			
			$link.addClass('animating');
			$toggle.addClass('animating');
			if($toggle.is(':hidden')) {
				$toggle.stop(true, true).animate({height: 'show'}, event.data.show.duration, event.data.show.easing, function(){
					$$.text(event.data.hide.text);
					$link.addClass('visible').removeClass('animating');
					$toggle.addClass('visible').removeClass('animating');
					
					if($.scrollTo) {
						$.event.trigger('showHideScroll');
						$.scrollTo($toggle, {
							duration: 	event.data.duration,
							axis: 		'y',
							offset:		-10
						});
					}
				});
			}
			else {
				$toggle.stop(true, true).animate({height: 'hide'}, event.data.hide.duration, event.data.hide.easing, function(){
					$$.text(event.data.show.text);
					$link.addClass('hidden').removeClass('animating');
					$toggle.addClass('hidden').removeClass('animating');
				});
			}
			
			event.preventDefault();
			$$.blur();
		}
		
	})(jQuery);
}