/**
* Generic toggle module   
* @author a.weeber, Wisdom
* @date 03-2009
* @namespace YAHOO.newsengine 
* @module toggle
* @static
* @requires yahoo, dom, event, animation (optional), cookie (optional) from YUI Library 2.x
*/ 

YAHOO.namespace("newsengine");
YAHOO.newsengine.toggle = (function() {


	/**
	* Yui shortcut variables 
	* @final 
	*/

	var Dom = YAHOO.util.Dom,
		Event = YAHOO.util.Event;
	
	/**
	* Module settings object 
	* @final 
	*/
	
	var settings = {
		toggleClass 		: "toggle",
		activeClass			: "active",
		showClass			: "show",
		toggleRegionClass	: "toggleRegion",
		enableCookie		: true
	};


	/**
	* Initializes the module based on CSS (toggle) context 
	* @method init
	*/

	var init = function() {
		
		var toggleControls = Dom.getElementsByClassName(settings.toggleClass, "a");		
	
		Event.addListener(toggleControls, "click", function(e){Event.preventDefault(e);});
		Event.addListener(toggleControls,"click",function(){toggleElement(this);});
		
		if(settings.enableCookie) {
			
			/* load toggle state if stored in cookie*/
			loadCookieStates(toggleControls);
		}
	};
	
	/**
	* Toggles an element based on source elements properties stored in the 'rel' attribute
	* @method toggleElement
	* @private
	* @param {Obj} toggleControl HTML source element (<a>)
	*/

	var toggleElement = function(toggleControl) {
		
		/* toggle parameters are stored in the a's rel attribuut */
		/* param order : target(id),effect(string),effectLength(int), storeCookie(boolean) */
		/* 1st param targetId is always required */
		
		var toggleSettings		= toggleControl.rel.split(",");
		var toggleTarget		= Dom.get(toggleSettings[0]);
		var toggleEffect		= toggleSettings[1];
		var toggleEffectLength	= toggleSettings[2];
		var storeInCookie		= toggleSettings[3];

		var isValidEffect = function(toggleEffect) {
			if(!toggleEffect) { 
				return false;
			}
			else  {
				return toggleEffect === "collapse" || toggleEffect === "fade"; /* add extra effects with ||*/
			}
		};
	
		if(isValidEffect(toggleEffect)) {
			var toggleAnim;
			
			if(toggleEffect == "collapse") {
				var currentHeight,toHeight;
		
				if(Dom.hasClass(toggleTarget,settings.showClass)) {
					currentHeight = Dom.getRegion(toggleTarget).bottom - Dom.getRegion(toggleTarget).top;
					
				} else {
					currentHeight = 0;
				}

				if(currentHeight == "0") {
					// check original height
					Dom.addClass(toggleTarget,settings.showClass);
					Dom.setStyle(toggleTarget, "height", "auto");
					toHeight = Dom.getRegion(toggleTarget).bottom - Dom.getRegion(toggleTarget).top;
					Dom.setStyle(toggleTarget, "height", "0px");
					Dom.addClass(toggleControl, settings.activeClass);

				} else {
					toHeight = 0;
					Dom.removeClass(toggleControl, settings.activeClass);
				}
				
				toggleAnim = new YAHOO.util.Anim(toggleTarget, { height: { to: toHeight }},toggleEffectLength);
				toggleAnim.useSeconds = false;
				
				// set the height back to auto at the end of the animation
				if(toHeight > 0) {
					toggleAnim.onComplete.subscribe(function() {Dom.setStyle(toggleTarget, "height", "auto");});
				} else {
					toggleAnim.onComplete.subscribe(function() {Dom.removeClass(toggleTarget, settings.showClass);});
				}
				
				// start animation
				toggleAnim.animate();
			}
			
			if(toggleEffect == "fade") {
				
				var toOpacity = "0";
				if(Dom.hasClass(toggleTarget,settings.showClass)) {
					Dom.removeClass(toggleControl, settings.activeClass);
				} else {
					toOpacity = "0.999";
					Dom.setStyle(toggleTarget, "opacity", "0");
					Dom.addClass(toggleTarget, settings.showClass);
					Dom.addClass(toggleControl, settings.activeClass);
				}
				
				toggleAnim = new YAHOO.util.Anim(toggleTarget, { opacity: { to: toOpacity }},toggleEffectLength);
				toggleAnim.useSeconds = false;

				if(toOpacity == "0") {
					toggleAnim.onComplete.subscribe(function() {Dom.removeClass(toggleTarget, settings.showClass);});
				}
				toggleAnim.animate();
			}
	
		}
		/* normal toggle mode*/
		else {
			if(Dom.hasClass(toggleTarget,settings.showClass)) {
				Dom.removeClass(toggleTarget, settings.showClass);
				Dom.removeClass(toggleControl, settings.activeClass);
			} else {
				Dom.addClass(toggleTarget, settings.showClass);
				Dom.addClass(toggleControl, settings.activeClass);
			}
		}
		
		/* store state in cookie */
		
		if(storeInCookie == "true" && toggleControl) {
			var stateValue = "off";
			if(Dom.hasClass(toggleControl, settings.activeClass)) {
				stateValue = "on";	
			}
			YAHOO.util.Cookie.set(toggleTarget.id, stateValue, { expires: new Date("January 12, 2065"),  path: "/" });
		}
	};
	
	/**
	* Loads the toggle states based on cookie value
	* @method loadCookieStates
	* @private
	*/
	
	var loadCookieStates = function(toggleElements) {
		
		for(var i=0; i<toggleElements.length; i++) {
			
			var toggleSettings		= toggleElements[i].rel.split(",");
			var toggleTargetId		= toggleSettings[0];
			var toggleEffect		= toggleSettings[1];
			
			if(YAHOO.util.Cookie.get(toggleTargetId) == "on") {
				// set targerObj to display block/height & toggleControl to class active
				if(toggleEffect && toggleEffect == "collapse") {
					Dom.setStyle(toggleTargetId, "height", "auto");
				} 
				Dom.addClass(toggleTargetId, settings.showClass);
				Dom.addClass(toggleElements[i], settings.activeClass);

			} else if(YAHOO.util.Cookie.get(toggleTargetId) == "off") {
				// set targerObj to display none / height & remove class active from toggleControl
				if(toggleEffect && toggleEffect == "collapse") {
					Dom.setStyle(toggleTargetId, "height", "0px");
				} 
				Dom.removeClass(toggleTargetId, settings.showClass);
				Dom.removeClass(toggleElements[i], settings.activeClass);
			} else {
				// cookie not set or propery set
			}			
		}
	};	
	
	
	/**
	* @return {obj} collection of public methods
	*/
	
	return  {
		init:init
		
	};

})();

YAHOO.util.Event.onDOMReady(YAHOO.newsengine.toggle.init, YAHOO.newsengine.toggle, true);
