/*
	MENU script
	version 1.0
	http://www.slavon.net
	Copyright (C) 2004-2005 Badalian Slava
	
	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
*/

// =============================================

// Стандартные дефайны
var over_id = "";  // Используется для подсветки
var menu_show = new Array(); // Массив показаных объектов
var menu_gen = new Array(); // Массив сгенерённых объектов
var menu_x = 0; // Смещение по X
var menu_y = 0; // Смещение по Y
var popTimer = 0; // Смещение по X
var menu = new Array(); // Основной массив
var precache = 0; // 1 - осуществлять прелоад, 0 - загружать по мере наведения

// =============================================

// Определяем объектную модель браузера
var isDOM = (document.getElementById ? true : false); 
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);

// =============================================


// Кросс-браузерная функция получения объекта по ID
function getRef(id) {
    if (isDOM) return document.getElementById(id);
    if (isIE4) return document.all[id];
    if (isNS4) return document.layers[id];
}

// =============================================

// Кросс-браузерная функция стиля объекта по ID
function getSty(id) {
    return (isNS4 ? getRef(id) : getRef(id).style);
} 

// =============================================

// Проверяем есть ли необходимые DOM функции, если нет - вот они ;)))
if(typeof HTMLElement!="undefined"){
if(!HTMLElement.prototype.insertAdjacentElement){
	HTMLElement.prototype.insertAdjacentElement = function(where,parsedNode)
	{
		switch (where){
		case 'beforeBegin':
			this.parentNode.insertBefore(parsedNode,this)
			break;
		case 'afterBegin':
			this.insertBefore(parsedNode,this.firstChild);
			break;
		case 'beforeEnd':
			this.appendChild(parsedNode);
			break;
		case 'afterEnd':
			if (this.nextSibling)             
				this.parentNode.insertBefore(parsedNode,this.nextSibling);
			else this.parentNode.appendChild(parsedNode);
			break;
		}
	}
	
	HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr)
	{
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where,parsedHTML)
	}


	HTMLElement.prototype.insertAdjacentText = function(where,txtStr)
	{
		var parsedText = document.createTextNode(txtStr)
		this.insertAdjacentElement(where,parsedText)
	}
}
if (!HTMLElement.prototype.innerHTML){
	HTMLElement.prototype.innerHTML = function (str) {
	   var r = this.ownerDocument.createRange();
	   r.selectNodeContents(this);
	   r.deleteContents();
	   var df = r.createContextualFragment(str);
	   this.appendChild(df);
	   return str;
	}
	
	HTMLElement.prototype.outerHTML = function (str) {
	   var r = this.ownerDocument.createRange();
	   r.setStartBefore(this);
	   var df = r.createContextualFragment(str);
	   this.parentNode.replaceChild(df, this);
	   return str;
	}
}
}

// =============================================

// Функция - контейнер
function Item(pid, text, url, img, img_over, ori, var1, var2 //, ..., varN
													){
	this.pid = pid; // PARENT_ID
	this.text = text; // TEXT
	this.url = url; // URL
	this.img = (img?img:false); // IMG
	this.img_over = (img_over?img_over:false); // IMG_OVER
	this.ori = ori; // ориентация  'l' - left, 'd' - down
	this.x = 0; // Позицция элемента по X
	this.y = 0; // Позицция элемента по Y
	this.h = 0; // Высота элемента
	this.w = 0; // Шырина элемента

	// Дополнительные аргументы
	if(Item.arguments.length>6){
		var a = Item.arguments; 
		for(i=1; (i+5)<a.length; i++)
			eval("this.var" + i + "= a[i+5]");
	}
}

// =============================================

// Функция для релоадинга позиций
function clear_all(){
	if (!isDOM) return true; // работает тока под DOM
	menu_show = new Array(); // обнуляем массив показанных объектов
	menu_gen = new Array(); // обнуляем массив сгенерённых объектов
	menu_status = 0; //  Обнуляем текущий уровень
	getRef('place_menu').innerHTML = ""; // Стираем уже сгенерённые элементы 1-ого уровня
	getRef('place_menu2').innerHTML = ""; // Стираем уже сгенерённые элементы N-ого уровня
	write_menu_l1(menu_x, menu_y); // Сгенерить с нуля меню
	return;
}

// =============================================

