Language patch pt-br for login.txt
[dokuwiki.git] / lib / scripts / toolbar.js
blobb766f8b8536bc8afca3df538c9774f989a0c294a
1 // used to identify pickers
2 var pickercounter=0;
4 /**
5  * Create a toolbar
6  *
7  * @param  string tbid       ID of the element where to insert the toolbar
8  * @param  string edid       ID of the editor textarea
9  * @param  array  tb         Associative array defining the buttons
10  * @param  bool   allowblock Allow buttons creating multiline content
11  * @author Andreas Gohr <andi@splitbrain.org>
12  */
13 function initToolbar(tbid,edid,tb, allowblock){
14     var $toolbar, $edit;
15     if (typeof tbid == 'string') {
16         $toolbar = jQuery('#' + tbid);
17     } else {
18         $toolbar = jQuery(tbid);
19     }
21     $edit = jQuery('#' + edid);
23     if ($toolbar.length == 0 || $edit.length == 0 || $edit.attr('readOnly')) {
24         return;
25     }
27     if (typeof allowblock === 'undefined') {
28         allowblock = true;
29     }
31     //empty the toolbar area:
32     $toolbar.html('');
34     jQuery.each(tb, function (k, val) {
35         if (!tb.hasOwnProperty(k) || (!allowblock && val.block === true)) {
36             return;
37         }
38         var actionFunc, $btn;
40         // create new button (jQuery object)
41         $btn = jQuery(createToolButton(val.icon, val.title, val.key, val.id,
42                                        val['class']));
44         // type is a tb function -> assign it as onclick
45         actionFunc = 'tb_'+val.type;
46         if( jQuery.isFunction(window[actionFunc]) ){
47             $btn.on('click', bind(window[actionFunc],$btn,val,edid) );
48             $toolbar.append($btn);
49             return;
50         }
52         // type is a init function -> execute it
53         actionFunc = 'addBtnAction'+val.type.charAt(0).toUpperCase()+val.type.substring(1);
54         if( jQuery.isFunction(window[actionFunc]) ){
55             var pickerid = window[actionFunc]($btn, val, edid);
56             if(pickerid !== ''){
57                 $toolbar.append($btn);
58                 $btn.attr('aria-controls', pickerid);
59                 if (actionFunc === 'addBtnActionPicker') {
60                     $btn.attr('aria-haspopup', 'true');
61                 }
62             }
63             return;
64         }
66         alert('unknown toolbar type: '+val.type+'  '+actionFunc);
67     });
70 /**
71  * Button action for format buttons
72  *
73  * @param  DOMElement btn   Button element to add the action to
74  * @param  array      props Associative array of button properties
75  * @param  string     edid  ID of the editor textarea
76  * @author Gabriel Birke <birke@d-scribe.de>
77  * @author Andreas Gohr <andi@splitbrain.org>
78  */
79 function tb_format(btn, props, edid) {
80     var sample = props.sample || props.title;
81     insertTags(edid,
82                fixtxt(props.open),
83                fixtxt(props.close),
84                fixtxt(sample));
85     pickerClose();
86     return false;
89 /**
90  * Button action for format buttons
91  *
92  * This works exactly as tb_format() except that, if multiple lines
93  * are selected, each line will be formatted seperately
94  *
95  * @param  DOMElement btn   Button element to add the action to
96  * @param  array      props Associative array of button properties
97  * @param  string     edid  ID of the editor textarea
98  * @author Gabriel Birke <birke@d-scribe.de>
99  * @author Andreas Gohr <andi@splitbrain.org>
100  */
101 function tb_formatln(btn, props, edid) {
102     var sample = props.sample || props.title,
103         opts,
104         selection = DWgetSelection(jQuery('#'+edid)[0]);
106     sample = fixtxt(sample);
107     props.open  = fixtxt(props.open);
108     props.close = fixtxt(props.close);
110     // is something selected?
111     if(selection.getLength()){
112         sample = selection.getText();
113         opts = {nosel: true};
114     }else{
115         opts = {
116             startofs: props.open.length,
117             endofs: props.close.length
118         };
119     }
121     sample = sample.split("\n").join(props.close+"\n"+props.open);
122     sample = props.open+sample+props.close;
124     pasteText(selection,sample,opts);
126     pickerClose();
127     return false;
131  * Button action for insert buttons
133  * @param  DOMElement btn   Button element to add the action to
134  * @param  array      props Associative array of button properties
135  * @param  string     edid  ID of the editor textarea
136  * @author Gabriel Birke <birke@d-scribe.de>
137  * @author Andreas Gohr <andi@splitbrain.org>
138  */
139 function tb_insert(btn, props, edid) {
140     insertAtCarret(edid,fixtxt(props.insert));
141     pickerClose();
142     return false;
146  * Button action for the media popup
148  * @param  DOMElement btn   Button element to add the action to
149  * @param  array      props Associative array of button properties
150  * @param  string     edid  ID of the editor textarea
151  * @author Andreas Gohr <andi@splitbrain.org>
152  */
153 function tb_mediapopup(btn, props, edid) {
154     window.open(
155         DOKU_BASE+props.url+encodeURIComponent(NS)+'&edid='+encodeURIComponent(edid),
156         props.name,
157         props.options);
158     return false;
162  * Button action for automatic headlines
164  * Insert a new headline based on the current section level
166  * @param  DOMElement btn   Button element to add the action to
167  * @param  array      props Associative array of button properties
168  * @param  string     edid  ID of the editor textarea
169  * @author Andreas Gohr <andi@splitbrain.org>
170  */
171 function tb_autohead(btn, props, edid){
172     var lvl = currentHeadlineLevel(edid),
173         tags;
175     // determine new level
176     lvl += props.mod;
177     if(lvl < 1) lvl = 1;
178     if(lvl > 5) lvl = 5;
180     tags = (new Array(8 - lvl)).join('=');
181     insertTags(edid, tags+' ', ' '+tags+"\n", props.text);
182     pickerClose();
183     return false;
188  * Add button action for picker buttons and create picker element
190  * @param  jQuery      btn   Button element to add the action to
191  * @param  array      props Associative array of button properties
192  * @param  string     edid  ID of the editor textarea
193  * @return boolean    If button should be appended
194  * @author Gabriel Birke <birke@d-scribe.de>
195  */
196 function addBtnActionPicker($btn, props, edid) {
197     var pickerid = 'picker'+(pickercounter++);
198     var picker = createPicker(pickerid, props, edid);
199     jQuery(picker).attr('aria-hidden', 'true');
201     $btn.click(
202         function(e) {
203             pickerToggle(pickerid,$btn);
204             e.preventDefault();
205             return '';
206         }
207     );
209     return pickerid;
213  * Add button action for the link wizard button
215  * @param  DOMElement btn   Button element to add the action to
216  * @param  array      props Associative array of button properties
217  * @param  string     edid  ID of the editor textarea
218  * @return boolean    If button should be appended
219  * @author Andreas Gohr <gohr@cosmocode.de>
220  */
221 function addBtnActionLinkwiz($btn, props, edid) {
222     dw_linkwiz.init(jQuery('#'+edid));
223     jQuery($btn).click(function(e){
224         dw_linkwiz.val = props;
225         dw_linkwiz.toggle();
226         e.preventDefault();
227         return '';
228     });
229     return 'link__wiz';
234  * Show/Hide a previously created picker window
236  * @author Andreas Gohr <andi@splitbrain.org>
237  */
238 function pickerToggle(pickerid,$btn){
239     var $picker = jQuery('#' + pickerid),
240         pos = $btn.offset();
241     if ($picker.hasClass('a11y')) {
242         $picker.removeClass('a11y').attr('aria-hidden', 'false');
243     } else {
244         $picker.addClass('a11y').attr('aria-hidden', 'true');
245     }
246     var picker_left = pos.left + 3,
247         picker_width = $picker.width(),
248         window_width = jQuery(window).width();
249     if (picker_width > 300) {
250         $picker.css("max-width", "300");
251         picker_width = 300;
252     }
253     if ((picker_left + picker_width + 40) > window_width) {
254         picker_left = window_width - picker_width - 40;
255     }
256     if (picker_left < 0) {
257         picker_left = 0;
258     }
259     $picker.offset({left: picker_left, top: pos.top+$btn[0].offsetHeight+3});
263  * Close all open pickers
265  * @author Andreas Gohr <andi@splitbrain.org>
266  */
267 function pickerClose(){
268     jQuery('.picker').addClass('a11y');
273  * Replaces \n with linebreaks
274  */
275 function fixtxt(str){
276     return str.replace(/\\n/g,"\n");
279 jQuery(function () {
280     initToolbar('tool__bar','wiki__text',toolbar);
281     jQuery('#tool__bar').attr('role', 'toolbar');