function myAutoSuggest(params){
	this.name = params.name || "myAS";
	this.insertIn = params.insertIn;
	this.insertInObj = $("#"+this.insertIn);
	this.height = params.height || "20px";
	var timeOut = params.timeOut || 200;
	var width = params.width || "200px";
	var keyEvent=($.browser.msie)?'keydown':'keypress';
	var defaultValue = params.defaultValue || "";
	var spath = params.spath;
	var svar = params.svar;
	var start = params.start;
	this.iType = params.iType || "text"; 
    
	this.value = "";
	var dynamic = params.dynamic || 0;
	this.results = {};
	this.source = [];
	var startList =[];
	var _this = this;

	this.insertInObj.css({"width":width,"height":this.height,"padding":"0"});
    if(this.iType == "text"){

    	this.insertInObj.html('<input type="text" id="'+this.name+'" name="'+this.name+'" class="myAS" value="'+defaultValue+'">');
    	this.ASobj_text = $("#"+this.name);
    }
    else if(this.iType == "select"){
 
    	this.insertInObj.html('<input type="text" id="'+this.name+'_val" name="'+this.name+'_val" class="myAS" value="'+defaultValue+'"><input type="hidden" id="'+this.name+'" name="'+this.name+'" value="0">');
    	this.ASobj_text = $("#"+this.name+"_val");
        this.ASobj_id = $("#"+this.name);        
    }
   

	this.ASobj_text.css({"height":this.height});

	var CSobj = new myCustomSelect({
	"name" : this.name+"_CS",
	"rowsCount" : "5",
	"rowHeight" : "25"
	},this);

	if(start){
		$.getJSON(spath,start,function(data){
			$.each(data.items, function(i,item){
			try{startList[item.id] = item.string;}
			catch(e){}							
  			});
			CSobj.insert(startList,"startList");
		});		
	}
	
	this.ASobj_text.focus(function(){

		if(_this.ASobj_text.val()==defaultValue) _this.ASobj_text.val("");
		if(_this.value!=_this.ASobj_text.val()){
			_this.value=_this.ASobj_text.val();
			AScheckForChanges();
		}
		CSobj.CSshow();
	});
	this.ASobj_text.blur(function(){
		if(_this.ASobj_text.val()=="") _this.ASobj_text.val(defaultValue);
		if(!CSobj.flag) CSobj.CShide();
		if(_this.iType=="select" && !CSobj.flag) 
			if(!AScheckValue()) {
				_this.ASobj_text.val(defaultValue);
				_this.ASobj_id.val("0");
				CSobj.insert(startList,"startList");
				}
	});
	
	this.ASobj_text.bind(($.browser.msie)?'keydown':'keypress', function(evt){
		evt = evt || window.event;
		var key = evt.keyCode || evt.which;
		if ((key==40||key==38||key==13)&&CSobj.display) {
		if(evt.preventDefault) evt.preventDefault();
		evt.returnValue = false;
		if(key==13) CSobj.select();
		else CSobj.upDown(key);
		return false;
		}
		else if(key!=9&&key!=37&&key!=39)AScheckForChanges();
	});

	if(dynamic==0){
		$.getJSON(spath,svar,function(data){
			$.each(data.items, function(i,item){
			try{_this.source[item.id] = item.string;}
			catch(e){}
  			});
		});
	}

	function AScheckForChanges(){
		setTimeout(function(){
			if(_this.value!=_this.ASobj_text.val()){
			_this.value=_this.ASobj_text.val();
			_this.ASrefreshResults(_this.value);
			}
		},timeOut);
	}
	function AScheckValue(){
		var check = false;
		for(var key in _this.source) {
		if(_this.source[key] == _this.value) check=true;
		}
		return check;
	}



	this.ASrefreshResults = function (val){
		this.results={};
		if(val=='') {
			CSobj.insert(startList);
			}
		else
		if(dynamic==0){
			for(var i in _this.source){
				tempStr=this.source[i].toLowerCase();
				if(tempStr.indexOf(val.toLowerCase())>=0) this.results[i] = this.source[i];
				}
			this.results=ASsortResults(val);
			CSobj.insert(this.results);
		}
		else{

			$.getJSON(spath,svar,function(data){
	  			$.each(data.items, function(i,item){
					this.results[item.id]=item.string;
	         	 });
				this.results=ASsortResults(val);
				CSobj.insert(this.results);
			});
		}
	}

	function ASsortResults(val){
		var result={};
		var tempArr=[];
		var splitArr=[];
		var tempStr,replaceStr;
		var pos=0;
		for(var i in _this.results){
			tempStr=_this.results[i].toLowerCase();
			pos=tempStr.indexOf(val.toLowerCase());
			replaceStr = _this.results[i].substr(pos,val.length);
			tempArr.push(pos+'->'+i+'->'+_this.results[i].replace(replaceStr,'<b>'+replaceStr+'</b>'));
		}
		function sortArr(i,ii){
  			var a,b;
			var tempA=[];
			var tempB=[];
  			
  			tempA=i.split('->');
  			a=parseInt(tempA[0]);
  			tempB=ii.split('->');
  			b=parseInt(tempB[0]);  		
  			
			if (a > b) return 1; 
     		else if (a < b) return -1; 
    		else return 0;	
		}
		tempArr.sort(sortArr);
		
		
		for(var i in tempArr){
  				splitArr=tempArr[i].split('->');
	          	result[splitArr[1]]=splitArr[2];
		}
		return result;
	}
	
$(document).click(function(){
		if(!CSobj.flag) CSobj.CShide();		
	});
}