// Рекурсивная функция генерации меню
function while_id(x){
	count_loop:
	for(var ion=1; ion<menu.length; ion++)
		if(menu[ion].pid == x){
			for(var i=1; i<menu.length; i++)
				if (menu[i].pid == ion){
					if(write_menu_custom(ion) == false)
						continue count_loop;
					getSty("a" + ion).visibility = "hidden";
					break;
				}
			while_id(ion);
		}
	return;
}

// =============================================

// Изначальная генерация
function write_menu_l1(ox, oy){
	if (!isDOM) return true; // работает тока под DOM
	menu_x = ox; // устонавливаем смещения по X
	menu_y = oy; // устонавливаем смещения по Y
	
	// Создаём контейнер для вторых уровней
	if(!getRef('place_menu2'))
		document.body.insertAdjacentHTML('beforeEnd','<div id="place_menu2"></div>');
			
	write_menu_custom(0); // генерим PID=0
	if(precache == 1) // Если включена "пред генерация"
		while_id(0);  // генерим остальные уровни
	return;
}

// =============================================

// Функция проверки статусов меню
function check_sys(){
	if (!isDOM) return true; // работает тока под DOM

	var temp = new Array(); // временный массив содержащий id всго дерево родителей текущего элемента
	var i = "";  // временная переменная
	var hide; // переменная статуса для скрытия

	// собираем массив родителей текущего элемента
	temp[temp.length] = menu_status; 
	if (menu_status != 0)
		if(menu[menu_status].pid !=0){
			i=menu[menu_status].pid;
			temp[temp.length] = i;
			while (menu[i].pid != 0){
				i=menu[i].pid;
				temp[temp.length] = i;
			}
		}

	// Сравниваем массив с тем что должно быть и убераем лишнее
	for(i=0; i<menu_show.length; i++){
		hide = true;
		for(j=0; j<temp.length; j++)
			if(menu_show[i] == temp[j]){
				hide = false;
				break;
			}
		if(hide == true)
			if(getRef("a" + menu_show[i]))
				getSty("a" + menu_show[i]).visibility = "hidden";
	}
	
	// Часть обработки подсветки
	if(over_id){
		// Cобираем массив родителей от подсвеченого элемента
		over_id_arr = new Array;
		i = menu[over_id].pid
		over_id_arr[over_id_arr.length] = over_id;
		while (i != 0){
			over_id_arr[over_id_arr.length] = i;
			i = menu[i].pid;
		}

		if (getRef("a" + over_id)){
			// Вариант: есть сгенерённый дочерний уровень
			if (getRef("a" + over_id) && getSty("a" + over_id).visibility == "hidden"){
				// Выпадающее меню от дочернего уровня скрыто
				// Вызываем функцию для обработки действия отсвечиванию
				for(i=0;i<over_id_arr.length;i++)
					clear_over(over_id_arr[i]);
				over_id = '';
			}
		}else{
			// Вариант: нет сгенерённого дочернего уровеня
			if(popTimer){
				// Вызываем функцию для обработки действия отсвечиванию
				for(i=0;i<over_id_arr.length;i++)
					clear_over(over_id_arr[i]);
				over_id = '';
			}
		}
	}	
	return;	
}

// =============================================

// Функция отратываемая при onmouseover
function td_menu_over(id){
	if (!isDOM) return true; // работает тока под DOM

	clearTimeout(popTimer); // обнуляем таймер
	write_menu_custom(id);  // генерим PID=id
	menu_status = id; // устанавливаем переменную статуса
	popTimer = 0; // обнуляем статус таймера (для дальшейшего сравнения)
	check_sys(); // проверяем статусы

	// Начало: Часть обработки подсветки
	// Собираем родителей + текущий элемент
	over_id_arr = new Array;
	i = menu[id].pid
	over_id_arr[over_id_arr.length] = id;
	while (i != 0){
		over_id_arr[over_id_arr.length] = i;
		i = menu[i].pid;
	}
	// Конец: Часть обработки подсветки
	
	// Собираем масив отображонных элементов и отображаем элементы
	if (getRef("a" + id) && id != ''){
		// проверяем - есть ли элемент уже в массиве
		var add = true;
		for(i=0; i<menu_show.length; i++)
			if(menu_show[i] == id){
				add = false;
				break;
			}
			
		// если нету - добовляем в массив
		if (add == true)
			menu_show[menu_show.length] = id;
		// отображаем 
		getSty("a" + id).visibility = "visible";
	}
	
	// Начало: Часть обработки подсветки
	// Вызываем функцию для обработки действия по подсвечиванию
	for(i=0;i<over_id_arr.length;i++)
		clear_out(over_id_arr[i]);
	over_id = id;
	// Конец: Часть обработки подсветки

	check_sys(); // проверяем статусы
	
	return;
}

