/**
* Angucomplete
* Autocomplete directive for AngularJS
* By Daryl Rowland
*/
angular.module('angucomplete', [] )
.directive('angucomplete', function ($parse, $http) {
return {
restrict: 'EA',
scope: {
"id": "@id",
"placeholder": "@placeholder",
"modelObject": "=ngModelObject",
"autoCompeleteSearchStr" : "=ngModel",
"url": "@url",
"titleField": "@titlefield",
"descriptionField": "@descriptionfield",
"imageField": "@imagefield",
"inputClass": "@inputclass",
"userPause": "@pause",
"loadDataFunc": "&loadDataFunc",
"searchFields": "@searchfields",
"minLengthUser": "@minlength"
},
/*
template: '
\
\
Searching...
\
No results found
\
\
\
\
{{result.title}}
\
{{result.description}}
\
',
*/
template: '\
\
Searching...
\
No results found
\
\
\
\
{{result.title}}
\
{{result.description}}
\
',
controller: function ( $scope ) {
$scope.lastFoundWord = null;
$scope.currentIndex = null;
$scope.justChanged = false;
$scope.searchTimer = null;
$scope.searching = false;
$scope.pause = 500;
$scope.minLength = 3;
if ($scope.minLengthUser && $scope.minLengthUser != "") {
$scope.minLength = $scope.minLengthUser;
}
if ($scope.userPause) {
$scope.pause = $scope.userPause;
}
$scope.processResults = function(responseData) {
if (responseData && responseData.length > 0) {
$scope.showDropdown = true;
$scope.results = [];
var titleFields = [];
if ($scope.titleField && $scope.titleField != "") {
titleFields = $scope.titleField.split(",");
}
for (var i = 0; i < responseData.length; i++) {
// Get title variables
var titleCode = "";
for (var t = 0; t < titleFields.length; t++) {
if (t > 0) {
titleCode = titleCode + " + ' ' + ";
}
titleCode = titleCode + "responseData[i]." + titleFields[t];
}
// Figure out description
var description = "";
if ($scope.descriptionField && $scope.descriptionField != "") {
eval("description = responseData[i]." + $scope.descriptionField);
}
// Figure out image
var image = "";
if ($scope.imageField && $scope.imageField != "") {
eval("image = responseData[i]." + $scope.imageField);
}
var resultRow = {
title: eval(titleCode),
description: description,
image: image,
originalObject: responseData[i]
}
$scope.results[$scope.results.length] = resultRow;
}
} else {
$scope.results = [];
$scope.showDropdown = false;
}
}
$scope.searchTimerComplete = function(str) {
// Begin the search
if (str.length >= $scope.minLength) {
var localData = $scope.loadDataFunc();
if (localData) {
var searchFields = $scope.searchFields.split(",");
var matches = [];
for (var i = 0; i < localData.length; i++) {
var match = false;
for (var s = 0; s < searchFields.length; s++) {
var searchFieldValue = eval('localData[i].' + searchFields[s]);
if (localData[i] && searchFieldValue) {
var evalStr = 'match = match || (localData[i].' + searchFields[s] + '.toLowerCase().indexOf("' + str.toLowerCase() + '") >= 0)';
eval(evalStr);
}
}
if (match) {
matches[matches.length] = localData[i];
}
}
$scope.searching = false;
$scope.processResults(matches);
$scope.$apply();
} else {
$http.get($scope.url + str, {}).
success(function(responseData, status, headers, config) {
$scope.searching = false;
$scope.processResults(responseData);
}).
error(function(data, status, headers, config) {
console.log("error");
});
}
}
}
$scope.hoverRow = function(index) {
$scope.currentIndex = index;
}
$scope.keyPressed = function(event) {
if (!(event.which == 38 || event.which == 40 || event.which == 13)) {
if (!$scope.autoCompeleteSearchStr || $scope.autoCompeleteSearchStr == "") {
$scope.showDropdown = false;
} else {
//$scope.model = $scope.autoCompeleteSearchStr;
if ($scope.autoCompeleteSearchStr.length >= $scope.minLength) {
//$scope.showDropdown = true;
$scope.currentIndex = -1;
$scope.results = [];
if ($scope.searchTimer) {
clearTimeout($scope.searchTimer);
}
$scope.searching = true;
$scope.searchTimer = setTimeout(function() {
$scope.searchTimerComplete($scope.autoCompeleteSearchStr);
}, $scope.pause);
}
}
} else {
event.preventDefault();
}
}
$scope.selectResult = function(result) {
$scope.autoCompeleteSearchStr = result.title;
$scope.modelObject = result;
//$scope.autoCompeleteSearchStr = result.originalObject.name;
$scope.showDropdown = false;
$scope.results = [];
//$scope.$apply();
}
},
link: function($scope, elem, attrs, ctrl) {
elem.bind("keyup", function (event) {
if(event.which === 40) {
if (($scope.currentIndex + 1) < $scope.results.length) {
$scope.currentIndex ++;
$scope.$apply();
event.preventDefault;
event.stopPropagation();
}
$scope.$apply();
} else if(event.which == 38) {
if ($scope.currentIndex >= 1) {
$scope.currentIndex --;
$scope.$apply();
event.preventDefault;
event.stopPropagation();
}
} else if (event.which == 13) {
if ($scope.currentIndex >= 0 && $scope.currentIndex < $scope.results.length) {
$scope.selectResult($scope.results[$scope.currentIndex]);
$scope.$apply();
event.preventDefault;
event.stopPropagation();
} else {
$scope.results = [];
$scope.$apply();
event.preventDefault;
event.stopPropagation();
}
} else if (event.which == 27) {
$scope.results = [];
$scope.showDropdown = false;
$scope.$apply();
} else if (event.which == 8) {
$scope.modelObject = null;
$scope.$apply();
}
});
}
};
});