if(typeof(bsn)=="undefined")
	_b=bsn={};
	
if(typeof(_b.Autosuggest)=="undefined")
	_b.Autosuggest={};
else 
	alert("Autosuggest is already set!");
	
_b.AutoSuggest=function(b,c)
{
	if(!document.getElementById)
		return 0;
		
	this.fld=_b.DOM.gE(b);
	if(!this.fld)
		return 0;
	
	this.sInp="";
	this.nInpC=0;
	this.aSug=[];
	this.iHigh=0;
	this.hasFocus = false;
	this.oP=c?c:{};
	
	var d={minchars:1,meth:"get",varname:"input",className:"autosuggest",timeout:2500,delay:500,offsety:-5,shownoresults:true,noresults:"No results!",maxheight:250,cache:true,maxentries:25};
	
	for (k in d)
	{
		if(typeof(this.oP[k])!=typeof(d[k]))
			this.oP[k]=d[k]
	}
	
	var p=this;
	
// This next line is commented out in Ron's version, but he includes an onkeydown event
	this.fld.onkeypress=function(a){return p.onKeyPress(a)};
	
	this.fld.onkeyup=function(a){return p.onKeyUp(a)};
	this.fld.onkeydown=function(a){ return p.onKeyDown(a); };
	this.fld.onfocus=function(a){return p.onFocus(a);};
	this.fld.onblur=function(a){return p.onBlur(a);};
	this.fld.setAttribute("autocomplete","off")
};
	
_b.AutoSuggest.prototype.onFocus=function(a)
{
	this.hasFocus=true;
};

_b.AutoSuggest.prototype.onBlur = function(a)
{
	this.hasFocus=false;
};

_b.AutoSuggest.prototype.onKeyPress=function(a)
{
	var b=(window.event)?window.event.keyCode:a.keyCode;
	var c=13;
	var d=9;
	var e=27;
	var f=1;
	
	switch(b)
	{
		case c:
			this.setHighlightedValue();
			f=0;
			return false;
			break;

		case e:
			this.clearSuggestions();
			break

// ADDED case d BELOW SEEMS TO CLEAR THE SUGGESTION BOX AFTER A TAB.
		case d:
			this.clearSuggestions();
			f=0;
			break;
	}
	
	return f
};

_b.AutoSuggest.prototype.onKeyUp=function(a)
{
	var b=(window.event)?window.event.keyCode:a.keyCode;
	var c=38;
	var d=40;
	var e=1;
	
	switch(b)
	{
		case c:
			this.changeHighlight(b);
			e=0;
			break;
		
		case d:
			this.changeHighlight(b);
			e=0;
			break;
			
		default:
			this.getSuggestions(this.fld.value)
	}
	return e
};

_b.AutoSuggest.prototype.onKeyDown = function(a)
{
	var b = (window.event) ? window.event.keyCode : a.keyCode;

	var c = 13;
	var d = 9;
	var e = 27;
	
	var f = 1;

	switch(b)
	{
		case c:
			this.setHighlightedValue();
			f = 0;
			break;

		case e:
			this.clearSuggestions();
			break;
// ADDED case d BELOW SEEMS TO CLEAR THE SUGGESTION BOX AFTER A TAB.
		case d:
			this.clearSuggestions();
			f = 0;
			break;
	}

	return f;
};


_b.AutoSuggest.prototype.getSuggestions=function(a)
{
	if(a==this.sInp)
		return 0;

// RON DOES SOMETHING RELATED TO LIST KILLING HERE

	if(a.length<this.oP.minchars)
	{
		this.sInp="";
		return 0
	}
	
	var l=this.aSug.length;
	
	if(a.length>this.nInpC && l && l<this.oP.maxentries&&this.oP.cache)
	{
		var b=[];
		
		for(var i=0;i<this.aSug.length;i++)
		{
			if(this.aSug[i].value.substr(0,a.length).toLowerCase()==a.toLowerCase())
				b.push(this.aSug[i])
		}
		
		this.sInp=a;
		
		this.nInpC=a.length;
		this.aSug=b;
		this.createList(this.aSug);
		return false
	}
	else
	{
		this.sInp=a;
		this.nInpC=a.length;
		var c=this;
		clearTimeout(this.ajID);
		this.ajID=setTimeout(function(){c.doAjaxRequest()},this.oP.delay)
	}
	return false
};

_b.AutoSuggest.prototype.doAjaxRequest=function()
{
	var b=this;
	
	if(typeof(this.oP.script)=="function")
		var c=this.oP.script(encodeURIComponent(this.fld.value));
	else 
		var c=this.oP.script+this.oP.varname+"="+encodeURIComponent(this.fld.value);
	
	if(!c)
		return false;
	
	var d=this.oP.meth;
	
	var e=function(a){b.setSuggestions(a)};
	var f=function(a){alert("AJAX error: "+a)};
	
	var g=new _b.Ajax();
	g.makeRequest(c,d,e,f)
};

