summaryrefslogtreecommitdiff
path: root/lib/scripts
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2014-02-14 10:17:05 +0100
committerAndreas Gohr <andi@splitbrain.org>2014-02-14 10:17:05 +0100
commit525f884d88f9b6a9242079cc727e1c042581d3bc (patch)
treeb1edd1d97f96e92538f47a39f5aecc981e337012 /lib/scripts
parent2fc5588a5bd4e73b65d615879e6fd58434fbe90a (diff)
parent5b82acf8318410c81848ddc7f6c0dc201a735626 (diff)
downloadrpg-525f884d88f9b6a9242079cc727e1c042581d3bc.tar.gz
rpg-525f884d88f9b6a9242079cc727e1c042581d3bc.tar.bz2
Merge pull request #502 from splitbrain/multiqsearch
dw_qsearch as jQuery function
Diffstat (limited to 'lib/scripts')
-rw-r--r--lib/scripts/qsearch.js308
1 files changed, 168 insertions, 140 deletions
diff --git a/lib/scripts/qsearch.js b/lib/scripts/qsearch.js
index e5cc73b49..95c632e45 100644
--- a/lib/scripts/qsearch.js
+++ b/lib/scripts/qsearch.js
@@ -6,165 +6,193 @@
* @author Adrian Lang <lang@cosmocode.de>
* @author Michal Rezler <m.rezler@centrum.cz>
*/
+jQuery.fn.dw_qsearch = function (overrides) {
-var dw_qsearch = {
-
- $inObj: null,
- $outObj: null,
- timer: null,
- curRequest: 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;
- }
+ var dw_qsearch = {
- // attach eventhandler to search field
- do_qsearch = function () {
- // abort any previous request
- if (dw_qsearch.curRequest != null) {
- dw_qsearch.curRequest.abort();
- }
- var value = dw_qsearch.$inObj.val();
- if (value === '') {
- dw_qsearch.clear_results();
+ output: '#qsearch__out',
+
+ $inObj: this,
+ $outObj: null,
+ timer: null,
+ curRequest: null,
+
+ /**
+ * initialize the quick search
+ *
+ * Attaches the event handlers
+ *
+ */
+ init: function () {
+ var do_qsearch;
+
+ dw_qsearch.$outObj = jQuery(dw_qsearch.output);
+
+ // objects found?
+ if (dw_qsearch.$inObj.length === 0 ||
+ dw_qsearch.$outObj.length === 0) {
return;
}
- dw_qsearch.curRequest = jQuery.post(
- DOKU_BASE + 'lib/exe/ajax.php',
- {
- call: 'qsearch',
- q: encodeURI(value)
- },
- dw_qsearch.onCompletion,
- 'html'
- );
- };
- dw_qsearch.$inObj.keyup(
- function() {
- if(dw_qsearch.timer){
- window.clearTimeout(dw_qsearch.timer);
- dw_qsearch.timer = null;
+ // attach eventhandler to search field
+ do_qsearch = function () {
+ // abort any previous request
+ if (dw_qsearch.curRequest != null) {
+ dw_qsearch.curRequest.abort();
}
- dw_qsearch.timer = 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;
-
- dw_qsearch.curRequest = null;
-
- if (data === '') {
- dw_qsearch.clear_results();
- return;
- }
-
- dw_qsearch.$outObj
- .html(data)
- .show()
- .css('white-space', 'nowrap');
-
- // disable overflow during shortening
- dw_qsearch.$outObj.find('li').css('overflow', 'visible');
-
- $links = dw_qsearch.$outObj.find('a');
- max = dw_qsearch.$outObj[0].clientWidth; // maximum width allowed (but take away paddings below)
- if(document.documentElement.dir === 'rtl'){
- max -= parseInt(dw_qsearch.$outObj.css('padding-left'));
- too_big = function (l) { return l.offsetLeft < 0; };
- }else{
- max -= parseInt(dw_qsearch.$outObj.css('padding-right'));
- too_big = function (l) { return l.offsetWidth + l.offsetLeft > max; };
- }
-
- $links.each(function () {
- var start, length, replace, nsL, nsR, eli, runaway;
+ var value = dw_qsearch.getSearchterm();
+ if (value === '') {
+ dw_qsearch.clear_results();
+ return;
+ }
+ dw_qsearch.curRequest = jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ {
+ call: 'qsearch',
+ q: encodeURI(value)
+ },
+ dw_qsearch.onCompletion,
+ 'html'
+ );
+ };
+
+ dw_qsearch.$inObj.keyup(
+ function () {
+ if (dw_qsearch.timer) {
+ window.clearTimeout(dw_qsearch.timer);
+ dw_qsearch.timer = null;
+ }
+ dw_qsearch.timer = window.setTimeout(do_qsearch, 500);
+ }
+ );
- if (!too_big(this)) {
+ // attach eventhandler to output field
+ dw_qsearch.$outObj.click(dw_qsearch.clear_results);
+ },
+
+ /**
+ * Read search term from input
+ */
+ getSearchterm: function() {
+ return dw_qsearch.$inObj.val();
+ },
+
+ /**
+ * 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;
+
+ dw_qsearch.curRequest = null;
+
+ if (data === '') {
+ dw_qsearch.clear_results();
return;
}
- // make IE's innerText available to W3C conform browsers
- if(this.textContent){
- this.__defineGetter__('innerText', function(){ return this.textContent });
- this.__defineSetter__('innerText', function(val){ this.textContent = val });
+ dw_qsearch.$outObj
+ .html(data)
+ .show()
+ .css('white-space', 'nowrap');
+
+ // disable overflow during shortening
+ dw_qsearch.$outObj.find('li').css('overflow', 'visible');
+
+ $links = dw_qsearch.$outObj.find('a');
+ max = dw_qsearch.$outObj[0].clientWidth; // maximum width allowed (but take away paddings below)
+ if (document.documentElement.dir === 'rtl') {
+ max -= parseInt(dw_qsearch.$outObj.css('padding-left'));
+ too_big = function (l) {
+ return l.offsetLeft < 0;
+ };
+ } else {
+ max -= parseInt(dw_qsearch.$outObj.css('padding-right'));
+ too_big = function (l) {
+ return l.offsetWidth + l.offsetLeft > max;
+ };
}
- 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 = '…';
+ $links.each(function () {
+ var start, length, replace, nsL, nsR, eli, runaway;
+
+ if (!too_big(this)) {
+ return;
+ }
+
+ // make IE's innerText available to W3C conform browsers
+ if (this.textContent) {
+ this.__defineGetter__('innerText', function () {
+ return this.textContent
+ });
+ this.__defineSetter__('innerText', function (val) {
+ this.textContent = val
+ });
}
- this.innerText = substr_replace(this.innerText,
- replace, start, length);
- eli = this.innerText.indexOf('…');
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);
- // reenable overflow
- dw_qsearch.$outObj.find('li').css('overflow', 'hidden').css('text-overflow','ellipsis');
+ eli = this.innerText.indexOf('…');
+ nsL = this.innerText.indexOf('(');
+ nsR = this.innerText.indexOf(')');
+ }
+ });
+
+ // reenable overflow
+ dw_qsearch.$outObj.find('li').css('overflow', 'hidden').css('text-overflow', 'ellipsis');
+ }
+
+
+ };
+
+ jQuery.extend(dw_qsearch, overrides);
+
+ if (!overrides.deferInit) {
+ dw_qsearch.init();
}
+
+ return dw_qsearch;
};
jQuery(function () {
- dw_qsearch.init('#qsearch__in','#qsearch__out');
+ jQuery('#qsearch__in').dw_qsearch({
+ output: '#qsearch__out'
+ });
});