//конфигурация
var MENU_WIDTH = 240;				//размер меню по всем разделам (не более 265 пикселей - если больше, надо дорисовать бэкграунды)
var MENU_TOP_OFFSET = 9;			//смещение выпадающего меню по вертикали
var FULL_MENU_LEFT_OFFSET = -1;		//смещение выпадающего меню по горизонтали
var FULL_MENU_ALIGN = 'right'; 		//указывает как должно быть выровнено меню относительно границ родительского элемента (left или right)
var ROOT_DEPT_ID = 0; 				//id-шка корневого раздела иерархии разделов
var TIME_BEFORE_SHOW_MENU = 350;	//задержка в миллисекундах перед отображением меню
	

//глобальные переменные
var active_menu_id = '';
var active_menu_div_params_initialized = false;
var active_menu_div_width = 0;
var active_menu_div_height = 0;
var active_menu_div_left = 0;
var active_menu_div_top = 0;
var menu_divs_offsets = {};
var cancel_menu_clicked_timer;
var menu_clicked = false;
var cursor_position_checker_interval;
var timeout_to_hide_menu;
var timeout_to_show_menu;
var show_menu_timeout_td_id;
var non_hide_timeout;
var timeouted_to_hide_menu = false;
var do_not_hide_menu_by_cursor_position = false;
var cursor_x = 0;
var cursor_y = 0;



$(document).ready(function () {	
	init_main_menu();
	correct_menu_with_browser_width();
	
	$(window).resize(function(){
		correct_menu_with_browser_width();
		full_menu_repositioning();
		clear_all_menu_divs_offsets();
	});
});

//функция инициализации главного горизонтального меню
function init_main_menu(){
	$('.tabs_table td[id]').each(function(){
		$(this).append('<div class="depts_menu"></div>');
		var menu = $('div.depts_menu', $(this));
		$(menu).css('margin-top', MENU_TOP_OFFSET+'px');
		$(menu).css('width', MENU_WIDTH+'px');
		if ($(this).attr('id') == 'menu_' + ROOT_DEPT_ID){
			full_menu_repositioning();
		}
	});
	
	$('.tabs_table td[id]').hover(
		function () {start_show_menu_timeout($(this).attr('id'),'hover')},
		function () {clear_show_menu_timeout($(this).attr('id'));}
	)
	.click (
		function () {start_show_menu_timeout($(this).attr('id'),'click')}
	)
	.bind('mousemove',
		function(e){
			cursor_x = e.pageX;
			cursor_y = e.pageY;
		}
	);
	
	
	$('ul.fm_list li').hover(
		function () {$(this).addClass('hover');}, 
		function () {$(this).removeClass('hover');}
	)
	.click(function () {
		menu_click(this);
	});
	
	
	//логика для скрытия меню при клике в другой области документа
	$('div.depts_menu').bind('mousedown', function() { set_menu_clicked();});
	$('.tabs_table td[id]').bind('mousedown', function() { set_menu_clicked();});
	$(document).bind('mousedown', function(){ hide_active_menu_when_clicked();});
	
	//формируем реальные ссылки 
	make_hrefs();


}

//блок из 3-х функций, которые отвечают за небольшую задержку при отображении меню
function start_show_menu_timeout(hover_td_id, action_type){
	//console.info(show_menu_timeout_td_id + ' ' +hover_td_id);
	if ((show_menu_timeout_td_id != hover_td_id) || (action_type == 'click')){
		show_menu_timeout_td_id = hover_td_id;	
		clearTimeout(timeout_to_show_menu);
		if ((active_menu_id != '') || (action_type == 'click')){
			//значит в момент наведения на эту td-шку уже отображается какое-то меню
			//либо эта функция вызвана при клике на пункт меню, а не при наведении на него
			//в этом случае отображем новое меню без таймаута
			show_menu_container()
		}
		else{
			timeout_to_show_menu = setTimeout("show_menu_container()",TIME_BEFORE_SHOW_MENU);
		}
	}
}
function show_menu_container(){
	if (show_menu_timeout_td_id != ''){
		var td = $('#'+show_menu_timeout_td_id);
		if (typeof td != 'undefined'){
			show_menu_timeout_td_id='';
			clearTimeout(timeout_to_show_menu);
			show_menu(td);
		}
	}
}
function clear_show_menu_timeout(hover_td_id){
	show_menu_timeout_td_id='';
	clearTimeout(timeout_to_show_menu);
}




