/*!
 * Solid Accordion Plugin for jQuery
 *
 * Version: 0.2
 * Author: Sayo (sayo@live.ru, me@sayo.ru)
 *
 * Note that plugin works only with elements that have id.
 */

(function($){
	$.fn.solidAccordion = function(option){
		var defaults = {
			speed: "fast", // Animation speed
			baseHeight: 50, // Height of inactive element (in pixels)
			fullHeight: 100, // Height of active element (in pixels)
			activeClass: 'accordion_active', // Class of inactive element
			inactiveClass: 'accordion_inactive', // Class of active element
			bottomToTop: false, // Animation style (slide down or slide up)
			makeActiveTop: false, // Change active element z-index to be at top
			action: 'mouseover', // Action to change active element
			
			activeId: "" // Active element id
			
			/*
				Also baseHeight, fullHeight, activeClass and inactiveClass params can be defined as
				attributes of element: accordionBaseHeight, accordionFullHeight, accordionActiveClass,
				accordionInactiveClass.
				
				Note that bottomToTop param will change position to relative.
				If you have problems with bottomToTop in IE, set containter position to relative.
			*/
		};
		
		option = $.extend(defaults, option);
		
		activeAccordionItem = undefined;
		
		$(this).each(function() {
			var $this = $(this);
			var $_this = this;
			
			if (option.bottomToTop)
			{
				$this.children().css('position', 'relative');
			}
			
			var bH = option.baseHeight, fH = option.fullHeight;
			if ($this.attr("accordionBaseHeight"))
				bH = $this.attr("accordionBaseHeight");
			if ($this.attr("accordionFullHeight"))
				fH = $this.attr("accordionFullHeight");
			
			if (option.activeId == this.id || $this.attr("accordionActive"))
			{
				$this.css("height", parseInt(fH) + "px");
				
				if (option.bottomToTop)
				{
					$this.children().css('bottom', '0px');
				}
				
				if ($this.attr('accordionActiveClass'))
					$this.addClass($this.attr('accordionActiveClass'));
				else if (option.activeClass != "")
					$this.addClass(option.activeClass);
					
				activeAccordionItem = $this;
			} else {
				$this.css("height", parseInt(bH) + "px");
				
				if (option.bottomToTop)
				{
					$this.children().css('bottom', (parseInt(fH) - parseInt(bH)) + 'px');
				}
				
				if ($this.attr('accordionInactiveClass'))
					$this.addClass($this.attr('accordionInactiveClass'));
				else if (option.inactiveClass != "")
					$this.addClass(option.inactiveClass);
			}
			
			$this.bind(option.action, function(e){
				if (activeAccordionItem != $this)
				{
					if (activeAccordionItem != undefined)
					{
						activeAccordionItem.stop(true);
					
						var abH = option.baseHeight, afH = option.fullHeight;
						if (activeAccordionItem.attr("accordionBaseHeight"))
							abH = activeAccordionItem.attr("accordionBaseHeight");	
						if (activeAccordionItem.attr("accordionFullHeight"))
							afH = activeAccordionItem.attr("accordionFullHeight");
						
						activeAccordionItem.animate({height: parseInt(abH) + "px"}, option.speed);
						
						if (option.bottomToTop)
						{
							activeAccordionItem.children().animate({bottom: (parseInt(afH) - parseInt(abH)) + 'px'}, option.speed);
						}
						
						if (activeAccordionItem.attr('accordionActiveClass'))
							activeAccordionItem.removeClass(activeAccordionItem.attr('accordionActiveClass'));
						else if (option.activeClass != "")
							activeAccordionItem.removeClass(option.activeClass);
							
						if (activeAccordionItem.attr('accordionInactiveClass'))
							activeAccordionItem.addClass(activeAccordionItem.attr('accordionInactiveClass'));
						else if (option.inactiveClass != "")
							activeAccordionItem.addClass(option.inactiveClass);
					}
						
					activeAccordionItem = $this;
					var fH = option.fullHeight;
					if ($this.attr("accordionFullHeight"))
						fH = $this.attr("accordionFullHeight");
					
					$this.animate({height: parseInt(fH) + "px"}, option.speed);
					
					if (option.bottomToTop)
					{
						$this.children().animate({bottom: '0px'}, option.speed);
					}
					
					if ($this.attr('accordionInactiveClass'))
						$this.removeClass(activeAccordionItem.attr('accordionInactiveClass'));
					else if (option.inactiveClass != "")
						$this.removeClass(option.inactiveClass);
						
					if ($this.attr('accordionActiveClass'))
						$this.addClass(activeAccordionItem.attr('accordionActiveClass'));
					else if (option.activeClass != "")
						$this.addClass(option.activeClass);
				}
			});
		});
	}
})(jQuery);

