(function(){
		angular.module('PortalSearch').directive('searchbox', ['stateService', function(stateService) {
			return {
				link: function(scope, element, attrs) {
					function createAutocomplete(){
						
						// update the user query
						element.bind("keyup", function(event) {
							/*
							if (event.keyCode == 13) {
								// enter key: submit query
								if (scope.userquery != '') {
									//scope.handleSubmit(scope.userquery);
								}
							} else {
								// all other keys: update user query
								scope.userquery = event.target.value;
							}
							*/
					   });
						var termTemplate = "<span>%s</span>";
						// display autocomplete hints
						element.autocomplete({
							delay: 500,
							minLength: 3,
							source: function(request, response) {
							  // @todo execute a query against the index on the fly
							  var hintTerm = request.term;
							  var autoCompleteObj = stateService.getAutocomplete(hintTerm).then(
								function(resp){
								  scope.hints = [];
								  if(resp.data && resp.data.suggest && resp.data.suggest.mySuggester
									&& resp.data.suggest.mySuggester[hintTerm] 
									&& resp.data.suggest.mySuggester[hintTerm].numFound > 0){
										var dupes = {};
										var uniqueSuggestions = [];
										var lst = resp.data.suggest.mySuggester[hintTerm].suggestions;
										$.each(lst, function(i, el) {
											if (!dupes[el.term]) {
												dupes[el.term] = true;
												uniqueSuggestions.push(el);
											}
										});
										/*
										uniqueSuggestions.forEach(
											function(suggestion){
												scope.hints.push({ "label" : suggestion.term });
											}
										);
										*/
										
										scope.hints = uniqueSuggestions;
									}
								  response(scope.hints);
								}, 
								function(error){
								  response([]);
								});
							},
							//Build the selection element
							create: function () {
								$(this).data('ui-autocomplete')._renderItem = function (ul, item) {
								  var newLabel="<span>" + item.term + "</span>";
									return $('<li>')
										.append('<a>' + newLabel + '</a>')
										.appendTo(ul);
								};
							},
							//Remove the styling tags from the label
							select: function( event, ui ) {
								element.val( ui.item.term.replace(/<(.*?)>/g, ''));
								return false;
							}
						  });
					}
					
					function defer(method) {
//console.log("Checking...");
						if (window.jQuery.ui)
							method();
						else
							setTimeout(function() { defer(method) }, 50);
					};

					defer(createAutocomplete);
					
				},
				restrict: "A",
				scope: false
			}
		}]);
})();