var SelectList = (function(){
	var select_list = {'elem':[], 'params':[], 'list':[], 'list_filter':[], 'list_default':[]};
	var select_act = undefined;
	var select_id = -1;
	var list_default = false;
	var ajax = new Ajax();
	var list_loading = false;
	var callback_function = function(){};
	
	function initEvents(){
		jWps('body').bind('mousedown', function(e){
			var outside = true, t = e.target;

			while(t && t != t.parentNode){
				if(t == select_list.elem[select_id]){
					outside = false;
					break;
				}
				t = t.parentNode;
			}
			if(outside){
				closeList();
			}
		});
		jWps(select_act).find('.dropdown').bind('mousedown', function(){
			(isOpen()) ? closeList() : openList() ;
			if(isOpen()){
				setTimeout(function(){
				jWps(select_act).find('.select_input')[0].select();
			}, 100);
			}
		});
		jWps(select_act).find('.select_input').bind('mousedown', function(e){
			openList();
			setTimeout(function(){
				e.target.select();
			}, 100);
		});
		/* jWps(select_act).find('.select_input').bind('blur', function(){
			setTimeout(function(){
				closeList();
			}, 100);
		}); */
		jWps(select_act).find('.select_input').bind('keyup', function(){
			if(!list_loading) return;
			
			if(select_list.list[select_id].length > 0){
				var list_filter = [];
				var list = select_list.list[select_id];
				var filter = this.value.toLowerCase();
				
				if(filter != ''){
					for(var i=0; i<list.length; i++){
						var title = list[i].title.toLowerCase();
						if(title.indexOf(filter) == 0){
							list_filter.push(list[i]);
						}
					}
					select_list.list_filter[select_id] = list_filter;
					list = list_filter = [];
					showResult('filter');
				}else{
					list_default = true;
				}
			}
		});
		//jWps('body').bind('keypress', keyHandler);
	}
	
	function keyHandler(e){
		var key = e.keyCode || e.charCode;
		switch(key){
			case 27:  // Esc

				break;
			case 37: // <--

				break;
			case 39:  // -->

				break;
		}
	}
	
	function loadList(){
		list_loading = false;
		var params = select_list.params[select_id];
		var module = (params.module)?params.module:'selectlist';
		ajax.post({'module':'selectlist','act':'city'}, function(data, text){
			if(typeof(data.list) == 'object'){
				select_list.list[select_id] = [];
				for(var i=0; i<data.list.length; i++){
					select_list.list[select_id][i] = data.list[i];
				}
				list_loading = true;
			}
		});
	}
	
	function showResult(mode){
		if(mode == 'filter'){
			var list_filter = select_list.list_filter[select_id];
			var html = '';
			for(var i=0; i<list_filter.length; i++){
				html+= '<li onclick="SelectList.itemClick(this);" val="'+list_filter[i].value+'">'+list_filter[i].title+'</li>';
			}
			if(html == ''){
				html = '<li class="disable">Ничего не найдено</li>';
				list_default = true;
			}
			jWps(select_act).find('.result_list').html('<ul>'+html+'</ul>');
		}
	}
	
	function isOpen(){
		if(jWps(select_act).find('.result_list')[0].style.display == 'block') return true;
		else return false;
	}
	
	function openList(){
		jWps(select_act).find('.result_list').show();
	}
	
	function closeList(){
		jWps(select_act).find('.result_list').hide();
		if(list_default){
			jWps(select_act).find('.result_list').html(select_list.list_default[select_id]);
			var elem = jWps(select_act).find('.result_list').find('li')[1];
			jWps(select_act).find('.select_value')[0].value = elem.getAttribute('val');
			jWps(select_act).find('.select_input')[0].value = elem.innerHTML;
			list_default = false;
			callback_function();
		}
	}
	
	return{
		'init': function(e, params, callback){
			for(var i=0; i<select_list.elem.length; i++)
				if(select_list.elem[i] == e){ select_act = e; select_id = i; return; }
			
			select_id = select_list.elem.length;
			select_list.elem[select_id] = e;
			select_list.params[select_id] = params;
			var result_list = jWps(e).find('.result_list')[0];
			select_list.list_default[select_id] = result_list.innerHTML;
			result_list.style.width = e.clientWidth - 2 + 'px';
			select_act = e;
			
			if(typeof callback == 'function') callback_function = callback;
			
			initEvents();
			loadList();
		},
		'itemClick': function(e){
			jWps(select_act).find('.select_value')[0].value = e.getAttribute('val');
			jWps(select_act).find('.select_input')[0].value = e.innerHTML;
			jWps(select_act).find('.result_list').find('.active').removeClass('active');
			jWps(e).addClass('active');
			list_default = false;
			closeList();
			callback_function();
		}
	}
})();
