function autoCompleteDB()
{
	this.aNames=new Array();
}

autoCompleteDB.prototype.assignArray=function(aList)
{
	this.aNames=aList;
};

autoCompleteDB.prototype.getMatches=function(str,aList,maxSize)
{
	/* debug */ //alert(maxSize+"ok getmatches");
	var ctr=0;
	for(var i in this.aNames)
	{
		if(this.aNames[i].toLowerCase().indexOf(str.toLowerCase())==0) /*looking for case insensitive matches */
		{
			aList.push(this.aNames[i]);
			ctr++;
		}
		if(ctr==(maxSize-1)) /* counter to limit no of matches to maxSize */
			break;
	}
};

function autoComplete(aNames,oText,oDiv,maxSize)
{

	this.oText=oText;
	this.oDiv=oDiv;
	this.maxSize=maxSize;
	this.cur=-1;


	/*debug here */
	//alert(oText+","+this.oDiv);

	this.db=new autoCompleteDB();
	this.db.assignArray(aNames);

	oText.onkeyup=this.keyUp;
	oText.onkeydown=this.keyDown;
	oText.autoComplete=this;
	oText.onblur=this.hideSuggest;
}

autoComplete.prototype.hideSuggest=function()
{
	this.autoComplete.oDiv.style.visibility="hidden";
};

autoComplete.prototype.selectText=function(iStart,iEnd)
{
	if(this.oText.createTextRange) /* For IE */
	{
		var oRange=this.oText.createTextRange();
		oRange.moveStart("character",iStart);
		oRange.moveEnd("character",iEnd-this.oText.value.length);
		oRange.select();
	}
	else if(this.oText.setSelectionRange) /* For Mozilla */
	{
		this.oText.setSelectionRange(iStart,iEnd);
	}
	this.oText.focus();
};

autoComplete.prototype.textComplete=function(sFirstMatch)
{
	if(this.oText.createTextRange || this.oText.setSelectionRange)
	{
		var iStart=this.oText.value.length;
		this.oText.value=sFirstMatch;
		this.selectText(iStart,sFirstMatch.length);
	}
};

autoComplete.prototype.keyDown=function(oEvent)
{
	oEvent=window.event || oEvent;
	iKeyCode=oEvent.keyCode;

	switch(iKeyCode)
	{
		case 38: //up arrow
			this.autoComplete.moveUp();
			break;
		case 40: //down arrow
			this.autoComplete.moveDown();
			break;
		case 13: //return key
			//window.focus();
			document.getElementById('txt').focus();
			break;
	}
};

autoComplete.prototype.moveDown=function()
{
	if(this.oDiv.childNodes.length>0 && this.cur<(this.oDiv.childNodes.length-1))
	{
		++this.cur;
		for(var i=0;i<this.oDiv.childNodes.length;i++)
		{
			if(i==this.cur)
			{
				this.oDiv.childNodes[i].className="over";
				this.oText.value=this.oDiv.childNodes[i].innerHTML;
			}
			else
			{
				this.oDiv.childNodes[i].className="";
			}
		}
	}
};

autoComplete.prototype.moveUp=function()
{
	if(this.oDiv.childNodes.length>0 && this.cur>0)
	{
		--this.cur;
		for(var i=0;i<this.oDiv.childNodes.length;i++)
		{
			if(i==this.cur)
			{
				this.oDiv.childNodes[i].className="over";
				this.oText.value=this.oDiv.childNodes[i].innerHTML;
			}
			else
			{
				this.oDiv.childNodes[i].className="";
			}
		}
	}
};

autoComplete.prototype.keyUp=function(oEvent)
{
	oEvent=oEvent || window.event;
	var iKeyCode=oEvent.keyCode;
	if(iKeyCode==8 || iKeyCode==46)
	{
		this.autoComplete.onTextChange(false); /* without autocomplete */
	}
	else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode <= 46) || (iKeyCode >= 112 && iKeyCode <= 123))
	{
        //ignore
    }
	else
	{
		this.autoComplete.onTextChange(true); /* with autocomplete */
	}
};

autoComplete.prototype.positionSuggest=function() /* to calculate the appropriate poistion of the dropdown */
{
	var oNode=this.oText;
	var x=0,y=oNode.offsetHeight;

	while(oNode.offsetParent && oNode.offsetParent.tagName.toUpperCase() != 'BODY')
	{
		x+=oNode.offsetLeft;
		y+=oNode.offsetTop;
		oNode=oNode.offsetParent;
	}

	x+=oNode.offsetLeft;
	y+=oNode.offsetTop;

	this.oDiv.style.top=y+"px";
	this.oDiv.style.left=x+"px";
}

