/* $Id$ */

/**
 * Поиск по карте сайта
 */
function sitemapSearch() {
	var field = $('#sitemap-search'),
		buttonClear = $('.js-sitemap-search-clear'),
		element = $('.site-map-menus').find('.title');
	
	//обработчик клика по кнопке очищения поискового поля
	buttonClear.click(function(){
		var elementHidden = $('.site-map-menus').find('.g-hidden');
		
		//очищаем поисковое поле
		field
			.val('')
			.focus();
		//скрываем кнопку очищения
		$(this).addClass('g-hidden');
		//отображаем ранее скрытые элементы
		elementHidden.removeClass('g-hidden');
	});
	
	//осуществляем поиск, если введено более 2 символов
	field.keyup(function(){
		var pattern = $(this).val();
		
		if (pattern.length > 2) {
			var reg = new RegExp(pattern, 'gi');
			
			//расскрываем кнопку очищения
			buttonClear.removeClass('g-hidden');
			//запускаем поиск запроса в элементах дерева
			sitemapSearchTree(element, reg);
		} else {
			var elementHidden = $('.site-map-menus').find('.g-hidden');
			
			//скрываем кнопку очищения
			buttonClear.addClass('g-hidden');
			//отображаем ранее скрытые элементы
			elementHidden.removeClass('g-hidden');
		}
	});
}

/**
 * Запускаем поиск в каждом элементе
 * 
 * @param obj	element		Элемент дерева
 * @param obj	reg			Поисковый запрос
 */
function sitemapSearchTree(element, reg) {
	element.each(function(){
		var self = $(this),
			container = self.parent(),
			children = container.find('.site-map-menu'),
			isExpanded = !!children.length;
			
			//поиск в элементе
			sitemapSearchItem(container, self, reg, isExpanded);
	});
}

/**
 * Осуществляем поиск в элементе и задаем параметры отображения
 * 
 * @param obj	container		Контайнер элемента дерева
 * @param obj	self			Элемент дерева
 * @param obj	reg				Поисковый запрос
 * @param bool	isExpanded		Наличие подпунктов
 */
function sitemapSearchItem(container, self, reg, isExpanded) {
	var val = self.text();
	
	if (val.search(reg) == -1) {
		//метка для скрытия элемента
		container.addClass('js-sitemap-element-hide');
		
		if (isExpanded) {
			var children = container
								.find('.site-map-menu')
								.first()
								.children('li')
								.children('.item_link');
			
			//поиск по подпунктам элемента
			sitemapSearchTree(children, reg);
		} else {
			container
					.removeClass('js-sitemap-element-hide')
					.addClass('g-hidden');
			
			//все родители данного элемента в дереве
			var parents = container.parentsUntil('.site-map-menus');
			
			//скрываем всех родителей, имеющих соответствующую метку
			parents.each(function(){
				var parent = $(this);
				
				if (parent.hasClass('js-sitemap-element-hide')) {
					parent
						.removeClass('js-sitemap-element-hide')
						.addClass('g-hidden');
				}
			});
		}
		
	} else {
		//метка для показа элемента
		container.addClass('js-sitemap-element-show');
		
		if (isExpanded) {
			var children = container
								.find('.site-map-menu')
								.first()
								.children('li')
								.children('.item_link');
			
			//поиск по подпунктам элемента
			sitemapSearchTree(children, reg);
		} else {
			container.removeClass('js-sitemap-element-hide g-hidden');
			
			//все родители данного элемента в дереве
			var parents = container.parentsUntil('.site-map-menus');
			
			//корректируем отображение всех родителей
			parents.each(function(){
				var self = $(this);
				
				//убираем метку скрытия и отображаем родителя
				self.removeClass('js-sitemap-element-hide g-hidden');
			});
		}
	}
}

/**
 * Инициализируем события наведения курсора на элементы карты сайта
 */
function sitemapItemsHover() {
	$('li.collapsed').addClass('leaf');
	
	var container = $('.site-map-menus'),
		box = container.find('h2.title'),
		itemBox = container.find('li.expanded > .item_link'),
		item = container.find('li.leaf'),
		hoverClass = 'site-map-item-hover';
	
	//раздел дерева меню
	box.hover(
		function(){
			sitemapHoverClass($(this).parent());
		},
		function(){
			sitemapHoverClass($(this).parent());
		}
	);
	
	//подраздел дерева меню
	itemBox.hover(
		function(){
			sitemapHoverClass($(this).parent());
		},
		function(){
			sitemapHoverClass($(this).parent());
		}
	);
	
	//пункт дерева меню
	item.hover(
		function(){
			sitemapHoverClass($(this));
		},
		function(){
			sitemapHoverClass($(this));
		}
	);
}

/**
 * Добавляем/убираем класс hover'а
 * 
 * @param obj self
 */
function sitemapHoverClass(self) {
	self.toggleClass('site-map-item-hover');
}


$(function(){
	var sitemapLink = $('.sitemap a');
	
	if (!sitemapLink.hasClass('item_link')) {
		sitemapLink.addClass('item_link');
	}
	
	sitemapSearch();
	sitemapItemsHover();
});