var divChoices;

function listFilter(){
	var JSFilt;
	var filt_fromc, filt_cur, filt_typed, filt_cur_choices, filt_p_tags, filt_active,
		objInput, choices, divChoices, submitted;
	this.filt_fromc=false;
	this.filt_cur=-1;
	this.filt_typed='';
	this.choices=new Array();
	this.filt_cur_choices=new Array();
	this.filt_p_tags=new Array();
	this.filt_active=false;
	this.objInput=new Object();
	this.submitted=new Function();
}

listFilter.prototype={
	filterInit: function(obj,arr){
		this.objInput=obj;
		this.choices=arr;
		if(arguments.length>2){
			this.submitted=arguments[2];
		}
		
		divChoices=document.createElement('DIV');
		divChoices.className='filt_choices';
		ht=this.objInput.offsetHeight;
		if(document.all)ht+=4;
		divChoices.style.marginTop=ht+'px';
	
		this.objInput.parentNode.insertBefore(divChoices,this.objInput);
		this.objInput.onkeydown=this.filt_keycheck;
		this.objInput.onkeyup=this.filt;

		//this.objInput.parentNode.insertBefore(this.divChoices,this.objInput.nextSibling);
		//this.objInput.parentNode.insertBefore(document.createElement('BR'),this.objInput.nextSibling);
		JSFilt=this;
	},

	filt: function(){
		if(choices.length==0)return false;
		var what=JSFilt.objInput.value;
		if(JSFilt.filt_fromc==true){
			JSFilt.filt_fromc=false;
			return false;
		}
		if(what==''){
			divChoices.style.display='none';
			return false;
		}
		var re=new RegExp('^'+what,"i");
		strOut='';
		found=false;
		JSFilt.filt_cur=-1;
		JSFilt.filt_cur_choices=new Array();
		divChoices.innerHTML='';
		for(i=0;i<choices.length;i++){
			if(choices[i].match(re)){
				filtTop=JSFilt.filt_cur_choices.length;
				strOut+='<p onclick="JSFilt.filtChoose('+filtTop+')" onmouseover="JSFilt.filt_mouseOver(this,'+filtTop+')" onmouseout="this.className=\'\'">'+choices[i]+'</p>';
				found=true;
				JSFilt.filt_cur_choices[filtTop]=choices[i];
			}else{
				if(found)break;
			}
		}
		
		JSFilt.filt_p_tags=divChoices.getElementsByTagName('P');
		if(strOut>''){
			disp='block';
			JSFilt.filt_active=true;
		}else{
			disp='none';
			JSFilt.filt_active=false;
		}
		divChoices.style.display=disp;
		divChoices.scrollTop=0;
		try {
			divChoices.innerHTML=strOut;
		}catch(ex){
			alert(ex.message);
		}
	},
	
	filt_keycheck: function(e){
		evt=(e)?e:window.event;
		pK=e?e.keyCode:window.event.keyCode;
		switch(pK){
			case 37:
				JSFilt.filt_fromc=true;
				return e;
				break;
			case 39:
				JSFilt.filt_fromc=true;
				return e;
				break;
			case 40:
				if(!JSFilt.filt_active) return false;
				JSFilt.filt_scroll(1);
				return false;
				break;
			case 38:
				if(!JSFilt.filt_active) return false;
				JSFilt.filt_scroll(-1);
				return false;
				break;
			case 13:
				divChoices.style.display='none';
				JSFilt.submitted();
				JSFilt.filt_fromc=true;
				JSFilt.filt_active=false;
				return false;
				break;
			case 27:
				JSFilt.filt_cur=-1;
				JSFilt.objInput.value=filt_typed;
				divChoices.style.display='none';
				JSFilt.filt_fromc=true;
				return false;
				break;
			default:
				return e;
		}
	},
	
	filt_mouseOver: function(obj,which){
		if(JSFilt.filt_cur>=0 && JSFilt.filt_cur<JSFilt.filt_p_tags.length){
			JSFilt.filt_p_tags[JSFilt.filt_cur].className='';
		}
		JSFilt.filt_cur=which;
		obj.className='current';
	},
	
	filt_scroll:function(inc){
		if(inc==-1){
			if(JSFilt.filt_cur==0){
				if(JSFilt.filt_active){
					JSFilt.objInput.value=filt_typed;
					JSFilt.filt_p_tags[0].className='';
					JSFilt.filt_cur=-1;
				}
				return false;
			}
		}else if(inc==1){
			if(JSFilt.filt_cur==-1){
				filt_typed=JSFilt.objInput.value;
			}
			if(JSFilt.filt_cur==JSFilt.filt_cur_choices.length-1){
				JSFilt.filt_fromc=true;
				return false;
			}
		}
		if(JSFilt.filt_cur>=0){
			JSFilt.filt_p_tags[JSFilt.filt_cur].className='';
		}
		JSFilt.filt_cur+=inc;
		if(JSFilt.filt_cur<0)return false;
		JSFilt.filt_p_tags[JSFilt.filt_cur].className='current';
		JSFilt.filt_fromc=true;
		JSFilt.objInput.value=JSFilt.filt_cur_choices[JSFilt.filt_cur];
		pTop=JSFilt.filt_p_tags[JSFilt.filt_cur].offsetTop;
		sTop=divChoices.scrollTop;
		if(pTop-sTop>235) divChoices.scrollTop=(pTop-235);
		else if(pTop<divChoices.scrollTop) divChoices.scrollTop=pTop;
	},
	
	filtChoose: function(which){
		divChoices.style.display='none';
		JSFilt.objInput.value=JSFilt.filt_cur_choices[which];
		JSFilt.submitted();
	}
}

