/*
	Written by Bborie Park
	Copyright (c) 2008 California Vectorborne Disease Surveillance System
	Licensed under the GNU GPL
*/
(function($) {

	$.extend({
		ecollapse: new function() {

			this.defaults = {
				speed: 500,
				speedOpen: 500,
				speedClose: 500
			};

			function collapseEvent() {
				if ($(this).children(".nocollapse").length > 0) {
					collapseAction.call(this, "parcollapse");
				}
				else {
					collapseAction.call(this, "collapse");
				}

				$(this).trigger('ecollapseEvent');
			}

			function collapseAction(collapseType) {
				var e = this;
				var $e = $(this);

				switch (collapseType) {
					case 'collapse':
						// collapse fieldset
						if (!$e.hasClass("collapsed")) {
							$e.children().not(".trigger").slideUp(e.config.speedClose, function() {
								if ($(this).siblings(':not(".trigger")').andSelf().is(':hidden')) $e.addClass('collapsed');
							});
						}
						// expand fieldset
						else {
							$e.removeClass('collapsed');
							$e.children().not(".trigger").slideDown(e.config.speedOpen);
						}
						break;
					case 'parcollapse':
						$e.toggleClass("parcollapsed");
						$e.children().not(".nocollapse").not("legend").slideToggle(e.config.speed);
						break;
				}
			}

			this.construct = function(options) {
				return this.each(function() {
					var config, e;
					e = this;

					this.config = {};
					config = $.extend(this.config, $.ecollapse.defaults, options);

					// collapse element if it has css class "collapsed"
					$(this).filter(".collapsed").each(function () {
						$(this).children().not(".trigger").hide();
					});

					// partially collapse element if it has css class "parcollapsed"
					$(this).filter(".parcollapsed").each(function () {
						$(this).children().not(".nocollapse").not(".trigger").hide();
					});

					// attach event to trigger element 
					$(this).children(".trigger").unbind('click.ecollapse').bind('click.ecollapse', function(event) {
						collapseEvent.call(e);
						return false;
					});
				});
			}
		}
	});

	$.fn.extend({
		ecollapse: $.ecollapse.construct,
		eCollapse: $.ecollapse.construct
	});

})(jQuery);

