//// default search behavior
var searchDataSource = new YAHOO.widget.DS_XHR("scripts/ajax/search_ajax.php", ["\n", "\t"]); 
searchDataSource.responseType = YAHOO.widget.DS_XHR.TYPE_FLAT; 
searchDataSource.queryMatchSubset = true;

var searchAutoComplete = new YAHOO.widget.AutoComplete('search_input','search_output', searchDataSource); 
searchAutoComplete.queryDelay = 0; 
searchAutoComplete.allowBrowserAutocomplete = false; 
searchAutoComplete.useShadow = true; 
searchAutoComplete.prehighlightClassName = "yui-ac-prehighlight"; 
searchAutoComplete.formatResult = function(oResultItem, sQuery) {
	if (oResultItem[0].length > 0) {					
		var name = oResultItem[0];
		var percent = oResultItem[1];
		var percentStr = (percent == null || percent == "" ? "" : oResultItem[1] + "%")
		
		if (name != sQuery && percent != null) {
			var index = Math.max(0, name.toLowerCase().indexOf(sQuery.toLowerCase()));
			var endIndex = index + sQuery.length;
			name = (name.substring(0, index) + "<strong>" + name.substring(index, endIndex) + "</strong>" + name.substring(endIndex));
		}
		
		var html = "<div style='position: relative;'>" + name + "<span style='position: absolute; right: 5px;'>" + percentStr + "</span></div>"; 
		return html;
	}
};

var highlighter = null;

////
var topResultsNameCache = new Array();

//// INDEX.php
/* 
 * updates view when an item is selected in the search bar output.
 */
function updateSearchSelection(oSelf, elItem, oData) {	
	var name = elItem[2][0];
	
	// move to the restaurant	
	moveAndShowRestaurant(name);	
	// select search field
	document.getElementById('search_input').select();
}

/*
 * clears old top results when new ones are fetched.
 */
function clearSearchResults(oSelf, sQuery) {
	clearTopResults();
}

/* 
 * updates the top results with new results.
 * max of 4 items shown.
 */
function populateTopRestaurants(oSelf, sQuery, aResults) {
	// sort results by top
	updateTopResults(sQuery[2]);
}
//// -------

function updateTopResults(restaurants) {
	if (restaurants) {		
		// sort results by top
		restaurants.sort(sortSearchResultsByRating);		
		var len = Math.min(restaurants.length, 4);
		for (var i = 0; i < len; i++) {
			if (restaurants[i][0].length > 0 && restaurants[i][1].length > 0 && restaurants[i][2].length > 0 && restaurants[i][3].length > 0 && restaurants[i][4].length > 0)
				addTopResults(restaurants[i][0], restaurants[i][1], restaurants[i][2], restaurants[i][3], restaurants[i][4]);
		}
	}
	
	YAHOO.addLocationArea.align("tl", "bl");  
	YAHOO.showLocationArea.align("tl", "bl");
}

/*
 * sorts the results by rating.
 */
function sortSearchResultsByRating(a, b) {
	// compare the restaurant ratings
	return (b[1] - a[1]);
}

/* 
 * clears the top results listing.
 */
function clearTopResults() {
	var res = document.getElementById('topSearchResults');
	if (res) {
		res.innerHTML = "";
		topResultsNameCache = new Array();
	}
}

/* 
 * adds a new rating to the top listing.
 */
function addTopResults(name, rating, restaurant_id, latitude, longitude) {
	var topResults = document.getElementById('topSearchResults');
	var shortName = name;
	if (shortName.length > 26)
		shortName = name.substring(0, 26)+"...";
	// check if the name is already on there, if not, then add it, if so, then don't
	var found = false;
	for (var i = 0; i < topResultsNameCache.length; i++) {
		if (topResultsNameCache[i][1] == name) {
			found = true;
		}
	}
	
	if (!found) {
		topResultsNameCache.push([restaurant_id, name]);
		topResults.innerHTML += "<table cellpadding='0' cellspacing='0' width='100%'><tr><td><a href='restaurant.php?id=" + restaurant_id + "' onmouseover='highlightLocation(" + latitude + ", " + longitude + ")' onmouseout='unhighlightLocation()'>" + 
					shortName + 
				"</a></td><td align='right'><span style='font-weight: normal;'>" + 
					rating + "%</span></td></tr></table>";		
	}
}

function highlightLocation(latitude, longitude) {	
	unhighlightLocation();	
	var ratioOffset = ( ((map.getZoom()-gmMinZoom)/(gmMaxZoom-gmMinZoom)) * (-0.00049) );	// 0.0005-0.00005 = 0.00045
	var offset = 0.0005 + ratioOffset;
	
	highlighter = new GPolyline([
				new GLatLng(latitude-offset, longitude+offset),
				new GLatLng(latitude+offset, longitude+offset),
				new GLatLng(latitude+offset, longitude-offset),
				new GLatLng(latitude-offset, longitude-offset),				
				new GLatLng(latitude-offset, longitude+offset)
			], "#0000FF",15);
	map.addOverlay(highlighter);
}

function unhighlightLocation() {
	if (highlighter) {
		map.removeOverlay(highlighter);
		highlighter = null;
	}
}


/*
 * load new restaurant.
 */	 
function loadSearchQuery(e) {	
	
	if (!e) {
		e = window.event;
	}

	if ((e.which && e.which == 13) || 
		(e.keyCode && e.keyCode == 13)) {
		
		var query = document.getElementById('search_input').value;
		loadSearchHelper(query);
	} 
}	

function normalSelectEvent(oSelf, elItem, oData) {	
	var name = elItem[2][0];
	
	// select search field
	loadSearchHelper(name);
}

function loadSearchHelper(name) {
	if (name != "<?= $NO_RESTAURANTS_FOUND ?>") {
		var index = location.href.indexOf('?');
		var newLoc = "search.php?query="+encodeURIComponent(name);
					
		var params = new Array();
		if (index != -1) {
			var nameValuePairs = location.href.substring(index+1,location.href.length).split('&');
			for (var i=0; i< nameValuePairs.length; i++) {
				if (!nameValuePairs[i]) continue;
				
				var name = nameValuePairs[i].split('=');
			
				if (name[0] != "query" && name[0] != "user") {
					newLoc += "&" + nameValuePairs[i];
				}
			}
		}

		location.href = newLoc;
	}
}

function enableSearchEventKey() {
	document.getElementById('search_input').onkeydown = loadSearchQuery;
}

function disableSearchEventKey() {
	document.getElementById('search_input').onkeydown = function() {};
}

// main page search bar behavior 

searchAutoComplete.dataRequestEvent.subscribe(enableSearchEventKey);
searchAutoComplete.dataReturnEvent.subscribe(disableSearchEventKey);
searchAutoComplete.itemSelectEvent.subscribe(normalSelectEvent);
