(function setup_autocomplete(){
	new YAHOO.util.YUILoader({
	    require: ["datasource", "autocomplete"],
	    loadOptional: true,
	    onSuccess: function(){
			init();
		}
	}).insert();
	
	function init(){
		//Custom formatting for Autocomplete.  Highlights search term in results
		function formatACResults(oResultData, sQuery, sResultMatch){
			var rg = new RegExp(sQuery, 'i');
			var sKey = sResultMatch
			
			// Extract the part of the match that the user did not type
			var sKeyBeginning = sKey.substr(0, sKey.search(rg));
			var sKeyMiddle = sKey.substr(sKey.search(rg), sQuery.length);
			var sKeyRemainder = sKey.substr(sKey.search(rg) + sQuery.length); 
			
			var aMarkup = ["<div class='myCustomResult'>",
			  sKeyBeginning,
			  "<span class='yui-ac-query'>",
			  sKeyMiddle,
			  "</span>",
			  sKeyRemainder,
			  "</div>"];
			return (aMarkup.join(""));
		}
		
		function create_directory_autocomplete() {
			//Don't create autocomplete on Book and Search pages
			if (document.getElementById("radio_searchYellow_SearchTypeHeading")) {
				return;
			}
			
			//XML DataSource
			var directory_xhr = new YAHOO.util.XHRDataSource("/Misc/_query.asp");
			directory_xhr.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
			directory_xhr.responseSchema = {
				resultNode : "section",
				fields : ["name"]
			};
			
			//Create Static JS Array DataSource
			directory_xhr.sendRequest(
				"?q=Sections_Get&bbb=0",
				{
					success : function( sQuery , oResponse , oParent ){
						var directory_static_ds = new YAHOO.util.LocalDataSource(oResponse.results);
						directory_static_ds.responseType = YAHOO.util.LocalDataSource.TYPE_JSARRAY;
						directory_static_ds.responseSchema = {
							fields : ["name"]
						};
						
						//AutoComplete
						var directory_ac_config = {
							forceSelection :		false,
							maxResultsDisplayed : 	10,
							minQueryLength : 		0,
							autoHighlight : 		false,
							useShadow : 			true,
							formatResult : 			formatACResults
						};
						var directory_autocomplete = new YAHOO.widget.AutoComplete("txt_searchYellow_Where", "book_suggestions", directory_static_ds, directory_ac_config);
						directory_autocomplete.setHeader("Search Suggestions");
						
						//Change majorCity on directory item select event
						directory_autocomplete.itemSelectEvent.subscribe(function(oSelf, elItem, oData){				
							if(document.getElementById("majorCity")){
								document.getElementById("majorCity").value = document.getElementById("txt_searchYellow_Where").value;
							}
						});
					}
				}
			);
			
		}
		YAHOO.util.Event.onContentReady("txt_searchYellow_Where", create_directory_autocomplete);
		
		function create_heading_autocomplete() {
			var book_input = document.getElementById("majorCity") ? document.getElementById("majorCity") : document.getElementById("txt_searchYellow_Where");
			//DataSource
			var heading_xhr = new YAHOO.util.XHRDataSource("/Misc/_query.asp");
			heading_xhr.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
			heading_xhr.responseSchema = {
				resultNode : "Heading",
				fields : ["HeadingName"]
			};
			
			//AutoComplete
			var heading_ac_config = {
				connXhrMode :			"cancelStaleRequests",
				forceSelection :		false,
				maxResultsDisplayed : 	15,
				minQueryLength : 		2,
				autoHighlight : 		false,
				useShadow : 			true,
				resultTypeList :		false,
				formatResult :			formatACResults,
				generateRequest :		function(sQuery){ 
											return "?q=Headings_Get"
												+ "&CityName=" + book_input.value.split(', ')[0] 
												+ "&StateAbbr=" + book_input.value.split(', ')[1]
												+ "&Search_String=" + sQuery;
										}
			};
			
			var heading_autocomplete;
			function setupAutocomplete(){
				heading_autocomplete = new YAHOO.widget.AutoComplete("search_category", "what_suggestions", heading_xhr, heading_ac_config);
				heading_autocomplete.setHeader("Search Suggestions");
				
				//Set cookie and submit form when item selected from autocomplete
				heading_autocomplete.itemSelectEvent.subscribe(function(oSelf, elItem, oData){				
					document.cookie='rememberLocation=true;domain=yellowpagecity.com;path=/;expires=January 1, 2050';
					document.cookie='ypCityLocation=City=' + (book_input.value.split(', ')[0]).replace(/ /g,"+") +
										'&State='+ book_input.value.split(', ')[1] + 
										'&Country=US;domain=yellowpagecity.com;path=/;expires=January 1, 2050';
					
					document.getElementById("YPCsearch").submit();
				});
				
				//Data Request Event - Displays rotating image
				heading_autocomplete.dataRequestEvent.subscribe(function( oSelf , sQuery , oRequest ){
					document.getElementById("search_category").style.background = "white url(/images/loading.gif) no-repeat right";
				} );
				
				//Data Return Event - Hides rotating image
				heading_autocomplete.dataReturnEvent.subscribe(function( oSelf , sQuery , aResults ){
					document.getElementById("search_category").style.background = "white";
				} );
			}
			
			if(!document.getElementById("radio_searchYellow_SearchTypeBusiness") || !document.getElementById("radio_searchYellow_SearchTypeBusiness").checked){
				setupAutocomplete();
			}
			
			// Enables / disables autocomplete on book/search pages
			if (document.getElementById("radio_searchYellow_SearchTypeHeading")) {
				document.getElementById("radio_searchYellow_SearchTypeHeading").onclick = function(){
					setupAutocomplete();
				};
				
				document.getElementById("radio_searchYellow_SearchTypeBusiness").onclick = function(){
					heading_autocomplete.destroy();
				};
			}
		}
		YAHOO.util.Event.onContentReady("search_category", create_heading_autocomplete);
	};
})();