/[webpac2]/Webpacus/root/editor/quicktags.js
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /Webpacus/root/editor/quicktags.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 197 - (show annotations)
Tue Nov 29 15:30:03 2005 UTC (18 years, 5 months ago) by dpavlin
File MIME type: application/javascript
File size: 8470 byte(s)
 r11261@llin:  dpavlin | 2005-11-29 16:32:54 +0100
 close open tags works in multiple textareas

1 /*
2 original version from WordPress
3 by Alex King http://www.alexking.org/
4
5 tax fix and conversion to Prototype by Dobrica Pavlinusic <dpavlin@rot13.org>
6 */
7
8
9 var edButtons = new Array();
10 var edLinks = new Array();
11 var edOpenTags = new Array();
12 var edCanvas = null;
13
14 function edButton(id, display, tagStart, tagEnd, access, open) {
15 Logger.debug('edButton '+id+': '+display);
16 this.id = id; // used to name the toolbar button
17 this.display = display; // label on button
18 this.tagStart = tagStart; // open tag
19 this.tagEnd = tagEnd; // close tag
20 this.access = access; // access key
21 this.open = open; // set to -1 if tag does not need to be closed
22 }
23
24 edButtons[edButtons.length] =
25 new edButton('ed_div'
26 ,'div'
27 ,'<div>\n'
28 ,'\n</div>\n'
29 ,'d'
30 );
31
32 edButtons[edButtons.length] =
33 new edButton('ed_span'
34 ,'span'
35 ,'<span>'
36 ,'</span>'
37 ,'s'
38 );
39
40 edButtons[edButtons.length] =
41 new edButton('ed_strong'
42 ,'str'
43 ,'<strong>'
44 ,'</strong>'
45 ,'b'
46 );
47
48 edButtons[edButtons.length] =
49 new edButton('ed_em'
50 ,'em'
51 ,'<em>'
52 ,'</em>'
53 ,'i'
54 );
55
56 /*
57 edButtons[edButtons.length] =
58 new edButton('ed_pre'
59 ,'code'
60 ,'<code>'
61 ,'</code>'
62 ,'c'
63 );
64
65 edButtons[edButtons.length] =
66 new edButton('ed_block'
67 ,'b-quote'
68 ,'<blockquote>'
69 ,'</blockquote>'
70 ,'q'
71 );
72 */
73
74 edButtons[edButtons.length] =
75 new edButton('ed_link'
76 ,'link'
77 ,''
78 ,'</a>'
79 ,'a'
80 ); // special case
81
82 function edLink() {
83 this.display = '';
84 this.URL = '';
85 this.newWin = 0;
86 }
87
88 edButtons[edButtons.length] =
89 new edButton('ed_table'
90 ,'table'
91 ,'\n<table>\n'
92 ,'\n</table>\n'
93 ,'t'
94 );
95
96 edButtons[edButtons.length] =
97 new edButton('ed_tr'
98 ,'tr'
99 ,'<tr>'
100 ,'</tr>'
101 ,'r'
102 );
103
104 edButtons[edButtons.length] =
105 new edButton('ed_td'
106 ,'td'
107 ,'<td>'
108 ,'</td>'
109 ,'e'
110 );
111
112 function edShowButton(name, button, i) {
113 if (button.id == 'ed_link') {
114 return('<input type="button" id="' + name + '_' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(\''+name+'\', ' + i + ');" value="' + button.display + '" />');
115 }
116 else {
117 return('<input type="button" id="' + name + '_' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(\''+name+'\', ' + i + ');" value="' + button.display + '" />');
118 }
119 }
120
121 function edAddTag(name, button) {
122 if (edButtons[button].tagEnd != '') {
123 edOpenTags[name][ edOpenTags[name].length ] = button;
124 $( name + '_' + edButtons[button].id ).value = '/' + $( name + '_' + edButtons[button].id ).value;
125 }
126 }
127
128 function edRemoveTag(name, button) {
129 for (i = 0; i < edOpenTags[name].length; i++) {
130 if (edOpenTags[name][i] == button) {
131 edOpenTags[name].splice(i, 1);
132 $( name + '_' + edButtons[button].id ).value = $( name + '_' + edButtons[button].id ).value.replace('/', '');
133 }
134 }
135 }
136
137 function edCheckOpenTags(name, button) {
138 var tag = 0;
139 for (i = 0; i < edOpenTags[name].length; i++) {
140 if (edOpenTags[name][i] == button) {
141 tag++;
142 }
143 }
144 if (tag > 0) {
145 return true; // tag found
146 }
147 else {
148 return false; // tag not found
149 }
150 }
151
152 function edCloseAllTags( name ) {
153 var count = edOpenTags[name].length;
154 Logger.info('edCloseAllTags '+name+' count:'+count);
155 for (o = 0; o < count; o++) {
156 edInsertTag(name, edOpenTags[name][ edOpenTags[name].length - 1 ]);
157 }
158 }
159
160 var edActiveToolbar = {};
161
162 function edToolbar( name ) {
163
164 if (edActiveToolbar[name]) return false;
165
166 var toolbar_div = name + '_toolbar';
167
168 Logger.info('edToolbar of '+name+' is '+toolbar_div);
169
170 var div = $( toolbar_div );
171 if (! div) {
172 Logger.error('div not found');
173 return false;
174 }
175
176 var toolbar = '';
177
178 for (var i = 0; i < edButtons.length; i++) {
179 toolbar += edShowButton(name, edButtons[i], i);
180 }
181 toolbar += '&nbsp;&nbsp';
182 toolbar += '<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags(\''+name+'\');" title="Close all open tags" value="Close Tags" />';
183
184 div.innerHTML = toolbar;
185
186 edActiveToolbar[name] = 1;
187 edOpenTags[name] = new Array();
188
189 Logger.debug('edActiveToolbar['+name+'] = '+edActiveToolbar[name]);
190 return false;
191 }
192
193 // insertion code
194
195 function edInsertTag(name, i) {
196
197 myField = $( name );
198 if (! myField) {
199 Logger.error("can't find "+name);
200 return false;
201 }
202
203 var pos = myField.scrollTop;
204 Logger.debug('edInsertTag '+name+','+i+'; scrollTop='+pos);
205
206 //IE support
207 if (document.selection) {
208 myField.focus();
209 sel = document.selection.createRange();
210 if (sel.text.length > 0) {
211 sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
212 }
213 else {
214 if (!edCheckOpenTags(name, i) || edButtons[i].tagEnd == '') {
215 sel.text = edButtons[i].tagStart;
216 edAddTag(name, i);
217 }
218 else {
219 sel.text = edButtons[i].tagEnd;
220 edRemoveTag(name, i);
221 }
222 }
223 myField.focus();
224 }
225 //MOZILLA/NETSCAPE support
226 else if (myField.selectionStart || myField.selectionStart == '0') {
227 var startPos = myField.selectionStart;
228 var endPos = myField.selectionEnd;
229 var cursorPos = endPos;
230 var scrollTop = myField.scrollTop;
231
232 if (startPos != endPos) {
233 myField.value = myField.value.substring(0, startPos)
234 + edButtons[i].tagStart
235 + myField.value.substring(startPos, endPos)
236 + edButtons[i].tagEnd
237 + myField.value.substring(endPos, myField.value.length);
238 cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
239 }
240 else {
241 if (!edCheckOpenTags(name, i) || edButtons[i].tagEnd == '') {
242 myField.value = myField.value.substring(0, startPos)
243 + edButtons[i].tagStart
244 + myField.value.substring(endPos, myField.value.length);
245 edAddTag(name, i);
246 cursorPos = startPos + edButtons[i].tagStart.length;
247 }
248 else {
249 myField.value = myField.value.substring(0, startPos)
250 + edButtons[i].tagEnd
251 + myField.value.substring(endPos, myField.value.length);
252 edRemoveTag(name, i);
253 cursorPos = startPos + edButtons[i].tagEnd.length;
254 }
255 }
256 myField.focus();
257 myField.selectionStart = cursorPos;
258 myField.selectionEnd = cursorPos;
259 myField.scrollTop = scrollTop;
260 }
261 else {
262 if (!edCheckOpenTags(name, i) || edButtons[i].tagEnd == '') {
263 myField.value += edButtons[i].tagStart;
264 edAddTag(name, i);
265 }
266 else {
267 myField.value += edButtons[i].tagEnd;
268 edRemoveTag(name, i);
269 }
270 myField.focus();
271 }
272
273 if (pos && myField.scrollTop != pos) myField.scrollTop = pos;
274 }
275
276 function edInsertContent(myField, myValue) {
277
278 var pos = myField.scrollTop;
279
280 Logger.debug('edInsertContent "'+myValue+'", scrollTop='+pos);
281 //IE support
282 if (document.selection) {
283 myField.focus();
284 sel = document.selection.createRange();
285 sel.text = myValue;
286 myField.focus();
287 }
288 //MOZILLA/NETSCAPE support
289 else if (myField.selectionStart || myField.selectionStart == '0') {
290 var startPos = myField.selectionStart;
291 var endPos = myField.selectionEnd;
292 myField.value = myField.value.substring(0, startPos)
293 + myValue
294 + myField.value.substring(endPos, myField.value.length);
295 myField.focus();
296 myField.selectionStart = startPos + myValue.length;
297 myField.selectionEnd = startPos + myValue.length;
298 } else {
299 myField.value += myValue;
300 myField.focus();
301 }
302
303 if (pos && myField.scrollTop != pos) myField.scrollTop = pos;
304 }
305
306 function edInsertLink(name, i, defaultValue) {
307
308 myField = $( name );
309 if (! myField) {
310 Logger.error("can't find "+name);
311 return false;
312 }
313
314 if (!defaultValue) {
315 defaultValue = 'http://';
316 }
317 if (!edCheckOpenTags(name, i)) {
318 var URL = prompt('Enter the URL' ,defaultValue);
319 if (URL) {
320 edButtons[i].tagStart = '<a href="' + URL + '">';
321 edInsertTag(name, i);
322 }
323 }
324 else {
325 edInsertTag(name, i);
326 }
327 }
328
329 /* additional methods on textarea */
330
331 /*
332 onkeydown="return edTab(event);"
333 */
334 function edTab(event) {
335 var e = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
336 if (e == 9) {
337 edInsertContent(edCanvas, '\t');
338 // this is a fix for gecko-based browsers which force
339 // focus change on tab. It *should* be harmless for
340 // others, since edCavnas is allready focused
341 setTimeout('edCanvas.focus();', 1);
342 return false;
343 }
344 return true;
345 }
346
347 /*
348 onfocus="return edFocus('template_content');"
349 */
350 function edFocus( name ) {
351 Logger.info('edFocus '+name);
352 edCanvas = $( name );
353 if (! edCanvas) Logger.error("can't find "+name);
354 edToolbar( name );
355 return false;
356 }
357
358 /*
359 onblur="return edBlur();"
360 */
361 function edBlur() {
362 Logger.info('edBlur');
363 edCanvas = null;
364 return false;
365 }
366
367 /*
368 call this function for cleanup of toolbar and other
369 temporary data.
370 */
371 function edKill( name ) {
372 Logger.info('edKill '+name);
373 edActiveToolbar[name] = null;
374 }

  ViewVC Help
Powered by ViewVC 1.1.26