diff options
author | Adrian Lang <mail@adrianlang.de> | 2011-09-09 22:26:16 +0200 |
---|---|---|
committer | Adrian Lang <mail@adrianlang.de> | 2011-09-13 12:03:43 +0200 |
commit | 5e7a292691951a0fa0a18f06c8b9bcfb509a032d (patch) | |
tree | 5a844f42ea262883faaf5047544799e4ceb10941 /lib/scripts/linkwiz.js | |
parent | c62a5f5846e3477044ebc93e96f98b878d3e7a59 (diff) | |
download | rpg-5e7a292691951a0fa0a18f06c8b9bcfb509a032d.tar.gz rpg-5e7a292691951a0fa0a18f06c8b9bcfb509a032d.tar.bz2 |
Various JavaScript improvements, JSLint, jQuery
Diffstat (limited to 'lib/scripts/linkwiz.js')
-rw-r--r-- | lib/scripts/linkwiz.js | 199 |
1 files changed, 100 insertions, 99 deletions
diff --git a/lib/scripts/linkwiz.js b/lib/scripts/linkwiz.js index 83653c9bb..6e0a00183 100644 --- a/lib/scripts/linkwiz.js +++ b/lib/scripts/linkwiz.js @@ -1,7 +1,3 @@ -/*jslint sloppy: true, indent: 4, white: true, browser: true, eqeq: true */ -/*global jQuery, DOKU_BASE, LANG, DOKU_UHC, getSelection, pasteText */ - - /** * The Link Wizard * @@ -10,7 +6,7 @@ */ var dw_linkwiz = { $wiz: null, - entry: null, + $entry: null, result: null, timer: null, textArea: null, @@ -28,12 +24,11 @@ var dw_linkwiz = { // create HTML Structure dw_linkwiz.$wiz = jQuery(document.createElement('div')) .attr('id','link__wiz') + .addClass('hidden_with_access_keys') .css({ 'position': 'absolute', 'top': (pos.top+20)+'px', - 'left': (pos.left+80)+'px', - 'margin-left': '-10000px', - 'margin-top': '-10000px' + 'left': (pos.left+80)+'px' }) .html( '<div id="link__wiz_header">'+ @@ -44,15 +39,19 @@ var dw_linkwiz = { ) .addClass('picker'); - $editor[0].form.parentNode.appendChild(dw_linkwiz.$wiz[0]); + $editor.parents('form').parent().append(dw_linkwiz.$wiz); dw_linkwiz.textArea = $editor[0]; dw_linkwiz.result = jQuery('#link__wiz_result')[0]; - dw_linkwiz.entry = jQuery('#link__wiz_entry')[0]; + + // scrollview correction on arrow up/down gets easier + jQuery(dw_linkwiz.result).css('position', 'relative'); + + dw_linkwiz.$entry = jQuery('#link__wiz_entry'); // attach event handlers jQuery('#link__wiz_close').click(dw_linkwiz.hide); - jQuery(dw_linkwiz.entry).keyup(dw_linkwiz.onEntry); - jQuery(dw_linkwiz.result).click(dw_linkwiz.onResultClick); + dw_linkwiz.$entry.keyup(dw_linkwiz.onEntry); + jQuery(dw_linkwiz.result).delegate('a', 'click', dw_linkwiz.onResultClick); dw_linkwiz.$wiz.draggable({handle: '#link__wiz_header'}); }, @@ -84,13 +83,12 @@ var dw_linkwiz = { } if(e.keyCode == 13){ //Enter if(dw_linkwiz.selected > -1){ - var obj = dw_linkwiz.getResult(dw_linkwiz.selected); - if(obj){ - var a = jQuery(obj).find('a')[0]; - dw_linkwiz.resultClick(a); + var $obj = dw_linkwiz.$getResult(dw_linkwiz.selected); + if($obj.length > 0){ + dw_linkwiz.resultClick($obj.find('a')[0]); } - }else if(dw_linkwiz.entry.value){ - dw_linkwiz.insertLink(dw_linkwiz.entry.value); + }else if(dw_linkwiz.$entry.val()){ + dw_linkwiz.insertLink(dw_linkwiz.$entry.val()); } e.preventDefault(); @@ -107,13 +105,18 @@ var dw_linkwiz = { * @returns DOMObject or null */ getResult: function(num){ - var childs = jQuery(dw_linkwiz.result).find('div'); - var obj = childs[num]; - if(obj){ - return obj; - }else{ - return null; - } + DEPRECATED('use dw_linkwiz.$getResult()[0] instead'); + return dw_linkwiz.$getResult()[0] || null; + }, + + /** + * Get one of the results by index + * + * @param int result div to return + * @returns jQuery object + */ + $getResult: function(num) { + return jQuery(dw_linkwiz.result).find('div').eq(num); }, /** @@ -125,26 +128,31 @@ var dw_linkwiz = { return; } - var obj = dw_linkwiz.getResult(num); - if(obj){ - dw_linkwiz.deselect(); - obj.className += ' selected'; - - // make sure the item is viewable in the scroll view - // FIXME check IE compatibility - if(obj.offsetTop > dw_linkwiz.result.scrollTop + dw_linkwiz.result.clientHeight){ - dw_linkwiz.result.scrollTop += obj.clientHeight; - }else if(obj.offsetTop - dw_linkwiz.result.clientHeight < dw_linkwiz.result.scrollTop){ // this works but isn't quite right, fixes welcome - dw_linkwiz.result.scrollTop -= obj.clientHeight; - } - // now recheck - if still not in view, the user used the mouse to scroll - if( (obj.offsetTop > dw_linkwiz.result.scrollTop + dw_linkwiz.result.clientHeight) || - (obj.offsetTop < dw_linkwiz.result.scrollTop) ){ - obj.scrollIntoView(); - } + var $obj = dw_linkwiz.$getResult(num); + if ($obj.length === 0) { + return; + } - dw_linkwiz.selected = num; + dw_linkwiz.deselect(); + $obj.addClass('selected'); + + // make sure the item is viewable in the scroll view + + //getting child position within the parent + var childPos = $obj.position().top; + //getting difference between the childs top and parents viewable area + var yDiff = childPos + $obj.outerHeight() - jQuery(dw_linkwiz.result).innerHeight(); + + if (childPos < 0) { + //if childPos is above viewable area (that's why it goes negative) + jQuery(dw_linkwiz.result)[0].scrollTop += childPos; + } else if(yDiff > 0) { + // if difference between childs top and parents viewable area is + // greater than the height of a childDiv + jQuery(dw_linkwiz.result)[0].scrollTop += yDiff; } + + dw_linkwiz.selected = num; }, /** @@ -152,10 +160,7 @@ var dw_linkwiz = { */ deselect: function(){ if(dw_linkwiz.selected > -1){ - var obj = dw_linkwiz.getResult(dw_linkwiz.selected); - if(obj){ - obj.className = obj.className.replace(/ ?selected/,''); - } + dw_linkwiz.$getResult(dw_linkwiz.selected).removeClass('selected'); } dw_linkwiz.selected = -1; }, @@ -165,10 +170,12 @@ var dw_linkwiz = { * resultClick() */ onResultClick: function(e){ - if(e.target.tagName != 'A') return; + if(!jQuery(this).is('a')) { + return; + } e.stopPropagation(); e.preventDefault(); - dw_linkwiz.resultClick(e.target); + dw_linkwiz.resultClick(this); return false; }, @@ -176,17 +183,14 @@ var dw_linkwiz = { * Handles the "click" on a given result anchor */ resultClick: function(a){ - var L = dw_linkwiz; - var id = a.title; - if(id == '' || id.substr(id.length-1) == ':'){ - L.entry.value = id; - L.autocomplete_exec(); + dw_linkwiz.$entry.val(a.title); + if(a.title == '' || a.title.substr(-1) == ':'){ + dw_linkwiz.autocomplete_exec(); }else{ - L.entry.value = id; - if(a.nextSibling && a.nextSibling.tagName == 'SPAN'){ - L.insertLink(a.nextSibling.innerHTML); + if (jQuery(a.nextSibling).is('span')) { + dw_linkwiz.insertLink(a.nextSibling.innerHTML); }else{ - L.insertLink(''); + dw_linkwiz.insertLink(''); } } }, @@ -198,14 +202,18 @@ var dw_linkwiz = { * as link title instead */ insertLink: function(title){ - var L = dw_linkwiz; - var E = L.entry; - if(!E.value) return; + var link = dw_linkwiz.$entry.val(), + sel, stxt; + if(!link) { + return; + } - var sel = getSelection(L.textArea); - if(sel.start == 0 && sel.end == 0) sel = L.selection; + sel = getSelection(dw_linkwiz.textArea); + if(sel.start == 0 && sel.end == 0) { + sel = dw_linkwiz.selection; + } - var stxt = sel.getText(); + stxt = sel.getText(); // don't include trailing space in selection if(stxt.charAt(stxt.length - 1) == ' '){ @@ -213,25 +221,29 @@ var dw_linkwiz = { stxt = sel.getText(); } - if(!stxt && !DOKU_UHC) stxt=title; + if(!stxt && !DOKU_UHC) { + stxt=title; + } // prepend colon inside namespaces for non namespace pages - if(L.textArea.form['id'].value.indexOf(':') != -1 && - E.value.indexOf(':') == -1){ - E.value = ':'+E.value; + if(dw_linkwiz.textArea.form.id.value.indexOf(':') != -1 && + link.indexOf(':') == -1){ + link = ':' + link; } - var link = '[['+E.value+'|'; - if(stxt) link += stxt; + var so = link.length+3; + + link = '[['+link+'|'; + if(stxt) { + link += stxt; + } link += ']]'; - var so = E.value.length+3; - var eo = 2; + pasteText(sel,link,{startofs: so, endofs: 2}); + dw_linkwiz.hide(); - pasteText(sel,link,{startofs: so, endofs: eo}); - L.hide(); - // reset the entry to the parent namespace and remove : at the beginning - E.value = E.value.replace(/(^:)?[^:]*$/, ''); + // reset the entry to the parent namespace + dw_linkwiz.$entry.val(dw_linkwiz.$entry.val().replace(/[^:]*$/, '')); }, /** @@ -252,21 +264,15 @@ var dw_linkwiz = { * Executes the AJAX call for the page/namespace lookup */ autocomplete_exec: function(){ + var $res = jQuery(dw_linkwiz.result); dw_linkwiz.deselect(); - dw_linkwiz.result.innerHTML = '<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />'; - - // because we need to use POST, we - // can not use the .load() function. - jQuery.post( + $res.html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />') + .load( DOKU_BASE + 'lib/exe/ajax.php', { call: 'linkwiz', - q: dw_linkwiz.entry.value - }, - function (data) { - dw_linkwiz.result.innerHTML = data; - }, - 'html' + q: dw_linkwiz.$entry.val() + } ); }, @@ -274,33 +280,28 @@ var dw_linkwiz = { * Show the link wizard */ show: function(){ - var L = dw_linkwiz; - L.selection = getSelection(dw_linkwiz.textArea); - L.$wiz.css('marginLeft', '0'); - L.$wiz.css('marginTop', '0'); - L.entry.focus(); - L.autocomplete(); + dw_linkwiz.selection = getSelection(dw_linkwiz.textArea); + dw_linkwiz.$wiz.removeClass('hidden_with_access_keys'); + dw_linkwiz.$entry.focus(); + dw_linkwiz.autocomplete(); }, /** * Hide the link wizard */ hide: function(){ - var L = dw_linkwiz; - L.$wiz.css('marginLeft', '-10000px'); - L.$wiz.css('marginTop', '-10000px'); - L.textArea.focus(); + dw_linkwiz.$wiz.addClass('hidden_with_access_keys'); + dw_linkwiz.textArea.focus(); }, /** * Toggle the link wizard */ toggle: function(){ - if(dw_linkwiz.$wiz.css('marginLeft') == '-10000px'){ + if(dw_linkwiz.$wiz.hasClass('hidden_with_access_keys')){ dw_linkwiz.show(); }else{ dw_linkwiz.hide(); } } - }; |