/**
 * JQuery Plugin to create a simple accordion.
 */
(function($) {

	// Classes to mark important DOM elements
	var MARKER_CLASS_ACCORDION = "jsAccordion";
	var MARKER_CLASS_ELEMENT = "jsAccordionElement";
	var KEY_ACCORDION_CONFIG = "accordionConfig";
	var KEY_ACCORDION_ISRUNNING = "accordionIsRunning";
	
	
	var getAccordionConfigFor = function(elem) {
		return $(elem).closest('.'+MARKER_CLASS_ACCORDION)
			.data(KEY_ACCORDION_CONFIG);
	};

	var isAnimationRunning = function(elem) {
		return $(elem).closest('.'+MARKER_CLASS_ACCORDION)
		.data(KEY_ACCORDION_ISRUNNING);		
	};
	
	var setAnimationRunning = function(elem,boolean) {
		return $(elem).closest('.'+MARKER_CLASS_ACCORDION)
		.data(KEY_ACCORDION_ISRUNNING,boolean);			
	};
	
	
	var getAccordionElementFor = function(elem) {
		return $(elem).closest('.'+MARKER_CLASS_ELEMENT);
	};
	
	var getAccordionContentFor = function(elem) {
		var currElem = getAccordionElementFor(elem);
		var currConfig = getAccordionConfigFor(elem);
		return $('.'+currConfig.contentClass,currElem);
	};
	
	// Click handler for the toggle Element
	var toggleClickHandler = function(e) {
		var currElem = getAccordionElementFor(this);
		var currConfig = getAccordionConfigFor(this);
		var currContent = getAccordionContentFor(this);
		var self = this;
		setAnimationRunning(self,true);
		if (currElem.hasClass(currConfig.expandedClass)) {
			// Element is expanded:
			if (currConfig.onClose) currConfig.onClose(currElem,currConfig);
			currContent.slideUp(currConfig.closeTime,function() {
				setAnimationRunning(self,false);
				if (currConfig.onClosed) currConfig.onClosed(currElem,currConfig);
			});
			currElem.removeClass(currConfig.expandedClass);
		} else {
			// Element is folded:
			if (currConfig.onOpen) currConfig.onOpen(currElem,currConfig);
			currContent.slideDown(currConfig.closeTime,function() {
				setAnimationRunning(self,false);
				if (currConfig.onOpened) currConfig.onOpened(currElem,currConfig);
			});
			currElem.addClass(currConfig.expandedClass);			
		}
		return false;
	};
	
	$.fn.accordion = function(settings) {
		var config = {
			// Animation
			'openTime': 1000,
			'closeTime': 1000,
			// Callbacks	
			'onOpen': null,
			'onOpened': null,
			'onClose': null,
			'onClosed': null,
			// CSS
			'togglerClass': 'toggle',
			'elementClass': 'accordionElement',
			'contentClass': 'accordionElementContentContainer',
			'expandableClass': 'expandable',
			'expandedClass': 'expanded'
		};
		if (settings) $.extend(config, settings);
		this.each(function() {
			$(this).addClass(MARKER_CLASS_ACCORDION);
			$(this).data(KEY_ACCORDION_CONFIG,config);
			$(this).data(KEY_ACCORDION_ISRUNNING,false);
			$('.'+config.elementClass).each(function() {
				$(this).addClass(MARKER_CLASS_ELEMENT);
				$('.'+config.togglerClass,this).click(toggleClickHandler);
				if (!$(this).hasClass(config.expandedClass)) {
					$('.'+config.contentClass,this).hide();
				}
			});
		});	
	};	
	
})(jQuery);
