1investagramsAngularApp.controller('searchBarUserControlController', 2 function ($scope, $rootScope, stockApiService) { 3 4 $scope.IsLoading = false; 5 6 $scope.AuthenticatedUserId = gaAuthenticatedUserId; 7 8 9 var typingTimer; //timer identifier 10 var doneTypingInterval = 500; //time in ms 11 12 $scope.SearchBar = { 13 Request: { 14 Keyword: "" 15 }, 16 ShowSnippet: false, 17 ShowDropdown: false, 18 StockSnippetResult: [], 19 EncodedKeyword: "", 20 RecentSearch: [], 21 MaxRecentSearch: 3, 22 23 searchStockSnippet: function () { 24 25 $scope.IsLoading = true; 26 27 if ($scope.SearchBar.Request.Keyword) { 28 29 var keyword = encodeURIComponent($scope.SearchBar.Request.Keyword); 30 var userDefaultExchange; 31 32 userDefaultExchange = $scope.UserNav.getDefaultExchangeWithChecking(); 33 34 var cvParam = getCacheVersion(Constant.TimeDurationConstant.Seconds.HOURS_8); 35 36 stockApiService.searchStockSnippet(keyword, userDefaultExchange, 0, 0, cvParam).then(function (result) { 37 38 $scope.SearchBar.StockSnippetResult = result.data; 39 40 $scope.IsLoading = false; 41 }, 42 function (error) { 43 showErrorResponse(error); 44 $scope.IsLoading = false; 45 }); 46 } 47 48 }, 49 50 doSearchSnippet: function () { 51 52 $scope.IsLoading = true; 53 $scope.SearchBar.StockSnippetResult = []; 54 clearTimeout(typingTimer); 55 56 if ($scope.SearchBar.Request.Keyword) { 57 typingTimer = setTimeout(function () { 58 $scope.SearchBar.EncodedKeyword = encodeURIComponent($scope.SearchBar.Request.Keyword); 59 $scope.SearchBar.ShowSnippet = true; 60 $scope.SearchBar.searchStockSnippet(); 61 62 }, doneTypingInterval); 63 } 64 else { 65 $scope.SearchBar.showRecentSearch(); 66 $scope.IsLoading = false; 67 } 68 69 70 }, 71 72 73 doSearch: function () { 74 if (!$scope.IsLoading) { 75 var doDirect = false; 76 77 $scope.SearchBar.EncodedKeyword = encodeURIComponent($scope.SearchBar.Request.Keyword); 78 79 if ($scope.SearchBar.StockSnippetResult.length > 0) { 80 if ($scope.SearchBar.StockSnippetResult[0].StockCode.toUpperCase() == $scope.SearchBar.Request.Keyword.toUpperCase().replace("$", "") || 81 $scope.SearchBar.StockSnippetResult[0].StockCodeAndExchange.toUpperCase() == $scope.SearchBar.Request.Keyword.toUpperCase().replace("$", "")) { 82 doDirect = true; 83 $scope.SearchBar.searchStock($scope.SearchBar.StockSnippetResult[0]); 84 } 85 86 } 87 88 if (!doDirect) { 89 if ($scope.SearchBar.Request.Keyword) { 90 $scope.SearchBar.pushRecentSearch($scope.SearchBar.Request.Keyword); 91 PageUrlConstant.Search.ExecuteOriginalUrl("Stock", $scope.SearchBar.Request.Keyword); 92 } 93 } 94 95 96 } 97 }, 98 99 searchStock: function (stock, e) { 100 101 if (e) { 102 e.preventDefault(); 103 } 104 105 106 $scope.SearchBar.pushRecentSearch(stock.StockCode, true, stock); 107 108 if (e && e.target.id == "SearchAiButton") { 109 PageUrlConstant.InvestaAi.ExecuteOriginalUrl(false, stock.StockCodeAndExchange); 110 } 111 else { 112 if ($scope.UserNav.ActivePage == "Chart" || $scope.UserNav.ActivePage == "Stock") { 113 $scope.SearchBar.ShowSnippet = false; 114 $scope.SearchBar.ShowDropdown = false; 115 $rootScope.$broadcast("searchStockChartPage", stock.StockCodeAndExchange); 116 } 117 else { 118 PageUrlConstant.ViewStock.ExecuteOriginalUrl(false, stock.StockCodeAndExchange); 119 } 120 } 121 }, 122 123 searchKeyword: function (e, type, keyword) { 124 e.preventDefault(); 125 126 if (keyword) { 127 $scope.SearchBar.Request.Keyword = keyword; 128 } 129 130 $scope.SearchBar.pushRecentSearch($scope.SearchBar.Request.Keyword); 131 PageUrlConstant.Search.ExecuteOriginalUrl(type, $scope.SearchBar.Request.Keyword); 132 }, 133 134 pushRecentSearch: function (keyword, isStock, stockSnippetData) { 135 var search = { 136 IsStock: false, 137 Keyword: keyword, 138 StockSnippetData: null, 139 } 140 141 search.EncodedKeyword = $scope.SearchBar.EncodedKeyword; 142 143 if (isStock) { 144 search.IsStock = true; 145 search.StockSnippetData = stockSnippetData; 146 } 147 148 var recentSearch = $scope.SearchBar.RecentSearch; 149 if (recentSearch.length > 0) { 150 151 var dupeIndex = recentSearch.findIndex(function (item) { 152 return (item["Keyword"] == search["Keyword"]); 153 }); 154 155 if (dupeIndex < 0) { 156 recentSearch.unshift(search); 157 } 158 else { 159 recentSearch.splice(dupeIndex, 1); 160 recentSearch.unshift(search); 161 } 162 163 if (recentSearch.length > $scope.SearchBar.MaxRecentSearch) { 164 recentSearch.pop(); 165 } 166 } 167 else { 168 recentSearch.push(search); 169 } 170 171 LocalStorageCache.RecentSearch.Set($scope.SearchBar.RecentSearch); 172 }, 173 174 175 showRecentSearch: function () { 176 if ($scope.SearchBar.RecentSearch.length > 0 && !$scope.SearchBar.Request.Keyword) { 177 $scope.SearchBar.ShowDropdown = true; 178 } 179 }, 180 181 clearRecentSearch: function () { 182 bootbox.dialog({ 183 message: "Are you sure you want to clear all recent searches?", 184 title: "Clear Recent Searches", 185 backdrop: true, 186 onEscape: true, 187 buttons: { 188 no: { 189 label: "Cancel", 190 className: "btn-outline-secondary", 191 callback: function () { 192 193 } 194 }, 195 yes: { 196 label: "Clear", 197 className: "btn-outline-danger", 198 callback: function () { 199 $scope.SearchBar.RecentSearch = []; 200 LocalStorageCache.RecentSearch.Remove(); 201 } 202 } 203 } 204 }); 205 } 206 207 }; 208 209 210 211 $(document).mouseup(function (e) { 212 213 if ($scope.SearchBar.ShowSnippet) { 214 215 var container = $("#searchBarUserControlContainer"); 216 217 if (!container.is(e.target) // if the target of the click isn't the container... 218 && container.has(e.target).length === 0) // ... nor a descendant of the container 219 { 220 $scope.SearchBar.ShowSnippet = false; 221 $scope.SearchBar.ShowDropdown = false; 222 223 // You should let angular know about the update that you have made, so that it can refresh the UI 224 $scope.$digest(); 225 } 226 227 } 228 229 230 }); 231 232 233 234 $scope.$on("searchBarKeyword", function (event, arg) { 235 $scope.SearchBar.Request.Keyword = arg; 236 $scope.SearchBar.EncodedKeyword = encodeURIComponent($scope.SearchBar.Request.Keyword); 237 }); 238 239 240 241 $scope.initValue = function () { 242 var recentSearch = LocalStorageCache.RecentSearch.Get(); 243 244 if (recentSearch) { 245 $scope.SearchBar.RecentSearch = recentSearch; 246 } 247 248 249 }; 250 251 252 $scope.initValue(); 253 254 255 } 256);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.