// wrap plugin in a closure
(function($) {
	// multitoggler plugin definition
	$.fn.multitoggler =
		function(options) {
			// extend default options with those provided
			var
				opts = $.extend({}, $.fn.multitoggler.defaults, options)
				transitions =
					{
						defaultIn: 'slideDown',
						defaultOut: 'slideUp',
						fadeIn: 'fadeIn',
						fadeOut: 'fadeOut'
					};

			return this.each(function() {
				var
					$this = $(this),

					// build element specific options
					o = $.metadata ? $.extend({}, opts, $this.metadata()) : opts,

					// plugin functionality starts here
					triggers = $('.' + o.triggerClass, $this),
					contents = $('.' + o.contentClass, $this),
					$expand = $('.' + o.triggerClass + '-expand', $this),
					$collapse = $('.' + o.triggerClass + '-collapse', $this);

				if (o.hide) {
					contents.hide();
					if ($expand.length) {
						$expand.removeClass('hidden');
					}
					if ($collapse.length) {
						$collapse.addClass('hidden');
					}
				} else {
					if ($expand.length) {
						$expand.addClass('hidden');
					}
					if ($collapse.length) {
						$collapse.removeClass('hidden');
					}
				}
				triggers.each(function(i, trigger) {
					var
						$trigger = $(trigger),
						$hrefElement =
							(
								o.ajax
									?
										(
											(
												'a' == trigger.tagName.toLowerCase()
											)
											? $trigger
											: $('a', $trigger) || null
										)
									: null
							);

					if (o.ajax && $hrefElement) {
						if (contents[i]) {
							var
								$content = $(contents[i]),
								ajaxOptions =
									{
										cache: false,
										dataType: 'html',
										success:
											function(data, textStatus) {
												$trigger
													.removeClass(o.loadingClass)
													.removeClass(o.collapsedClass)
													.addClass(o.expandedClass)
													.trigger(o.expandedClass);
												$content
													.html(data)
													.slideDown('normal', function() { $(this).trigger(o.expandedClass); });
											},
										url: $hrefElement.attr('href')
									};
							$hrefElement.bind('click', function(e) {
								if ($trigger.hasClass(o.expandedClass)) {
									$content.slideUp('normal', function() {
										$(this)
											.empty()
											.trigger(o.collapsedClass);
										$trigger
											.removeClass(o.expandedClass)
											.addClass(o.collapsedClass)
											.trigger(o.collapsedClass);
									});
								} else {
									$.ajax(ajaxOptions);
									$trigger.addClass(o.loadingClass);
								}
								return false;
							});
						}
					} else {
						$trigger.bind('click', function(e) {
							if (contents[i]) {
								if ($trigger.hasClass(o.expandedClass)) {
									if ($expand[i]) {
										$($expand[i]).removeClass('hidden');
									}
									if ($collapse[i]) {
										$($collapse[i]).addClass('hidden');
									}
									$trigger
										.removeClass(o.expandedClass)
										.addClass(o.collapsedClass);

									$.fn[transitions[o.transition + 'Out']]
										.call(
											$(contents[i]),
											'normal',
											function() {
												$(this)
													.removeClass(o.expandedClass)
													.addClass(o.collapsedClass)
													.trigger(o.collapsedClass)
													.hide();
												$trigger.trigger(o.collapsedClass);
											}
										);
								} else {
									if ($expand[i]) {
										$($expand[i]).addClass('hidden');
									}
									if ($collapse[i]) {
										$($collapse[i]).removeClass('hidden');
									}
									$trigger
										.removeClass(o.collapsedClass)
										.addClass(o.expandedClass);
									$.fn[transitions[o.transition + 'In']]
										.call(
											$(contents[i]),
											'normal',
											function() {
												$(this)
													.removeClass(o.collapsedClass)
													.addClass(o.expandedClass)
													.trigger(o.expandedClass);
												$trigger.trigger(o.expandedClass);
											}
										);
								}
							}

							return false;
						});
					}
				});
			});
		};

	// multitoggler plugin default options
	$.fn.multitoggler.defaults =
		{
			ajax: false,
			collapsedClass: 'multitoggler-collapsed',
			contentClass: 'multitoggler-content',
			expandedClass: 'multitoggler-expanded',
			loadingClass: 'loading',
			transition: 'default',
			triggerClass: 'multitoggler-trigger',
			hide: true
		};
})(jQuery);

