{"version":3,"file":"Search.js","sources":["Search.js"],"sourcesContent":["/*==============================================================================================================================\r\n| Author Ignia, LLC\r\n| Client GoldSim\r\n| Project Website\r\n\\=============================================================================================================================*/\r\n\r\n/**\r\n * BING SEARCH\r\n * @file Object for retrieving search results from the Bing Search API, and also managing the paging buttons so users can\r\n * retrieve subsequent records.\r\n */\r\n;(function(window, document, goldSimWeb, $, undefined) {\r\n\r\n /*============================================================================================================================\r\n | ESTABLISH VARIABLES\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n var pluginName = \"bingSearch\";\r\n var defaults = {\r\n apiKey : null,\r\n customConfig : null,\r\n queryStringParameter : 'SearchText',\r\n previousButton : 'PreviousPage',\r\n nextButton : 'NextPage',\r\n searchBox : 'SearchResultsSearchQuery'\r\n };\r\n\r\n /*============================================================================================================================\r\n | CONSTRUCTOR\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Constructor for initializing the jQuery plugin.\r\n */\r\n function Plugin(element, options) {\r\n\r\n //Public properties\r\n this.element = element;\r\n this.options = $.extend({}, defaults, options);\r\n\r\n //Private properties\r\n this._defaults = defaults;\r\n this._name = pluginName;\r\n this._totalResults = 0;\r\n\r\n //Initialize\r\n this.init();\r\n\r\n }\r\n\r\n /*============================================================================================================================\r\n | INITIALIZER\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Initialize the plug.\r\n */\r\n Plugin.prototype.init = function () {\r\n\r\n /**\r\n * Set base query\r\n */\r\n this._searchQuery = this.getQuerystringValue(this.options.queryStringParameter);\r\n this._baseApiUrl = 'https://api.bing.microsoft.com/v7.0/custom/search?q=' +\r\n encodeURIComponent(this._searchQuery) +\r\n '&customconfig=' + this.options.customConfig +\r\n '&responseFilter=Webpages&safesearch=Off';\r\n\r\n /**\r\n * Locate user interface elements\r\n */\r\n this._nextButton = $('#' + this.options.nextButton);\r\n this._previousButton = $('#' + this.options.previousButton);\r\n this._searchBox = $('#' + this.options.searchBox);\r\n\r\n /**\r\n * Pre-populate results page search input value\r\n */\r\n if (this._searchBox) {\r\n this._searchBox.val(this._searchQuery);\r\n }\r\n\r\n /**\r\n * Build initial results set\r\n */\r\n this.getSearchResults();\r\n\r\n /**\r\n * Establish click handlers for paging buttons\r\n */\r\n if (this._previousButton) {\r\n this._previousButton.on('click', this.pageResults.bind(this));\r\n }\r\n if (this._nextButton) {\r\n this._nextButton.on('click', this.pageResults.bind(this));\r\n }\r\n\r\n };\r\n\r\n /*============================================================================================================================\r\n | PUBLIC CONSTRUCTOR\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Public interface for constructing a new instance of the plugin. This helps prevent multiple instances of the object from\r\n * being instantiated on the same object.\r\n */\r\n $.fn[pluginName] = function (options) {\r\n return this.each(function () {\r\n if (!$.data(this, \"plugin_\" + pluginName)) {\r\n $.data(\r\n this,\r\n \"plugin_\" + pluginName,\r\n new Plugin(this, options)\r\n );\r\n }\r\n });\r\n };\r\n\r\n /*============================================================================================================================\r\n | FUNCTION: GET SEARCH RESULTS\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Given the record number to begin at, this function will call into the Bing Search API, and then bind the results to the\r\n * search results markup.\r\n */\r\n Plugin.prototype.getSearchResults = function(offset) {\r\n offset = offset? offset : 0;\r\n $.ajax({\r\n url : this._baseApiUrl + '&count=10&offset=' + offset + '&textDecorations=true&textFormat=HTML',\r\n headers : { 'Ocp-Apim-Subscription-Key': this.options.apiKey },\r\n success : this.bindSearchResults.bind(this)\r\n });\r\n\r\n };\r\n\r\n /*============================================================================================================================\r\n | FUNCTION: BIND SEARCH RESULTS\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Given the record number to begin at, this function will call into the Bing Search API, and then bind the results to the\r\n * search results markup.\r\n */\r\n Plugin.prototype.bindSearchResults = function(result, status, xhr) {\r\n\r\n var searchResults = result.webPages.value;\r\n\r\n // Clear current results\r\n $(this.element).html('');\r\n\r\n // Render search results\r\n for (var i = 0; i < searchResults.length; i++) {\r\n\r\n var title = searchResults[i].name;\r\n var url = searchResults[i].url;\r\n var displayUrl = searchResults[i].displayUrl;\r\n var snippet = searchResults[i].snippet;\r\n\r\n var searchResult =\r\n '
';\r\n\r\n $(this.element).append(searchResult);\r\n\r\n }\r\n\r\n // Make updated estimated matches available to pagination\r\n this._totalResults = result.webPages.totalEstimatedMatches;\r\n\r\n // Render pagination\r\n setTimeout(function () {\r\n this.setPagination(this._totalResults);\r\n }.bind(this), 1500);\r\n\r\n };\r\n\r\n /*============================================================================================================================\r\n | FUNCTION: SET PAGINATION\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Update the pagination links based on the total estimated results.\r\n */\r\n Plugin.prototype.setPagination = function(totalResults) {\r\n\r\n var pageSize = 10;\r\n var totalPages = Math.ceil(totalResults / pageSize);\r\n var currentPageNumber = Number(window.location.hash.length ? window.location.hash.substr(5) : 1);\r\n\r\n //Set previous button\r\n if (this._previousButton) {\r\n this._previousButton.attr(\"disabled\", currentPageNumber <= 1).data(\"page\", currentPageNumber - 1);\r\n }\r\n\r\n //Set next button\r\n if (this._nextButton) {\r\n this._nextButton.attr(\"disabled\", currentPageNumber >= totalPages).data(\"page\", currentPageNumber + 1);\r\n }\r\n\r\n };\r\n\r\n /*============================================================================================================================\r\n | FUNCTION: GET QUERY STRING VALUE\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Determine and return the value for the requested querystring parameter\r\n */\r\n Plugin.prototype.getQuerystringValue = function(parameter) {\r\n var cleanParameter = parameter.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\r\n var regex = new RegExp('[\\\\?&]' + cleanParameter + '=([^]*)');\r\n var results = regex.exec(location.search);\r\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\r\n };\r\n\r\n /*============================================================================================================================\r\n | FUNCTION: PAGE RESULTS\r\n \\---------------------------------------------------------------------------------------------------------------------------*/\r\n /**\r\n * Determine and return the value for the requested querystring parameter\r\n */\r\n Plugin.prototype.pageResults = function() {\r\n\r\n event.preventDefault();\r\n\r\n var source = $(event.currentTarget);\r\n var pageNumber = Number(source.data(\"page\") || 1);\r\n window.location.hash = \"Page\" + pageNumber;\r\n\r\n this.getSearchResults((pageNumber-1)*10);\r\n\r\n };\r\n\r\n}(window, document, window.goldSimWeb = window.goldSimWeb || {}, jQuery));"],"names":["window","$","pluginName","defaults","apiKey","customConfig","queryStringParameter","previousButton","nextButton","searchBox","Plugin","element","options","this","extend","_defaults","_name","_totalResults","init","prototype","_searchQuery","getQuerystringValue","_baseApiUrl","encodeURIComponent","_nextButton","_previousButton","_searchBox","val","getSearchResults","on","pageResults","bind","fn","each","data","offset","ajax","url","headers","Ocp-Apim-Subscription-Key","success","bindSearchResults","result","status","xhr","searchResults","webPages","value","html","i","length","title","name","searchResult","displayUrl","snippet","append","totalEstimatedMatches","setTimeout","setPagination","totalResults","totalPages","Math","ceil","currentPageNumber","Number","location","hash","substr","attr","parameter","cleanParameter","replace","results","RegExp","exec","search","decodeURIComponent","event","preventDefault","source","currentTarget","pageNumber","document","goldSimWeb","jQuery"],"mappings":"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"}