//////////////////////////////////////////////////
//                                              //
//      Функции выпадающего главного меню       //
//                                              //
//////////////////////////////////////////////////

// Произведено ли выравнивание меню
var m_posaligned=false;

// Массив для абсолютного выравнивания меню
m_posalign = new Array();

// Массив соответствий потомков предков
m_parents = new Array();

// Запомненные позиции
m_posalign_x = 0; m_posalign_y = 0;

// Мажорная функция выравнивания для выпадающего меню
function m_posalign_mj(arr){
	for(var i in arr){
		if(arr[i]=='')break;
		var src=arr[i][1];
		var dst=arr[i][0];
		var dx=arr[i][2];
		var dy=arr[i][3];
		var x,y;
		if(src!='#'){
			x=0; y=0;
			for(var o=document.getElementById(src); o!=document.body && o!=null; o=o.offsetParent){
				y=y+o.offsetTop;
				x=x+o.offsetLeft;
			}
		}else{
			x=m_posalign_x;
			y=m_posalign_y;
		}
		o=document.getElementById(dst); if(o);else continue;
		o.style.left=x+dx;
		o.style.top=y+dy;
		m_posalign_x=x;
		m_posalign_y=y;
	}
	m_posaligned=true;
}

// Минорная функция абсолютного выравнивания
var m_posalign_mn_dy=0;
function m_posalign_mn(arr){
	for(var i in arr){
		if(arr[i]=='')break;
		var src=arr[i][1];
		var dst=arr[i][0];
		var dx=arr[i][2];
		var dy=arr[i][3];
		var x,y;
		if(src!='#'){
			x=0; y=0;
			var s=document.getElementById(src); if(!s)return;
			posalign_mn_dy=s.offsetHeight;
			for(var o=s; o!=document.body && o!=null; o=o.offsetParent){
				y=y+o.offsetTop;
				x=x+o.offsetLeft;
			}
		}else{
			x=m_posalign_x;
			y=m_posalign_y;
		}
		o=document.getElementById(dst); if(o);else continue;
		o.style.display='block';
		o.style.left=x+dx+'px';
		o.style.top=y-dy-o.offsetHeight+posalign_mn_dy+'px';
		m_posalign_x=x;
		m_posalign_y=y;
	}
	m_posaligned=true;
}

// Миксованная функция выравнивания
function m_posalign_mx(arr){
	for(var i in arr){
		if(arr[i]=='')break;
		var src=arr[i][1];
		var dst=arr[i][0];
		var dx=arr[i][2];
		var dy=arr[i][3];
		var tp=arr[i][4];
		var x,y;
		if(src!='#'){
			x=0; y=0;
			var s=document.getElementById(src); if(!s)return;
			posalign_mn_dy=s.offsetHeight;
			for(var o=s; o!=null; o=o.offsetParent){
				y=y+o.offsetTop;
				x=x+o.offsetLeft;
			}
		}else{
			x=m_posalign_x;
			y=m_posalign_y;
		}
		o=document.getElementById(dst); if(o);else continue;
		
		document.body.appendChild(o);
		o.style.display='block';
		o.style.left=x+dx+'px';

		if(tp=='minor'){
			o.style.top=y-dy-o.offsetHeight+posalign_mn_dy+'px';
		}else if(tp=='major'){
			o.style.top=y+dy+'px';
		}

		m_posalign_x=x;
		m_posalign_y=y;
	}
	m_posaligned=true;
}

// Массив пунктов меню (разбитый по уровням)
m_array=new Array();

// Массив текущих пунктов, которые находится в процессе раскрытия, или уже раскрыты, по уровням
m_current=new Array();

// Функция помечает все пункты меню данного уровня как закрытые
function m_unset(lev){
	if(m_array[lev]){
		for(var i in m_array[lev]){
			m_array[lev][i]=false;
		}
	}
}

// Функция закрывает все пункты данного уровня, помеченные как закрытые
function m_close(){
	for(var l in m_array){
		for(var i in m_array[l]){
			if(m_array[l][i])continue;
			m_sub('m_'+i);
			var o=document.getElementById('m_d'+String(i).substr(1));
			if(!o)continue;
			o.style.visibility='hidden';
			if(i==m_current[l])m_current[l]='';
		}
	}
}

// Ссылка на текущий открываемый пункт, по уровням
m_object=new Array();

