1 |
|
---|
2 | // used to identify pickers
|
---|
3 | var pickercounter=0;
|
---|
4 |
|
---|
5 | /**
|
---|
6 | * Create a toolbar
|
---|
7 | *
|
---|
8 | * @param string tbid ID of the element where to insert the toolbar
|
---|
9 | * @param string edid ID of the editor textarea
|
---|
10 | * @param array tb Associative array defining the buttons
|
---|
11 | * @param bool allowblock Allow buttons creating multiline content
|
---|
12 | * @author Andreas Gohr <[email protected]>
|
---|
13 | */
|
---|
14 | function initToolbar(tbid,edid,tb, allowblock){
|
---|
15 | var toolbar = $(tbid);
|
---|
16 | if(!toolbar) return;
|
---|
17 | var edit = $(edid);
|
---|
18 | if(!edit) return;
|
---|
19 | if(edit.readOnly) return;
|
---|
20 |
|
---|
21 | if (typeof allowblock === 'undefined') {
|
---|
22 | allowblock = true;
|
---|
23 | }
|
---|
24 |
|
---|
25 | //empty the toolbar area:
|
---|
26 | toolbar.innerHTML='';
|
---|
27 |
|
---|
28 | var cnt = tb.length;
|
---|
29 | for(var i=0; i<cnt; i++){
|
---|
30 | if (!allowblock && tb[i].block === true) {
|
---|
31 | continue;
|
---|
32 | }
|
---|
33 | var actionFunc;
|
---|
34 |
|
---|
35 | // create new button
|
---|
36 | var btn = createToolButton(tb[i]['icon'],
|
---|
37 | tb[i]['title'],
|
---|
38 | tb[i]['key'],
|
---|
39 | tb[i]['id'],
|
---|
40 | tb[i]['class']);
|
---|
41 |
|
---|
42 |
|
---|
43 | // type is a tb function -> assign it as onclick
|
---|
44 | actionFunc = 'tb_'+tb[i]['type'];
|
---|
45 | if( isFunction(window[actionFunc]) ){
|
---|
46 | addEvent(btn,'click', bind(window[actionFunc],btn,tb[i],edid));
|
---|
47 | toolbar.appendChild(btn);
|
---|
48 | continue;
|
---|
49 | }
|
---|
50 |
|
---|
51 | // type is a init function -> execute it
|
---|
52 | actionFunc = 'addBtnAction'+tb[i]['type'].charAt(0).toUpperCase()+tb[i]['type'].substring(1);
|
---|
53 | if( isFunction(window[actionFunc]) ){
|
---|
54 | if(window[actionFunc](btn, tb[i], edid)){
|
---|
55 | toolbar.appendChild(btn);
|
---|
56 | }
|
---|
57 | continue;
|
---|
58 | }
|
---|
59 |
|
---|
60 | alert('unknown toolbar type: '+tb[i]['type']+' '+actionFunc);
|
---|
61 | } // end for
|
---|
62 |
|
---|
63 | }
|
---|
64 |
|
---|
65 | /**
|
---|
66 | * Button action for format buttons
|
---|
67 | *
|
---|
68 | * @param DOMElement btn Button element to add the action to
|
---|
69 | * @param array props Associative array of button properties
|
---|
70 | * @param string edid ID of the editor textarea
|
---|
71 | * @author Gabriel Birke <[email protected]>
|
---|
72 | * @author Andreas Gohr <[email protected]>
|
---|
73 | */
|
---|
74 | function tb_format(btn, props, edid) {
|
---|
75 | var sample = props['title'];
|
---|
76 | if(props['sample']){
|
---|
77 | sample = props['sample'];
|
---|
78 | }
|
---|
79 | insertTags(edid,
|
---|
80 | fixtxt(props['open']),
|
---|
81 | fixtxt(props['close']),
|
---|
82 | fixtxt(sample));
|
---|
83 | pickerClose();
|
---|
84 | return false;
|
---|
85 | }
|
---|
86 |
|
---|
87 | /**
|
---|
88 | * Button action for format buttons
|
---|
89 | *
|
---|
90 | * This works exactly as tb_format() except that, if multiple lines
|
---|
91 | * are selected, each line will be formatted seperately
|
---|
92 | *
|
---|
93 | * @param DOMElement btn Button element to add the action to
|
---|
94 | * @param array props Associative array of button properties
|
---|
95 | * @param string edid ID of the editor textarea
|
---|
96 | * @author Gabriel Birke <[email protected]>
|
---|
97 | * @author Andreas Gohr <[email protected]>
|
---|
98 | */
|
---|
99 | function tb_formatln(btn, props, edid) {
|
---|
100 | var sample = props['title'];
|
---|
101 | if(props['sample']){
|
---|
102 | sample = props['sample'];
|
---|
103 | }
|
---|
104 | sample = fixtxt(sample);
|
---|
105 |
|
---|
106 | props['open'] = fixtxt(props['open']);
|
---|
107 | props['close'] = fixtxt(props['close']);
|
---|
108 |
|
---|
109 | // is something selected?
|
---|
110 | var opts;
|
---|
111 | var selection = getSelection($(edid));
|
---|
112 | if(selection.getLength()){
|
---|
113 | sample = selection.getText();
|
---|
114 | opts = {nosel: true};
|
---|
115 | }else{
|
---|
116 | opts = {
|
---|
117 | startofs: props['open'].length,
|
---|
118 | endofs: props['close'].length
|
---|
119 | };
|
---|
120 | }
|
---|
121 |
|
---|
122 | sample = sample.split("\n").join(props['close']+"\n"+props['open']);
|
---|
123 | sample = props['open']+sample+props['close'];
|
---|
124 |
|
---|
125 | pasteText(selection,sample,opts);
|
---|
126 |
|
---|
127 | pickerClose();
|
---|
128 | return false;
|
---|
129 | }
|
---|
130 |
|
---|
131 | /**
|
---|
132 | * Button action for insert buttons
|
---|
133 | *
|
---|
134 | * @param DOMElement btn Button element to add the action to
|
---|
135 | * @param array props Associative array of button properties
|
---|
136 | * @param string edid ID of the editor textarea
|
---|
137 | * @author Gabriel Birke <[email protected]>
|
---|
138 | * @author Andreas Gohr <[email protected]>
|
---|
139 | */
|
---|
140 | function tb_insert(btn, props, edid) {
|
---|
141 | insertAtCarret(edid,fixtxt(props['insert']));
|
---|
142 | pickerClose();
|
---|
143 | return false;
|
---|
144 | }
|
---|
145 |
|
---|
146 | /**
|
---|
147 | * Button action for the media popup
|
---|
148 | *
|
---|
149 | * @param DOMElement btn Button element to add the action to
|
---|
150 | * @param array props Associative array of button properties
|
---|
151 | * @param string edid ID of the editor textarea
|
---|
152 | * @author Andreas Gohr <[email protected]>
|
---|
153 | */
|
---|
154 | function tb_mediapopup(btn, props, edid) {
|
---|
155 | window.open(
|
---|
156 | DOKU_BASE+props['url']+encodeURIComponent(NS)+'&edid='+encodeURIComponent(edid),
|
---|
157 | props['name'],
|
---|
158 | props['options']);
|
---|
159 | return false;
|
---|
160 | }
|
---|
161 |
|
---|
162 | /**
|
---|
163 | * Button action for automatic headlines
|
---|
164 | *
|
---|
165 | * Insert a new headline based on the current section level
|
---|
166 | *
|
---|
167 | * @param DOMElement btn Button element to add the action to
|
---|
168 | * @param array props Associative array of button properties
|
---|
169 | * @param string edid ID of the editor textarea
|
---|
170 | * @author Andreas Gohr <[email protected]>
|
---|
171 | */
|
---|
172 | function tb_autohead(btn, props, edid){
|
---|
173 | var lvl = currentHeadlineLevel(edid);
|
---|
174 |
|
---|
175 | // determine new level
|
---|
176 | lvl += props['mod'];
|
---|
177 | if(lvl < 1) lvl = 1;
|
---|
178 | if(lvl > 5) lvl = 5;
|
---|
179 |
|
---|
180 | var tags = '=';
|
---|
181 | for(var i=0; i<=5-lvl; i++) tags += '=';
|
---|
182 | insertTags(edid, tags+' ', ' '+tags+"\n", props['text']);
|
---|
183 | pickerClose();
|
---|
184 | return false;
|
---|
185 | }
|
---|
186 |
|
---|
187 |
|
---|
188 | /**
|
---|
189 | * Add button action for picker buttons and create picker element
|
---|
190 | *
|
---|
191 | * @param DOMElement btn Button element to add the action to
|
---|
192 | * @param array props Associative array of button properties
|
---|
193 | * @param string edid ID of the editor textarea
|
---|
194 | * @return boolean If button should be appended
|
---|
195 | * @author Gabriel Birke <[email protected]>
|
---|
196 | */
|
---|
197 | function addBtnActionPicker(btn, props, edid) {
|
---|
198 | var pickerid = 'picker'+(pickercounter++);
|
---|
199 | createPicker(pickerid, props, edid);
|
---|
200 | addEvent(btn,'click',function(){
|
---|
201 | pickerToggle(pickerid,btn);
|
---|
202 | return false;
|
---|
203 | });
|
---|
204 | return true;
|
---|
205 | }
|
---|
206 |
|
---|
207 | /**
|
---|
208 | * Add button action for the link wizard button
|
---|
209 | *
|
---|
210 | * @param DOMElement btn Button element to add the action to
|
---|
211 | * @param array props Associative array of button properties
|
---|
212 | * @param string edid ID of the editor textarea
|
---|
213 | * @return boolean If button should be appended
|
---|
214 | * @author Andreas Gohr <[email protected]>
|
---|
215 | */
|
---|
216 | function addBtnActionLinkwiz(btn, props, edid) {
|
---|
217 | linkwiz.init($(edid));
|
---|
218 | addEvent(btn,'click',function(){
|
---|
219 | linkwiz.toggle();
|
---|
220 | return false;
|
---|
221 | });
|
---|
222 | return true;
|
---|
223 | }
|
---|
224 |
|
---|
225 | /**
|
---|
226 | * Show/Hide a previosly created picker window
|
---|
227 | *
|
---|
228 | * @author Andreas Gohr <[email protected]>
|
---|
229 | */
|
---|
230 | function pickerToggle(pickerid,btn){
|
---|
231 | var picker = $(pickerid);
|
---|
232 | if(picker.style.marginLeft == '-10000px'){
|
---|
233 | var x = findPosX(btn);
|
---|
234 | var y = findPosY(btn);
|
---|
235 | picker.style.left = (x+3)+'px';
|
---|
236 | picker.style.top = (y+btn.offsetHeight+3)+'px';
|
---|
237 | picker.style.marginLeft = '0px';
|
---|
238 | picker.style.marginTop = '0px';
|
---|
239 | }else{
|
---|
240 | picker.style.marginLeft = '-10000px';
|
---|
241 | picker.style.marginTop = '-10000px';
|
---|
242 | }
|
---|
243 | }
|
---|
244 |
|
---|
245 | /**
|
---|
246 | * Close all open pickers
|
---|
247 | *
|
---|
248 | * @author Andreas Gohr <[email protected]>
|
---|
249 | */
|
---|
250 | function pickerClose(){
|
---|
251 | var pobjs = getElementsByClass('picker');
|
---|
252 | for(var i=0; i<pobjs.length; i++){
|
---|
253 | pobjs[i].style.marginLeft = '-10000px';
|
---|
254 | pobjs[i].style.marginTop = '-10000px';
|
---|
255 | }
|
---|
256 | }
|
---|
257 |
|
---|
258 |
|
---|
259 | /**
|
---|
260 | * Replaces \n with linebreaks
|
---|
261 | */
|
---|
262 | function fixtxt(str){
|
---|
263 | return str.replace(/\\n/g,"\n");
|
---|
264 | }
|
---|
265 |
|
---|