{"version":3,"sources":["page/typeAhead.js"],"names":["jQuery","fn","InitializeTypeAhead","option","$","extend","initialModelUrl","serviceUrl","siteSearchUrl","queryKeyword","typeAheadTimer","pageContent","this","setGroup","viewModel","Keyword","ko","observable","TypeAheadResultGroup","observableArray","IsSearchRunning","selectedResult","currentNdx","ajax","url","type","dataType","contentType","success","data","mapping","fromJS","error","xhr","textStatus","errorThrown","console","log","Search","section","Url","length","window","location","href","encodeURIComponent","LoadDataFromServer","searchTerm","cache","findArray","toLowerCase","replace","split","grep","n","preservedCaseKeywords","keywordIndex","utils","arrayForEach","item","Results","childItem","DisplayMatched","Name","searchItem","regEx","RegExp","test","push","exec","containsPlaceholder","originalCase","shift","removeAll","selectPrevious","selectNext","bindingHandlers","bindTypeAheadKeyUp","init","element","valueAccessor","allBindingsAccessor","bindingContext","options","keyup","event","val","keycode","keyCode","which","clearTimeout","setTimeout","hide","isFocusedEl","navigator","userAgent","$textboxInput","on","closest","addClass","removeClass","off","each","i","o","applyBindings"],"mappings":"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","file":"typeAhead.js","sourcesContent":["jQuery.fn.InitializeTypeAhead = function (option) {\r\n var defaults = {\r\n initialModelUrl: null,\r\n serviceUrl: null,\r\n siteSearchUrl: null,\r\n queryKeyword: null\r\n };\r\n var option = $.extend({}, defaults, option);\r\n var pageContent = $(this);\r\n var typeAheadTimer;\r\n var setGroup = false;\r\n\r\n var viewModel = {};\r\n viewModel.Keyword = ko.observable('');\r\n viewModel.TypeAheadResultGroup = ko.observableArray();\r\n viewModel.IsSearchRunning = ko.observable(false);\r\n viewModel.selectedResult = ko.observable();\r\n viewModel.currentNdx = -1;\r\n $.ajax({\r\n url: option.initialModelUrl,\r\n type: \"POST\",\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (data) {\r\n ko.mapping.fromJS(data, {}, viewModel.TypeAheadResultGroup);\r\n },\r\n error: function (xhr, textStatus, errorThrown) {\r\n console.log(xhr);\r\n console.log(\"textStatus : \" + textStatus);\r\n console.log(\"errorThrown : \" + errorThrown);\r\n }\r\n });\r\n\r\n viewModel.Search = function (section) {\r\n if(viewModel.selectedResult() != null && viewModel.selectedResult().Url() && viewModel.selectedResult().Url().length > 0)\r\n window.location.href = viewModel.selectedResult().Url();\r\n else{\r\n var siteSearchUrl = option.siteSearchUrl + \"?\" + option.queryKeyword + \"=\" + encodeURIComponent(viewModel.Keyword());\r\n window.location.href = siteSearchUrl;\r\n }\r\n }\r\n\r\n viewModel.LoadDataFromServer = function () {\r\n viewModel.IsSearchRunning(true);\r\n viewModel.currentNdx = -1;\r\n viewModel.selectedResult(null);\r\n var searchTerm = viewModel.Keyword();\r\n $.ajax({\r\n url: option.serviceUrl + \"?query=\" + encodeURIComponent(viewModel.Keyword()),\r\n type: \"POST\",\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n cache: false,\r\n success: function (data) {\r\n var cleanFilter = searchTerm.toLowerCase().replace(/[^a-zA-Z0-9 :]/g, \"\")\r\n var findArray = cleanFilter.split(/,| /);\r\n findArray = $.grep(findArray, function (n) { return (n); });\r\n //each category\r\n var preservedCaseKeywords = [];\r\n var keywordIndex = 0;\r\n ko.utils.arrayForEach(data, function (item) {\r\n //each result item\r\n keywordIndex = 0;\r\n ko.utils.arrayForEach(item.Results, function (childItem) {\r\n childItem.DisplayMatched = childItem.Name;\r\n //each keyword to highlight in the title\r\n ko.utils.arrayForEach(findArray, function (searchItem) {\r\n if (searchItem.length > 1) {\r\n var regEx = new RegExp('(' + searchItem + ')', \"i\");\r\n while(regEx.test(childItem.DisplayMatched)) {\r\n preservedCaseKeywords.push(regEx.exec(childItem.DisplayMatched)[0]);\r\n childItem.DisplayMatched = childItem.DisplayMatched.replace(regEx, \"###_\" + keywordIndex + \"_###\");\r\n keywordIndex++;\r\n }\r\n }\r\n });\r\n //\"$1\"\r\n });\r\n \r\n keywordIndex = 0;\r\n var containsPlaceholder = new RegExp('(###_)', \"i\");\r\n //to prevent searching for strings contained in the html match getting double-nested, replace them all after\r\n ko.utils.arrayForEach(item.Results, function (childItem) {\r\n ko.utils.arrayForEach(findArray, function (searchItem) {\r\n if (searchItem.length > 1) {\r\n while(containsPlaceholder.test(childItem.DisplayMatched)) {\r\n var originalCase = preservedCaseKeywords.shift();\r\n var regEx = new RegExp('(' + \"###_\" + keywordIndex + \"_###\" + ')', \"i\");\r\n childItem.DisplayMatched = childItem.DisplayMatched.replace(regEx, \"\" + originalCase + \"\");\r\n keywordIndex++;\r\n }\r\n }\r\n });\r\n });\r\n });\r\n if(setGroup)\r\n ko.mapping.fromJS(data, {}, viewModel.TypeAheadResultGroup);\r\n viewModel.IsSearchRunning(false);\r\n },\r\n error: function (xhr, textStatus, errorThrown) {\r\n console.log(xhr);\r\n viewModel.TypeAheadResultGroup.removeAll();\r\n console.log(\"textStatus : \" + textStatus);\r\n console.log(\"errorThrown : \" + errorThrown);\r\n }\r\n });\r\n }\r\n //these functions handle using arrow keys in the list-style\r\n //see GlobalMenuBar for example of use\r\n viewModel.selectPrevious = function () {\r\n if(viewModel.currentNdx === -1)\r\n viewModel.currentNdx = 0;\r\n else\r\n viewModel.currentNdx--;\r\n viewModel.selectedResult(this.TypeAheadResultGroup()[0].Results()[viewModel.currentNdx]);\r\n };\r\n\r\n viewModel.selectNext = function () {\r\n if(viewModel.currentNdx === -1)\r\n viewModel.currentNdx = 0;\r\n else\r\n viewModel.currentNdx++;\r\n viewModel.selectedResult(this.TypeAheadResultGroup()[0].Results()[viewModel.currentNdx]);\r\n };\r\n ko.bindingHandlers.bindTypeAheadKeyUp = {\r\n init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var options = valueAccessor();\r\n var allBindings = allBindingsAccessor();\r\n var observable = options.observable;\r\n\r\n $(element).keyup(function (event) {\r\n var $this = $(this);\r\n var val = $this.val();\r\n var keycode = (event.keyCode ? event.keyCode : event.which);\r\n\r\n if (keycode == '38') {\r\n viewModel.selectPrevious();\r\n return false;\r\n } else if (keycode == '40') {\r\n viewModel.selectNext();\r\n return false;\r\n }\r\n if (!!val && val.length >= 3) {\r\n clearTimeout(typeAheadTimer);\r\n setGroup = true;\r\n typeAheadTimer = setTimeout(viewModel.LoadDataFromServer, 300);\r\n }\r\n else {\r\n setGroup = false;\r\n viewModel.TypeAheadResultGroup.removeAll();\r\n }\r\n\r\n if (keycode == '13') {\r\n $('.typeahead-results').hide();\r\n }\r\n return false;\r\n });\r\n }\r\n };\r\n\r\n ko.bindingHandlers.isFocusedEl = {\r\n init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n\r\n if( /Android|iPhone|iPad|BlackBerry|IEMobile/i.test(navigator.userAgent) ) {\r\n\r\n \r\n var $textboxInput = $(element);\r\n\r\n $textboxInput.on('focus.customEv', function() {\r\n $textboxInput\r\n .closest('.panel-back').addClass('adjust-input-position');\r\n\r\n \r\n $textboxInput.on('blur.customEv', function() {\r\n $textboxInput\r\n .closest('.panel-back').removeClass('adjust-input-position');\r\n\r\n $textboxInput.off('blur.customEv');\r\n });\r\n });\r\n }\r\n }\r\n };\r\n\r\n // Apply Bindings\r\n $.each(pageContent, function (i, o) {\r\n ko.applyBindings(viewModel, o);\r\n });\r\n};\r\n"]}