
var cmenu_handling_over_done = null;
var cmenu_handling_click_done = null;
var cmenu_handling_list = new Array();

var MSIE = ( document.all && !window.opera );

var debug_mode = false;

var debuginformation = null;

function cMenu(id, topdown) {

	if ( debuginformation == null ) {
		if ( debuginformation = document.getElementById('debuginformation') ) debuginformation.style.display = debugmode ? 'inline' : 'none';
	}

	this.id = id;
	this.submenus = new Array();

	this.zBase = 17000;
	this.zLevel = 0;

	this.base = document.getElementById(this.id);
	this.base.style.zIndex = this.zBase;

	var attr = document.createAttribute('menubase');
	attr.nodeValue = id;
	this.base.setAttributeNode(attr);

	this.base.style.display = ( topdown ? 'inline' : 'block' );

	attr = document.createAttribute('topdown');
	attr.nodeValue = ( topdown != null && topdown );
	this.base.setAttributeNode(attr);

	this.handleSubmenu(this.base);

	cmenu_handling_list.push(this);
	if ( document.onmouseover != cmenu_document_mouseover ) {
		document.onmouseover = cmenu_document_mouseover;
	}
	if ( document.onclick != cmenu_document_click ) {
		document.onclick = cmenu_document_click;
	}
}

cMenu.prototype.closeAll = function(excepts) {
	var idx = 0;

	if ( excepts == null ) excepts = '';
	for ( idx = this.submenus.length - 1; idx >= 0; idx-- ) {
		var elem;

		if ( (elem = document.getElementById(this.submenus[idx])) && elem.style.display == 'block' && !(excepts.indexOf(' ' + elem.id + ' ') >= 0) ) {
			elem.style.display = 'none';
		}
	}
}

cMenu.prototype.handleMenuitem = function(item) {

	var attr = document.createAttribute('menubase');
	attr.nodeValue = this.id;
	item.setAttributeNode(attr);

	item.onmouseover = cmenu_li_mouseover;
	item.onmouseout = cmenu_li_mouseout;

	var subitem = item.firstChild;

	if ( debug_mode ) {
		var s = '';
		s += 'topleft: '+item.offsetLeft+'x'+item.offsetTop+'\r\n';
		s += 'extends: '+item.offsetWidth+'x'+item.offsetHeight;
		item.title = s;
	}

	this.zLevel++
	while ( subitem ) {

		if ( subitem.style ) subitem.style.zIndex = this.zBase + this.zLevel;

		if ( subitem.nodeName == 'LI' ) {
			this.handleMenuitem(subitem);
		} else if ( subitem.nodeName == 'UL' ) {
			if ( item ) {
				var attr = document.createAttribute('subid');
				attr.nodeValue = subitem.getAttribute('id');
				item.setAttributeNode(attr);
				this.submenus.push(subitem.getAttribute('id'));
				subitem.onmouseover = cmenu_ul_mouseover;
			}
			this.handleSubmenu(subitem);
		}

		subitem = subitem.nextSibling;
	}
	this.zLevel--;
}

cMenu.prototype.handleSubmenu = function(item) {

	if ( item != this.base ) {
		item.style.display = 'none';
		var attr = document.createAttribute('menubase');
		attr.nodeValue = this.id;
		item.setAttributeNode(attr);
	}

	var subitem = item.firstChild;

	this.zLevel++;
	while ( subitem ) {

		if ( subitem.style ) subitem.style.zIndex = this.zBase + this.zLevel;

		if ( subitem.nodeName == 'LI' ) {
			this.handleMenuitem(subitem);
		} else if ( subitem.nodeName == 'UL' ) {
			this.handleSubmenu(subitem);
		}

		subitem = subitem.nextSibling;
	}
	this.zLevel--;

}

/*
		Event handling functions ...
 */