//функция, которая показывает дополнительные пункты в главном меню, если позволяет ширина рабочей области
function correct_menu_with_browser_width(){
	hide_active_menu();	
	
	var design_width = $("div.page_container2").width();
	design_width = design_width - 14; //делаем поправку на боковые тени
	
	//среднюя ширина одного символа в назвнии пунктов меню
	var char_width = 7.5;
	//размеры пэддингов в пунктах меню
	var item_padding_width = 52;
	
	var cur_menu_width = 0;
	cur_menu_width = 160; //сразу прибавляем ширину последнего пункта "Все разделы" - он у нас всегда должен быть отображен 
	
	$('.tabs_table td:not(:last)').each(function(){
		var cur_item_text_length = $('nobr',$(this)).text().length
		var cur_item_width = (cur_item_text_length * char_width) + item_padding_width;
		cur_menu_width = cur_menu_width + cur_item_width;
		
		if (cur_menu_width < design_width){ //показываем пункт
			$(this).show();
		}
		else{ //прячем
			$(this).hide();
		}
	});
	
}

//функция отображения выпадающего списка подразделов (при наведении)
function show_menu(td){
	var td_id = $(td).attr('id');
	
	if (td_id != active_menu_id){
		//скрываем меню, которое могло быть отображено ранее
		hide_active_menu();

		//смотрим, есть ли у нас список с подразделами для выбранного пункта
		if ($('#sub_' + td_id).length){
			var target_div = $('#' + td_id + ' div.depts_menu');
			$(target_div).show();
			active_menu_id = td_id;
			var new_ul = $('#sub_' + td_id).clone(true)

			//перед отображением меню удаляем из него пункт 'назад', если назад уже некуда
			var back_item_id = $('li.back',$(new_ul)).attr('name');
			$('li.back',$(new_ul)).remove();
			
			$(new_ul).prependTo(target_div).addClass('fm_cur_list');
			clear_timeout_to_hide_menu();
			
			//set_non_hide_timeout();
			clearTimeout(non_hide_timeout);
			clear_non_hide_timeout();
			
			init_cursor_position_checker();

			if ((!$.browser.opera) || ($.browser.version >= 9.8)){
				$(target_div).dropShadow({left: 1, top: 1, blur: 2, opacity: 0.4});
			}
		}
	}
}

//функция обработки клика на подразделе (происходит его замена на другой список со слайдингом)
function menu_click (clicked){
	
	//если пункт содержит class=link, то делаем переход по ссылке (на тот случай, если клик пришелся не на <a>, а на <li>)
	if ($(clicked).hasClass('link')){
		if ($("a",$(clicked))[0].href){location.href=$("a",$(clicked))[0].href}
		return false;
	}
	
	var current_td = $(clicked).parents('.tabs_table td[id]').get(0);
	var current_td_id = $(current_td).attr('id');	
	var current_list = $("ul.fm_cur_list");
	var sel_dept = $('div.depts_menu',$(current_td));
	var clicked_id = $(clicked).attr('name');
	//var sel_dept_id = $(sel_dept_id).attr('name');

	
	//смотрим, есть ли у нас список с подразделами для выбранного пункта
	if ($('#sub_menu_' + clicked_id).length){
		var slide_direction = 'right';
		var slide_speed = 200;
		if ($(clicked).hasClass('back')) {
			slide_direction = 'left';
			slide_speed = 340;
		}
		
		if ($(current_list).attr('id') != 'sub_menu_' + clicked_id){ //проверка, чтобы не делать переход на себя же
			$(sel_dept).empty();
			var new_ul = $('#sub_menu_' + clicked_id).clone(true);

			//перед отображением удаляем пункт меню 'назад', если назад уже некуда
			//console.info(current_td_id+' : '+clicked_id);
			if (current_td_id == 'menu_'+clicked_id){
				//console.info('remove');
				$('li.back',$(new_ul)).remove();
			}

			
			if (($.browser.opera)&&($.browser.version < 9.8)){
				$(new_ul).prependTo(sel_dept).addClass('fm_cur_list');
			}
			else{
				$(new_ul).prependTo(sel_dept).show("slide", { direction: slide_direction }, slide_speed).addClass('fm_cur_list');
				$(sel_dept).redrawShadow();
			}
			active_menu_div_params_initialized = false;
			set_non_hide_timeout();
			clear_timeout_to_hide_menu();
			init_cursor_position_checker();
			self.scroll(0,0);
		}
	}
}


