/*
HTML структура для создания меню
<[главный слой] id="[id главного слоя меню]">

	<[слой меню 1]>
		[название меню 1]
		<div style="dysplay: none; position: absolute; float: none;">
			[список меню 1]
		</div>
	</[слой меню 1]>

	<[слой меню 2]>
		[название меню 2]
		<div style="dysplay: none; position: absolute; float: none;">
			[список меню 2]
		</div>
	</[слой меню 2]>

</[главный слой]>
*/

//print нужна только для дебага
/*print = function(txt) {
	var pr = getObject("print");
	if (pr) {
		pr.innerHTML = txt;
	}
}*/

/* Переменные для управления поведением меню */
var mmSTRID = 'menu';	//id главного слоя меню
var mmCOUNT = 20;	//количество разбиений длинны выпадающего меню
var mmDELAY = 5;	//задержка между отображением каждого куска меню
var mmPARAM = 2;	//коэффициент задержки перед расскрытием меню по отношению к закрытию

function getObject(obj) {
	var theObj;
	if (document.layers) {
		if (typeof obj == "string") return document.layers(obj);
		else return odj;
	}
	if (document.all) {
		if (typeof obj == "string") {
			if(document.all(obj) != null) return document.all(obj);
			else return null;
		}
		else return obj;
	}
	if (document.getElementById); {
		if (typeof obj == "string") return document.getElementById(obj);
		else return obj;
	}
	return null;
}

function xAddEventListener(e, eT, eL, cap) {
	if ( !(e=getObject(e)) ) {
		return;
	}
	eT = eT.toLowerCase();
	if ( e.addEventListener ) {
		e.addEventListener(eT, eL, cap||false);
	}
	else if ( e.attachEvent ) {
		e.attachEvent('on'+eT, eL);
	}
	else {
		var o = e['on'+eT];
		e['on'+eT] = typeof o == 'function' ? function(v){ o(v); eL(v); } : eL;
	}
}

xAddEventListener(window, 'load', function(){var mainMenu = new c_main_menu(mmSTRID);}, false);

/* функция show() вынесена за пределы c_main_menu лдя того,
чтобы иметь возможность вызывать ее через setTimeout() */
var show = function(el, h) {
	el = document.getElementById(el);
	
	el.style.clip = "rect(auto auto "+h+" auto)";
	
	el.open = (h >= el.offsetHeight);
	el.close = (h <= 0);
	el.event = !(el.open || el.close);
}

//функция создания меню
function c_main_menu(id) {
	var mainElement;
	
	var mainElement = getObject(id);	
	var items = mainElement.childNodes;
	var menuElements = new Array();
	var elCount = 0;
	
	for (var i=0; items[i] != null; i++) {
		if(items[i].innerHTML) {
			menuElements[elCount] = items[i];
			menuElements[elCount].id = "menuElement"+elCount;

			//тут прошито, что выподающим элементом должен быть div
			menuElements[elCount].subMenu = menuElements[elCount].getElementsByTagName('DIV')[0];
			menuElements[elCount].subMenu.id = "subMenu"+elCount;
			menuElements[elCount].subMenu.open = false;
			menuElements[elCount].subMenu.close = true;
			menuElements[elCount].subMenu.event = false;
			
			menuElements[elCount].count = mmCOUNT;
			menuElements[elCount].delay = mmDELAY;
			menuElements[elCount].param = mmPARAM;
			
			show(menuElements[elCount].subMenu.id, 0);
			menuElements[elCount].subMenu.style.display = "block";

			menuElements[elCount].menuMouseOver = menuElements[elCount].onmouseover;
			menuElements[elCount].menuMouseOut = menuElements[elCount].onmouseout;
			
			menuElements[elCount].show = function() {
				this.interval = this.subMenu.offsetHeight / this.count;
				if (!this.subMenu.event) {
					if ( this.subMenu.close ) {
						for (var i=0; i<=this.count; i++) {
							setTimeout('show("'+this.subMenu.id+'", '+this.interval*i+');', this.delay*i);
						}
					}
				}
			}
			
			menuElements[elCount].hide = function() {
				this.interval = this.subMenu.offsetHeight / this.count;
				if (!this.subMenu.event) {
					if ( this.subMenu.open ) {
						clearTimeout(this.timerOpen);
						for (var i=this.count; i>=0; i--) {
							setTimeout('show("'+this.subMenu.id+'", '+this.interval*i+');', this.delay*(this.count-i));
						}
					}
					else {
						this.timerClose = setTimeout('getObject("'+this.id+'").hide();', this.delay*this.count);
					}
				}
			}
			
			menuElements[elCount].onmouseover = function() {
				if(this.menuMouseOver) {
					this.menuMouseOver();
				}
				var delay = this.count*this.delay*this.param;
				if (this.subMenu.event) {
					delay = delay*2;
				}
				clearTimeout(this.timerClose);
				this.timerOpen = setTimeout('getObject("'+this.id+'").show();', delay);
			}
			
			menuElements[elCount].onmouseout = function() {
				if(this.menuMouseOut) {
					this.menuMouseOut();
				}
				var delay = this.count*this.delay;
				if (this.subMenu.event) {
					delay = delay*2;
				}
				clearTimeout(this.timerOpen);
				this.timerClose = setTimeout('getObject("'+this.id+'").hide();', delay);
			}
			
		elCount++;		
		}
	}
}
