/**
 * YUI accordion menu, originally by Hedger Wang, updated at www.blog.highub.com. 
 * 
 * @author Hedger Wang
 * @link http://www.blog.highub.com/yui/advnaced-ajax-yui-accordion-navigation/
 * @requires YUI 2.x yahoo-dom-event.js
 * @requires YUI 2.x animation-min.js
 */
var AccordionMenu = (function() {
	var YUD = YAHOO.util.Dom;
	var YUE = YAHOO.util.Event;
	var oMenuSetting = {};
	var oMenuCache = {};
	var dLastHoverTitle;
	YUD.addClass(document.documentElement,'accordion-menu-js');
	
	function getDT(e) {
		var dEl = YUE.getTarget(e);
		if ((e.tagName + '').toUpperCase() == 'DD') {
			var dt = e.previousSibling;
			while (dt) {
				if (dt.tagName && dt.tagName.toUpperCase() == 'DT') {
					break;
				};
				dt = dt.previousSibling
			};
			if (!dt || dt.tagName.toUpperCase() != 'DT') {
				return;
			} else {
				return (dt.tagName == 'DT') ? dt:null;
			};
		} else if (e.clientX) {
			var found = false;
			while (dEl.parentNode) {
				if (YUD.hasClass(dEl,'a-m-t')) {
					found  = true; break;
				};
				dEl = dEl.parentNode;
			};
			if (!found) {
				return null;
			} else {
				return (dEl.tagName == 'DT') ? dEl:null;
			};
		};
	};

	function getDD(dt) {
		if (!dt) { return null; };
		var dd = dt.nextSibling;
		while (dd) {
			if (dd.tagName && dd.tagName.toUpperCase() == 'DD') {
				break;
			};
			dd = dd.nextSibling;
		};
		if (!dd || dd.tagName.toUpperCase() != 'DD') {
			return;
		} else {
			return dd;
		};
	};

	function expand(dl,dt,dd) {
		dl.hasAnimation += 1;
		YUD.addClass(dd,'a-m-d-before-expand');
		var oAttr = { height:{ from:0,to:dd.offsetHeight } };
		YUD.removeClass(dd,'a-m-d-before-expand');
		var onComplete = function() {
			oAnim.onComplete.unsubscribe(onComplete);
			oAnim.stop();
			YUD.removeClass(dd,'a-m-d-anim');
			YUD.addClass(dd,'a-m-d-expand');
			onComplete = null;
			dl.hasAnimation -=1;
			var dt = getDT(dd);
			YUD.addClass(dt,'a-m-t-expand');
			if (oMenuCache[dl.id] && oMenuCache[dl.id].onOpen && dd.style.height != '') { 	
				oMenuCache[dl.id].onOpen({ dl:dl,dt:dt,dd:dd });							
			};
			dd.style.height = '';
		};
		var onTween = function() { 
			if (dd.style.height) { 	
				YUD.addClass(dd,'a-m-d-anim');			
				oAnim.onTween.unsubscribe(onTween);
				onTween = null;
				dd.oAnim = null;
			};
		};
		if (dd.oAnim) { 
			dd.oAnim.stop();
			dd.oAnim = null;
			dl.hasAnimation -= 1;
		};
		var oEaseType = YAHOO.util.Easing.easeOut;
		var seconds = 0.5;
		if (oMenuCache[dl.id]) { 
			oEaseType = oMenuCache[dl.id]['easeOut'] ? oEaseType:YAHOO.util.Easing.easeIn;
			seconds =  oMenuCache[dl.id]['seconds'];
			
			if (!oMenuCache[dl.id]['animation']) { 
				var oAnim = { onComplete:{ unsubscribe:function() {} },stop:function() {} };
				onComplete();
				return;
			};
		};
		var oAnim = new YAHOO.util.Anim(dd,oAttr,seconds ,oEaseType);
		oAnim.onComplete.subscribe(onComplete);
		oAnim.onTween.subscribe(onTween);
		oAnim.animate();
		dd.oAnim = oAnim;
	};
	
	function collapse(dl,dt,dd) { 
		dl.hasAnimation +=1;
		YUD.addClass(dd,'a-m-d-anim');
		var oAttr = { height:{ from:dd.offsetHeight,to:0 } };
		var onComplete = function() { 
			oAnim.onComplete.unsubscribe(onComplete);
			YUD.removeClass(dd,'a-m-d-anim');
			YUD.removeClass(dd,'a-m-d-expand');
			dd.style.height = '';
			dd.oAnim = null;
			onComplete = null;
			dl.hasAnimation -=1;
			var dt = getDT(dd);
			YUD.removeClass(dt,'a-m-t-expand');
			if (oMenuCache[dl.id] && oMenuCache[dl.id].onOpen) { 				
				oMenuCache[dl.id].onClose(	 { dl:dl,dt:dt,dd:dd });
			};		
		};
		if (dd.oAnim) { 
			dd.oAnim.stop();
			dd.oAnim = null;
			dl.hasAnimation -=1;
		};
		var oEaseType = YAHOO.util.Easing.easeOut;
		var seconds = 0.5;
		if (oMenuCache[dl.id]) { 
			oEaseType = oMenuCache[dl.id]['easeOut']?oEaseType:YAHOO.util.Easing.easeIn;
			seconds =  oMenuCache[dl.id]['seconds'];
			if (!oMenuCache[dl.id]['animation']) { 
				var oAnim = { onComplete:{ unsubscribe:function() {} },stop:function() {} };
				onComplete();
				return;
			};
		};
		var oAnim = new YAHOO.util.Anim(dd,oAttr,seconds ,oEaseType);
		oAnim.onComplete.subscribe(onComplete);
		oAnim.animate();
		dd.oAnim = oAnim;
	};
	
	function collapseAll(dl,dt,dd) { 
		var aOtherDD = YUD.getElementsByClassName('a-m-d-expand','dd',dl);
		for (var i=0;i<aOtherDD.length;i++) { 
			var otherDD = aOtherDD[i];
			if (otherDD !=dd) { 
				collapse(dl,null,otherDD);
			};			
		};
	}

	var onMenuMouseover = function(e) { 
		var dMenuTitle = getDT(e);
		if (!dMenuTitle) { return; };
		if (dLastHoverTitle) { 
			YUD.removeClass(dLastHoverTitle,'a-m-t-hover');
		};	
		YUD.addClass(dMenuTitle,'a-m-t-hover');
		dLastHoverTitle = dMenuTitle;
		YUE.preventDefault(e);
		return false;	
	};
	
	var onMenuMouseout = function(e) { 
		var dMenuTitle = getDT(e);
		if (!dMenuTitle) { return; };
		if (dLastHoverTitle && dLastHoverTitle!=dMenuTitle) { 
			YUD.removeClass(dLastHoverTitle,'a-m-t-hover');
			YUD.removeClass(dLastHoverTitle,'a-m-t-down');
		};
		YUD.removeClass(dMenuTitle,'a-m-t-down');
		YUD.removeClass(dMenuTitle,'a-m-t-hover');
		dLastHoverTitle = null;
		YUE.preventDefault(e);
		return false;	
	};
	
	var onMenuMousedown = function(e) { 
		var dMenuTitle = getDT(e);
		if (!dMenuTitle) { return; };
		YUD.addClass(dMenuTitle,'a-m-t-down');
		YUE.preventDefault(e);
		return false;
	};
	
	var onMenuClick = function(e) { 
		var dt = getDT(e);
		if (!dt) { return; };
		var dd = getDD(dt);
		if (!dd) { return; };
		var dl = dt.parentNode;
		
		if (dl.hasAnimation == null) { 
			dl.hasAnimation = 0;
		}
		if (dl.hasAnimation > 0) { return; };
		YUD.removeClass(dt,'a-m-t-down');
		
		if (YUD.hasClass(dd,'a-m-d-expand')) { 	
			collapse(dl,dt,dd);
		} else { 			
			if (oMenuCache[dl.id] && oMenuCache[dl.id].dependent == false) {}
			else { collapseAll(dl,dt,dd); }
			expand(dl,dt,dd);
		};	
		YUE.preventDefault(e);
		return false;
	};
	
	YUE.on(document,'mouseover',onMenuMouseover);
	YUE.on(document,'mouseout',onMenuMouseout);
	YUE.on(document,'mousedown',onMenuMousedown);
	YUE.on(document,'click',onMenuClick);
	
	var oApi = { 
		openDtById: function(sId) { 
			var dt = document.getElementById(sId);
			if (!dt) { return; };
			if (!YUD.hasClass(dt,'a-m-t')) { return; };
			var dl = dt.parentNode;
			var dd = getDD(dt);
			if (dl.hasAnimation == null) { dl.hasAnimation = 0; };
			if (dl.hasAnimation > 0) { return; };
			if (YUD.hasClass(dd,'a-m-d-expand')) { return; };
			if (oMenuCache[dl.id] && oMenuCache[dl.id].dependent == false) { 
			} else { 
				collapseAll(dl,dt,dd);
			}
			expand(dl,dt,dd);
		},
		closeDtById: function(sId) { 
			var dt = document.getElementById(sId);
			if (!dt) { return; };
			if (!YUD.hasClass(dt,'a-m-t')) { return; };
			var dl = dt.parentNode;
			var dd = getDD(dt);
			if (dl.hasAnimation == null) { dl.hasAnimation = 0; };
			if (dl.hasAnimation > 0) { return; };
			if (!YUD.hasClass(dd,'a-m-d-expand')) { return; };
			collapse(dl,dt,dd);
		},
		setting: function(id,oOptions) { 	
			if (!oOptions) { return; };
			if (typeof(id)!='string') { return; };
			var setMunu = function(dl) { 	
				dl = dl || this;
				dl.hasAnimation = 0;
				oMenuCache[dl.id] = { 
					element:dl,
					dependent:true,
					onOpen:function() {},
					onClose:function() {},
					seconds:0.5,
					easeOut:true,
					openedIds:[],
					animation:true
				};
				oMenu =  oMenuCache[dl.id];
				if (typeof(oOptions['animation']) == 'boolean') {
					oMenu['animation'] = !!oOptions['animation'];
				};
				if (typeof(oOptions['dependent']) == 'boolean') {
					oMenu['dependent'] = !!oOptions['dependent']; 
				};
				if (typeof(oOptions['easeOut']) == 'boolean') {
					oMenu['easeOut'] = !!oOptions['easeOut'];
				};
				if (typeof(oOptions['seconds']) == 'number') {
					oMenu['seconds'] = Math.max(0 , oOptions['seconds']);
				};
				if (typeof(oOptions['onOpen']) == 'function') {
					oMenu['onOpen'] = oOptions['onOpen'];
				};
				if (typeof(oOptions['onClose']) == 'function') {
					oMenu['onClose'] = oOptions['onClose'];
				};
				if (oOptions['openedIds'].shift) {
					oMenu['openedIds'] = oOptions['openedIds'];
				};
				for (var i=0; i<oMenu['openedIds'].length; i++) {
					var sId = oMenu['openedIds'][i];
					var dt = document.getElementById(sId);
					if (dt && dt.tagName.toUpperCase() == 'DT') {
						var dl = dt.parentNode;
						var dd = getDD(dt);
						expand(dl,dt,dd);
					} else if (!dt) {
						function onDtAvailable() {
							var dt = this;
							if (dt.tagName.toUpperCase() == 'DT') {
								var dl = dt.parentNode;
								var dd = getDD(dt);
								expand(dl,dt,dd);
							};
						};
						YUE.onAvailable(sId,onDtAvailable);
					}
				};
			};
			if (document.getElementById(id)) { 
				setMunu(document.getElementById(id))
			} else { 	
				YUE.onAvailable(id,setMunu);
			};
		}
	 };//endof api
	 
 	return oApi;
 
})();

function onMyMenuOpen(obj) {
    var dl = obj.dl;
    var dt = obj.dt;
    var dd = obj.dd;
    /*
    var d = document.createElement('div');
    d.className = 'debug';
    d.innerHTML = dt.innerHTML + ' is opened';
    document.body.insertBefore(d, dl.nextSibling);
    */
 }

function onMyMenuClose(obj) {
    var dl = obj.dl;
    var dt = obj.dt;
    var dd = obj.dd;
    /*
    var d = document.createElement('div');
    d.className = 'debug';
    d.innerHTML = dt.innerHTML + ' is closed';
    document.body.insertBefore(d, dl.nextSibling);
    */
 }