9e909d5be3
Update Bundler to 1.0.15. Update Rails to 2.3.12. Update rails_xss plugin. The latter two were the source of a considerable amount of grief, as rails_xss is now MUCH stricter about what string methods can be used. Also made it possible to use rake 0.9.x with Instiki. But you probably REALLY want to use ruby bundle exec rake ... instead of just saying rake ....
115 lines
2.5 KiB
JavaScript
115 lines
2.5 KiB
JavaScript
/**
|
|
*
|
|
* JQuery QuickSearch - Hook up a form field to hide non-matching elements.
|
|
* $Id: quicksearch.js 53 2009-01-07 02:52:03Z deveiant $
|
|
*
|
|
* Author: Michael Granger <mgranger@laika.com>
|
|
*
|
|
*/
|
|
jQuery.fn.quicksearch = function( target, searchElems, options ) {
|
|
// console.debug( "Quicksearch fn" );
|
|
|
|
var settings = {
|
|
delay: 250,
|
|
clearButton: false,
|
|
highlightMatches: false,
|
|
focusOnLoad: false,
|
|
noSearchResultsIndicator: null
|
|
};
|
|
if ( options ) $.extend( settings, options );
|
|
|
|
return jQuery(this).each( function() {
|
|
// console.debug( "Creating a new quicksearch on %o for %o", this, searchElems );
|
|
new jQuery.quicksearch( this, searchElems, settings );
|
|
});
|
|
};
|
|
|
|
|
|
jQuery.quicksearch = function( searchBox, searchElems, settings ) {
|
|
var timeout;
|
|
var boxdiv = $(searchBox).parents('div').eq(0);
|
|
|
|
function init() {
|
|
setupKeyEventHandlers();
|
|
focusOnLoad();
|
|
};
|
|
|
|
function setupKeyEventHandlers() {
|
|
// console.debug( "Hooking up the 'keypress' event to %o", searchBox );
|
|
$(searchBox).
|
|
unbind( 'keyup' ).
|
|
keyup( function(e) { return onSearchKey( e.keyCode ); });
|
|
$(searchBox).
|
|
unbind( 'keypress' ).
|
|
keypress( function(e) {
|
|
switch( e.which ) {
|
|
// Execute the search on Enter, Tab, or Newline
|
|
case 9:
|
|
case 13:
|
|
case 10:
|
|
clearTimeout( timeout );
|
|
e.preventDefault();
|
|
doQuickSearch();
|
|
break;
|
|
|
|
// Allow backspace
|
|
case 8:
|
|
return true;
|
|
break;
|
|
|
|
// Only allow valid search characters
|
|
default:
|
|
return validQSChar( e.charCode );
|
|
}
|
|
});
|
|
};
|
|
|
|
function focusOnLoad() {
|
|
if ( !settings.focusOnLoad ) return false;
|
|
$(searchBox).focus();
|
|
};
|
|
|
|
function onSearchKey ( code ) {
|
|
clearTimeout( timeout );
|
|
// console.debug( "...scheduling search." );
|
|
timeout = setTimeout( doQuickSearch, settings.delay );
|
|
};
|
|
|
|
function validQSChar( code ) {
|
|
var c = String.fromCharCode( code );
|
|
return (
|
|
(c == ':') ||
|
|
(c >= 'a' && c <= 'z') ||
|
|
(c >= 'A' && c <= 'Z')
|
|
);
|
|
};
|
|
|
|
function doQuickSearch() {
|
|
var searchText = searchBox.value;
|
|
var pat = new RegExp( searchText, "im" );
|
|
var shownCount = 0;
|
|
|
|
if ( settings.noSearchResultsIndicator ) {
|
|
$('#' + settings.noSearchResultsIndicator).hide();
|
|
}
|
|
|
|
// All elements start out hidden
|
|
$(searchElems).each( function(index) {
|
|
var str = $(this).text();
|
|
|
|
if ( pat.test(str) ) {
|
|
shownCount += 1;
|
|
$(this).fadeIn();
|
|
} else {
|
|
$(this).hide();
|
|
}
|
|
});
|
|
|
|
if ( shownCount == 0 && settings.noSearchResultsIndicator ) {
|
|
$('#' + settings.noSearchResultsIndicator).slideDown();
|
|
}
|
|
};
|
|
|
|
init();
|
|
};
|