autoComplete.prototype.onTextChange=function(bTextComplete)
{
	var txt=this.oText.value;
	var oThis=this;
	this.cur=-1;

	if(txt.length>0)
	{
		while(this.oDiv.hasChildNodes())
			this.oDiv.removeChild(this.oDiv.firstChild);

		var aStr=new Array();
		this.db.getMatches(txt,aStr,this.maxSize);
		if(!aStr.length) {this.hideSuggest ;return}
		if(bTextComplete) this.textComplete(aStr[0]);
		this.positionSuggest();

		for(i in aStr)
		{
			var oNew=document.createElement('div');
			this.oDiv.appendChild(oNew);
			oNew.onmouseover=
			oNew.onmouseout=
			oNew.onmousedown=function(oEvent)
			{
				oEvent=window.event || oEvent;
				oSrcDiv=oEvent.target || oEvent.srcElement;

				//debug :window.status=oEvent.type;
				if(oEvent.type=="mousedown")
				{
					oThis.oText.value=this.innerHTML;
				}
				else if(oEvent.type=="mouseover")
				{
					this.className="over";
				}
				else if(oEvent.type=="mouseout")
				{
					this.className="";
				}
				else
				{
					this.oText.focus();
				}
			};
			oNew.innerHTML=aStr[i];
		}

		this.oDiv.style.visibility="visible";
	}
	else
	{
		this.oDiv.innerHTML="";
		this.oDiv.style.visibility="hidden";
	}
};

function createAutoComplete()
{
var aNames = ["Aquarium Tanks and Accessory Manufacturers",
"Charcoal Suppliers",
"Netting and Netting Product Manufacturers",
"Garden Machinery (Sales and Service)",
"Garden Tools",
"Solar Energy Equipment",
"Filtration Systems and Services",
"Horticultural Equipment Manufacturers",
"Hydroponics",
"Aggregate Suppliers including Sand, Gravel and Shale",
"Railway Sleepers",
"Stone Merchants",
"Timber Merchants",
"Doors Patio Supply and Installation",
"Floral and Plant Displays",
"Florists",
"Flowers Artificial",
"Farm Shops",
"Organic Food Production and Supply",
"Market Gardeners",
"Cane and Basketware",
"Craft Centres and Retail Outlets",
"Wooden Goods Other Than Furniture",
"Christmas and Festive Goods",
"Sign and Nameplate Suppliers",
"Barbecue and Grilling Equipment and Accessories",
"Outdoor Clothing and Equipment",
"Conservatories",
"Paving Supplies",
"Decking",
"Paving Contractors",
"Garden Sheds",
"Timber Constructed Buildings",
"Building and Timber Preservation Services",
"Furniture (Garden Manufacture of)",
"Furniture (Garden)",
"Fence and Gate Suppliers",
"Greenhouses",
"Aquarium and Pond Suppliers",
"Garden (Ornament Manufacturers)",
"Garden (Ornament Wholesalers)",
"Forestry Advisers",
"Tree Surgeons",
"Conservation Organisations",
"Colleges (Technical and Agricultural)",
"Craftsmen in Wood",
"Drystone Walling",
"Landscape Contractors",
"Landscape Designers",
"Garden Design",
"Gardening Services",
"Horticultural Consultants",
"Horticultural Plant and Equipment Servicing",
"Water Garden Construction Services",
"Land Surveying Activities",
"Thatching and Conservation Related Crafts and Services",
"Water Treatment Services",
"Irrigation Systems Design and Development",
"Outdoor Leisure Pursuit Organisers and Equipment",
"Historic Houses and Gardens",
"Parks and Gardens",
"Tool Hire Services",
"Labels Finishing and Supply",
"Blinds and Canopies",
"Curtain and Blind Fitting",
"Pottery Manufacturers of",
"Door and Window Furniture",
"Metalwork Ornamental Production of",
"Spas and Whirlpool Baths Suppliers of",
"Herb Growers",
"Charities and Charitable Organisations",
"Pest Control",
"Holiday Parks and Camps",
"Travel Insurance Services",
"Tour Operators",
"Tourist Information Offices",
"Hotels",
"Animal Feed and Pet Foods",
"Bulb Growers and Suppliers",
"Fertilisers",
"Garden Centres",
"Horticultural Supplies",
"Nurseries Wholesale",
"Nurserymen",
"Seeds Wholesale of",
"Bonsai Retail Centres",
"Turf Suppliers and Contractors",
"Plants (Retail)",
"Seeds (Retail)",
"Pets and Pet Products",
"Accommodation",
"Hotels and Guest Houses",
"Gardening Services",
"RHS Exhibitors"];



new autoComplete(aNames,document.getElementById('txt'),document.getElementById('suggest'),10);
}