function myCustomSelect(params,ASobj){
	var parent = ASobj;
	var insertIn = parent.insertIn;
	var inputHeight = parent.height || 20;
	var CSname = params.name || "myCS";
	var rowHeight = params.rowHeight || 25;
	var rowsCount = params.rowsCount || 10;
	var boxHeight = rowsCount * rowHeight;
	var insertInObj = $("#"+insertIn);
	var index = 0;
	var count = 0;
	
	this.display=false;
	this.flag=false;
	var _this=this;
	
	insertInObj.css({"position":"relative"});
	insertInObj.append('<div id="'+CSname+'" class="myCS"><h1><i>Введите название</i></h1></div>');
	
    if(parent.iType=="select"){
        insertInObj.append('<a id="'+CSname+'_arr" class="myCS_arr"></a>');
        if($.browser.msie) $(".myCS_arr").css({"top":"2px"});
    	$("#"+CSname+"_arr").click(function(){
    		_this.display ? _this.CShide() : _this.CSshow();
    	});
    }
    
	var CSobj = $("#"+CSname);
	
	CSobj.css({"top":(parseInt(inputHeight)+2)});

	insertInObj.mouseover(function(){
		_this.flag=true;
	});
	insertInObj.mouseout(function(){
		_this.flag=false;
	});	
	

	this.changeSelect = function(){
		var tempObj=$("#"+CSname+" a:eq("+(index)+")");

	 	$("#"+CSname+" .selected").removeClass('selected');
		$(tempObj).addClass('selected');

	};

	this.insert=function(rows,option){

		var list='';
		var n=0;
		for(var i in rows){
			list+='<a rel="'+i+'" style="color: #000;">'+rows[i]+'</a>';
			n++;
		}
		if(n < rowsCount) CSobj.css({"overflow-y":"hidden","height":(n*rowHeight)});
		else $(CSobj).css({"overflow-y":"scroll","height":boxHeight});
		
		CSobj.html(list);

		count=$("#"+CSname+" a").length;
		index = 0;
		this.changeSelect(index,CSname)
		$("#"+CSname+" a").click(function(){
			return;
		});
		if(!this.display && option!="startList") this.CSshow();
	
		$('#'+CSname+' a').mouseover(function(){
	            index=$('#'+CSname+' a').index(this);
	            _this.changeSelect()
	        });
		$('#'+CSname+' a').click(function(){
	            index=$('#'+CSname+' a').index(this);
	            _this.select();
	        });	        
		if(n==0){
			CSobj.html("<h1><i>Ничего не найдено</i></h1>");
			CSobj.css({"overflow-y":"hidden","height":"auto"});			
		}
		
	}
	;

	this.CSshow=function(){
		CSobj.show();
		this.display=true;
		this.flag=true;
	};
	this.CShide=function(){
		CSobj.hide();
		this.display=false;
		this.flag=false;
	};

	this.upDown=function(key){
		var row;
		var scrollOffset=CSobj.scrollTop();

		if(key==40 && index<count-1){
			index+=1;
			row = $("#"+CSname+" a:eq("+index+")").offset().top - CSobj.offset().top;
			if(row >= (boxHeight-25)) {

				scrollOffset+=25;
				CSobj.scrollTop(scrollOffset);
			}
			this.changeSelect(index);
		}
		if(key==38 && index>0){
			index-=1;
			row = $("#"+CSname+" a:eq("+index+")").offset().top - CSobj.offset().top;
			if(row < 25) {
				scrollOffset-=25;
				CSobj.scrollTop(scrollOffset);
			}
			this.changeSelect(index);
		}

	}
	this.select=function(){
		var text = $("#"+CSname+" a:eq("+(index)+")").text();
		this.CShide();
		this.flag=false;
		this.display=true;
		parent.ASobj_text.val(text);
		parent.value = text;
		parent.ASrefreshResults(text);
        if(parent.iType=="select") parent.ASobj_id.val($("#"+CSname+" a:eq("+(index)+")").attr("rel"))
	}
}


