1 // new edit toolbar used with permission
3 // http://www.alexking.org/
5 var edButtons = new Array();
6 var edLinks = new Array();
7 var edOpenTags = new Array();
9 function edButton(id, display, tagStart, tagEnd, access, open) {
10 this.id = id; // used to name the toolbar button
11 this.display = display; // label on button
12 this.tagStart = tagStart; // open tag
13 this.tagEnd = tagEnd; // close tag
14 this.access = access; // access key
15 this.open = open; // set to -1 if tag does not need to be closed
18 function zeroise(number, threshold) {
19 // FIXME: or we could use an implementation of printf in js here
20 var str = number.toString();
21 if (number < 0) { str = str.substr(1, str.length) }
22 while (str.length < threshold) { str = "0" + str }
23 if (number < 0) { str = '-' + str }
28 var datetime = now.getUTCFullYear() + '-' +
29 zeroise(now.getUTCMonth() + 1, 2) + '-' +
30 zeroise(now.getUTCDate(), 2) + 'T' +
31 zeroise(now.getUTCHours(), 2) + ':' +
32 zeroise(now.getUTCMinutes(), 2) + ':' +
33 zeroise(now.getUTCSeconds() ,2) +
36 edButtons[edButtons.length] =
37 new edButton('ed_strong'
44 edButtons[edButtons.length] =
52 edButtons[edButtons.length] =
53 new edButton('ed_link'
60 edButtons[edButtons.length] =
61 new edButton('ed_block'
69 edButtons[edButtons.length] =
72 ,'<del datetime="' + datetime + '">'
77 edButtons[edButtons.length] =
80 ,'<ins datetime="' + datetime + '">'
85 edButtons[edButtons.length] =
94 edButtons[edButtons.length] =
102 edButtons[edButtons.length] =
110 edButtons[edButtons.length] =
118 edButtons[edButtons.length] =
119 new edButton('ed_code'
126 edButtons[edButtons.length] =
127 new edButton('ed_more'
135 edButtons[edButtons.length] =
136 new edButton('ed_next'
150 edLinks[edLinks.length] = new edLink('WordPress'
151 ,'http://wordpress.org/'
154 edLinks[edLinks.length] = new edLink('alexking.org'
155 ,'http://www.alexking.org/'
158 function edShowButton(button, i) {
159 if (button.id == 'ed_img') {
160 document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
162 else if (button.id == 'ed_link') {
163 document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
166 document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '" />');
170 function edShowLinks() {
171 var tempStr = '<select onchange="edQuickLink(this.options[this.selectedIndex].value, this);"><option value="-1" selected>' + quicktagsL10n.quickLinks + '</option>';
172 for (i = 0; i < edLinks.length; i++) {
173 tempStr += '<option value="' + i + '">' + edLinks[i].display + '</option>';
175 tempStr += '</select>';
176 document.write(tempStr);
179 function edAddTag(button) {
180 if (edButtons[button].tagEnd != '') {
181 edOpenTags[edOpenTags.length] = button;
182 document.getElementById(edButtons[button].id).value = '/' + document.getElementById(edButtons[button].id).value;
186 function edRemoveTag(button) {
187 for (i = 0; i < edOpenTags.length; i++) {
188 if (edOpenTags[i] == button) {
189 edOpenTags.splice(i, 1);
190 document.getElementById(edButtons[button].id).value = document.getElementById(edButtons[button].id).value.replace('/', '');
195 function edCheckOpenTags(button) {
197 for (i = 0; i < edOpenTags.length; i++) {
198 if (edOpenTags[i] == button) {
203 return true; // tag found
206 return false; // tag not found
210 function edCloseAllTags() {
211 var count = edOpenTags.length;
212 for (o = 0; o < count; o++) {
213 edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
217 function edQuickLink(i, thisSelect) {
220 if (edLinks[i].newWin == 1) {
221 newWin = ' target="_blank"';
223 var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>'
226 thisSelect.selectedIndex = 0;
227 edInsertContent(edCanvas, tempStr);
230 thisSelect.selectedIndex = 0;
234 function edSpell(myField) {
236 if (document.selection) {
238 var sel = document.selection.createRange();
239 if (sel.text.length > 0) {
243 else if (myField.selectionStart || myField.selectionStart == '0') {
244 var startPos = myField.selectionStart;
245 var endPos = myField.selectionEnd;
246 if (startPos != endPos) {
247 word = myField.value.substring(startPos, endPos);
251 word = prompt(quicktagsL10n.wordLookup, '');
253 if (word !== null && /^\w[\w ]*$/.test(word)) {
254 window.open('http://www.answers.com/' + escape(word));
258 function edToolbar() {
259 document.write('<div id="ed_toolbar">');
260 for (i = 0; i < edButtons.length; i++) {
261 edShowButton(edButtons[i], i);
263 document.write('<input type="button" id="ed_spell" class="ed_button" onclick="edSpell(edCanvas);" title="' + quicktagsL10n.dictionaryLookup + '" value="' + quicktagsL10n.lookup + '" />');
264 document.write('<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="' + quicktagsL10n.closeAllOpenTags + '" value="' + quicktagsL10n.closeTags + '" />');
265 // edShowLinks(); // disabled by default
266 document.write('</div>');
271 function edInsertTag(myField, i) {
273 if (document.selection) {
275 sel = document.selection.createRange();
276 if (sel.text.length > 0) {
277 sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
280 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
281 sel.text = edButtons[i].tagStart;
285 sel.text = edButtons[i].tagEnd;
291 //MOZILLA/NETSCAPE support
292 else if (myField.selectionStart || myField.selectionStart == '0') {
293 var startPos = myField.selectionStart;
294 var endPos = myField.selectionEnd;
295 var cursorPos = endPos;
296 var scrollTop = myField.scrollTop;
298 if (startPos != endPos) {
299 myField.value = myField.value.substring(0, startPos)
300 + edButtons[i].tagStart
301 + myField.value.substring(startPos, endPos)
302 + edButtons[i].tagEnd
303 + myField.value.substring(endPos, myField.value.length);
304 cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
307 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
308 myField.value = myField.value.substring(0, startPos)
309 + edButtons[i].tagStart
310 + myField.value.substring(endPos, myField.value.length);
312 cursorPos = startPos + edButtons[i].tagStart.length;
315 myField.value = myField.value.substring(0, startPos)
316 + edButtons[i].tagEnd
317 + myField.value.substring(endPos, myField.value.length);
319 cursorPos = startPos + edButtons[i].tagEnd.length;
323 myField.selectionStart = cursorPos;
324 myField.selectionEnd = cursorPos;
325 myField.scrollTop = scrollTop;
328 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
329 myField.value += edButtons[i].tagStart;
333 myField.value += edButtons[i].tagEnd;
340 function edInsertContent(myField, myValue) {
342 if (document.selection) {
344 sel = document.selection.createRange();
348 //MOZILLA/NETSCAPE support
349 else if (myField.selectionStart || myField.selectionStart == '0') {
350 var startPos = myField.selectionStart;
351 var endPos = myField.selectionEnd;
352 myField.value = myField.value.substring(0, startPos)
354 + myField.value.substring(endPos, myField.value.length);
356 myField.selectionStart = startPos + myValue.length;
357 myField.selectionEnd = startPos + myValue.length;
359 myField.value += myValue;
364 function edInsertLink(myField, i, defaultValue) {
366 defaultValue = 'http://';
368 if (!edCheckOpenTags(i)) {
369 var URL = prompt(quicktagsL10n.enterURL, defaultValue);
371 edButtons[i].tagStart = '<a href="' + URL + '">';
372 edInsertTag(myField, i);
376 edInsertTag(myField, i);
380 function edInsertImage(myField) {
381 var myValue = prompt(quicktagsL10n.enterImageURL, 'http://');
383 myValue = '<img src="'
385 + '" alt="' + prompt(quicktagsL10n.enterImageDescription, '')
387 edInsertContent(myField, myValue);
392 // Allow multiple instances.
393 // Name = unique value, id = textarea id, container = container div.
394 // Can disable some buttons by passing comma delimited string as 4th param.
395 var QTags = function(name, id, container, disabled) {
396 var t = this, cont = document.getElementById(container);
401 t.Canvas = document.getElementById(id);
403 if ( ! t.Canvas || ! cont )
406 disabled = ( typeof disabled != 'undefined' ) ? ','+disabled+',' : '';
408 t.edShowButton = function(button, i) {
409 if ( disabled && (disabled.indexOf(','+button.display+',') != -1) )
411 else if ( button.id == name+'_img' )
412 return '<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage('+name+'.Canvas);" value="' + button.display + '" />';
413 else if (button.id == name+'_link')
414 return '<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="'+name+'.edInsertLink('+i+');" value="'+button.display+'" />';
416 return '<input type="button" id="' + button.id + '" accesskey="'+button.access+'" class="ed_button" onclick="'+name+'.edInsertTag('+i+');" value="'+button.display+'" />';
419 t.edAddTag = function(button) {
420 if ( t.Buttons[button].tagEnd != '' ) {
421 t.OpenTags[t.OpenTags.length] = button;
422 document.getElementById(t.Buttons[button].id).value = '/' + document.getElementById(t.Buttons[button].id).value;
426 t.edRemoveTag = function(button) {
427 for ( var i = 0; i < t.OpenTags.length; i++ ) {
428 if ( t.OpenTags[i] == button ) {
429 t.OpenTags.splice(i, 1);
430 document.getElementById(t.Buttons[button].id).value = document.getElementById(t.Buttons[button].id).value.replace('/', '');
435 t.edCheckOpenTags = function(button) {
437 for ( var i = 0; i < t.OpenTags.length; i++ ) {
438 if ( t.OpenTags[i] == button )
441 if ( tag > 0 ) return true; // tag found
442 else return false; // tag not found
445 this.edCloseAllTags = function() {
446 var count = t.OpenTags.length;
447 for ( var o = 0; o < count; o++ )
448 t.edInsertTag(t.OpenTags[t.OpenTags.length - 1]);
451 this.edQuickLink = function(i, thisSelect) {
454 if ( Links[i].newWin == 1 ) {
455 newWin = ' target="_blank"';
457 var tempStr = '<a href="' + Links[i].URL + '"' + newWin + '>'
460 thisSelect.selectedIndex = 0;
461 edInsertContent(t.Canvas, tempStr);
463 thisSelect.selectedIndex = 0;
468 t.edInsertTag = function(i) {
470 if ( document.selection ) {
472 sel = document.selection.createRange();
473 if ( sel.text.length > 0 ) {
474 sel.text = t.Buttons[i].tagStart + sel.text + t.Buttons[i].tagEnd;
476 if ( ! t.edCheckOpenTags(i) || t.Buttons[i].tagEnd == '' ) {
477 sel.text = t.Buttons[i].tagStart;
480 sel.text = t.Buttons[i].tagEnd;
485 } else if ( t.Canvas.selectionStart || t.Canvas.selectionStart == '0' ) { //MOZILLA/NETSCAPE support
486 var startPos = t.Canvas.selectionStart;
487 var endPos = t.Canvas.selectionEnd;
488 var cursorPos = endPos;
489 var scrollTop = t.Canvas.scrollTop;
491 if ( startPos != endPos ) {
492 t.Canvas.value = t.Canvas.value.substring(0, startPos)
493 + t.Buttons[i].tagStart
494 + t.Canvas.value.substring(startPos, endPos)
495 + t.Buttons[i].tagEnd
496 + t.Canvas.value.substring(endPos, t.Canvas.value.length);
497 cursorPos += t.Buttons[i].tagStart.length + t.Buttons[i].tagEnd.length;
499 if ( !t.edCheckOpenTags(i) || t.Buttons[i].tagEnd == '' ) {
500 t.Canvas.value = t.Canvas.value.substring(0, startPos)
501 + t.Buttons[i].tagStart
502 + t.Canvas.value.substring(endPos, t.Canvas.value.length);
504 cursorPos = startPos + t.Buttons[i].tagStart.length;
506 t.Canvas.value = t.Canvas.value.substring(0, startPos)
507 + t.Buttons[i].tagEnd
508 + t.Canvas.value.substring(endPos, t.Canvas.value.length);
510 cursorPos = startPos + t.Buttons[i].tagEnd.length;
514 t.Canvas.selectionStart = cursorPos;
515 t.Canvas.selectionEnd = cursorPos;
516 t.Canvas.scrollTop = scrollTop;
518 if ( ! t.edCheckOpenTags(i) || t.Buttons[i].tagEnd == '' ) {
519 t.Canvas.value += Buttons[i].tagStart;
522 t.Canvas.value += Buttons[i].tagEnd;
529 this.edInsertLink = function(i, defaultValue) {
530 if ( ! defaultValue )
531 defaultValue = 'http://';
533 if ( ! t.edCheckOpenTags(i) ) {
534 var URL = prompt(quicktagsL10n.enterURL, defaultValue);
536 t.Buttons[i].tagStart = '<a href="' + URL + '">';
544 this.edInsertImage = function() {
545 var myValue = prompt(quicktagsL10n.enterImageURL, 'http://');
547 myValue = '<img src="'
549 + '" alt="' + prompt(quicktagsL10n.enterImageDescription, '')
551 edInsertContent(t.Canvas, myValue);
555 t.Buttons[t.Buttons.length] = new edButton(name+'_strong','b','<strong>','</strong>','b');
556 t.Buttons[t.Buttons.length] = new edButton(name+'_em','i','<em>','</em>','i');
557 t.Buttons[t.Buttons.length] = new edButton(name+'_link','link','','</a>','a'); // special case
558 t.Buttons[t.Buttons.length] = new edButton(name+'_block','b-quote','\n\n<blockquote>','</blockquote>\n\n','q');
559 t.Buttons[t.Buttons.length] = new edButton(name+'_del','del','<del datetime="' + datetime + '">','</del>','d');
560 t.Buttons[t.Buttons.length] = new edButton(name+'_ins','ins','<ins datetime="' + datetime + '">','</ins>','s');
561 t.Buttons[t.Buttons.length] = new edButton(name+'_img','img','','','m',-1); // special case
562 t.Buttons[t.Buttons.length] = new edButton(name+'_ul','ul','<ul>\n','</ul>\n\n','u');
563 t.Buttons[t.Buttons.length] = new edButton(name+'_ol','ol','<ol>\n','</ol>\n\n','o');
564 t.Buttons[t.Buttons.length] = new edButton(name+'_li','li','\t<li>','</li>\n','l');
565 t.Buttons[t.Buttons.length] = new edButton(name+'_code','code','<code>','</code>','c');
566 t.Buttons[t.Buttons.length] = new edButton(name+'_more','more','<!--more-->','','t',-1);
567 // t.Buttons[t.Buttons.length] = new edButton(name+'_next','page','<!--nextpage-->','','p',-1);
569 var tb = document.createElement('div');
570 tb.id = name+'_qtags';
572 var html = '<div id="'+name+'_toolbar">';
573 for (var i = 0; i < t.Buttons.length; i++)
574 html += t.edShowButton(t.Buttons[i], i);
576 html += '<input type="button" id="'+name+'_ed_spell" class="ed_button" onclick="edSpell('+name+'.Canvas);" title="' + quicktagsL10n.dictionaryLookup + '" value="' + quicktagsL10n.lookup + '" />';
577 html += '<input type="button" id="'+name+'_ed_close" class="ed_button" onclick="'+name+'.edCloseAllTags();" title="' + quicktagsL10n.closeAllOpenTags + '" value="' + quicktagsL10n.closeTags + '" /></div>';
580 cont.parentNode.insertBefore(tb, cont);