if (window['_shared_core_loaded']!==true) {
	alert('The Suggest widget cannot run without core.js!');
}

function Suggest(src,iC,vC,mL,kD){

	EvMan.Init();
	var self=this;
	this.src=src.replace(/&amp;/gi,'&');
	this.validString = '';

	this.valueColumn=vC?vC:0;
	this.inputColumn=iC?iC:0;
	this.minLength=mL?mL:2;
	this.keyDelay=kD?kD:400;

	var root=getDomEntry().parentNode;

	this.list=root.appendChild(cn('div')).cls('SuggestBox');
	this.value=root.firstChild;
	this.input=$(this.value.nextSibling);

	this.option=null;
	this.oWait=null;
	this.input.setAttribute('autocomplete','off');
	this.list.ss({visibility:'hidden'});
	
	if(this.value.value != 0){
		this.input.cls('selected', true);
	} else {
		this.input.cls('notselected', true);
	}

	if(window.opera) {
		EvMan.Add(this.input,'keypress',function(e){self.keyDown(e);});
	} else {
		EvMan.Add(this.input,'keydown',function(e){self.keyDown(e);});
	}

	
	EvMan.Add(this.input,'keyup',function(e){self.keyUp();});
	EvMan.Add(this.input,'blur',function(e){setTimeout(function(){self.close();},300);});
}

Suggest.prototype={
	keyUp:function(){
		var self=this;
	
		if(this.oWait){
			clearTimeout(this.oWait);
		}
		this.checkValidInput();
		this.oWait=setTimeout(function(){self.load()},this.keyDelay);
	},

	checkValidInput:function(){
		this.input.cls('selected', false);
		this.input.cls('notselected', false);
	
		if (!this.input.value || this.input.value !=this.validString) {
			this.value.value = 0;
			this.input.cls('notselected', true);
		} else {
			this.input.cls('selected', true);
		}
	},

	load:function(){
		if (this.serviceKey){
			return;
		}
	
		if(this.minLength<=this.input.value.length){
			window['currentSuggest']=this;
			sendQuery(this.src+'param='+this.input.value);
		} else {
			this.close();
		}
	},

	render:function(data){
		clearNode(this.list);
		var d,s,self=this;
	
		if (data.length==0){
			return;
		}
		
		if (self.input.offsetTop) {
			this.list.ss({top:(self.input.offsetTop+20)+'px'});
		}

		for(var i=0;i<data.length;i++){
			d=this.list.appendChild(cn('div'));
	
			d.Eadd('mouseover',function(e){self.highlight(findNodeByTag((e.srcElement||e.target),'div'));});
			d.Eadd('mouseout',function(e){findNodeByTag((e.srcElement||e.target),'div').className='';});
			d.Eadd('click',function(e){self.setValue();self.close();});
	
			for(var j=0,row=data[i];j<row.length;j++){
				d.add('span',row[j]).cls('suggestCol'+j);
			}
		}
		this.option = null;
		this.list.ss({visibility:'visible'});
	},

	keyDown:function(e){
		this.serviceKey=true;
		switch(e.keyCode){
			case 13:
				if(this.option){
					stopEvent(e);
					this.setValue();
				}else{
					stopEvent(e);
					if(this.value.value != 0){
						window.location = 'index.php?sid=catalog/listing&parent=' + this.value.value;
					}
				}
			break;
			case 38:this.up();break;
			case 40:this.down();break;
			case 27:this.close();break;
			case 39:case 37:break;
			default:this.serviceKey=false;break;
		}
	},

	up:function(){
		if (this.option){
			if (this.option.previousSibling){
				this.highlight(this.option.previousSibling);
			}
		}else{
			this.highlight(this.list.lastChild);
		}
	},

	down:function(){
		if (this.option){
			if (this.option.nextSibling){
				this.highlight(this.option.nextSibling);
			}
		}else{
			this.highlight(this.list.firstChild);
		}
	},

	highlight:function(el){
		if (this.option){
			this.option.className='';
		}
		if(el){
			this.option=el;
			el.className = 'hover';
			this.setValue(true);
		}
	},

	close:function(){
		clearNode(this.list);
		this.option=null;
		this.list.ss({visibility:'hidden'});
	},

	setValue:function(justSet){
		if (!justSet){
			this.input.value=this.option.childNodes[this.inputColumn].firstChild.nodeValue;
			this.value.value=this.option.childNodes[this.valueColumn].firstChild.nodeValue;
			this.validString = this.input.value;
			this.input.focus();
			this.close();
		}
		this.checkValidInput();
	}
};

function CharFilter(pattern){

	var ss=document.getElementsByTagName('script');
	var re=new RegExp().compile(pattern,'i');

	if(!(input=ss[ss.length-1].previousSibling)){
		return;
	}

	EvMan.Init();
	
	EvMan.Add(input,'keydown',function(e){
		var char = String.fromCharCode(e.charCode||e.keyCode);

		if(!re.test(char)){
			stopEvent(e);
		}
	});
}

function findNodeByTag(el,tag){
	while((el.nodeName.toLowerCase()!=tag)&&(el=el.parentNode));
	return el;
}