summaryrefslogtreecommitdiff
path: root/lib/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/scripts')
-rw-r--r--lib/scripts/drag.js22
-rw-r--r--lib/scripts/edit.js8
-rw-r--r--lib/scripts/events.js4
-rw-r--r--lib/scripts/linkwiz.js2
-rw-r--r--lib/scripts/media.js463
-rw-r--r--lib/scripts/script.js47
-rw-r--r--lib/scripts/toolbar.js16
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