/** * Copyright (c) 2009 Dave Ross * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit * persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **/ /////////////////////// // LiveSearch /////////////////////// function LiveSearch() { var resultsElement = ''; var searchBoxes = ''; } LiveSearch.activeRequests = new Array(); /** * Initialization for the live search plugin. * Sets up the key handler and creates the search results list. */ LiveSearch.init = function() { jQuery("body").append(''); this.resultsElement = jQuery('ul.search_results'); this.resultsElement.hide(); // Add the keypress handler // Using keyup because keypress doesn't recognize the backspace key // and that's kind of important. LiveSearch.searchBoxes = jQuery("input[name='s']"); LiveSearch.searchBoxes.keyup(LiveSearch.handleKeypress); // Prevent browsers from doing autocomplete on the search field LiveSearch.searchBoxes.parent('form').attr('autocomplete', 'off'); // Hide the search results when the search box loses focus jQuery("html").click(LiveSearch.hideResults); LiveSearch.searchBoxes.add(this.resultsElement).click(function(e) { e.stopPropagation(); }); jQuery(window).resize(function() {LiveSearch.positionResults(this);}); } LiveSearch.positionResults = function() { // Look for the search box. Exit if there isn't one. if(LiveSearch.searchBoxes.size() === 0) { return false; } // Position the ul right under the search box var searchBoxPosition = LiveSearch.searchBoxes.offset(); this.resultsElement.css('left', searchBoxPosition.left); this.resultsElement.css('display', 'block'); var topOffset = searchBoxPosition.top + LiveSearch.searchBoxes.outerHeight; this.resultsElement.css('top', topOffset + 'px'); }; /** * Process the search results that came back from the AJAX call */ LiveSearch.handleAJAXResults = function(e) { var showThumbs = false; var showExcerpt = false; LiveSearch.activeRequests.pop(); resultsSearchTerm = e.searchTerms; if(resultsSearchTerm != LiveSearch.searchBoxes.val()) { if(LiveSearch.activeRequests.length == 0) { LiveSearch.removeIndicator(); } return; } var resultsShownFor = jQuery("ul.search_results").children("input[name=query]").val(); if(resultsShownFor != "" && resultsSearchTerm == resultsShownFor) { if(LiveSearch.activeRequests.length == 0) { LiveSearch.removeIndicator(); } return; } var searchResultsList = jQuery("ul.search_results"); searchResultsList.empty(); searchResultsList.append(''); if(e.results.length == 0) { // Hide the search results, no results to show LiveSearch.hideResults(); } else { for(var postIndex = 0; postIndex < e.results.length; postIndex++) { var searchResult = e.results[postIndex]; if(searchResult.post_title !== undefined) { var renderedResult = ''; // Thumbnails if(showThumbs && searchResult.attachment_thumbnail) { var liClass = "post_with_thumb"; } else { var liClass = ""; } renderedResult += '
  • '; // Render thumbnail if(showThumbs && searchResult.attachment_thumbnail) { renderedResult += ''; } renderedResult += '' + searchResult.post_title + ''; if(showExcerpt && searchResult.post_excerpt) { renderedResult += '

    ' + searchResult.post_excerpt + '

    '; } if(e.displayPostMeta) { renderedResult += '

    Posted by ' + searchResult.post_author_nicename + '

    ' + searchResult.post_date + '

    '; renderedResult += '
  • '; } searchResultsList.append(renderedResult); } } // "more" link searchResultsList.append(''); // Show the search results LiveSearch.showResults(); } if(LiveSearch.activeRequests.length == 0) { LiveSearch.removeIndicator(); } }; /** * Keypress handler. Sets up a 0 sec. timeout which then * kicks off the actual query.s */ LiveSearch.handleKeypress = function(e) { var delayTime = 0; var term = LiveSearch.searchBoxes.val(); setTimeout( function() { LiveSearch.runQuery(term); }, delayTime); }; /** * Do the AJAX request for search results, or hide the search results * if the search box is empty. */ LiveSearch.runQuery = function(terms) { var srch=LiveSearch.searchBoxes.val(); if(srch === "" || srch.length < 3) { // Nothing entered. Hide the autocomplete. LiveSearch.hideResults(); LiveSearch.removeIndicator(); } else { // Do an autocomplete lookup LiveSearch.displayIndicator(); // Clear out the old requests in the queue while(LiveSearch.activeRequests.length > 0) { var req = LiveSearch.activeRequests.pop(); req.abort(); } // do AJAX query //var currentSearch = jQuery("input[name='s']").val(); var currentSearch = terms; var req = jQuery.getJSON( "http://www.dollarbasher.com/wp-content/plugins/daves-wordpress-live-search/daves-wordpress-live-search-ajax.php", {s: currentSearch}, LiveSearch.handleAJAXResults); // Add this request to the queue LiveSearch.activeRequests.push(req); } }; LiveSearch.hideResults = function() { switch('down') { case 'up': jQuery("ul.search_results:visible").fadeOut(); return; case 'down': default: jQuery("ul.search_results:visible").slideUp(); return; } }; LiveSearch.showResults = function() { this.positionResults(); switch('down') { case 'up': jQuery("ul.search_results:hidden").fadeIn(); return; case 'down': default: jQuery("ul.search_results:hidden").slideDown(); return; } }; /** * Display the "spinning wheel" AJAX activity indicator */ LiveSearch.displayIndicator = function() { if(jQuery("#search_results_activity_indicator").size() === 0) { jQuery("body").append(''); var searchBoxPosition = LiveSearch.searchBoxes.offset(); jQuery("#search_results_activity_indicator").css('position', 'absolute'); var indicatorY = (searchBoxPosition.top + ((LiveSearch.searchBoxes.outerHeight() - LiveSearch.searchBoxes.innerHeight()) / 2) + 'px'); jQuery("#search_results_activity_indicator").css('top', indicatorY); var indicatorX = (searchBoxPosition.left + LiveSearch.searchBoxes.outerWidth() - 16 - 2) + 'px'; jQuery("#search_results_activity_indicator").css('left', indicatorX); } }; /** * Hide the "spinning wheel" AJAX activity indicator */ LiveSearch.removeIndicator = function() { jQuery("#search_results_activity_indicator").remove(); }; /////////////////// // Initialization /////////////////// jQuery(function() { LiveSearch.init(); });