/**
 * @author Dan G. Switzer II
 */
(function ($){
	/* declare defaults */
	var defaults = {
		selector: "td.collapsible"
		, classChildRow: "expand-child"
		, classCollapse: "collapsed"
		, classExpand: "expanded"
		, showCollapsed: false            
		, collapse: true                 
		, fx: {hide:"hide",show:"show"}   
		, addAnchor: "append"            
	}, bHideParentRow = !!$.browser.msie;

	$.fn.collapsible = function (sel, options){
		var self = this, bIsElOpt = (sel && sel.constructor == Object),
			settings = $.extend({}, defaults, bIsElOpt ? sel : options);
		
		if( !bIsElOpt ) settings.selector = sel;
		if( settings.collapse ) settings.showCollapsed = true;

		return this.each(function (){
			var $td = $(settings.selector, this),
				$a = $td.find("a");
			
				if( $a.length == 0 ) $a = $td[settings.addAnchor]('<a href="#" class="' + settings[settings.showCollapsed ? "classCollapse" : "classExpand"] + '"></a>').find("a");

				$a.bind("click", function (){
					var $self = $(this), 
						$tr = $self.parent().parent(), 
						$trc = $tr.next(), 
						bIsCollapsed = $self.hasClass(settings.classExpand);
					$self[bIsCollapsed ? "removeClass" : "addClass"](settings.classExpand)[!bIsCollapsed ? "removeClass" : "addClass"](settings.classCollapse);
					while( $trc.hasClass(settings.classChildRow) ){
						if( bHideParentRow ){
							var ts_config = $.data(self[0], "tablesorter");
							$trc[bIsCollapsed ? settings.fx.hide : settings.fx.show]();
							
							if( !bIsCollapsed && ts_config ){
								if( $tr.hasClass(ts_config.widgetZebra.css[0]) ) $trc.addClass(ts_config.widgetZebra.css[0]).removeClass(ts_config.widgetZebra.css[1]);
								else if( $tr.hasClass(ts_config.widgetZebra.css[1]) ) $trc.addClass(ts_config.widgetZebra.css[1]).removeClass(ts_config.widgetZebra.css[0]);
							}
						}
						$("td", $trc)[bIsCollapsed ? settings.fx.hide : settings.fx.show]();
						$trc = $trc.next();
					}
					return false;
				});
			
			if( settings.collapse && !bHideParentRow ){
				$td
					.parent()
					.each(function (){
						var $tr = $(this).next();
						while( $tr.hasClass(settings.classChildRow) ){
							$tr = $tr.find("td").hide().end().next();
						}
					});
	  	}

			if( settings.showCollapsed && bHideParentRow ){
				$td
					.parent()
					.each(function (){
						var $tr = $(this).next();
						while( $tr.hasClass(settings.classChildRow) ){
							$tr = $tr.hide().next();
						}
					});
			}
		});
	}
})(jQuery);

