/**
 * @author Anton Starcev (ast@design.ru)
 * alpha-версия :-)
 */
function ElementsMap(){
	this.index = {}; // здесь будут храниться объекты по ключу
	this.indexWithItems = {}; // уже отобранные с элементами

	this.AllDay = 'filter-h24-key'; // const
	this.TakeMoney = 'filter-money-take-key'; // const

	this.DisableClass = 'hide-point'; // класс скрывающий пункты меню

	/**
	 * Содержит элементы, на который идут ссылки
	 * из точек метро
	 */
	this.infoContaner = document.getElementById('atms'); // значение по-молчанию document.getElementById('atms'), чтобы не править /atms/ и связанные страницы
	if(this.infoContaner) this.infoCollection = this.infoContaner.childNodes; // выдорка info item
	this.searchInput = document.getElementById('atms-search'); 

	// спец индексы
	this.indexAllDay = {}; // круглосуточные банкоматы 
	this.indexTakeMoney = {}; // приминают наличные
	this.indexNoFilter = {}; // вне спец индексов
	this.indexFiltersAnd = {}; // условие объекдинения индексов AND indexTakeMoney и indexAllDay

	this.indexSearch = {}; // отфильтрованные по поиску search.js
}
ElementsMap.prototype={
	/**
	 * Обходим элементы ссылающиеся на индекс
	 */
	getElementsCollection: function(nodesCollection){
		this.infoCollection =  nodesCollection;
		var _ElementsMap = this;
		
		menu(nodesCollection, function(node){
			
			// добираемся для ключевых слов офиса|банкомата
			if(node.nodeType == 1){ // if <.../>
				node.Ids = [];
				// берем контейнер где есть ссылки на метро формата id777_metro_name
				menu(node.getElementsByTagName('p'), function(p){
					// уточняем, что это должен быть .search-keywords
					if(Common.Class.match(p, 'search-keywords')){
						
						menu(p.getElementsByTagName('span'), function(span){
							var id = _ElementsMap.getIdFromString(span.innerHTML); // получаем id
							node.Ids.push(id);
							
							_ElementsMap.index[id].elem.push(node); // добовляем ноду в индекс элемента
							_ElementsMap.indexWithItems[id] = true; // говорим в id есть елементы
		
							// дополнительные индексы
							if(Common.Class.match(node, _ElementsMap.AllDay)) _ElementsMap.indexAllDay[id] = true;
							if(Common.Class.match(node, _ElementsMap.TakeMoney)) _ElementsMap.indexTakeMoney[id] = true;
		
							// если не относятся ни к одному из индексов
							if(!_ElementsMap.indexAllDay[id] && !_ElementsMap.indexTakeMoney[id]) _ElementsMap.indexNoFilter[id] = true;
		
							// если в обоих
							if(_ElementsMap.indexAllDay[id] && _ElementsMap.indexTakeMoney[id]) _ElementsMap.indexFiltersAnd[id] = true;
						});
					}
				});
			}
		});
	},
	/**
	 * Обходим элементы индекса
	 */
	getIndexFromElements: function(nodesCollection){
		var _ElementsMap = this;
		menu(nodesCollection, function(node){
			if(node.nodeType == 1){ // если это тег
				var id = _ElementsMap.getIdFromString(node.id); // получаем id

					
				if(id){
					_ElementsMap.index[id] = {
						ref: node, // ссылающийся елемент
						elem: [] // создаем массив для будущих <div/>
					};

					// навешиваем событие
					Common.Event.add(node, 'click', function(){
						_ElementsMap.indexSelected(id); // говорим, что выбран индекс
					});
				}
			}
		});
	},
	
	/**
	 * id по формату
	 */
	getIdFromString: function(str){
		var m = str.match(/^id([0-9]+)/);
		if(m)
			return m[1];
		return console.log(str);
	},
	
	/**
	 * выбран индекс (onClick)
	 */
	indexSelected: function(id){

		// TODO заплатка
		// если выбрали станцию метро, а у контейнера остался 'filtered',
		// который дописал поиск, 'filtered' нужно убрать
		//if(this.searchInput.value.length == 0)
			//Common.Class.remove(this.infoContaner, 'filtered')


		var nodes = this.infoCollection, il = this.infoCollection.length;

		for(var i=0; i < il; i++)
		{
			var IsInIndex = false;
			currentElement = nodes[i];
			// перебираем id-метро которые есть в нодах
			menu(currentElement.Ids, function(otherId){
				if(otherId == id){
					IsInIndex = true;
				}
			});
			if(IsInIndex == false) Common.Class.add(currentElement, this.DisableClass);
		}

		// пишем в класс, что кликнули
		Common.Class.add(this.infoContaner, 'indexSelected');

		isSearching();

		//hidden
		//if(document.getElementById('f-list')) vtb24.tabs.switchTabItem(document.getElementById('f-list'));
		if(document.getElementById('f-list')) tabs.OnTabLabelClick(document.getElementById('f-list'));
		if(document.getElementById('f_list')) tabs.OnTabLabelClick(document.getElementById('f_list'));
	},
	
	setNotNullDependencies: function(){
		for(x in this.index){
			var currentItem = this.index[x];
			//document.title = "DisableClass " + this.DisableClass;
			if(currentItem.elem.length == 0 && currentItem.ref){
				Common.Class.add(currentItem.ref, this.DisableClass); // прячем метро без филиалов
			}
		};
	},
	/**
	 * Выборка по поиску search.js
	 */
	FilterRefs: function(){

		var _ElementsMap = this;
		_ElementsMap.indexSearch = {}; // обнуляем (новый поиск)

		this.hideAllRefs();

		menu(this.infoCollection, function(item){
			if(Common.Class.match(item, 'found')){ // если пользователь нашел
				menu(item.Ids, function(id){

					var ToShow = false;
					var IsAllFilters = false;

					// если такие элементы есть на странице
					if(document.getElementById('flt1') && document.getElementById('flt2')){
						if(document.getElementById('flt1').checked && document.getElementById('flt2').checked) IsAllFilters = true;
	
						if(document.getElementById('flt1').checked && _ElementsMap.indexAllDay[id] && !IsAllFilters) // если входит во включенный фильтр и не все фильтры
							ToShow = true;
						if(document.getElementById('flt2').checked && _ElementsMap.indexTakeMoney[id] && !IsAllFilters)
							ToShow = true;
					}

					if(IsAllFilters && _ElementsMap.indexTakeMoney[id] && _ElementsMap.indexAllDay[id])
						ToShow = true;

					if(document.getElementById('flt1') && document.getElementById('flt2')) if(!document.getElementById('flt1').checked && !document.getElementById('flt2').checked) ToShow = true; // если не один фильтр не нажат

					// если это страница офисов
					if(document.getElementById('Branches')) ToShow = true;

					if(ToShow){
						_ElementsMap.indexSearch[id] = true;
						Common.Class.remove(_ElementsMap.index[id].ref, _ElementsMap.DisableClass);
					}

				});
			}
		});

		

		if(this.searchInput) if(Common.Class.match(this.searchInput, 'empty')) this.showAllRefs();
	},
	/**
	 * Показываем метро у элементов с классом class_name в зависимости от фильтров
	 * Boolean IsChecked - выбран контрол или нет
	 */
	FilterRefsByClass: function(obj, class_name, IsChecked){

	},
	hideElementsInIndex: function(index){
		for(x in index){
			var currentItem = this.index[x];
			currentItem.ref.style.display = "none";
			currentItem.ref.style.border = "solid 1px red";
			Common.Class.add(currentItem.ref, this.DisableClass); // прячем :-)
		};
	},
	showElementsInIndex: function(index){
		for(x in index){
			var currentItem = this.index[x];
			Common.Class.remove(currentItem.ref, this.DisableClass);
		};
	},
	/**
	 * показываем index если есть с таким же номером в withIndex, то есть AND
	 */
	showElementsInIndexWith: function(index, withIndex){
		for(x in index){
			if(withIndex[x]) Common.Class.remove(this.index[x].ref, this.DisableClass);
		};
	},
	hideAllRefs: function(){
		for(x in this.indexWithItems){
			var currentItem = this.index[x];
			Common.Class.add(currentItem.ref, this.DisableClass); // прячем метро без филиалов
		};
	},
	/**
	 * показываем только id с елементами больше одного
	 */
	showAllRefs: function(){
		for(x in this.indexWithItems){
			var currentItem = this.index[x];
			Common.Class.remove(currentItem.ref, this.DisableClass); // прячем метро без филиалов
		};
	}
}

var IE = document.all?true:false;
var Opera = window.opera?true:false;

function C(m){
	if(!IE && !Opera) console.log(m)
}