// =============================================

// Функция отратываемая при onmouseout
function td_menu_out(){
	if (!isDOM) return true; // работает тока под DOM
	
	menu_status = 0; // обнуляем статусную переменную
	clearTimeout(popTimer); // обнуляем таймер
	popTimer = setTimeout('check_sys()', 200); // выставляем таймер на проверку
	
	return;
}

// =============================================

// Подсвитки - Наведение мышки
function clear_over(id){
	if (!isDOM) return true; // работает тока под DOM
/*
	// !!!! КОД НЕДЕЙСТВИТЕЛЕН! ПЕРЕОПРЕДЕЛЯТЬ ДЛЯ КАЖДОГО СЛУЧАЯ!!! ОСТАВЛЕН КАК ПРИМЕР
	if (menu[id].img && menu[id].pid == 0)
		if(getRef("td_y_" + id).src != menu[id].img)
			getRef("td_y_" + id).src = menu[id].img;
	if (menu[id].pid != 0)
		if(getRef("td_z_" + id).className != 'table-umenu')
			getRef("td_z_" + id).className = 'table-umenu';
			*/
	return;
}

// =============================================

// Подсвитки - Убирание мышки
function clear_out(id){
	if (!isDOM) return true; // работает тока под DOM
	
	// !!!! КОД НЕДЕЙСТВИТЕЛЕН! ПЕРЕОПРЕДЕЛЯТЬ ДЛЯ КАЖДОГО СЛУЧАЯ!!! ОСТАВЛЕН КАК ПРИМЕР
	/*if (menu[id].img_over && !menu[id].div_style && menu[id].pid == 0)
		if(getRef("td_y_" + id).src != menu[id].img_over)
			getRef("td_y_" + id).src = menu[id].img_over;
	if (menu[id].pid != 0)
		if(getRef("td_z_" + id).className != 'table-umenu-s')
			getRef("td_z_" + id).className = 'table-umenu-s';
			*/
	return;
}

// =============================================