_b.AutoSuggest.prototype.setSuggestions=function(a)
{
	this.aSug=[];
	if(this.oP.json)
	{
		var b=eval('('+a.responseText+')');
		
		for (var i=0;i<b.results.length;i++)
		{
			this.aSug.push({'id':b.results[i].id,'value':b.results[i].value,'info':b.results[i].info})
		}
	}
	else
	{
		var c=a.responseXML;
		var d=c.getElementsByTagName('results')[0].childNodes;
		
		for (var i=0;i<d.length;i++)
		{
			if(d[i].hasChildNodes())
				this.aSug.push({'id':d[i].getAttribute('id'),'value':d[i].childNodes[0].nodeValue,'info':d[i].getAttribute('info')})
		}
	}
		
	this.idAs="as_"+this.fld.id;
	this.createList(this.aSug)
};
	
_b.AutoSuggest.prototype.createList=function(b)
{
	if(!this.hasFocus) return;
	var c=this;
	_b.DOM.remE(this.idAs);
	this.killTimeout();
	
	if(b.length==0 && !this.oP.shownoresults)
		return false;
	
	var d=_b.DOM.cE("div",{id:this.idAs,className:this.oP.className});
	var e=_b.DOM.cE("div",{className:"as_corner"});
	var f=_b.DOM.cE("div",{className:"as_bar"});
	var g=_b.DOM.cE("div",{className:"as_header"});
	g.appendChild(e);
	g.appendChild(f);
	d.appendChild(g);
	
	var h=_b.DOM.cE("ul",{id:"as_ul"});
	for (var i=0;i<b.length;i++)
	{
		var j=b[i].value;
		var k=j.toLowerCase().indexOf(this.sInp.toLowerCase());
		var l=j.substring(0,k)+"<em>"+j.substring(k,k+this.sInp.length)+"</em>"+j.substring(k+this.sInp.length);
		var m=_b.DOM.cE("span",{},l,true);
		
		if(b[i].info!="")
		{
			var n=_b.DOM.cE("br",{});
			m.appendChild(n);
			var o=_b.DOM.cE("small",{},b[i].info);
			m.appendChild(o)
		}
		
		var a=_b.DOM.cE("a",{href:"#"});
		var p=_b.DOM.cE("span",{className:"tl"}," ");
		var q=_b.DOM.cE("span",{className:"tr"}," ");
		
		a.appendChild(p);
		a.appendChild(q);
		a.appendChild(m);
		a.name=i+1;
		a.onclick=function(){c.setHighlightedValue();return false};
		a.onmouseover=function(){c.setHighlight(this.name)};
		var r=_b.DOM.cE("li",{},a);
		h.appendChild(r)
	}
	
	if (b.length==0&&this.oP.shownoresults)
	{
		var r=_b.DOM.cE("li",{className:"as_warning"},this.oP.noresults);
		h.appendChild(r)
	}
	
	d.appendChild(h);
	var s=_b.DOM.cE("div",{className:"as_corner"});
	var t=_b.DOM.cE("div",{className:"as_bar"});
	var u=_b.DOM.cE("div",{className:"as_footer"});
	u.appendChild(s);
	u.appendChild(t);
	d.appendChild(u);
	var v=_b.DOM.getPos(this.fld);
	d.style.left=v.x+"px";
	d.style.top=(v.y+this.fld.offsetHeight+this.oP.offsety)+"px";
	d.style.width=this.fld.offsetWidth+"px";
	d.onmouseover=function(){c.killTimeout()};
	d.onmouseout=function(){c.resetTimeout()};
	
	document.getElementsByTagName("body")[0].appendChild(d);
	this.iHigh=0;
	var c=this;
	
	this.toID=setTimeout(function(){c.clearSuggestions()},this.oP.timeout)
};

_b.AutoSuggest.prototype.changeHighlight=function(a)
{
	var b=_b.DOM.gE("as_ul");
	if (!b)
		return false;
	
	var n;
	
	if (a==40)
		n=this.iHigh+1;
	else if (a==38)
		n=this.iHigh-1;
		
	if (n>b.childNodes.length)
		n=b.childNodes.length;
		
	if (n<1)
		n=1;
		
	this.setHighlight(n)
};

_b.AutoSuggest.prototype.setHighlight=function(n)
{
	var a=_b.DOM.gE("as_ul");
	
	if (!a)
		return false;
	if (this.iHigh>0)
		this.clearHighlight();
	
	this.iHigh=Number(n);
	a.childNodes[this.iHigh-1].className="as_highlight";
	this.killTimeout()
};

_b.AutoSuggest.prototype.clearHighlight=function()
{
	var a=_b.DOM.gE("as_ul");
	
	if (!a)
		return false;

	if (this.iHigh>0)
	{
		a.childNodes[this.iHigh-1].className="";
		this.iHigh=0
	}
};

