/[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 175 - (show annotations)
Sun Nov 27 04:45:56 2005 UTC (18 years, 5 months ago) by dpavlin
File MIME type: application/javascript
File size: 7655 byte(s)
 r11186@llin:  dpavlin | 2005-11-27 05:48:19 +0100
 first try at implementing decent text-only editor, based on quicktags
 added tab support and dynamic creation of toolbars

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(button, i) {
113 if (button.id == 'ed_img') {
114 return('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
115 }
116 else if (button.id == 'ed_link') {
117 return('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
118 }
119 else {
120 return('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '" />');
121 }
122 }
123
124 function edAddTag(button) {
125 if (edButtons[button].tagEnd != '') {
126 edOpenTags[edOpenTags.length] = button;
127 $( edButtons[button].id ).value = '/' + $( edButtons[button].id ).value;
128 }
129 }
130
131 function edRemoveTag(button) {
132 for (i = 0; i < edOpenTags.length; i++) {
133 if (edOpenTags[i] == button) {
134 edOpenTags.splice(i, 1);
135 $( edButtons[button].id ).value = $( edButtons[button].id ).value.replace('/', '');
136 }
137 }
138 }
139
140 function edCheckOpenTags(button) {
141 var tag = 0;
142 for (i = 0; i < edOpenTags.length; i++) {
143 if (edOpenTags[i] == button) {
144 tag++;
145 }
146 }
147 if (tag > 0) {
148 return true; // tag found
149 }
150 else {
151 return false; // tag not found
152 }
153 }
154
155 function edCloseAllTags() {
156 var count = edOpenTags.length;
157 for (o = 0; o < count; o++) {
158 edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
159 }
160 }
161
162 var edActiveToolbar = {};
163
164 function edToolbar( name ) {
165
166 if (edActiveToolbar.name) return false;
167
168 var toolbar_div = name + '_toolbar';
169
170 Logger.info('edToolbar of '+name+' is '+toolbar_div);
171
172 var div = $( toolbar_div );
173 if (! div) {
174 Logger.error('div not found');
175 return false;
176 }
177
178 var toolbar = '';
179
180 for (i = 0; i < edButtons.length; i++) {
181 toolbar += edShowButton(edButtons[i], i);
182 }
183 toolbar += '&nbsp;&nbsp';
184 toolbar += '<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="Close all open tags" value="Close Tags" />';
185
186 div.innerHTML = toolbar;
187 Logger.debug('before: '+edActiveToolbar.name);
188 edActiveToolbar.name = 1;
189 Logger.debug('after: '+edActiveToolbar.name);
190 }
191
192 // insertion code
193
194 function edInsertTag(myField, i) {
195
196 //IE support
197 if (document.selection) {
198 myField.focus();
199 sel = document.selection.createRange();
200 if (sel.text.length > 0) {
201 sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
202 }
203 else {
204 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
205 sel.text = edButtons[i].tagStart;
206 edAddTag(i);
207 }
208 else {
209 sel.text = edButtons[i].tagEnd;
210 edRemoveTag(i);
211 }
212 }
213 myField.focus();
214 }
215 //MOZILLA/NETSCAPE support
216 else if (myField.selectionStart || myField.selectionStart == '0') {
217 var startPos = myField.selectionStart;
218 var endPos = myField.selectionEnd;
219 var cursorPos = endPos;
220 var scrollTop = myField.scrollTop;
221
222 if (startPos != endPos) {
223 myField.value = myField.value.substring(0, startPos)
224 + edButtons[i].tagStart
225 + myField.value.substring(startPos, endPos)
226 + edButtons[i].tagEnd
227 + myField.value.substring(endPos, myField.value.length);
228 cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
229 }
230 else {
231 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
232 myField.value = myField.value.substring(0, startPos)
233 + edButtons[i].tagStart
234 + myField.value.substring(endPos, myField.value.length);
235 edAddTag(i);
236 cursorPos = startPos + edButtons[i].tagStart.length;
237 }
238 else {
239 myField.value = myField.value.substring(0, startPos)
240 + edButtons[i].tagEnd
241 + myField.value.substring(endPos, myField.value.length);
242 edRemoveTag(i);
243 cursorPos = startPos + edButtons[i].tagEnd.length;
244 }
245 }
246 myField.focus();
247 myField.selectionStart = cursorPos;
248 myField.selectionEnd = cursorPos;
249 myField.scrollTop = scrollTop;
250 }
251 else {
252 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
253 myField.value += edButtons[i].tagStart;
254 edAddTag(i);
255 }
256 else {
257 myField.value += edButtons[i].tagEnd;
258 edRemoveTag(i);
259 }
260 myField.focus();
261 }
262 }
263
264 function edInsertContent(myField, myValue) {
265 //IE support
266 if (document.selection) {
267 myField.focus();
268 sel = document.selection.createRange();
269 sel.text = myValue;
270 myField.focus();
271 }
272 //MOZILLA/NETSCAPE support
273 else if (myField.selectionStart || myField.selectionStart == '0') {
274 var startPos = myField.selectionStart;
275 var endPos = myField.selectionEnd;
276 myField.value = myField.value.substring(0, startPos)
277 + myValue
278 + myField.value.substring(endPos, myField.value.length);
279 myField.focus();
280 myField.selectionStart = startPos + myValue.length;
281 myField.selectionEnd = startPos + myValue.length;
282 } else {
283 myField.value += myValue;
284 myField.focus();
285 }
286 }
287
288 function edInsertLink(myField, i, defaultValue) {
289 if (!defaultValue) {
290 defaultValue = 'http://';
291 }
292 if (!edCheckOpenTags(i)) {
293 var URL = prompt('Enter the URL' ,defaultValue);
294 if (URL) {
295 edButtons[i].tagStart = '<a href="' + URL + '">';
296 edInsertTag(myField, i);
297 }
298 }
299 else {
300 edInsertTag(myField, i);
301 }
302 }
303
304 /* additional methods on textarea */
305
306 /*
307 onkeydown="return edTab(event);"
308 */
309 function edTab(event) {
310 var e = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
311 if (e == 9) {
312 edInsertContent(edCanvas, '\t');
313 return false;
314 }
315 return true;
316 }
317
318 /*
319 onfocus="return edFocus('template_content');"
320 */
321 function edFocus( name ) {
322 Logger.info('edFocus '+name);
323 edCanvas = $( name );
324 if (! edCanvas) Logger.error("can't find "+name);
325 edToolbar( name );
326 return false;
327 }
328
329 /*
330 onblur="return edBlur();"
331 */
332 function edBlur() {
333 Logger.info('edBlur');
334 edChanvas = null;
335 return false;
336 }
337
338 /*
339 call this function for cleanup of toolbar and other
340 temporary data.
341 */
342 function edKill( name ) {
343 Logger.info('edKill '+name);
344 edActiveToolbar.name = null;
345 }

  ViewVC Help
Powered by ViewVC 1.1.26