<html>
<head>
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.4/angular.min.js"></script>

	<script type="text/javascript" src="app.js"></script>
	<link rel="stylesheet" type="text/css" href="autocomplete.css">

</head>
<body ng-app="hmautocomplete">
	<div ng-controller="demo">
		<hm-autocomplete
			selected-index="selectedIndex"
			hm-textboxid="autotext"
            hm-dropdownid="dropdown"
            hm-suggestions="items"
            hm-select="onselect(items[selectedIndex])"
        >
			<input type="text" id="autotext" class="form-control" ng-model="strSearch" />

			<ul id="dropdown" class="ngcomplete-dropdown">
				<li ng-repeat="item in items | limitTo:10"
					class="ngcompleterow"
                    hover-class='ngcompleterowactive'
                    ng-mouseover='selectedIndex==$index'
                    ng-class="{'ngcompleterowactive':selectedIndex==$index}"
				            ng-bind-html="item.Name | highlight:strSearch"
                    hm-select-down="onselect(item)"
                >
				</li>
			</ul>

		</hm-autocomplete>
	</div>
</body>
</html>
angular.module("hmautocomplete", [])
  .directive('hmAutocomplete', function($timeout) {
    return {
      scope: {
        selectedIndex: '=',
        hmSuggestions: '=',
        hmDropdownid: '@',
        hmSelect: '&'
      },

      link: function(scope, element) {

        scope.selectedIndex = 0;

        var elem = angular.element(document.getElementById('autotext'));
        var list = angular.element(document.getElementById(scope.hmDropdownid));

        list.css('display', 'none');

        elem.bind('focus', function() {
          scope.selectedIndex = 0;
          scope.$apply();
          list.css('display', 'block');
        });

        elem.bind('blur', function() {
          $timeout(
            function() {
              list.css('display', 'none');
            }, 100
          )
        });

        elem.bind("keydown", function(event) {


          if (list.css('display') === 'none') {
            list.css('display', 'block');
          }

          if (event.keyCode === 40) { //down key, increment selectedIndex
            event.preventDefault();
            if (scope.selectedIndex + 1 === scope.hmSuggestions.length) {
              scope.selectedIndex = 0;
            } else {
              scope.selectedIndex++;
            }
            scope.$apply();
          } else if (event.keyCode === 38) { //up key, decrement selectedIndex
            event.preventDefault();

            if (scope.selectedIndex === 0) {
              scope.selectedIndex = scope.hmSuggestions.length - 1;
            } else {
              scope.selectedIndex--;
            }
            scope.$apply();

          } else if (event.keyCode === 13 || event.keyCode === 9) { //enter pressed or tab

            elem.val(scope.hmSuggestions[scope.selectedIndex].Name);
            list.css('display', 'none');
            scope.hmSelect(scope.hmSuggestions[scope.selectedIndex]);
            scope.$apply();

          } else if (event.keyCode === 27) {
            list.css('display', 'none');
          }
        });

      }
    };
  }).directive('hoverClass', function() {
    return {
      restrict: 'A',
      link: function(scope, element, attr) {

        element.on('mouseenter', function() {
          angular.element(document.getElementsByClassName(attr.hoverClass)).removeClass(attr.hoverClass);
          element.addClass(attr.hoverClass);
        });

        element.on('mouseleave', function() {
          element.removeClass(attr.hoverClass);
        });

      }
    };
  })

.directive('hmSelectDown', function() {
  return {
    restrict: 'A',
    scope: {
      hmSelectDown: '&'
    },
    link: function(scope, elem, attr) {
      var list = angular.element(document.getElementById(scope.hmDropdownid));
      elem.bind('click', function() {
        scope.hmSelectDown();
        list.css('display', 'none');
      });
    }
  };
})

.filter('highlight', function($sce) {
  return function(text, phrase) {
    if (phrase)
      text = text.replace(new RegExp('(' + phrase + ')', 'gi'), '<span class="highlighted">$1</span>');
    return $sce.trustAsHtml(text);
  }
}).controller('demo', function($scope) {

  $scope.items = [{
    'Name': 'India'
  },  {'Name':'United States'},
  {'Name':'England'},
  {'Name':'Germany'},
  {'Name':'London'},{
    'Name': 'Pakistan'
  }, {
    'Name': 'Nepal'
  }, {
    'Name': 'Bangladesh'
  }];
  $scope.onselect = function(obj) {
    alert(JSON.stringify(obj));
    console.log(obj);
  }

});
/* Styles go here */

.ngcomplete-holder {
    position: relative;
}

.ngcomplete-dropdown {
    list-style-type: none;
    border-color: #ececec;
    border-width: 1px;
    border-style: solid;
    padding: 2px;
    cursor: pointer;
    z-index: 9999;
    position: absolute;
    background-color: #ffffff;
    margin-top:0px;

}

.ngcompleterow {
   color: #000000;
   padding: 2px;
}

.ngcompleterowactive{
  background-color:#336699;
  color:#ffffff;
  transition-property: top, left;
  transition-duration: 2s, 1s;
  transition-delay: 0s, 0.5s;
}
.highlighted{
  font-weight:bold;
}