// Функция добавления класса
function m_add(id){
	var o = document.getElementById(id);
	if(!o)return;
	var c = o.className;
	var a = c.split(/\s+/);
	var b = [];
	var lnh = '';
	for (var i in a) {
		var s = a[i];
		var l = s.length;
		if (s.substr(l-6, 6) == '_hover') continue;
		b.push(a[i]);
		b.push(a[i]+'_hover');
	}
	var n = b.join(' ');
	if (n != c)	o.className = n;
}

// Функция удаления класса
function m_sub(id){
	var o = document.getElementById(id);
	if(!o)return;
	var c = o.className;
	var a = c.split(/\s+/);
	var b = [];
	for(var i in a){
		var s = a[i];
		var l = s.length;
		if(s.substr(l-6, 6) != '_hover') b.push(a[i]);
	}
	var n = b.join(' ');
	if (n != c)	o.className = n;
}

// Функция mouseover, с учетом уровня
function m_i(mi,lev){
	if(!m_posaligned)return;

	// Алфавитный ключ пункта меню
	var m='m'+mi;

	// Пометить все пункты данного уровня закрытыми
	m_unset(lev);

	// Пометить открытым текущий пункт и всех его родителей
	var l=lev; for(var i=m;i;i=m_parents[i]){
		if(!m_array[l])m_array[l]=new Array();
		m_array[l][i]=true; l--;
		m_add('m_'+i);
	}

	// Если этот пункт в процессе или уже открыт, дальше ничего делать не надо
	if( (m_current[lev]==m) && m_array[lev][m] )return;

	// Закрыть все пункты данного уровня, помеченные как закрытые
	m_close(lev);

	// Пометить этот пункт как в процессе
	m_current[lev]=m;

	// Найти его див
	o=document.getElementById('m_d'+mi);
	if(!o)return;

	// Прописать ссылку на него вне функции
	m_object[lev]=o;

	// Сделать альфу нулевой
	m_opa(o,0);

	// Установить CLIP в 0 0 0 0
	o.style.clip='rect(0 0 auto 0)';

	// Сделать видимым
	o.style.visibility='visible';

	// Запомнить ширину и высоту, только для данного уровня
	m_width[lev]=o.style.pixelWidth;
	m_height[lev]=o.style.pixelHeight;

	// Установить стадию в начало, только для данного уровня
	m_procents[lev]=0;

	// Запустить процесс отрытия на данном уровне
	m_process(lev);
}

// Ключ таймера тотального закрытия, по уровням
m_idcls='';

// Функция mouseout
function m_o(mi,lev){
	// Алфавитный ключ пункта
	var m='m'+mi;

	// Пометить закрытым текущий пункт и всех его родителей
	var l=lev; for(var i=m;i;i=m_parents[i]){
		if(!m_array[l])m_array[l]=new Array();
		m_array[l][i]=false; l--;
	}

	// Перезапустить тотальное закрытие через 330 мс
	if(m_idcls)clearTimeout(m_idcls);
	m_idcls=setTimeout('m_close()',330);
}

// Состояние открытия пункта в процентах, для уровней
m_procents=new Array();

// Запомненная ширина высота пункта, для уровней
m_width=new Array();
m_height=new Array();

// Функция процессит прозрачность, зависящую от браузера
function m_opa(o,p){
	p=p*18/20;
	if(o.filters){
		o.filters[0].opacity=p;
	}else{
		if(undefined!=o.style.mozOpacity){
			o.style.mozOpacity=p/100;
		}else if(undefined!=o.style.opacity){
			o.style.opacity=p/100;
		}
	}
}

// Функция процессит обработку открытия на заданном уровне
function m_process(lev){
	// Если уже 100%, то выходим
	if(m_procents[lev]==100)return;

	// Если пункт помечен как закрытый, то реально закрываем его выходим
	if(!m_array[lev][m_current[lev]]){
		m_object[lev].style.visibility='hidden';
		m_current[lev]='';
		return;
	}

	// Увеличиваем прогресс
	m_procents[lev]+=10;

	// Меняем ему альфу
	m_opa(m_object[lev],Math.sqrt(m_procents[lev]*100));

	// Переустанавливаем ему клип
//	m_object[lev].style.clip='rect(0 auto '+Math.sqrt(m_procents[lev])*0.1*(m_object[lev].offsetHeight)+'% 0)';
	m_object[lev].style.clip='rect(0 auto auto 0)';

	// Продолжаем процесс
	setTimeout('m_process('+lev+')',10);
}

