var
	menu=new Array(),	// Массив, содержащий структуру меню
	menuh=new Array(),	// Массив ячеек топ-меню
	submenus=new Array(),	// Массив объектов-ячеек, содержащих подменю
	re=new RegExp("^http://","i"),	// Регэксп, определяющий внешнюю ссылку
	selected_item='',	// Запишем сюда идентификатор ячейки, по которой был осуществлён переход
	emptyTop='';		// Идентификатор сайд-меню, которому не соответствует ячейка топ-меню
	appear_interval=null;	// Хэндлер интервала в 100 миллисекунд, на каждой итерации которого прозрачность уменьшается на 25%
	menu_opacity=0;		// Счётчик прзрачности; изначально - 0%
												
function menu_hc(){	// Имеет ли ветка меню видимых потомков
	haschild=false;
	for(hc_counter=0;(menu[this.id+'_'+hc_counter]&&(haschild==false));hc_counter++)
		if(menu[this.id+'_'+hc_counter].title.substr(0,1)!='_')haschild=true;
	return haschild;
}

function menu_export(table,addthis){	// Экспортирование ячеек меню в таблицу table; addthis - добавлять ли в таблицу данную ячейку
	if(this.title.substr(0,1)=='_')return;	// Ячейки, название которых начинается подчёркиванием, в меню невидимы
	if(this.hasChildren()){	// Если есть вложения - придётся рекуррентно создавать потомков
		if(addthis){	// Если true - создаём ячейку-"себя"
			this.class_name='f_';	// Ячейка содержит вложения
			this.class_name+=(this.id==selected_item)?'s':'u';	// Выделенная или нет?
			this.class_name+='_h';	// По умолчанию всегда свёрнута
			this.row=table.insertRow(-1);	// Вставляем <tr></tr> в конец таблицы
			this.col=this.row.insertCell(0);	// Вставляем <td></td>
			this.div=document.createElement('div');	// Вставляем <div></div> - слой внутри ячейки
			this.div.menu_id=this.id;	// Запоминает индекс меню для обработчика нажатия
			this.div.id='lv'+this.level; this.div.className=this.class_name;	// Значения по умолчанию
			if((this.link=='')||(this.link=='#')){	// Если ссылка ячейке не назначена, клик по ней раскроет подменю
				this.div.onclick=function(){ expand(this,this.menu_id,true); }	// Обучаем слой реагировать на нажатие
				this.div.innerHTML='<a href="#">'+this.title+'</a>';
			}else{	// Иначе - всё как у сингулярных ячеек (за исключением class_name
				if(re.test(this.link)){	// Если ссылка внешняя - откроем её в новом окне
					link_add=''; target="_blank";
				}else{	// Если ссылка не внешняя, к ней нужно добавить информацию об источнике перехода
					link_add=(this.link.indexOf('?')==-1)?'?':'&';	// Добавление к ссылке, указываюее выбранную ячейку
					link_add+='sm='+this.id; target='';
				}
				this.div.anc_id=this.id+'anchor';
				this.div.innerHTML='<a id="'+this.div.anc_id+'" href="'+this.link+link_add+'"'+target+'>'+this.title+'</a>';
				this.div.onclick=function(){ window.location.href=document.getElementById(this.anc_id).href; }	// Переходим по ссылке по щелчку в любой точке ячейки
			}
			this.col.appendChild(this.div);	// Вставляем слой в подготовленную ячейку меню
			submenus[this.id]=this.div;	// Такие слои хранятся в отдельном массиве
		}
		this.row2=table.insertRow(-1);	// Вставляем ячейку, содержащую подменю, сразу после предыдущей
		this.row2.style.display=(addthis)?'none':'block'; this.row2.id=this.id+'tr';	// Свойства элемента по умолчанию
		this.col2=this.row2.insertCell(0);	// Как обычно, создаём <td></td>
		this.subTable=document.createElement('table');	// Создаём новую таблицу для ячеек подменю
		this.subTable.cellSpacing=0; this.subTable.cellPadding=0;
		this.subTable.className='sidemenu';
		this.subTable.id=this.id+'table';	// Установки таблицы по умолчанию
		for(this.gen_counter=0;menu[this.id+'_'+this.gen_counter];this.gen_counter++)	// Рекуррентно добавляем вложенные ячейки
			menu[this.id+'_'+this.gen_counter].exportHTML(this.subTable,true);	// Рекуррентный вызов
		this.col2.appendChild(this.subTable);	// Цепляем подменю к ячейке
		return;	// Ячейка изначально принадлежала таблице table, так что можем ничего не возвращать
	}else if(addthis){	// Только если сингулярную ячейку нужно добавить
		if(this.title.substr(0,1)=='='){
			this.row=table.insertRow(-1);	// Вставляем <tr></tr> в конец таблицы
			this.col=this.row.insertCell(0);	// Вставляем <td></td>
			this.div=document.createElement('div');	// Вставляем <div></div> - слой внутри ячейки
			this.div.className='split';
			this.div.innerHTML=this.title.substr(1,this.title.length-1);
			this.col.appendChild(this.div);	// Вставляем слой в подготовленную ячейку меню
		}else{
			this.class_name='s_';	// Ячейка сингулярная
			this.class_name+=(this.id==selected_item)?'s':'u';	// Выделенная или нет?
			if(re.test(this.link)){	// Если ссылка внешняя - откроем её в новом окне
				link_add=''; target="_blank";
			}else{	// Если ссылка не внешняя, к ней нужно добавить информацию об источнике перехода
				link_add=(this.link.indexOf('?')==-1)?'?':'&';	// Добавление к ссылке, указываюее выбранную ячейку
				link_add+='sm='+this.id; target='';
			}
			this.row=table.insertRow(-1);	// Вставляем <tr></tr> в конец таблицы (поскольку -1)
			this.col=this.row.insertCell(0);	// Вставляем <td></td>
			this.col.anc_id=this.id+'anchor';
			this.col.innerHTML='<div id="lv'+this.level+'" class="'+this.class_name+'"><a id="'+this.col.anc_id+'" href="'+this.link+link_add+'"'+target+'>'+this.title+'</a></div>';	// Добавляем содержимое ячейки
			this.col.onclick=function(){ window.location.href=document.getElementById(this.anc_id).href; }	// Переходим по ссылке по щелчку в любой точке ячейки
			return;	// Ячейка в таблице - уходим
		}
	}
}

