123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- // 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');
- });
|