/**
 * Автокомплит поиска
 */
function AutoComplete(){
	
	this.respKey = 0;
	this.inputFieldSelector = '';
	this.dropFieldSelector = '';
	this.dropItemSelector = 'ul li a';
	this.selectedItemClass = 'sel';
	this.url;
	this.method = 'POST';
	this.minLettersRequire = 3;
	this.dropBoxTopDisplacement = 0;
	this.dropBoxLeftDisplacement = 0;
	this.freezedForm = null;
	/**
	 * Обработчик клика по элементу выпадающего списка
	 */
	this.clickHandler = null;
	/**
	 * Обработчик нажатия enter
	 */
	this.enterHandler = null;
	/**
	 * Обработчик ввода - ОБЯЗАТЕЛЬНО ДОЛЖЕН ВОЗВРАЩАТЬ TRUE
	 */
	this.typeHandler = null;
	/**
	 * Ссылка объекта на самого себя так как внутри обработчиков this переопределяется
	 */
	var self = this;
	
	/**
	 * Привязывает к элементам обработчики событий
	 * @param inputFieldSelector
	 * @param dropFieldSelector
	 * @return
	 */
	this.bind = function(inputFieldSelector, dropFieldSelector){
		this.inputFieldSelector = inputFieldSelector;
		this.dropFieldSelector = dropFieldSelector;
		$(this.inputFieldSelector).keyup(function(e){
		    // up button
		    if (e.keyCode == 38){
		    	// find selected if not found current - last
		    	var list = $(self.dropFieldSelector+' '+self.dropItemSelector), counter=0;
		    	for(counter;counter<list.length;counter++){
		        	if ($(list[counter]).hasClass(self.selectedItemClass)) {$(list[counter]).removeClass(self.selectedItemClass);break;}
		        }
		        counter = (counter==0)?(list.length-1):(counter-1);
		        var s = $(self.dropFieldSelector+' '+self.dropItemSelector+':eq('+counter+')');
		    	s.addClass(self.selectedItemClass);
		    	$(self.inputFieldSelector).val(s.text());
		    	list = null; s = null;
		    	return;
		    }
		    // down button
		    if (e.keyCode == 40){
		    	// find selected if not found current - last
		    	var list = $(self.dropFieldSelector+' '+self.dropItemSelector), counter=0;
		    	for(counter;counter<list.length;counter++){
		        	if ($(list[counter]).hasClass(self.selectedItemClass)) {$(list[counter]).removeClass(self.selectedItemClass);break;}
		        }
		        counter = (counter>=list.length-1)?0:counter+1;
		        var s = $(self.dropFieldSelector+' '+self.dropItemSelector+':eq('+counter+')');
		    	s.addClass(self.selectedItemClass);
		    	$(self.inputFieldSelector).val(s.text());
		    	return;	
		    }
		    // enter key
		    if (e.keyCode == 13){
		    	if (typeof self.enterHandler == 'function'){
		    		self.enterHandler();
		    	}
		    	return false;
		    }
		    // other key
		    if ($(this).val().length >self.minLettersRequire-1){
		    	if (typeof self.typeHandler == 'function'){
		    		self.typeHandler();
		    	}
		        self.respKey = new Date().getTime();
		    	$.ajax({
		  			url: self.url,
		  			cache: false,
		  			success: self.autoCompleteDropBox,
		  			type: 'POST',
		  			dataType: 'json',
		  			data: 's='+$(self.inputFieldSelector).val()+'&t='+self.respKey
				});
		    }
		}).attr('autocomplete','off');
		
		this.freezedForm = $(this.inputFieldSelector).parents('form');
		this.freezedForm.bind('submit',self.formSubmit);
		
		$(self.dropFieldSelector).mouseover(function(){
			$(document).bind('click',self.outClick);
		});
	}// end of bind
	
	/**
	 * Убирает выпадающий список при клике вне него
	 */
	this.outClick = function(){
		if (typeof self != 'undefined' && self != null)
		$(self.dropFieldSelector).css({display:'none'});
	}
	
	/**
	 * Отменяем сабмит формы при нажатии на enter
	 */
	this.formSubmit = function(){
		return false;
	}
	
	/**
	 * Добавляет элементы в выпадающий список
	 */
	this.autoCompleteDropBox = function(data){
		var dl = data.s.length;
		var au = $(self.dropFieldSelector);
		if(dl==0) {
			au.css({display:'none'});
			au.find('ul').empty();
			//$(self.inputFieldSelector).css('background',''); // selector because use one time
			dl = null; au = null;
	    	return;
		}
		var si = $(self.inputFieldSelector);
		si.css('background','');
		au.css({
			display: 'block',
			top: self.dropBoxTopDisplacement,
			left: self.dropBoxLeftDisplacement
		});
		var auul = au.find('ul');
		auul.empty();
		for (i=0;i<dl;i++){
			auul.append('<li><a'+((i%2)?' class="colored"':'')+' href="'+data.s[i].l+'" rev="'+((typeof data.s[i].v=='undefined')?data.s[i].l:data.s[i].v)+'">'+data.s[i].n+'</a></li>');
		}
		//console.log(typeof self.clickHandler);
		if (typeof self.clickHandler == 'function'){
			auul.find('li a').click(self.clickHandler);
		}
		dl = null; au = null; si = null; auul = null;
	}
	
	/**
	 * Чистим мусор от нашего автокомплита
	 */
	this.destroy = function(){
		//console.log('destroy');
		// отвязываем слушателей
		$(self.inputFieldSelector).unbind('keyup');
		$(self.dropFieldSelector).unbind('mouseover');
		$(document).unbind('.autocomplete');
		// скрываем выпадающий список
		$(self.dropFieldSelector).css({display:'none'});
		// возвращаем сабмит формы при enter
		self.freezedForm.unbind('submit',self.formSubmit);
		// уничтожаем внутренние ссылки на объекты
		self.freezedForm = null;
		self = null;
		//this = null;
		
	}
}