//прячет меню, которое отображено в данный момент
function hide_active_menu(){ //прячем меню, которое было активно
	//console.info("hide_active_menu()");
	if (active_menu_id != ''){
		var target_div = $('#' + active_menu_id + ' div.depts_menu');
		$(target_div).removeShadow();
		$(target_div).hide().empty();
	}
	active_menu_id = '';
	cancel_cursor_position_checker();
	timeouted_to_hide_menu = false;
	active_menu_div_params_initialized = false;
}



//для последнего пункта меню "Все разелы" пересчитывает позицию по горизонтали (в случае, когда он должен вырывниваться по правой границе)
function full_menu_repositioning(){
	if (FULL_MENU_ALIGN == 'right'){ //выравниваем меню по правой границе контенера
		var menu = $('#menu_'+ ROOT_DEPT_ID +' div.depts_menu');
		var container = $(menu).parent();
		var container_offset = $(container).offset();
		var container_width = $(container).width() + parseInt(del_noise_str($(container).css("padding-right"))) + parseInt(del_noise_str($(container).css("padding-left")));
		//console.info('left: '+container_offset.left+' top: '+container_offset.top+' width: '+container_width);
		var menu_left = Math.round(container_offset.left + (container_width - MENU_WIDTH) + FULL_MENU_LEFT_OFFSET);
		$(menu).css('left', menu_left+'px');
	}
}

//прячем меню, когда пользователь кликает на документе мимо меню
function hide_active_menu_when_clicked (){ 
	//console.info("hide_active_menu() menu_clicked:"+menu_clicked);
	if (!menu_clicked){		
		hide_active_menu()
	}
}

//логика для отделения кликов "мимо меню" от всех остальных 
function set_menu_clicked(){
	clearTimeout(cancel_menu_clicked_timer);
	menu_clicked = true;
	cancel_menu_clicked_timer = setTimeout("cancel_menu_clicked()",100);
}
function cancel_menu_clicked(){
	menu_clicked = false;
}

//функция, которая включает проверку текущей позиции курсора относительно активного меню
function init_cursor_position_checker(){
	//console.info("init_cursor_position_checker");
	clearInterval(cursor_position_checker_interval);
	cursor_position_checker_interval = setInterval("check_cursor_position()",500);
	$(document).bind('mousemove', function(e){
		cursor_x = e.pageX;
		cursor_y = e.pageY;
	}); 
}

//функция, которая отключает проверку позиции курсора относительно активного меню
function cancel_cursor_position_checker(){
	clearInterval(cursor_position_checker_interval);
	$(document).unbind('mousemove');
}

//собственно функция проверки позиции курсора (если курсор далеко от меню - прячем меню)
function check_cursor_position(){
	//console.info(cursor_x + ' ' + cursor_y + ' scroll: ' + getScrollTop() + ' ' + getScrollLeft());
	//получаем координаты и текущий размер активного меню
	if ((active_menu_id != '') && (!do_not_hide_menu_by_cursor_position)){
		//поправка позиции курсора на скроллинг - оказалась не нужна
		//var my_cursor_x = cursor_x + getScrollLeft();
		//var my_cursor_y = cursor_y + getScrollTop();
		
		//инициализируем глобальные переменные с размерами и позицией активного меню
		init_menu_div_params(active_menu_id);
		
		//находим расстояние от курсора до меню
		var distance_x = 0;
		if (cursor_x < active_menu_div_left) { distance_x = active_menu_div_left - cursor_x}
		else if (cursor_x > (active_menu_div_left + active_menu_div_width)) { distance_x = cursor_x - (active_menu_div_left + active_menu_div_width)}
		var distance_y = 0;
		if (cursor_y < active_menu_div_top) { distance_y = active_menu_div_top - cursor_y}
		else if (cursor_y > (active_menu_div_top + active_menu_div_height)) { distance_y = cursor_y - (active_menu_div_top + active_menu_div_height)}
		var max_distance = Math.max(distance_x, distance_y);
		//console.info('cursor_x:' + cursor_x + ' cursor_y:' + cursor_y);
		//console.info('distance_x:' + distance_x + ' distance_y:' + distance_y);
		//console.info('cursor_y:' + cursor_y + ' active_menu_div_top:' + active_menu_div_top + ' active_menu_div_height:' + active_menu_div_height);
		
		//console.info('max_distance:' + max_distance);

		//проверяем, достаточно ли оно велико, чтобы инициализировать процесс скрытия меню
		if (max_distance >250){set_timeout_to_hide_menu(100);}
		else if (max_distance >160){set_timeout_to_hide_menu(400);}
		else if (max_distance >100){set_timeout_to_hide_menu(800);}
		else{clear_timeout_to_hide_menu();}
	}
}

