diff options
Diffstat (limited to 'lib/scripts')
-rw-r--r-- | lib/scripts/drag.js | 22 | ||||
-rw-r--r-- | lib/scripts/edit.js | 8 | ||||
-rw-r--r-- | lib/scripts/events.js | 4 | ||||
-rw-r--r-- | lib/scripts/linkwiz.js | 2 | ||||
-rw-r--r-- | lib/scripts/media.js | 463 | ||||
-rw-r--r-- | lib/scripts/script.js | 47 | ||||
-rw-r--r-- | lib/scripts/toolbar.js | 16 |
7 files changed, 500 insertions, 62 deletions
diff --git a/lib/scripts/drag.js b/lib/scripts/drag.js index fa249a996..254eab4a6 100644 --- a/lib/scripts/drag.js +++ b/lib/scripts/drag.js @@ -50,8 +50,8 @@ var drag = { this.oX = parseInt(this.obj.style.left); this.oY = parseInt(this.obj.style.top); - this.eX = drag.evX(e); - this.eY = drag.evY(e); + this.eX = e.pageX; + this.eY = e.pageY; var _this = this; this.mousehandlers = [function (e) {return _this.drag(e);}, function (e) {return _this.stop(e);}]; @@ -80,23 +80,9 @@ var drag = { */ drag: function(e) { if(this.obj) { - this.obj.style.top = (this.evY(e)+this.oY-this.eY+'px'); - this.obj.style.left = (this.evX(e)+this.oX-this.eX+'px'); + this.obj.style.top = (e.pageY+this.oY-this.eY+'px'); + this.obj.style.left = (e.pageX+this.oX-this.eX+'px'); } }, - /** - * Returns the X position of the given event. - */ - evX: function(e){ - return (e.pageX) ? e.pageX : e.clientX + document.body.scrollTop; //fixme shouldn't this be scrollLeft? - }, - - /** - * Returns the Y position of the given event. - */ - evY: function(e){ - return (e.pageY) ? e.pageY : e.clientY + document.body.scrollTop; - } - }; diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 483fcc3cc..58433f25c 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -166,14 +166,18 @@ function keyHandler(e){ // keep current indention for lists and code var match = search.match(/(\n +([\*-] ?)?)/); if(match){ + var scroll = field.scrollHeight; var match2 = search.match(/^\n +[\*-]\s*$/); // Cancel list if the last item is empty (i. e. two times enter) if (match2 && field.value.substr(selection.start).match(/^($|\n)/)) { - field.value = field.value.substr(0, linestart) + "\n"; + field.value = field.value.substr(0, linestart) + "\n" + + field.value.substr(selection.start); + selection.start = linestart + 1; + selection.end = linestart + 1; + setSelection(selection); } else { insertAtCarret(field.id,match[1]); } - var scroll = field.scrollHeight; field.scrollTop += (field.scrollHeight - scroll); e.preventDefault(); // prevent enter key return false; diff --git a/lib/scripts/events.js b/lib/scripts/events.js index e7526ced7..2ea619085 100644 --- a/lib/scripts/events.js +++ b/lib/scripts/events.js @@ -55,6 +55,10 @@ function fixEvent(event) { event.stopPropagation = fixEvent.stopPropagation; // fix target event.target = event.srcElement; + // fix coords + event.pageX = (typeof event.pageX !== 'undefined') ? event.pageX : event.clientX + document.body.scrollTop; + event.pageY = (typeof event.pageY !== 'undefined') ? event.pageY : event.clientY + document.body.scrollTop; + return event; }; fixEvent.preventDefault = function() { diff --git a/lib/scripts/linkwiz.js b/lib/scripts/linkwiz.js index 4528d9591..225868592 100644 --- a/lib/scripts/linkwiz.js +++ b/lib/scripts/linkwiz.js @@ -38,7 +38,7 @@ var linkwiz = { LANG['linkwiz']+'</div>'+ '<div>'+LANG['linkto']+' <input type="text" class="edit" id="link__wiz_entry" autocomplete="off" /></div>'+ '<div id="link__wiz_result"></div>'; - textArea.form.parentNode.appendChild(linkwiz.wiz); + $('dw__editform').parentNode.appendChild(linkwiz.wiz); linkwiz.textArea = textArea; linkwiz.result = $('link__wiz_result'); linkwiz.entry = $('link__wiz_entry'); diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 3e4213f19..f14db63d7 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -6,6 +6,13 @@ var media_manager = { keepopen: false, hide: false, + align: false, + popup: false, + id: false, + display: false, + link: false, + size: false, + ext: false, /** * Attach event handlers to all "folders" below the given element @@ -218,24 +225,359 @@ var media_manager = { }, /** - * Insert the clicked image into the opener's textarea - * - * @author Andreas Gohr <andi@splitbrain.org> + * shows the popup for a image link */ select: function(event,link){ var id = link.name.substr(2); + media_manager.id = id; if(!opener){ // if we don't run in popup display example var ex = $('ex_'+id.replace(/:/g,'_')); if(ex.style.display == ''){ ex.style.display = 'none'; - }else{ + } else { ex.style.display = ''; } return false; } - opener.insertTags('wiki__text','{{'+id+'|','}}',''); + + media_manager.ext = false; + var dot = id.lastIndexOf("."); + if (dot != -1) { + var ext = id.substr(dot,id.length); + + if (ext != '.jpg' && ext != '.jpeg' && ext != '.png' && ext != '.gif' && ext != '.swf') { + media_manager.insert(null); + return false; + } + } else { + media_manager.insert(null); + return false; + } + + media_manager.popup.style.display = 'inline'; + media_manager.popup.style.left = event.pageX + 'px'; + media_manager.popup.style.top = event.pageY + 'px'; + + // set all buttons to outset + media_manager.outSet('media__linkbtn1'); + media_manager.outSet('media__linkbtn2'); + media_manager.outSet('media__linkbtn3'); + media_manager.outSet('media__linkbtn4'); + + media_manager.outSet('media__alignbtn0'); + media_manager.outSet('media__alignbtn1'); + media_manager.outSet('media__alignbtn2'); + media_manager.outSet('media__alignbtn3'); + + media_manager.outSet('media__sizebtn1'); + media_manager.outSet('media__sizebtn2'); + media_manager.outSet('media__sizebtn3'); + media_manager.outSet('media__sizebtn4'); + + + if (ext == '.swf') { + media_manager.ext = 'swf'; + + // disable display buttons for detail and linked image + $('media__linkbtn1').style.display = 'none'; + $('media__linkbtn2').style.display = 'none'; + + // set the link button to default + if (media_manager.link != false) { + if ( media_manager.link == '2' || media_manager.link == '1') { + media_manager.inSet('media__linkbtn3'); + media_manager.link = '3'; + DokuCookie.setValue('link','3'); + } else { + media_manager.inSet('media__linkbtn'+media_manager.link); + } + } else if (DokuCookie.getValue('link')) { + if ( DokuCookie.getValue('link') == '2' || DokuCookie.getValue('link') == '1') { + // this options are not availible + media_manager.inSet('media__linkbtn3'); + media_manager.link = '3'; + DokuCookie.setValue('link','3'); + } else { + media_manager.inSet('media__linkbtn'+DokuCookie.getValue('link')); + media_manager.link = DokuCookie.getValue('link'); + } + } else { + // default case + media_manager.link = '3'; + media_manager.inSet('media__linkbtn3'); + DokuCookie.setValue('link','3'); + } + + // disable button for original size + $('media__sizebtn4').style.display = 'none'; + + } else { + media_manager.ext = 'img'; + + // ensure that the display buttons are there + $('media__linkbtn1').style.display = 'inline'; + $('media__linkbtn2').style.display = 'inline'; + $('media__sizebtn4').style.display = 'inline'; + + // set the link button to default + if (DokuCookie.getValue('link')) { + media_manager.link = DokuCookie.getValue('link'); + } + if (media_manager.link == false) { + // default case + media_manager.link = '1'; + DokuCookie.setValue('link','1'); + } + media_manager.inSet('media__linkbtn'+media_manager.link); + } + + if (media_manager.link == '4') { + media_manager.align = false; + media_manager.size = false; + $('media__align').style.display = 'none'; + $('media__size').style.display = 'none'; + } else { + $('media__align').style.display = 'block'; + $('media__size').style.display = 'block'; + + // set the align button to default + if (media_manager.align != false) { + media_manager.inSet('media__alignbtn'+media_manager.align); + } else if (DokuCookie.getValue('align')) { + media_manager.inSet('media__alignbtn'+DokuCookie.getValue('align')); + media_manager.align = DokuCookie.getValue('align'); + } else { + // default case + media_manager.align = '0'; + media_manager.inSet('media__alignbtn0'); + DokuCookie.setValue('align','0'); + } + + // set the size button to default + if (DokuCookie.getValue('size')) { + media_manager.size = DokuCookie.getValue('size'); + } + if (media_manager.size == false || (media_manager.size === '4' && ext === '.swf')) { + // default case + media_manager.size = '2'; + DokuCookie.setValue('size','2'); + } + media_manager.inSet('media__sizebtn'+media_manager.size); + + $('media__sendbtn').focus(); + } + + return false; + }, + + /** + * build the popup window + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + initpopup: function() { + + media_manager.popup = document.createElement('div'); + media_manager.popup.setAttribute('id','media__popup'); + + var root = document.getElementById('media__manager'); + if (root == null) return; + root.appendChild(media_manager.popup); + + var headline = document.createElement('h1'); + headline.innerHTML = LANG.mediatitle; + var headlineimg = document.createElement('img'); + headlineimg.src = DOKU_BASE + 'lib/images/close.png'; + headlineimg.id = 'media__closeimg'; + addEvent(headlineimg,'click',function(event){ return media_manager.closePopup(event,this); }); + headline.insertBefore(headlineimg, headline.firstChild); + media_manager.popup.appendChild(headline); + drag.attach(media_manager.popup,headline); + + // link + + var linkp = document.createElement('p'); + + linkp.id = "media__linkstyle"; + if (media_manager.display == "2") { + linkp.style.display = "none"; + } + + var linkl = document.createElement('label'); + linkl.innerHTML = LANG.mediatarget; + linkp.appendChild(linkl); + + var linkbtns = ['lnk', 'direct', 'nolnk', 'displaylnk']; + for (var i = 0 ; i < linkbtns.length ; ++i) { + var linkbtn = document.createElement('button'); + linkbtn.className = 'button'; + linkbtn.value = i + 1; + linkbtn.id = "media__linkbtn" + (i + 1); + linkbtn.title = LANG['media' + linkbtns[i]]; + linkbtn.style.borderStyle = 'outset'; + addEvent(linkbtn,'click',function(event){ return media_manager.setlink(event,this); }); + + var linkimg = document.createElement('img'); + linkimg.src = DOKU_BASE + 'lib/images/media_link_' + linkbtns[i] + '.png'; + + linkbtn.appendChild(linkimg); + linkp.appendChild(linkbtn); + } + + media_manager.popup.appendChild(linkp); + + // align + + var alignp = document.createElement('p'); + var alignl = document.createElement('label'); + + alignp.appendChild(alignl); + alignp.id = 'media__align'; + if (media_manager.display == "2") { + alignp.style.display = "none"; + } + alignl.innerHTML = LANG['mediaalign']; + + var alignbtns = ['noalign', 'left', 'center', 'right']; + for (var n = 0 ; n < alignbtns.length ; ++n) { + var alignbtn = document.createElement('button'); + var alignimg = document.createElement('img'); + alignimg.src = DOKU_BASE + 'lib/images/media_align_' + alignbtns[n] + '.png'; + + alignbtn.id = "media__alignbtn" + n; + alignbtn.value = n; + alignbtn.title = LANG['media' + alignbtns[n]]; + alignbtn.className = 'button'; + alignbtn.appendChild(alignimg); + alignbtn.style.borderStyle = 'outset'; + addEvent(alignbtn,'click',function(event){ return media_manager.setalign(event,this); }); + + alignp.appendChild(alignbtn); + } + + media_manager.popup.appendChild(alignp); + + // size + + var sizep = document.createElement('p'); + var sizel = document.createElement('label'); + + sizep.id = 'media__size'; + if (media_manager.display == "2") { + sizep.style.display = "none"; + } + sizep.appendChild(sizel); + sizel.innerHTML = LANG['mediasize']; + + var sizebtns = ['small', 'medium', 'large', 'original']; + for (var size = 0 ; size < sizebtns.length ; ++size) { + var sizebtn = document.createElement('button'); + var sizeimg = document.createElement('img'); + + sizep.appendChild(sizebtn); + sizeimg.src = DOKU_BASE + 'lib/images/media_size_' + sizebtns[size] + '.png'; + + sizebtn.className = 'button'; + sizebtn.appendChild(sizeimg); + sizebtn.value = size + 1; + sizebtn.id = 'media__sizebtn' + (size + 1); + sizebtn.title = LANG['media' + sizebtns[size]]; + sizebtn.style.borderStyle = 'outset'; + addEvent(sizebtn,'click',function(event){ return media_manager.setsize(event,this); }); + } + + media_manager.popup.appendChild(sizep); + + // send and close button + + var btnp = document.createElement('p'); + media_manager.popup.appendChild(btnp); + btnp.setAttribute('class','btnlbl'); + + var cls = document.createElement('input'); + cls.type = 'button'; + cls.setAttribute('class','button'); + cls.value = LANG['mediaclose']; + btnp.appendChild(cls); + addEvent(cls,'click',function(event){ return media_manager.closePopup(event,this); }); + + var btn = document.createElement('input'); + btn.type = 'button'; + btn.id = 'media__sendbtn'; + btn.setAttribute('class','button'); + btn.value = LANG['mediainsert']; + btnp.appendChild(btn); + addEvent(btn,'click',function(event){ return media_manager.insert(event); }); + }, + + /** + * Insert the clicked image into the opener's textarea + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + insert: function(event){ + var id = media_manager.id; + // set syntax options + $('media__popup').style.display = 'none'; + + var opts = ''; + var optsstart = ''; + var alignleft = ''; + var alignright = ''; + + if (media_manager.ext == 'img' || media_manager.ext == 'swf') { + + if (media_manager.link == '4') { + opts = '?linkonly'; + } else { + + if (media_manager.link == "3" && media_manager.ext == 'img') { + opts = '?nolink'; + optsstart = true; + } else if (media_manager.link == "2" && media_manager.ext == 'img') { + opts = '?direct'; + optsstart = true; + } + + var s = parseInt(media_manager.size); + + if (s && s >= 1) { + opts += (optsstart)?'&':'?'; + if (s=="1") { + opts += '100'; + if (media_manager.ext == 'swf') { + opts += 'x62'; + } + } else if (s=="2") { + opts += '200'; + if (media_manager.ext == 'swf') { + opts += 'x123'; + } + } else if (s=="3"){ + opts += '300'; + if (media_manager.ext == 'swf') { + opts += 'x185'; + } + } + } + if (media_manager.align == '1') { + alignleft = ''; + alignright = ' '; + } + if (media_manager.align == '2') { + alignleft = ' '; + alignright = ' '; + } + if (media_manager.align == '3') { + alignleft = ' '; + alignright = ''; + } + } + } + opener.insertTags('wiki__text','{{'+alignleft+id+opts+alignright+'|','}}',''); if(!media_manager.keepopen) window.close(); opener.focus(); @@ -340,6 +682,116 @@ var media_manager = { oflash.style.display = ''; }; oform.appendChild(clicky); + }, + + /** + * closes the link type popup + */ + closePopup: function(event) { + $('media__popup').style.display = 'none'; + }, + + /** + * set the align + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + setalign: function(event,cb){ + if(cb.value){ + DokuCookie.setValue('align',cb.value); + media_manager.align = cb.value; + media_manager.outSet("media__alignbtn0"); + media_manager.outSet("media__alignbtn1"); + media_manager.outSet("media__alignbtn2"); + media_manager.outSet("media__alignbtn3"); + media_manager.inSet("media__alignbtn"+cb.value); + }else{ + DokuCookie.setValue('align',''); + media_manager.align = false; + } + }, + /** + * set the link type + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + setlink: function(event,cb){ + if(cb.value){ + DokuCookie.setValue('link',cb.value); + media_manager.link = cb.value; + media_manager.outSet("media__linkbtn1"); + media_manager.outSet("media__linkbtn2"); + media_manager.outSet("media__linkbtn3"); + media_manager.outSet("media__linkbtn4"); + media_manager.inSet("media__linkbtn"+cb.value); + var size = document.getElementById("media__size"); + var align = document.getElementById("media__align"); + if (cb.value != '4') { + size.style.display = "block"; + align.style.display = "block"; + } else { + size.style.display = "none"; + align.style.display = "none"; + } + }else{ + DokuCookie.setValue('link',''); + media_manager.link = false; + } + }, + + /** + * set the display type + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + setdisplay: function(event,cb){ + if(cb.value){ + DokuCookie.setValue('display',cb.value); + media_manager.display = cb.value; + media_manager.outSet("media__displaybtn1"); + media_manager.outSet("media__displaybtn2"); + media_manager.inSet("media__displaybtn"+cb.value); + + }else{ + DokuCookie.setValue('display',''); + media_manager.align = false; + } + }, + + /** + * sets the border to outset + */ + outSet: function(id) { + var ele = document.getElementById(id); + if (ele == null) return; + ele.style.borderStyle = "outset"; + }, + /** + * sets the border to inset + */ + inSet: function(id) { + var ele = document.getElementById(id); + if (ele == null) return; + ele.style.borderStyle = "inset"; + }, + + /** + * set the image size + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + setsize: function(event,cb){ + if (cb.value) { + DokuCookie.setValue('size',cb.value); + media_manager.size = cb.value; + for (var i = 1 ; i <= 4 ; ++i) { + media_manager.outSet("media__sizebtn" + i); + } + media_manager.inSet("media__sizebtn"+cb.value); + } else { + DokuCookie.setValue('size',''); + media_manager.width = false; + } } }; @@ -348,5 +800,6 @@ addInitEvent(function(){ media_manager.selectorattach($('media__content')); media_manager.confirmattach($('media__content')); media_manager.attachoptions($('media__opts')); + media_manager.initpopup(); media_manager.initFlashUpload(); }); diff --git a/lib/scripts/script.js b/lib/scripts/script.js index b611f980a..bf6f41ce5 100644 --- a/lib/scripts/script.js +++ b/lib/scripts/script.js @@ -215,10 +215,7 @@ function addTocToggle() { prependChild(header,obj); obj.parentNode.onclick = toggleToc; - try { - obj.parentNode.style.cursor = 'pointer'; - obj.parentNode.style.cursor = 'hand'; - }catch(e){} + obj.parentNode.style.cursor = 'pointer'; } /** @@ -535,38 +532,24 @@ addInitEvent(function(){ * @author Andreas Gohr <andi@splitbrain.org> */ addInitEvent(function(){ - var break_classes = new RegExp('secedit|toc|page'); var btns = getElementsByClass('btn_secedit',document,'form'); for(var i=0; i<btns.length; i++){ - switch(btns[i].parentNode.className.match(/editbutton_(\w+)/)[1]) { - case 'plain': - addEvent(btns[i],'mouseover',function(e){ - var tgt = e.target.form.parentNode; - do { - tgt = tgt.previousSibling; - } while (tgt && !tgt.tagName); - if (!tgt) return; - if(tgt.nodeName != "DIV") tgt = tgt.previousSibling; - while(!break_classes.test(tgt.className)) { + addEvent(btns[i],'mouseover',function(e){ + var tgt = e.target.form.parentNode; + var nr = tgt.className.match(/(\s+|^)editbutton_(\d+)(\s+|$)/)[2]; + do { + tgt = tgt.previousSibling; + } while (tgt !== null && typeof tgt.tagName === 'undefined'); + if (tgt === null) return; + while(typeof tgt.className === 'undefined' || + tgt.className.match('(\\s+|^)sectionedit' + nr + '(\\s+|$)') === null) { + if (typeof tgt.className !== 'undefined') { tgt.className += ' section_highlight'; - if (tgt.tagName == 'H1') break; - tgt = (tgt.previousSibling != null) ? tgt.previousSibling : tgt.parentNode; } - }); - break; - - case 'table': - addEvent(btns[i],'mouseover',function(e){ - var tgt = e.target.form.parentNode; - do { - tgt = tgt.previousSibling; - } while (tgt && !tgt.tagName); - if (tgt && tgt.tagName === 'TABLE') { - tgt.className += ' section_highlight'; - } - }); - break; - } + tgt = (tgt.previousSibling !== null) ? tgt.previousSibling : tgt.parentNode; + } + if (typeof tgt.className !== 'undefined') tgt.className += ' section_highlight'; + }); addEvent(btns[i],'mouseout',function(e){ var secs = getElementsByClass('section_highlight'); diff --git a/lib/scripts/toolbar.js b/lib/scripts/toolbar.js index 99ad1bb9c..3f967448c 100644 --- a/lib/scripts/toolbar.js +++ b/lib/scripts/toolbar.js @@ -5,23 +5,31 @@ var pickercounter=0; /** * Create a toolbar * - * @param string tbid ID of the element where to insert the toolbar - * @param string edid ID of the editor textarea - * @param array tb Associative array defining the buttons + * @param string tbid ID of the element where to insert the toolbar + * @param string edid ID of the editor textarea + * @param array tb Associative array defining the buttons + * @param bool allowblock Allow buttons creating multiline content * @author Andreas Gohr <andi@splitbrain.org> */ -function initToolbar(tbid,edid,tb){ +function initToolbar(tbid,edid,tb, allowblock){ var toolbar = $(tbid); if(!toolbar) return; var edit = $(edid); if(!edit) return; if(edit.readOnly) return; + if (typeof allowblock === 'undefined') { + allowblock = true; + } + //empty the toolbar area: toolbar.innerHTML=''; var cnt = tb.length; for(var i=0; i<cnt; i++){ + if (!allowblock && tb[i].block === true) { + continue; + } var actionFunc; // create new button |