_b.AutoSuggest.prototype.setHighlightedValue=function()
{
	if (this.iHigh)
	{
		this.sInp=this.fld.value=this.aSug[this.iHigh-1].value;
		this.fld.focus();
		
		if (this.fld.selectionStart)
			this.fld.setSelectionRange(this.sInp.length,this.sInp.length);
		
		this.clearSuggestions();
		
		if (typeof(this.oP.callback)=="function")
			this.oP.callback(this.aSug[this.iHigh-1])
	}
};

_b.AutoSuggest.prototype.killTimeout=function()
{
	clearTimeout(this.toID)
};

_b.AutoSuggest.prototype.resetTimeout=function()
{
	clearTimeout(this.toID);
	var a=this;
	this.toID=setTimeout(function(){a.clearSuggestions()},1000)
};

_b.AutoSuggest.prototype.clearSuggestions=function()
{
	this.killTimeout();
	var a=_b.DOM.gE(this.idAs);
	var b=this;
	
	if(a)
	{
		var c=new _b.Fader(a,1,0,250,function(){_b.DOM.remE(b.idAs)})
	}
};
	
if (typeof(_b.Ajax)=="undefined")
	_b.Ajax={};
	
_b.Ajax=function()
{
	this.req={};
	this.isIE=false
};

_b.Ajax.prototype.makeRequest=function(a,b,c,d)
{
	if (b!="POST")
		b="GET";
	
	this.onComplete=c;
	this.onError=d;
	var e=this;
	
	if (window.XMLHttpRequest)
	{
		this.req=new XMLHttpRequest();
		this.req.onreadystatechange=function(){e.processReqChange()};
		this.req.open("GET",a,true);
		this.req.send(null)
	}
	
	else if (window.ActiveXObject)
	{
		this.req=new ActiveXObject("Microsoft.XMLHTTP");
		if (this.req)
		{
			this.req.onreadystatechange=function(){e.processReqChange()};
			this.req.open(b,a,true);
			this.req.send()
		}
	}
};

_b.Ajax.prototype.processReqChange=function()
{
	if (this.req.readyState==4)
	{
		if (this.req.status==200)
		{
			this.onComplete(this.req)
		} else {
			this.onError(this.req.status)
		}
	}
};

if(typeof(_b.DOM)=="undefined")
	_b.DOM={};
	
_b.DOM.cE=function(b,c,d,e)
{
	var f=document.createElement(b);
	if (!f) 
		return 0;
	
	for (var a in c)
		f[a]=c[a];
	
	var t=typeof(d);
	
	if (t=="string" && !e)
		f.appendChild(document.createTextNode(d));
	else if (t=="string" && e)
		f.innerHTML=d;
	else if (t=="object") 
		f.appendChild(d);
	
	return f
};

_b.DOM.gE=function(e)
{
	var t=typeof(e);

	if (t=="undefined")
		return 0;

	else if (t=="string")
	{
		var a=document.getElementById(e);
		if (!a) 
			return 0;
		else if (typeof(a.appendChild)!="undefined")
			return a;
		else 
			return 0
	}
	
	else if (typeof(e.appendChild)!="undefined")
		return e;
	else 
		return 0
};

_b.DOM.remE=function(a)
{
	var e=this.gE(a);
	
	if (!e)
		return 0;
	else if (e.parentNode.removeChild(e))
		return true;
	else return 0
};

_b.DOM.getPos=function(e)
{
	var e=this.gE(e);
	var a=e;
	var b=0;
	
	if(a.offsetParent)
	{
		while (a.offsetParent) {
			b+=a.offsetLeft;
			a=a.offsetParent
		}
	}
	
	else if (a.x)
		b+=a.x;
	
	var a=e;
	var c=0;
	
	if (a.offsetParent)
	{
		while (a.offsetParent)
		{
			c+=a.offsetTop;
			a=a.offsetParent
		}
	} 
	else if (a.y)
		c+=a.y;
	
	return {x:b,y:c}
};

if (typeof(_b.Fader)=="undefined")
	_b.Fader={};
	
_b.Fader=function(a,b,c,d,e)
{
	if (!a) 
		return 0;
	
	this.e=a;
	this.from=b;
	this.to=c;
	this.cb=e;
	this.nDur=d;
	this.nInt=50;
	this.nTime=0;
	
	var p=this;
	
	this.nID=setInterval(function(){p._fade()},this.nInt)
};

_b.Fader.prototype._fade=function()
{
	this.nTime+=this.nInt;
	var a=Math.round(this._tween(this.nTime,this.from,this.to,this.nDur)*100);
	var b=a/100;
	
	if (this.e.filters)
	{
		try
		{
			this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity=a
		} catch(e) {
			this.e.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+a+')'
		}
	}
	else {
		this.e.style.opacity=b
	}
	
	if (this.nTime==this.nDur)
	{
		clearInterval(this.nID);
		if (this.cb!=undefined)
			this.cb()
	}
};

_b.Fader.prototype._tween=function(t,b,c,d)
{
	return b+((c-b)*(t/d))
};