1 // new edit toolbar used with permission
3 // http://www.alexking.org/
5 var edButtons = new Array(), edLinks = new Array(), edOpenTags = new Array(), now = new Date(), datetime;
7 function edButton(id, display, tagStart, tagEnd, access, open) {
8 this.id = id; // used to name the toolbar button
9 this.display = display; // label on button
10 this.tagStart = tagStart; // open tag
11 this.tagEnd = tagEnd; // close tag
12 this.access = access; // access key
13 this.open = open; // set to -1 if tag does not need to be closed
16 function zeroise(number, threshold) {
17 // FIXME: or we could use an implementation of printf in js here
18 var str = number.toString();
19 if (number < 0) { str = str.substr(1, str.length) }
20 while (str.length < threshold) { str = "0" + str }
21 if (number < 0) { str = '-' + str }
25 datetime = now.getUTCFullYear() + '-' +
26 zeroise(now.getUTCMonth() + 1, 2) + '-' +
27 zeroise(now.getUTCDate(), 2) + 'T' +
28 zeroise(now.getUTCHours(), 2) + ':' +
29 zeroise(now.getUTCMinutes(), 2) + ':' +
30 zeroise(now.getUTCSeconds() ,2) +
33 edButtons[edButtons.length] =
34 new edButton('ed_strong'
41 edButtons[edButtons.length] =
49 edButtons[edButtons.length] =
50 new edButton('ed_link'
57 edButtons[edButtons.length] =
58 new edButton('ed_block'
66 edButtons[edButtons.length] =
69 ,'<del datetime="' + datetime + '">'
74 edButtons[edButtons.length] =
77 ,'<ins datetime="' + datetime + '">'
82 edButtons[edButtons.length] =
91 edButtons[edButtons.length] =
99 edButtons[edButtons.length] =
107 edButtons[edButtons.length] =
115 edButtons[edButtons.length] =
116 new edButton('ed_code'
123 edButtons[edButtons.length] =
124 new edButton('ed_more'
132 edButtons[edButtons.length] =
133 new edButton('ed_next'
147 edLinks[edLinks.length] = new edLink('WordPress'
148 ,'http://wordpress.org/'
151 edLinks[edLinks.length] = new edLink('alexking.org'
152 ,'http://www.alexking.org/'
155 function edShowButton(button, i) {
156 if (button.id == 'ed_img') {
157 document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
159 else if (button.id == 'ed_link') {
160 document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
163 document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '" />');
167 function edShowLinks() {
168 var tempStr = '<select onchange="edQuickLink(this.options[this.selectedIndex].value, this);"><option value="-1" selected>' + quicktagsL10n.quickLinks + '</option>', i;
169 for (i = 0; i < edLinks.length; i++) {
170 tempStr += '<option value="' + i + '">' + edLinks[i].display + '</option>';
172 tempStr += '</select>';
173 document.write(tempStr);
176 function edAddTag(button) {
177 if (edButtons[button].tagEnd != '') {
178 edOpenTags[edOpenTags.length] = button;
179 document.getElementById(edButtons[button].id).value = '/' + document.getElementById(edButtons[button].id).value;
183 function edRemoveTag(button) {
184 for (var i = 0; i < edOpenTags.length; i++) {
185 if (edOpenTags[i] == button) {
186 edOpenTags.splice(i, 1);
187 document.getElementById(edButtons[button].id).value = document.getElementById(edButtons[button].id).value.replace('/', '');
192 function edCheckOpenTags(button) {
194 for (i = 0; i < edOpenTags.length; i++) {
195 if (edOpenTags[i] == button) {
200 return true; // tag found
203 return false; // tag not found
207 function edCloseAllTags() {
208 var count = edOpenTags.length, o;
209 for (o = 0; o < count; o++) {
210 edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
214 function edQuickLink(i, thisSelect) {
216 var newWin = '', tempStr;
217 if (edLinks[i].newWin == 1) {
218 newWin = ' target="_blank"';
220 tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>'
223 thisSelect.selectedIndex = 0;
224 edInsertContent(edCanvas, tempStr);
227 thisSelect.selectedIndex = 0;
231 function edSpell(myField) {
232 var word = '', sel, startPos, endPos;
233 if (document.selection) {
235 sel = document.selection.createRange();
236 if (sel.text.length > 0) {
240 else if (myField.selectionStart || myField.selectionStart == '0') {
241 startPos = myField.selectionStart;
242 endPos = myField.selectionEnd;
243 if (startPos != endPos) {
244 word = myField.value.substring(startPos, endPos);
248 word = prompt(quicktagsL10n.wordLookup, '');
250 if (word !== null && /^\w[\w ]*$/.test(word)) {
251 window.open('http://www.answers.com/' + escape(word));
255 function edToolbar() {
256 document.write('<div id="ed_toolbar">');
257 for (var i = 0; i < edButtons.length; i++) {
258 edShowButton(edButtons[i], i);
260 document.write('<input type="button" id="ed_spell" class="ed_button" onclick="edSpell(edCanvas);" title="' + quicktagsL10n.dictionaryLookup + '" value="' + quicktagsL10n.lookup + '" />');
261 document.write('<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="' + quicktagsL10n.closeAllOpenTags + '" value="' + quicktagsL10n.closeTags + '" />');
262 document.write('<input type="button" id="ed_fullscreen" class="ed_button" onclick="fullscreen.on();" title="' + quicktagsL10n.toggleFullscreen + '" value="' + quicktagsL10n.fullscreen + '" />');
263 // edShowLinks(); // disabled by default
264 document.write('</div>');
269 function edInsertTag(myField, i) {
271 if (document.selection) {
273 var sel = document.selection.createRange();
274 if (sel.text.length > 0) {
275 sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
278 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
279 sel.text = edButtons[i].tagStart;
283 sel.text = edButtons[i].tagEnd;
289 //MOZILLA/NETSCAPE support
290 else if (myField.selectionStart || myField.selectionStart == '0') {
291 var startPos = myField.selectionStart, endPos = myField.selectionEnd, cursorPos = endPos, scrollTop = myField.scrollTop;
293 if (startPos != endPos) {
294 myField.value = myField.value.substring(0, startPos)
295 + edButtons[i].tagStart
296 + myField.value.substring(startPos, endPos)
297 + edButtons[i].tagEnd
298 + myField.value.substring(endPos, myField.value.length);
299 cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
302 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
303 myField.value = myField.value.substring(0, startPos)
304 + edButtons[i].tagStart
305 + myField.value.substring(endPos, myField.value.length);
307 cursorPos = startPos + edButtons[i].tagStart.length;
310 myField.value = myField.value.substring(0, startPos)
311 + edButtons[i].tagEnd
312 + myField.value.substring(endPos, myField.value.length);
314 cursorPos = startPos + edButtons[i].tagEnd.length;
318 myField.selectionStart = cursorPos;
319 myField.selectionEnd = cursorPos;
320 myField.scrollTop = scrollTop;
323 if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
324 myField.value += edButtons[i].tagStart;
328 myField.value += edButtons[i].tagEnd;
335 function edInsertContent(myField, myValue) {
336 var sel, startPos, endPos, scrollTop;
339 if (document.selection) {
341 sel = document.selection.createRange();
345 //MOZILLA/NETSCAPE support
346 else if (myField.selectionStart || myField.selectionStart == '0') {
347 startPos = myField.selectionStart;
348 endPos = myField.selectionEnd;
349 scrollTop = myField.scrollTop;
350 myField.value = myField.value.substring(0, startPos)
352 + myField.value.substring(endPos, myField.value.length);
354 myField.selectionStart = startPos + myValue.length;
355 myField.selectionEnd = startPos + myValue.length;
356 myField.scrollTop = scrollTop;
358 myField.value += myValue;
363 function edInsertLink(myField, i, defaultValue) {
364 if ( 'object' == typeof(wpLink) ) {
368 defaultValue = 'http://';
370 if (!edCheckOpenTags(i)) {
371 var URL = prompt(quicktagsL10n.enterURL, defaultValue);
373 edButtons[i].tagStart = '<a href="' + URL + '">';
374 edInsertTag(myField, i);
378 edInsertTag(myField, i);
383 function edInsertImage(myField) {
384 var myValue = prompt(quicktagsL10n.enterImageURL, 'http://');
386 myValue = '<img src="'
388 + '" alt="' + prompt(quicktagsL10n.enterImageDescription, '')
390 edInsertContent(myField, myValue);
395 // Allow multiple instances.
396 // Name = unique value, id = textarea id, container = container div.
397 // Can disable some buttons by passing comma delimited string as 4th param.
398 var QTags = function(name, id, container, disabled) {
399 var t = this, cont = document.getElementById(container), i, tag, tb, html, sel;
404 t.Canvas = document.getElementById(id);
406 if ( ! t.Canvas || ! cont )
409 disabled = ( typeof disabled != 'undefined' ) ? ','+disabled+',' : '';
411 t.edShowButton = function(button, i) {
412 if ( disabled && (disabled.indexOf(','+button.display+',') != -1) )
414 else if ( button.id == name+'_img' )
415 return '<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage('+name+'.Canvas);" value="' + button.display + '" />';
416 else if (button.id == name+'_link')
417 return '<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="'+name+'.edInsertLink('+i+');" value="'+button.display+'" />';
419 return '<input type="button" id="' + button.id + '" accesskey="'+button.access+'" class="ed_button" onclick="'+name+'.edInsertTag('+i+');" value="'+button.display+'" />';
422 t.edAddTag = function(button) {
423 if ( t.Buttons[button].tagEnd != '' ) {
424 t.OpenTags[t.OpenTags.length] = button;
425 document.getElementById(t.Buttons[button].id).value = '/' + document.getElementById(t.Buttons[button].id).value;
429 t.edRemoveTag = function(button) {
430 for ( i = 0; i < t.OpenTags.length; i++ ) {
431 if ( t.OpenTags[i] == button ) {
432 t.OpenTags.splice(i, 1);
433 document.getElementById(t.Buttons[button].id).value = document.getElementById(t.Buttons[button].id).value.replace('/', '');
438 t.edCheckOpenTags = function(button) {
440 for ( var i = 0; i < t.OpenTags.length; i++ ) {
441 if ( t.OpenTags[i] == button )
444 if ( tag > 0 ) return true; // tag found
445 else return false; // tag not found
448 this.edCloseAllTags = function() {
449 var count = t.OpenTags.length;
450 for ( var o = 0; o < count; o++ )
451 t.edInsertTag(t.OpenTags[t.OpenTags.length - 1]);
454 this.edQuickLink = function(i, thisSelect) {
456 var newWin = '', tempStr;
457 if ( Links[i].newWin == 1 ) {
458 newWin = ' target="_blank"';
460 tempStr = '<a href="' + Links[i].URL + '"' + newWin + '>'
463 thisSelect.selectedIndex = 0;
464 edInsertContent(t.Canvas, tempStr);
466 thisSelect.selectedIndex = 0;
471 t.edInsertTag = function(i) {
473 if ( document.selection ) {
475 sel = document.selection.createRange();
476 if ( sel.text.length > 0 ) {
477 sel.text = t.Buttons[i].tagStart + sel.text + t.Buttons[i].tagEnd;
479 if ( ! t.edCheckOpenTags(i) || t.Buttons[i].tagEnd == '' ) {
480 sel.text = t.Buttons[i].tagStart;
483 sel.text = t.Buttons[i].tagEnd;
488 } else if ( t.Canvas.selectionStart || t.Canvas.selectionStart == '0' ) { //MOZILLA/NETSCAPE support
489 var startPos = t.Canvas.selectionStart, endPos = t.Canvas.selectionEnd, cursorPos = endPos, 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 tb = document.createElement('div');
570 tb.id = name+'_qtags';
572 html = '<div id="'+name+'_toolbar">';
573 for (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);