// Генерация меню
function write_menu_custom(id){
	if (!isDOM) return true; // работает тока под DOM

	var temp_menu = new Array(); 
	var index_menu = new Array();
	var str = '';

	// Проверяем - уже отображено?
	for(i=0; i<menu_gen.length; i++)
		if (menu_gen[i] == id)
			return true;
	
	// Собираем массив - что надо отобразить и массив с индексами от старого меню
	for(i=1; i<menu.length; i++)
		if (menu[i].pid == id){
			temp_menu[(temp_menu.length?temp_menu.length:0)] = menu[i];
			index_menu[(index_menu.length?index_menu.length:0)] = i;
		}
	
	// Работаем с массивом
	if (temp_menu.length){
		// Определяем смещения от родителя для отображения
		if (id > 0 && menu[id].ori == 'd'){
			xx = menu[id].x;
			yy = menu[id].y + menu[id].h;
		}else if (id > 0 && menu[id].ori == 'l'){
			xx = menu[id].x + menu[id].w;
			yy = menu[id].y;
		}
		                                                
		if (!menu_gen.length){
			// Вариант 1-й (начальный) уровень
		    str = '<table WIDTH="100%" HEIGHT="29" BORDER="0" CELLSPACING="0" CELLPADDING="0"><tr><td width="50%">&nbsp;</td>';
			for(i=0; i<temp_menu.length; i++){
				if (temp_menu[i].var2){
					str +='<td  onmouseover="td_menu_over(' + index_menu[i] + ')" onmouseout="td_menu_out();" id="td_' + index_menu[i] + '" name="td_' + index_menu[i] + '" nowrap><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR><TD><IMG SRC="/common/img/leftup.gif" WIDTH="8" HEIGHT="29" BORDER="0" ALT=""></TD><TD BACKGROUND="/common/img/tileup.gif" nowrap HEIGHT="29">';
				} else {
					str +='<td  onmouseover="td_menu_over(' + index_menu[i] + ')" onmouseout="td_menu_out();" id="td_' + index_menu[i] + '" name="td_' + index_menu[i] + '" nowrap><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR><TD><IMG SRC="/common/img/0.gif" WIDTH="8" HEIGHT="29" BORDER="0" ALT=""></TD><TD BACKGROUND="/common/img/0.gif" nowrap HEIGHT="29">';
				};
				str +='<a href="' + temp_menu[i].url + '" CLASS="white">' + temp_menu[i].text + '</a>';
				if (temp_menu[i].var2){
					str +='</td><TD><IMG SRC="/common/img/rightup.gif" WIDTH="8" HEIGHT="29" BORDER="0" ALT=""></TD></TR></TABLE></TD><TD><img src="/common/img/pct_separator.gif" width="12" height="29"></TD>';
				} else {
					str +='</td><TD><IMG SRC="/common/img/0.gif" WIDTH="8" HEIGHT="29" BORDER="0" ALT=""></TD></TR></TABLE></TD><TD><img src="/common/img/pct_separator.gif" width="12" height="29"></TD>';
				};
			}
			str += '<td width="50%">&nbsp;</td></tr></table>';
		}else{
			// Вариант N-й (остальные) уровни
			str = "<div id='a" + id + "' name='a" + id + "' style='width: " + menu[id].w + "px; position: absolute; left: " + xx + "px; top: " + yy + "px; visibility: visible; z-index: 999999;' onmouseout='td_menu_out();'>";
		    str += '<table width="176" border="0" cellspacing="0" cellpadding="0">';
			for(i=0; i<temp_menu.length; i++){
				if (temp_menu[i].var1>2){
					str +='<tr height="21"><td BGCOLOR="#71A180" CLASS="NavBar" WIDTH="175" HEIGHT="18" onmouseover="td_menu_over(' + index_menu[i] + ')" onmouseout="td_menu_out();" id="td_' + index_menu[i] + '" name="td_' + index_menu[i] + '" nowrap>';
				} else {				
					str +='<tr height="21"><td BGCOLOR="#5DAC50"  WIDTH="175" HEIGHT="18" BACKGROUND="/common/img/upmenu.gif" CLASS="NavBar" onmouseover="td_menu_over(' + index_menu[i] + ')" onmouseout="td_menu_out();" id="td_' + index_menu[i] + '" name="td_' + index_menu[i] + '" nowrap>';
				};
				str +='<a href="' + temp_menu[i].url + '" class="upmenu">' + temp_menu[i].text + '</a>';
				str +='</td></tr>'; 
			}
			str += '</table>';
			str += "</div>";
		}

		if(menu_gen.length){
			// Вгенеряем вторые уровни
			getRef('place_menu2').innerHTML += str;
		}else{
			// Вгенеряем первый уровень
			getRef('place_menu').innerHTML = str;
		}
		
		for(i=0; i<temp_menu.length; i++){
			// Определяем смещения
			if (menu_gen.length){
				// Если это вторые уровни
				menu[index_menu[i]].x = getRef("a" + id).offsetLeft + getRef("td_" + index_menu[i]).offsetLeft;
				menu[index_menu[i]].y = getRef("a" + id).offsetTop + getRef("td_" + index_menu[i]).offsetTop;
			}else{
				// Если это первый уровень
				menu[index_menu[i]].x = menu_x + getRef("place_menu").offsetLeft + getRef("td_" + index_menu[i]).offsetLeft;
				menu[index_menu[i]].y = menu_y + getRef("place_menu").offsetTop + getRef("td_" + index_menu[i]).offsetTop;
			}
			// Определяем ширину и длину
			menu[index_menu[i]].h = getRef("td_" + index_menu[i]).offsetHeight;
			menu[index_menu[i]].w = getRef("td_" + index_menu[i]).offsetWidth;
        }
        // Добавляем ID к массиву генерённых
		menu_gen[(menu_gen.length?menu_gen.length:0)] = id;
	}
	
	return;
}

// =============================================

// Иницилизация 

precache = 0; // 1 - осуществлять прелоад, 0 - загружать по мере наведения

// =============================================