<!DOCTYPE html>
<html ng-app="myApp">

<head>
  <title>Auto Complete Searchbar Demo</title>
  <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" data-semver="3.2.0" data-require="bootstrap-css@*" />
  <link data-require="font-awesome@4.2.0" data-semver="4.2.0" rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.css" />
  <link href="style.css" rel="stylesheet" />
  <script src="//code.angularjs.org/1.3.1/angular.js" data-semver="1.3.1" data-require="angular.js@*"></script>
  <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.min.js" data-semver="0.10.0" data-require="angular-ui-bootstrap@0.10.0"></script>
  <script src="myController.js"></script>
  <script src="usersData.js"></script>
</head>

<body ng-controller="myController">
  <br>
  <div class="input-group searchfield" style="padding:10px;">
    <span class="input-group-addon"><i class="fa" ng-class="{true:'fa-spinner fa-spin', false:'fa-search'}[loading]"></i></span>
    <input type="text" typeahead-on-select='onSelect($item)' placeholder="Select User" class="form-control ng-valid ng-dirty" typeahead="user.name for user in users($viewValue)" ng-model="selecting" typeahead-wait-ms="delay" aria-autocomplete="list">
  </div>
  <span ng-hide="selected">You have not selected any user yet.</span>
  <span ng-show="selected">You have selected <strong>{{selected.name}}</strong> - age {{selected.age}}</span>
</body>

</html>
/* Styles go here */

.searchfield > ul{
  width: 94%;
}
.searchfield > input{
  border-bottom-right-radius: 3px !important;
  border-top-right-radius: 3px !important;
}
var myApp = angular.module("myApp", ['ui.bootstrap']);
myApp.controller("myController", ['$scope', '$timeout', 'usersData',
  function($scope, $timeout, usersData) {
    var minLength = 3;
    $scope.loading = false;
    
    $scope.delay = 500;

    $scope.onSelect = function(user){
      $scope.selected = user;
    };
    $scope.users = function(userName) {
      if (userName.length < minLength) {
        return [];
      }
      $scope.loading = true;
      return usersData.getUsers(userName).then(function(data){
        $scope.loading = false;
        return data;
      }, function(status){
        $scope.loading = false;
      });
    };
  }
]);
myApp.factory('usersData', function($http, $q){
  return {
    getUsers: function(query){
      var deffered = $q.defer();
      
      $http.jsonp('http://code.theraaz.com/example/users.php?callback=JSON_CALLBACK', {params : {query:query}})
        .success(function(data){
          deffered.resolve(data); 
        })
        .error(function(data, status){
          deffered.reject(status);
        });
        
      return deffered.promise;
    }
  }
});