function menu_mainparent(){	// Определение номера главного предка; для ячейки "id_2_4_3" вернёт "2"
	p1=this.id.indexOf('_')+1;
	p2=this.id.indexOf('_',p1);
	if(p2<0)p2=this.id.length;
	return parseInt(this.id.substr(p1,p2-p1));
}

function menuItem(nm,pt,tl,lk){	// Инициализация объекта menuItem - ячейки меню
	this.id=nm;
	this.parent=pt;
	this.title=tl;
	this.link=lk;
	this.hasChildren=menu_hc;
	this.exportHTML=menu_export;
	this.mainParent=menu_mainparent;
	this.level=this.id.split('_').length-2;
	return;
}															   

function hideAll(noShow){	// Скрытие сайд меню; noShow - расклывать ли меню по умолчанию
	for(side_menu_counter=0;menuElement=document.getElementById('sideMenu_'+side_menu_counter);side_menu_counter++)
		if(menuElement.style.display=='block')menuElement.style.display='none';	// Скрыаем видимые колонки
	if(!noShow&&(emptyTop!=''))document.getElementById(emptyTop).style.display='block';	// При шести менюшках (от нуля до пяти) sideMenu_6 - седьмая, невидимая
}

function topMenuSelect(top_menu_id,hide){	// Раскрытие нужного сайд-меню; hide - прятать или показывать?
	top_menu_element=document.getElementById('tm'+top_menu_id);	// Ищем ячейку топ-меню, пославшую запрос
	if(hide){	// Если надо прятать...
		hideAll(false);	// Прячем и, возможно, показываем меню по умолчанию
		if(top_menu_element){	// Если перешли от ячейки (а при hide=true иначе не бывает), меняем обработчик на отображение
			top_menu_element.onclick=function(){ id=this.id.substr(2,this.id.length-2)*1;topMenuSelect(id,false); }
			top_menu_element.className='tm_u';	// Снимаем выделение с ячейки
		}
		return;
	}else{					
		hideAll(true);	// Прячем ВООБЩЕ ВСЕ колонки сайд-меню
		for(top_menu_counter=1;codeElement=document.getElementById('tm'+top_menu_counter);top_menu_counter++)
			if(codeElement.className=='tm_s')codeElement.className='tm_u';	// Снимаем выделение с прежде выделенного
		document.getElementById('sideMenu_'+(top_menu_id-1)).style.display='block';	// Показываем связанное сайд-меню
		if(top_menu_element){	// А вот тут есть варианты, можно залететь сюда от ячейки топ-меню или при старте, отображая выделение
			if(!top_menu_element.anc_id)	// Меняем полярность только если ячейка не является ссылкой
				top_menu_element.onclick=function(){ id=this.id.substr(2,this.id.length-2)*1;topMenuSelect(id,true); }	// Меняем полярность обработчика
			top_menu_element.className='tm_s';	// Наводим выделение на ячейку
		}
		return;
	}
}

