/***
 * Creates new navigation
 * Namespace: Navigation
 * @param integer $submenuOffsetTop
 * @param integer $submenuOffsetLeft
 */
Navigation = {
	DD_SPEED: 3,
	DD_TIMER: 15,
	
	submenuOffsetTop: 0,
	submenuOffsetLeft: 0,
	
	timerMenu: [],
	timerSubMenu: [],

	/**
	 * Clear menu timeout
	 * @access private
	 * @param string $id
	 */ 
	setOffset: function (submenuOffsetTop, submenuOffsetLeft) {
		this.submenuOffsetTop	= (Util.isEmpty(submenuOffsetTop)) ? 0 : submenuOffsetTop;
		this.submenuOffsetLeft	= (Util.isEmpty(submenuOffsetLeft)) ? 0 : submenuOffsetLeft;
	},
	
	/** 
	 * Clear menu timeout
	 * @access private
	 * @param string $id
	 */ 
	_clearMenu: function (id) {
		if(this.timerMenu[id]) { clearTimeout(this.timerMenu[id]); }
	},
	
	/** 
	 * Clear submenu timeout
	 * @access private
	 * @param string $id
	 */ 
	_clearSubmenu: function (id) {
		if(this.timerSubMenu[id]) { clearInterval(this.timerSubMenu[id]); }
	},

	/** 
	 * Switch submenu
	 * @param string $id
	 * @param boolean $on
	 */ 
	switchMenu: function (id, on) {
		var menu	= Util.GetObject('Menu' + id);
		var submenu	= Util.GetObject('Submenu' + id);

		this._clearSubmenu(id);

		if(on == 1) {
			this._clearMenu(id);
	
			// Mouse over effect for classname
			if(Util.stristr(menu.className, 'Active')) {
				menu.active = true;
			} else {
				menu.active = false;
				menu.className = menu.className + 'Active';
			}
			Switch.SwitchCursor(menu, 1);

			if(submenu != null) {
				// Show submenue
				submenu.style.display = 'block';
	
				// Initalize height, top and left position
				if(!submenu.startHeight) {
		     		submenu.style.height	= 'auto';
					submenu.startHeight		= submenu.offsetHeight;
					submenu.startTop		= submenu.offsetTop;
					submenu.startLeft		= submenu.offsetLeft;
					submenu.style.height	= '0px';
					submenu.style.zIndex	= '50000';
	
					var top = parseInt(submenu.startTop) + parseInt(this.submenuOffsetTop);
					var left = parseInt(submenu.startLeft) + parseInt(this.submenuOffsetLeft);
	
					submenu.style.top = top + 'px';
					submenu.style.left = left + 'px';
				
					Util.SetStyle(submenu, 'backgroundPosition', '0% 100%');
				}
	
				// Start sliding for open
				this.timerSubMenu[id] = setInterval(function() { Navigation.slideMenu(id, 1); }, Navigation.DD_TIMER);
			}
		} else {
			this.timerMenu[id] = setTimeout(function() { Navigation.collapseMenu(id); }, 100);
		}
	},
	
	/** 
	 * Cancel switching old submenus
	 * @param string $id
	 */ 
	cancelSwitchMenu: function (id) {
		var menu	= Util.GetObject('Menu' + id);
		var submenu	= Util.GetObject('Submenu' + id);
	
		this._clearMenu(id);
	
		if(submenu != null) {
			this._clearSubmenu(id);
			
			var currentHeight = parseInt(submenu.style.height) || 0;
	
			Util.SetStyle(submenu, 'backgroundPosition', '0% 100%');
	
			if(submenu.startHeight && currentHeight <= submenu.startHeight) {
				this.timerSubMenu[id] = setInterval(function() { Navigation.slideMenu(id, 1); }, Navigation.DD_TIMER);
			}
		}
	},
			
	/** 
	 * Collapse submenu
	 * @param string $id
	 */ 
	collapseMenu: function (id) {
		var menu	= Util.GetObject('Menu' + id);
		var submenu	= Util.GetObject('Submenu' + id);
	
		Switch.SwitchCursor(menu, -1);
	
		// Stop sliding for open and close it
		if(submenu != null) {
			this.timerSubMenu[id] = setInterval(function() { Navigation.slideMenu(id, -1); }, Navigation.DD_TIMER);
		} else if(menu) {
			// Mouse over effect for classname
			if(!menu.active && Util.stristr(menu.className, 'Active')) {
				menu.className = menu.className.replace('Active', '');
			}
		}
	},
			
	/** 
	 * Slides submenu
	 * @param string $id
	 * @param integer $direction can be '1' for up and '-1' for down
	 */ 
	slideMenu: function (id, direction) {
		var menu	= Util.GetObject('Menu' + id);
		var submenu	= Util.GetObject('Submenu' + id);
		
		if(submenu == null) {
			return;
		}
		
		if(direction > 0) {
			var distance = (submenu.startHeight - parseInt(submenu.style.height)) / Navigation.DD_SPEED;
			distance = parseInt(Math.round(distance));
			if(isNaN(distance) || distance < 1) { distance = 2; }
	
			var newHeight = parseInt(Util.GetStyle(submenu, 'height')) + distance;
		
			if(isNaN(newHeight) || newHeight >= submenu.startHeight) {
				Util.SetStyle(submenu, 'height', submenu.startHeight + 'px');
				Util.SetStyle(submenu, 'backgroundPosition', '0% 100%');

				this._clearSubmenu(id);
			} else {
				Util.SetStyle(submenu, 'height', newHeight + 'px');
				Util.SetStyle(submenu, 'backgroundPosition', '0% 100%');
			}
		} else {
			var distance = parseInt(Util.GetStyle(submenu, 'height')) / Navigation.DD_SPEED;
			distance = parseInt(Math.round(distance));
			if(isNaN(distance) || distance < 1) { distance = 2; }
	
			var newHeight = parseInt(Util.GetStyle(submenu, 'height')) - distance;
		
			if(isNaN(newHeight) || newHeight < 1) {
				// Mouse over effect for classname
				if(!menu.active && Util.stristr(menu.className, 'Active')) { menu.className = menu.className.replace('Active', ''); }
			
				Util.SetStyle(submenu, 'height', '0px');
				Util.SetStyle(submenu, 'display','none');
	
				this._clearSubmenu(id);
			} else {
				Util.SetStyle(submenu, 'height', newHeight + 'px');
				Util.SetStyle(submenu, 'backgroundPosition', '0% 100%');
			}
		}
	},

	CLASS_NAME: 'Navigation'
};
