summaryrefslogtreecommitdiff
path: root/lib/scripts/linkwiz.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/scripts/linkwiz.js')
-rw-r--r--lib/scripts/linkwiz.js199
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();
}
}
-
};