
/**
 * Accordion Menu module
 * 
 * var myMenu = new AccordionMenu (sElementId, config);
 */

var AccordionMenu = function(sElementId, defaultItemId, p_config) {

	// Widget configuration
	var config = p_config;
	
	// Menu container el
	var menuContainerEl;
	
	// Name of cookie storing current selection
	var cookieId;
	
	// Element of currently selected menu item
	var selectedItemId;

	var expandedHeight = "350px";
	var collapsedHeight = "80px";
	
	init (sElementId);
	
	/**
	 * Initialize a viewport.
	 */
	function init (sElementId) {
		menuContainerEl = document.getElementById(sElementId);
		cookieId = sElementId;
		selectedItemId = YAHOO.util.Cookie.get(cookieId);
		
		if (! selectedItemId ) {
			selectedItemId = defaultItemId;
		}
		
		var menuItems = menuContainerEl.getElementsByTagName("li");
		var i, item;
		
		for (i = 0; i < menuItems.length; i++) {
			
			item = menuItems[i];
			
			if ( ! YAHOO.util.Dom.hasClass(item, "ami")) {
				continue;
			}
			
			if (item.id === selectedItemId) {
				item.style.height = expandedHeight;
			} else {
				item.style.height = "1.5em";
				YAHOO.util.Dom.addClass(item,"collapsed");
			}
			YAHOO.util.Event.addListener(item, "click", select, item.id);
		}
		
		menuContainerEl.style.visibility="visible";
	}
	
	function animateHeight (id, fromSize, toSize, onCompleteFn) {
		var anim = new YAHOO.util.Anim(id, { 
				height: {	
					from: fromSize, 
					to: toSize,
					unit: "px"
				} 
			}, 
			.5, 
			YAHOO.util.Easing.easeIn); 
		if (onCompleteFn) {
			anim.onComplete.subscribe(onCompleteFn);
		}
		anim.animate();
	};
	
	function select (e, o) {
		if ( o === selectedItemId) {
			return;
		}
		
		var selectedItemEl = document.getElementById(selectedItemId);
		
		collapse(selectedItemId, function () {
			YAHOO.util.Dom.addClass(selectedItemEl, "collapsed");
		});
		
		expand(o);
	
		YAHOO.util.Dom.removeClass(o, "collapsed");
		
		selectedItemId = o;
			
		// Remember selectedItemId (use cookie)
		// TODO: selectedItemEl may not have an id !
		if (selectedItemId == null) {
			YAHOO.util.Cookie.remove (cookieId);
		} else {
			YAHOO.util.Cookie.set (cookieId, o, {path:"/"});
		}
		
		// onSelect callback
		if (config.onSelect) {
			config.onSelect(o);
		}
	}
	
	function expand (id, onCompleteFn) {
		animateHeight (id, 20, 350, onCompleteFn);
	}
	function collapse (id, onCompleteFn) {
		animateHeight (id, 350,20, onCompleteFn);
	}
	
	// Public methods
	return {
		getSelectedItemId : function () { return selectedItemId; },
		select : function (sId) {toggle(null,sId);} ,
		expand : function (sId) {expand(sId); } ,
		collapse:function (sId) {collapse(sId);}
	}

}; 
