/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 197 - (hide 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 dpavlin 175 /*
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 dpavlin 197 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 dpavlin 175 }
116     else {
117 dpavlin 197 return('<input type="button" id="' + name + '_' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(\''+name+'\', ' + i + ');" value="' + button.display + '" />');
118 dpavlin 175 }
119     }
120    
121 dpavlin 197 function edAddTag(name, button) {
122 dpavlin 175 if (edButtons[button].tagEnd != '') {
123 dpavlin 197 edOpenTags[name][ edOpenTags[name].length ] = button;
124     $( name + '_' + edButtons[button].id ).value = '/' + $( name + '_' + edButtons[button].id ).value;
125 dpavlin 175 }
126     }
127    
128 dpavlin 197 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 dpavlin 175 }
134     }
135     }
136    
137 dpavlin 197 function edCheckOpenTags(name, button) {
138 dpavlin 175 var tag = 0;
139 dpavlin 197 for (i = 0; i < edOpenTags[name].length; i++) {
140     if (edOpenTags[name][i] == button) {
141 dpavlin 175 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 dpavlin 197 function edCloseAllTags( name ) {
153     var count = edOpenTags[name].length;
154     Logger.info('edCloseAllTags '+name+' count:'+count);
155 dpavlin 175 for (o = 0; o < count; o++) {
156 dpavlin 197 edInsertTag(name, edOpenTags[name][ edOpenTags[name].length - 1 ]);
157 dpavlin 175 }
158     }
159    
160     var edActiveToolbar = {};
161    
162     function edToolbar( name ) {
163    
164 dpavlin 179 if (edActiveToolbar[name]) return false;
165 dpavlin 175
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 dpavlin 176 for (var i = 0; i < edButtons.length; i++) {
179 dpavlin 197 toolbar += edShowButton(name, edButtons[i], i);
180 dpavlin 175 }
181     toolbar += '&nbsp;&nbsp';
182 dpavlin 197 toolbar += '<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags(\''+name+'\');" title="Close all open tags" value="Close Tags" />';
183 dpavlin 175
184     div.innerHTML = toolbar;
185 dpavlin 197
186 dpavlin 179 edActiveToolbar[name] = 1;
187 dpavlin 197 edOpenTags[name] = new Array();
188    
189     Logger.debug('edActiveToolbar['+name+'] = '+edActiveToolbar[name]);
190 dpavlin 176 return false;
191 dpavlin 175 }
192    
193     // insertion code
194    
195 dpavlin 197 function edInsertTag(name, i) {
196 dpavlin 175
197 dpavlin 197 myField = $( name );
198     if (! myField) {
199     Logger.error("can't find "+name);
200     return false;
201     }
202    
203 dpavlin 188 var pos = myField.scrollTop;
204 dpavlin 197 Logger.debug('edInsertTag '+name+','+i+'; scrollTop='+pos);
205 dpavlin 188
206 dpavlin 175 //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 dpavlin 197 if (!edCheckOpenTags(name, i) || edButtons[i].tagEnd == '') {
215 dpavlin 175 sel.text = edButtons[i].tagStart;
216 dpavlin 197 edAddTag(name, i);
217 dpavlin 175 }
218     else {
219     sel.text = edButtons[i].tagEnd;
220 dpavlin 197 edRemoveTag(name, i);
221 dpavlin 175 }
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 dpavlin 197 if (!edCheckOpenTags(name, i) || edButtons[i].tagEnd == '') {
242 dpavlin 175 myField.value = myField.value.substring(0, startPos)
243     + edButtons[i].tagStart
244     + myField.value.substring(endPos, myField.value.length);
245 dpavlin 197 edAddTag(name, i);
246 dpavlin 175 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 dpavlin 197 edRemoveTag(name, i);
253 dpavlin 175 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 dpavlin 197 if (!edCheckOpenTags(name, i) || edButtons[i].tagEnd == '') {
263 dpavlin 175 myField.value += edButtons[i].tagStart;
264 dpavlin 197 edAddTag(name, i);
265 dpavlin 175 }
266     else {
267     myField.value += edButtons[i].tagEnd;
268 dpavlin 197 edRemoveTag(name, i);
269 dpavlin 175 }
270     myField.focus();
271     }
272 dpavlin 188
273     if (pos && myField.scrollTop != pos) myField.scrollTop = pos;
274 dpavlin 175 }
275    
276     function edInsertContent(myField, myValue) {
277 dpavlin 188
278     var pos = myField.scrollTop;
279    
280     Logger.debug('edInsertContent "'+myValue+'", scrollTop='+pos);
281 dpavlin 175 //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 dpavlin 188
303     if (pos && myField.scrollTop != pos) myField.scrollTop = pos;
304 dpavlin 175 }
305    
306 dpavlin 197 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 dpavlin 175 if (!defaultValue) {
315     defaultValue = 'http://';
316     }
317 dpavlin 197 if (!edCheckOpenTags(name, i)) {
318 dpavlin 175 var URL = prompt('Enter the URL' ,defaultValue);
319     if (URL) {
320     edButtons[i].tagStart = '<a href="' + URL + '">';
321 dpavlin 197 edInsertTag(name, i);
322 dpavlin 175 }
323     }
324     else {
325 dpavlin 197 edInsertTag(name, i);
326 dpavlin 175 }
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 dpavlin 192 // 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 dpavlin 175 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 dpavlin 192 edCanvas = null;
364 dpavlin 175 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 dpavlin 179 edActiveToolbar[name] = null;
374 dpavlin 175 }

  ViewVC Help
Powered by ViewVC 1.1.26