/*
 * jQuery simpleAccordion plugin
 * @author Jonas Weidler (jquery@jonas-weidler.de)
 * @version 0.1.3
 * @date October 21, 2010
 * @category jQuery plugin
 * @requires jQuery 1.4.2
 * @copyright (c) 2010 Jonas Weidler
 * @license CC Attribution-Share Alike 3.0 - http://creativecommons.org/licenses/by-sa/3.0/
 */

(function($){
	$.fn.extend({ 
		simpleAccordion: function(options) {
			var defaults = 
			{
				slideSpeed: 500,
				classOpened: 'active',
				classTrigger: 'trigger',
				classContents: 'acc-contents',
				showOnLoad: 'none',
				list: false, // if you want to use the accordion inside a navigation set list to true
				event: 'click'
			};
			var options = $.extend(defaults, options);
			
			return this.each(function() {
								
				var opt = options;
				var obj = $(this);
				var sel = this.selector;
				
				var objContents = $("."+opt.classContents, this);
				//if (opt.list) var objTrigger = $(this).children("."+opt.classTrigger).children();
				if (opt.list) var objTrigger = $("."+opt.classTrigger, this).find(":first");
				else var objTrigger = $(this).children("."+opt.classTrigger);
				
				// notes to myself: once I used an accordion nested in another one there occured problems with setting the width of the nested ones because there were already hidden and had a width of 0 due to that. that's why I'm using this:
				$("."+opt.classContents, sel).show();
				// setting a width prevents bumpy ending of slide transition
				// this is the only part that actually requires jQ 1.4 :-(
				var width = objContents.width();
				objContents.css("width", width);
				$("."+opt.classContents, sel).hide();
				
				objTrigger.css({
					cursor: "pointer"
				});
				
				var i = 1;
				objContents.each(function(){
					$(this).attr("rel", "set-contents-"+i);
					i++;
				});
				
				objTrigger.bind(opt.event, function(event){
					var currentTrigger = $(this);
					
					// when you use nested accordions this will prevent the trigger of a parent accordion to be launched
					//event.stopPropagation();
					
					// determine the contents-element according to what 'list' is set to
					if (opt.list) var nextContents = currentTrigger.children("."+opt.classContents).eq(0);
					else var nextContents = currentTrigger.nextAll("."+opt.classContents).eq(0);
					//var nextContents = currentTrigger.nextAll("."+opt.classContents).eq(0);
					
					// close all active contents-elements if they're not realted to the trigger-element
					$("."+opt.classContents+"."+opt.classOpened, obj).each(function(){
						if (nextContents.attr("rel") != $(this).attr("rel")) {
							$(this).slideUp(opt.slideSpeed).removeClass(opt.classOpened);
							objTrigger.removeClass(opt.classOpened);
						}
					});
					
					isOpened = nextContents.hasClass(opt.classOpened);
					switch (isOpened) {
						case true:
							nextContents.slideUp(opt.slideSpeed).removeClass(opt.classOpened);
							objTrigger.removeClass(opt.classOpened);
							break;
						case false:
							nextContents.slideDown(opt.slideSpeed).addClass(opt.classOpened);
							currentTrigger.addClass(opt.classOpened);
							break;
					}
					event.preventDefault();
				});
				
				if (opt.showOnLoad != 'none') objTrigger.eq(opt.showOnLoad).trigger(opt.event);
			});
		}
	});
})(jQuery);
