diff options
author | Kate Arzamastseva <pshns@ukr.net> | 2011-06-24 11:32:51 +0300 |
---|---|---|
committer | Kate Arzamastseva <pshns@ukr.net> | 2011-06-24 11:32:51 +0300 |
commit | a2dc299eb0593f35454deb21a2cb5d51a235e80a (patch) | |
tree | 5b14bf906bbd13495826ebbe86d3af1c8fd88f71 /lib/scripts/qsearch.js | |
parent | 70c3cc9a17d47d8986cba0805d943c1a68af1740 (diff) | |
parent | c949174a2e8c324e3e463a9d10e9e6dc07b0ba9e (diff) | |
download | rpg-a2dc299eb0593f35454deb21a2cb5d51a235e80a.tar.gz rpg-a2dc299eb0593f35454deb21a2cb5d51a235e80a.tar.bz2 |
Merge branch 'master' of git://github.com/splitbrain/dokuwiki into media-revisions
Diffstat (limited to 'lib/scripts/qsearch.js')
-rw-r--r-- | lib/scripts/qsearch.js | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/lib/scripts/qsearch.js b/lib/scripts/qsearch.js new file mode 100644 index 000000000..97eaa7ef0 --- /dev/null +++ b/lib/scripts/qsearch.js @@ -0,0 +1,144 @@ +/*jslint sloppy: true, plusplus: true, continue: true */ +/*global jQuery, DOKU_BASE, window, document, substr_replace */ + +/** + * AJAX functions for the pagename quicksearch + * + * @license GPL2 (http://www.gnu.org/licenses/gpl.html) + * @author Andreas Gohr <andi@splitbrain.org> + * @author Adrian Lang <lang@cosmocode.de> + * @author Michal Rezler <m.rezler@centrum.cz> + */ + +var dw_qsearch = { + + $inObj: null, + $outObj: null, + + /** + * initialize the quick search + * + * Attaches the event handlers + * + * @param input element (JQuery selector/DOM obj) + * @param output element (JQuery selector/DOM obj) + */ + init: function (input, output) { + var do_qsearch; + + dw_qsearch.$inObj = jQuery(input); + dw_qsearch.$outObj = jQuery(output); + + // objects found? + if (dw_qsearch.$inObj.length === 0 || + dw_qsearch.$outObj.length === 0) { + return; + } + + // attach eventhandler to search field + do_qsearch = function () { + dw_qsearch.clear_results(); + var value = dw_qsearch.$inObj.val(); + if (value === '') { + return; + } + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + { + call: 'qsearch', + q: encodeURI(value) + }, + dw_qsearch.onCompletion, + 'html' + ); + }; + + dw_qsearch.$inObj.keyup( + function() { + dw_qsearch.clear_results(); + window.setTimeout(do_qsearch, 500); + } + ); + + // attach eventhandler to output field + dw_qsearch.$outObj.click(dw_qsearch.clear_results); + }, + + /** + * Empty and hide the output div + */ + clear_results: function(){ + dw_qsearch.$outObj.hide(); + dw_qsearch.$outObj.text(''); + }, + + /** + * Callback. Reformat and display the results. + * + * Namespaces are shortened here to keep the results from overflowing + * or wrapping + * + * @param data The result HTML + */ + onCompletion: function(data) { + var max, $links, too_big; + + if (data === '') { return; } + + dw_qsearch.$outObj + .html(data) + .show() + .css('white-space', 'nowrap'); + + // shorten namespaces if too long + max = dw_qsearch.$outObj[0].clientWidth; + $links = dw_qsearch.$outObj.find('a'); + too_big = (document.documentElement.dir === 'rtl') + ? function (l) { return l.offsetLeft < 0; } + : function (l) { return l.offsetWidth + l.offsetLeft > max; }; + + $links.each(function () { + var start, length, replace, nsL, nsR, eli, runaway; + + if (!too_big(this)) { + return; + } + + nsL = this.innerText.indexOf('('); + nsR = this.innerText.indexOf(')'); + eli = 0; + runaway = 0; + + while((nsR - nsL > 3) && too_big(this) && runaway++ < 500) { + if(eli !== 0){ + // elipsis already inserted + if( (eli - nsL) > (nsR - eli) ){ + // cut left + start = eli - 2; + length = 2; + }else{ + // cut right + start = eli + 1; + length = 1; + } + replace = ''; + }else{ + // replace middle with ellipsis + start = Math.floor( nsL + ((nsR-nsL)/2) ); + length = 1; + replace = '…'; + } + this.innerText = substr_replace(this.innerText, + replace, start, length); + + eli = this.innerText.indexOf('…'); + nsL = this.innerText.indexOf('('); + nsR = this.innerText.indexOf(')'); + } + }); + } +}; + +jQuery(function () { + dw_qsearch.init('#qsearch__in','#qsearch__out'); +}); |