//функции, возвращающие значения скроллингов
function getScrollTop(){
	return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
};
function getScrollLeft(){
	return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
};

//функция, которая инициализирует глобальные переменные с размерами и позицией активного меню
function init_menu_div_params(active_menu_id){
	if (active_menu_div_params_initialized == false){
		active_menu_div_params_initialized = true;
		
		var div = $('#'+active_menu_id+' div.depts_menu');
		var div_offset = get_menu_div_offset(active_menu_id, div);
		
		active_menu_div_width = $(div).width() + parseInt(del_noise_str($(div).css("padding-right"))) + parseInt(del_noise_str($(div).css("padding-left")));
		active_menu_div_height = $(div).height() + parseInt(del_noise_str($(div).css("padding-bottom"))) + parseInt(del_noise_str($(div).css("padding-top")));
		active_menu_div_left = div_offset.left;
		active_menu_div_top = div_offset.top;
		//console.info('init_menu_div_params() width:' + active_menu_div_width + ' height:' + active_menu_div_height + ' left:' + active_menu_div_left + ' top:' + active_menu_div_top);
	}
}

//функция, которая возвращает координаты (top и left) активного меню, если они еще не были просчитаны
function get_menu_div_offset(active_menu_id, target_div){
	
	if (menu_divs_offsets[active_menu_id] != 'initialized'){
		var target_div_offset = $(target_div).offset();
		menu_divs_offsets[active_menu_id] = 'initialized';
		menu_divs_offsets[active_menu_id+'left'] = target_div_offset.left;
		menu_divs_offsets[active_menu_id+'top'] = target_div_offset.top;
	}
	var result = {};
	result['left'] = menu_divs_offsets[active_menu_id+'left'];
	result['top'] = menu_divs_offsets[active_menu_id+'top'];
	return result;
}

//функция, которая очищает просчитанные ранее координаты (top и left) для всех выпадающих меню (используется при ресайзе окна)
function clear_all_menu_divs_offsets(){
	menu_divs_offsets = {};
}

//скрывает активное меню через указанное в параметре время
function set_timeout_to_hide_menu(time){
	if (!timeouted_to_hide_menu){
		//console.info("hide_active_menu() timeout: "+time);
		clearTimeout(timeout_to_hide_menu);		
		timeout_to_hide_menu = setTimeout("hide_active_menu()",time);
		timeouted_to_hide_menu = true;
	}
}
//отменяет запущенное предыдущей функцией скрытие активного меню
function clear_timeout_to_hide_menu(){
	clearTimeout(timeout_to_hide_menu);
	timeouted_to_hide_menu = false;
}

//устанавливает период, в течении которого меню после отображения не будет отслеживать позицию курсора, чтобы скрыть меню
function set_non_hide_timeout(){
	clearTimeout(non_hide_timeout);
	non_hide_timeout = setTimeout("clear_non_hide_timeout()",4300);
	do_not_hide_menu_by_cursor_position = true;
}
//очищает установленный флаг, по истечении периода, заданного функцией set_non_hide_timeout
function clear_non_hide_timeout(){
	do_not_hide_menu_by_cursor_position = false;
}
//создаем ссылки на пунктах подменю
function make_hrefs(){ 
	$('ul.fm_list li').each(function(){
		var link_url = $(this).attr('link_url');		
		if (typeof link_url != 'undefined'){
			$(this).html('<a href="'+$(this).attr('link_url')+'">'+$(this).attr('link_text')+'</a>').removeAttr('link_url').removeAttr('link_text');
		}
		else{$(this).html($(this).attr('link_text')).removeAttr('link_text');}
	});
}
