﻿var wPersonFilter = Class.create();
wPersonFilter.FILTERED_CLASSNAME = 'filtered';
wPersonFilter.FILTERABLE_CLASSNAME = 'filterable';
wPersonFilter.prototype = {
	
	initialize : function (input, container, elementName, keyElementName) {

		// constants
		this.KEY_CLASSNAME = 'filter-key';
		
		
		// private members
		this.input = null;
		this.items = [];
		
		this.elementName = '';
		this.keyElementName = '';
		
		this.tabs = null;
		
		this.wrongFilter	= false;
		

		// ctor
		
		this.elementName = elementName;
		this.keyElementName = keyElementName;

		this.addItems(container);
		this.addBehavior(input);
	},
		
	
	// private methods

	addBehavior : function (input) {
		this.input = $(input);
		this.input.observe('keyup', this.filter.bind(this));
		this.input.focus();
	},
	
	checkTab : function (letter) {
		if (this.tabs)
			this.tabs.activateByLetter(letter);
	},


	// public methods
	
	addItem : function (element) {
		var elements = element.getElementsByTagName(this.keyElementName);
		
		if (elements.length != 1)
			throw new Error('Ошибка инициализации фильтра');
			
		this.items.push( new wPersonFilterItem(element, elements[0]) );
	},
	
	addItems : function (container) {
		var elements = container.getElementsByTagName(this.elementName);
		
		if (elements.length > 0)
			for (var i = 0; i < elements.length; i++)
				if ($(elements[i]).hasClassName(wPersonFilter.FILTERABLE_CLASSNAME))
					this.addItem(elements[i]);
	},
	
	attachTabs : function (tabs) {
		this.tabs = tabs;
	},
	
	filter : function () {
		if (this.input.value.length == 1)
			this.checkTab(this.input.value);
	
		var visible = 0;
		
		for (var i = 0; i < this.items.length; i++)
			visible += this.items[i].filter(this.input.value);
			
		if (visible == 0 && !this.wrongFilter)
		{
			this.input.addClassName('wrong');
			this.wrongFilter = true;
		} else if (visible > 0 && this.wrongFilter) {
			this.input.removeClassName('wrong');
			this.wrongFilter = false;
		}
	},
	
	flush : function () {
		this.input.value = '';
		this.filter();
	}
	
}



var wPersonFilterItem = Class.create();
wPersonFilterItem.prototype = {


	initialize : function (element, keyElement) {
	
		// private members
		this.element	= null;
		this.keyElement = null;
		this.keyValue	= '';
		
		this.value = '';
		
		
		// ctor
		
		this.element = element;
		this.keyElement = keyElement;
		
		this.value = keyElement.innerHTML.toLowerCase();
		this.keyValue = keyElement.innerHTML;
	},
	
		
	// public methods
	
	filter : function (text) {
		if (this.value.indexOf(text.toLowerCase()) != 0) {
			this.element.addClassName(wPersonFilter.FILTERED_CLASSNAME);
			return 0;
		} else {
			this.element.removeClassName(wPersonFilter.FILTERED_CLASSNAME);
			this.keyElement.innerHTML = '<span class="match">'+this.keyValue.substring(0, text.length)+'</span>'+this.keyValue.substring(text.length);
			return 1;
		}
	}

}

