// $Id: x_menu.js,v 1.3 2006/10/05 11:14:49 a Exp $

xMenu = function() {
	this.init = function( id) {
		var main_obj = this
		var menu = document.getElementById(id)

		var parent_tag = this.parent_tag || "ul"
		var child_tag = this.child_tag || "li"

		var menu_max_width = this.menu_max_width || 500
		var show_delay		= this.show_delay || 100
		var hide_delay		= this.hide_delay || 300
		var class_prefix	= this.class_prefix || "l"
		var class_over	= this.class_over || "over"
		var show_timeout_id = [[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}]]
		var hide_timeout_id = [[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}],[0,{}]]
		var RegMyClass = new RegExp( class_prefix + "([0-9])", "i");
		var current_level = 0

		this.registerEvent = function( obj, event_, func) {
			document.all?obj.attachEvent( "on".concat( event_), func):obj.addEventListener( event_, func, false);
		}
		this.registerEvent( menu, "mouseover",
			function( e) {
				var obj = (e && e.target) || (event && event.srcElement)
				do {
					if ( obj.tagName.toLowerCase() == child_tag ) main_obj.show_child( obj)
				} while( !(menu==obj) && (obj = obj.parentNode) )
			}
		)
		this.registerEvent( menu, "mouseout",
			function( e) {
				var obj = (e && e.target) || (event && event.srcElement)
				do {
					if (  obj.tagName.toLowerCase() == child_tag  ) main_obj.hide_child( obj)
				} while( !(menu==obj) && (obj = obj.parentNode) )
			}
		)
		this.show_child = function( obj) {
			var l = obj.parentNode.className.match( RegMyClass, "i")[1]
			var ul;
			if ( ul = obj.getElementsByTagName( parent_tag)[0] ) {
				if ( obj.offsetLeft-(-ul.offsetWidth) > menu_max_width ) {
					ul.style.left = menu_max_width - ul.offsetWidth - obj.offsetLeft
				} else {
					ul.style.left = 0
				}
			}
			if ( current_level < l || hide_timeout_id[l][1] == obj ) {
				for( var i=0; i<=l; i++) clearTimeout( hide_timeout_id[i][0])
			} else {
				for( var i=0; i<=l; i++) {
					hide_timeout_id[i][1].className=""
					clearTimeout( hide_timeout_id[i][0])
				}
			}
			show_timeout_id[l] = [setTimeout( function() { obj.className = class_over;}, show_delay),obj]
			current_level = l
		}
		this.hide_child = function( obj) {
			var l = obj.parentNode.className.match( RegMyClass, "i")[1]
			for( var i=0; i<=l; i++) clearTimeout( show_timeout_id[i][0])
			hide_timeout_id[l] = [setTimeout( function() { obj.className=""}, hide_delay),obj]
			current_level = l
		}
	}
}