diff options
Diffstat (limited to 'wiki/lib/scripts/toolbar.js')
-rw-r--r-- | wiki/lib/scripts/toolbar.js | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/wiki/lib/scripts/toolbar.js b/wiki/lib/scripts/toolbar.js new file mode 100644 index 0000000..b766f8b --- /dev/null +++ b/wiki/lib/scripts/toolbar.js @@ -0,0 +1,282 @@ +// used to identify pickers +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 bool allowblock Allow buttons creating multiline content + * @author Andreas Gohr <andi@splitbrain.org> + */ +function initToolbar(tbid,edid,tb, allowblock){ + var $toolbar, $edit; + if (typeof tbid == 'string') { + $toolbar = jQuery('#' + tbid); + } else { + $toolbar = jQuery(tbid); + } + + $edit = jQuery('#' + edid); + + if ($toolbar.length == 0 || $edit.length == 0 || $edit.attr('readOnly')) { + return; + } + + if (typeof allowblock === 'undefined') { + allowblock = true; + } + + //empty the toolbar area: + $toolbar.html(''); + + jQuery.each(tb, function (k, val) { + if (!tb.hasOwnProperty(k) || (!allowblock && val.block === true)) { + return; + } + var actionFunc, $btn; + + // create new button (jQuery object) + $btn = jQuery(createToolButton(val.icon, val.title, val.key, val.id, + val['class'])); + + // type is a tb function -> assign it as onclick + actionFunc = 'tb_'+val.type; + if( jQuery.isFunction(window[actionFunc]) ){ + $btn.on('click', bind(window[actionFunc],$btn,val,edid) ); + $toolbar.append($btn); + return; + } + + // type is a init function -> execute it + actionFunc = 'addBtnAction'+val.type.charAt(0).toUpperCase()+val.type.substring(1); + if( jQuery.isFunction(window[actionFunc]) ){ + var pickerid = window[actionFunc]($btn, val, edid); + if(pickerid !== ''){ + $toolbar.append($btn); + $btn.attr('aria-controls', pickerid); + if (actionFunc === 'addBtnActionPicker') { + $btn.attr('aria-haspopup', 'true'); + } + } + return; + } + + alert('unknown toolbar type: '+val.type+' '+actionFunc); + }); +} + +/** + * Button action for format buttons + * + * @param DOMElement btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @author Gabriel Birke <birke@d-scribe.de> + * @author Andreas Gohr <andi@splitbrain.org> + */ +function tb_format(btn, props, edid) { + var sample = props.sample || props.title; + insertTags(edid, + fixtxt(props.open), + fixtxt(props.close), + fixtxt(sample)); + pickerClose(); + return false; +} + +/** + * Button action for format buttons + * + * This works exactly as tb_format() except that, if multiple lines + * are selected, each line will be formatted seperately + * + * @param DOMElement btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @author Gabriel Birke <birke@d-scribe.de> + * @author Andreas Gohr <andi@splitbrain.org> + */ +function tb_formatln(btn, props, edid) { + var sample = props.sample || props.title, + opts, + selection = DWgetSelection(jQuery('#'+edid)[0]); + + sample = fixtxt(sample); + props.open = fixtxt(props.open); + props.close = fixtxt(props.close); + + // is something selected? + if(selection.getLength()){ + sample = selection.getText(); + opts = {nosel: true}; + }else{ + opts = { + startofs: props.open.length, + endofs: props.close.length + }; + } + + sample = sample.split("\n").join(props.close+"\n"+props.open); + sample = props.open+sample+props.close; + + pasteText(selection,sample,opts); + + pickerClose(); + return false; +} + +/** + * Button action for insert buttons + * + * @param DOMElement btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @author Gabriel Birke <birke@d-scribe.de> + * @author Andreas Gohr <andi@splitbrain.org> + */ +function tb_insert(btn, props, edid) { + insertAtCarret(edid,fixtxt(props.insert)); + pickerClose(); + return false; +} + +/** + * Button action for the media popup + * + * @param DOMElement btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @author Andreas Gohr <andi@splitbrain.org> + */ +function tb_mediapopup(btn, props, edid) { + window.open( + DOKU_BASE+props.url+encodeURIComponent(NS)+'&edid='+encodeURIComponent(edid), + props.name, + props.options); + return false; +} + +/** + * Button action for automatic headlines + * + * Insert a new headline based on the current section level + * + * @param DOMElement btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @author Andreas Gohr <andi@splitbrain.org> + */ +function tb_autohead(btn, props, edid){ + var lvl = currentHeadlineLevel(edid), + tags; + + // determine new level + lvl += props.mod; + if(lvl < 1) lvl = 1; + if(lvl > 5) lvl = 5; + + tags = (new Array(8 - lvl)).join('='); + insertTags(edid, tags+' ', ' '+tags+"\n", props.text); + pickerClose(); + return false; +} + + +/** + * Add button action for picker buttons and create picker element + * + * @param jQuery btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @return boolean If button should be appended + * @author Gabriel Birke <birke@d-scribe.de> + */ +function addBtnActionPicker($btn, props, edid) { + var pickerid = 'picker'+(pickercounter++); + var picker = createPicker(pickerid, props, edid); + jQuery(picker).attr('aria-hidden', 'true'); + + $btn.click( + function(e) { + pickerToggle(pickerid,$btn); + e.preventDefault(); + return ''; + } + ); + + return pickerid; +} + +/** + * Add button action for the link wizard button + * + * @param DOMElement btn Button element to add the action to + * @param array props Associative array of button properties + * @param string edid ID of the editor textarea + * @return boolean If button should be appended + * @author Andreas Gohr <gohr@cosmocode.de> + */ +function addBtnActionLinkwiz($btn, props, edid) { + dw_linkwiz.init(jQuery('#'+edid)); + jQuery($btn).click(function(e){ + dw_linkwiz.val = props; + dw_linkwiz.toggle(); + e.preventDefault(); + return ''; + }); + return 'link__wiz'; +} + + +/** + * Show/Hide a previously created picker window + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function pickerToggle(pickerid,$btn){ + var $picker = jQuery('#' + pickerid), + pos = $btn.offset(); + if ($picker.hasClass('a11y')) { + $picker.removeClass('a11y').attr('aria-hidden', 'false'); + } else { + $picker.addClass('a11y').attr('aria-hidden', 'true'); + } + var picker_left = pos.left + 3, + picker_width = $picker.width(), + window_width = jQuery(window).width(); + if (picker_width > 300) { + $picker.css("max-width", "300"); + picker_width = 300; + } + if ((picker_left + picker_width + 40) > window_width) { + picker_left = window_width - picker_width - 40; + } + if (picker_left < 0) { + picker_left = 0; + } + $picker.offset({left: picker_left, top: pos.top+$btn[0].offsetHeight+3}); +} + +/** + * Close all open pickers + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function pickerClose(){ + jQuery('.picker').addClass('a11y'); +} + + +/** + * Replaces \n with linebreaks + */ +function fixtxt(str){ + return str.replace(/\\n/g,"\n"); +} + +jQuery(function () { + initToolbar('tool__bar','wiki__text',toolbar); + jQuery('#tool__bar').attr('role', 'toolbar'); +}); |