function cmenu_li_mouseover(e) {

	if ( debug_mode ) {
		var s = '';
		s += 'window.innerWidth: '+window.innerWidth+'\r\n';
		s += 'parent->lefttop: '+this.parentNode.offsetLeft+'x'+this.parentNode.offsetTop+'\r\n';
		s += 'parent->extends: '+this.parentNode.offsetWidth+'x'+this.parentNode.offsetHeight+'\r\n\r\n';
		s += 'this->lefttop: '+this.offsetLeft+'x'+this.offsetTop+'\r\n';
		s += 'this->extends: '+this.offsetWidth+'x'+this.offsetHeight;
		this.title = s;
	}

	if ( cmenu_handling_over_done == null ) {
		var subid = this.getAttribute('subid');
		if ( subid ) {
			var element = document.getElementById(subid);
			if ( element ) {

				var base = document.getElementById(this.getAttribute('menubase'));

				cmenu_closeall(cmenu_except_str(element));

				var topdown = base.getAttribute('topdown');

				if ( topdown === 'false' || topdown === false ) {

						element.style.top = '0px';
						element.style.left = ( this.offsetWidth - ( MSIE ? 2 : 0 ) ) + 'px';

				} else {
					element.style.top = (this.parentNode.offsetTop + (this.offsetTop - this.parentNode.offsetTop) + this.offsetHeight - 1) + 'px';

					if ( debug_mode ) {
						this.title = (this.parentNode.offsetLeft + this.offsetLeft + element.offsetWidth) + ' : ' + window.innerWidth;
					}
					if ( (this.parentNode.offsetLeft + this.offsetLeft + element.offsetWidth) > window.innerWidth ) {
						element.style.right = '0px';
					} else {
						element.style.left = '0px';
					}

				}


				element.style.display = 'block';
				paintDebugInfo(this);

			}
		} else {
			cmenu_closeall(cmenu_except_str(this));
		}
		cmenu_handling_over_done = this.id;
		if ( MSIE ) {
			if ( classFind(this.className, 'submenu') ) {
				this.className = classReplace(this.className, 'submenu', 'submenu_hover');
			} else if ( classFind(this.className, 'menuitem') ) {
				this.className = classReplace(this.className, 'menuitem', 'menuitem_hover');
			}
		}
	}
}

function paintDebugInfo(e) {
	if ( debug_mode && debuginformation != null ) debuginformation.innerHTML = 'ID: ' + e.id + ' Style: ' + e.style.left + ' Pos: ' + e.offsetLeft + 'x' + e.offsetTop + ' Ext: ' + e.offsetWidth + 'x' + e.offsetHeight + '<br/>\n' + debuginformation.innerHTML;
}

function cmenu_li_mouseout(e) {
	if ( MSIE ) {
		if ( classFind(this.className, 'submenu_hover') ) {
			this.className = classReplace(this.className, 'submenu_hover', 'submenu');
		} else if ( classFind(this.className, 'menuitem_hover') ) {
			this.className = classReplace(this.className, 'menuitem_hover', 'menuitem');
		}
	}
}

function cmenu_ul_mouseover(e) {
	if ( cmenu_handling_over_done == null ) {
		cmenu_closeall(cmenu_except_str(this));
		cmenu_handling_over_done = this.id;
	}
}

function cmenu_except_str(i) {
	var excepts = new Array();

	while ( i ) {
		if ( i.id != null && i.id != '' ) excepts.push(i.id);
		i = i.parentNode;
	}

	return ' ' + excepts.join(' ') + ' ';
}

function cmenu_document_mouseover(e) {
	if ( cmenu_handling_over_done != null ) {
		cmenu_handling_over_done = null;
	} else {
		cmenu_closeall(null);
	}
}

function cmenu_document_click(e) {
	if ( cmenu_handling_click_done != null ) {
		cmenu_handling_click_done = null;
	}
}

function cmenu_closeall(except) {
	for ( var idx = 0; idx < cmenu_handling_list.length; idx++ ) {
		cmenu_handling_list[idx].closeAll(except);
	}
}

function classReplace(classNameStr, replace_from, replace_to) {
	var dummy = classNameStr.split(" ");
	var idx;

	for (idx = 0; idx < dummy.length; idx++) {
		if ( dummy[idx] == replace_from ) {
			dummy[idx] = replace_to;
			break;
		}
	}

	return dummy.join(" ");
}

function classFind(classNameStr, find_str) {
	var dummy = classNameStr.split(" ");
	var idx;

	for ( idx = 0; idx < dummy.length; idx++ ) {
		if ( dummy[idx] == find_str ) {
			return idx+1;
		}
	}
	return false;
}