function initMenu(sideControl){	// Генерация сайд-меню внутри заданного элемента и раскрытие его на ячейке, указанной в selected_item
	for(top_menu_counter=1;(menuElement=menu['id_'+(top_menu_counter-1)]);top_menu_counter++){
		if(codeElement=document.getElementById('tm'+top_menu_counter)){
			if((menuElement.link=='')||(menuElement=='#')){	// Если ссылка не назначена - добавляем в ячейку текст
				codeElement.innerHTML=menuElement.title;	// Сначала проводим ассоциирование с топ-меню, если оно есть
				codeElement.onclick=function(){ id=this.id.substr(2,this.id.length-2)*1;topMenuSelect(id,false); }	// Выделение по нажатию
			}else{	// Иначе создаём ссылку
				if(re.test(menuElement.link)){	// Если ссылка внешняя - откроем её в новом окне
					link_add=''; target="_blank";
				}else{	// Если ссылка не внешняя, к ней нужно добавить информацию об источнике перехода
					link_add=(menuElement.link.indexOf('?')==-1)?'?':'&';	// Добавление к ссылке, указываюее выбранную ячейку
					link_add+='sm='+menuElement.id;
					target='';
				}
				codeElement.anc_id=menuElement.id+'anchor';	// Добавляем ссылку внутрь ячейки
				codeElement.innerHTML='<a id="'+codeElement.anc_id+'" href="'+menuElement.link+link_add+'"'+target+'>'+menuElement.title+'</a>';
				codeElement.onclick=function(){ window.location.href=document.getElementById(this.anc_id).href; }	// Переходим по ссылке по щелчку в любой точке ячейки
			}
		}else if(emptyTop=='')emptyTop='sideMenu_'+(top_menu_counter-1);	// Запоминаем неассоциированное сайд-меню
		new_menu=document.createElement('table');	// Создаём ветку сайд-меню
		new_menu.cellSpacing=0; new_menu.cellPadding=0; new_menu.style.display='none';
		new_menu.className='sidemenu';
		new_menu.id='sideMenu_'+(top_menu_counter-1);	// Именно по идентификатору topMenuSelect найдёт подменю
		menu['id_'+(top_menu_counter-1)].exportHTML(new_menu,false);
		sideControl.appendChild(new_menu);	// Добавляем колонку к указанному контролу
	}
	if(selected_item!=''){	// Есле выбранная ячейка явно задана
		menu_path=new Array();	// Массив ячеек-вложений, которые нужно раскрыть, чтобы добраться до выбранной
		temp_item=selected_item;								 
		for(menu_path_counter=0;menu[menu[temp_item].parent];menu_path_counter++){
			menu_path[menu_path_counter]=temp_item;
			temp_item=menu[temp_item].parent;
		}	// Состаляем путь к выбранной ячейке
		topMenuSelect(menu[temp_item].mainParent()+1,false);	// Пытаемся раскрыть нужную ячейку топ-меню
		for(menu_path_counter2=(menu_path_counter-1);menu_path_counter2>=0;menu_path_counter2--)
			if(menu[menu_path[menu_path_counter2]].hasChildren())
				expand(null,menu_path[menu_path_counter2],false);	// Постепенно раскрываем сайд-меню
	}else	hideAll(false); // Иначе показываем меню по умолчанию
}

function appear(elmID){	// Функция, позволяющая плавно насытить прозрачность подменю до 100%; elemID - идентификатор подменю
	elmTr=document.getElementById(elmID+'tr');
	elmTable=document.getElementById(elmID+'table');
	if(menu_opacity==0){
		elmTable.style.filter='alpha(opacity=0)';
		elmTable.style.opacity=0;
		elmTr.style.display='block';
	}else{									 
		elmTable.style.filter='alpha(opacity='+menu_opacity+')';
		elmTable.style.opacity=menu_opacity/100;
	}
	if(menu_opacity>=100)
		clearInterval(appear_interval);
	menu_opacity+=25;
}

function expand(elmItem,subID,visual){	// Раскрываем подменю, соответствующее ячейке elemItem.
	if(!elmItem)elmItem=submenus[subID];
	if((elmItem.className=='f_u_h')||(elmItem.className=='f_s_h')){	// Если вложение оказалось свёрнутым - открываем
		elmItem.className='f_u_c';
		if(!elmItem.anc_id)elmItem.onclick=function(){ rollup(this,subID); }	// Меняем полярность, если ячейка - не ссылка
	}else return rollup(elmItem,subID);	// Иначе - скрываем подменю
	elmSubmenu=document.getElementById(subID+'tr');
	if(elmSubmenu){
		if(visual){
			menu_opacity=0;
			appear_interval=setInterval('appear(\''+subID+'\');',100);
		}else elmSubmenu.style.display='block';
	}else return false;
}

function rollup(elmItem,subID){	// Сворачиваем раскрытое подменю
	if(elmItem){
		elmItem.className='f_u_h';
		elmItem.onclick=function(){ expand(this,subID,true); }
	}
	elmSubmenu=document.getElementById(subID+'tr');
	if(elmSubmenu)elmSubmenu.style.display='none';else return false;
}
