Instantly share code, notes, and snippets.
Created
May 2, 2011 23:08
-
Star
(1)
1
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save tnhu/952545 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// JS QuickTags version 1.3.1 | |
// | |
// Copyright (c) 2002-2008 Alex King | |
// http://alexking.org/projects/js-quicktags | |
// | |
// Thanks to Greg Heo <[email protected]> for his changes | |
// to support multiple toolbars per page. | |
// | |
// Licensed under the LGPL license | |
// http://www.gnu.org/copyleft/lesser.html | |
// | |
// ********************************************************************** | |
// This program is distributed in the hope that it will be useful, but | |
// WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
// ********************************************************************** | |
// | |
// This JavaScript will insert the tags below at the cursor position in IE and | |
// Gecko-based browsers (Mozilla, Camino, Firefox, Netscape). For browsers that | |
// do not support inserting at the cursor position (older versions of Safari, | |
// OmniWeb) it appends the tags to the end of the content. | |
// | |
// Pass the ID of the <textarea> element to the edToolbar and function. | |
// | |
// Example: | |
// | |
// <script type="text/javascript">edToolbar('canvas');</script> | |
// <textarea id="canvas" rows="20" cols="50"></textarea> | |
// | |
var dictionaryUrl = 'http://www.ninjawords.com/'; | |
// other options include: | |
// | |
// var dictionaryUrl = 'http://www.answers.com/'; | |
// var dictionaryUrl = 'http://www.dictionary.com/'; | |
var edButtons = new Array(); | |
var edLinks = new Array(); | |
var edOpenTags = new Array(); | |
function edButton(id, display, tagStart, tagEnd, access, open) { | |
this.id = id; // used to name the toolbar button | |
this.display = display; // label on button | |
this.tagStart = tagStart; // open tag | |
this.tagEnd = tagEnd; // close tag | |
this.access = access; // set to -1 if tag does not need to be closed | |
this.open = open; // set to -1 if tag does not need to be closed | |
} | |
edButtons.push( | |
new edButton( | |
'ed_bold' | |
,'B' | |
,'<strong>' | |
,'</strong>' | |
,'b' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_italic' | |
,'I' | |
,'<em>' | |
,'</em>' | |
,'i' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_link' | |
,'Link' | |
,'' | |
,'</a>' | |
,'a' | |
) | |
); // special case | |
edButtons.push( | |
new edButton( | |
'ed_ext_link' | |
,'Ext. Link' | |
,'' | |
,'</a>' | |
,'e' | |
) | |
); // special case | |
edButtons.push( | |
new edButton( | |
'ed_img' | |
,'IMG' | |
,'' | |
,'' | |
,'m' | |
,-1 | |
) | |
); // special case | |
edButtons.push( | |
new edButton( | |
'ed_ul' | |
,'UL' | |
,'<ul>\n' | |
,'\r</ul>' | |
,'u' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_ol' | |
,'OL' | |
,'<ol>\n' | |
,'\r</ol>' | |
,'o' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_li' | |
,'LI' | |
,' <li>' | |
,'</li>' | |
,'l' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_block' | |
,'B-QUOTE' | |
,'<blockquote>' | |
,'</blockquote>' | |
,'q' | |
) | |
); | |
var extendedStart = edButtons.length; | |
// below here are the extended buttons | |
edButtons.push( | |
new edButton( | |
'ed_h1' | |
,'H1' | |
,'<h1>' | |
,'</h1>\n\n' | |
,'1' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_h2' | |
,'H2' | |
,'<h2>' | |
,'</h2>\n\n' | |
,'2' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_h3' | |
,'H3' | |
,'<h3>' | |
,'</h3>\n\n' | |
,'3' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_h4' | |
,'H4' | |
,'<h4>' | |
,'</h4>\n\n' | |
,'4' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_p' | |
,'P' | |
,'<p>' | |
,'</p>\n' | |
,'p' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_code' | |
,'CODE' | |
,'<code>' | |
,'</code>' | |
,'c' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_pre' | |
,'PRE' | |
,'<pre>' | |
,'</pre>' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_dl' | |
,'DL' | |
,'<dl>\n' | |
,'</dl>\n\n' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_dt' | |
,'DT' | |
,'\t<dt>' | |
,'</dt>\n' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_dd' | |
,'DD' | |
,'\t<dd>' | |
,'</dd>\n' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_table' | |
,'TABLE' | |
,'<table>\n<tbody>' | |
,'</tbody>\n</table>\n' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_tr' | |
,'TR' | |
,'\t<tr>\n' | |
,'\n\t</tr>\n' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_td' | |
,'TD' | |
,'\t\t<td>' | |
,'</td>\n' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_ins' | |
,'INS' | |
,'<ins>' | |
,'</ins>' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_del' | |
,'DEL' | |
,'<del>' | |
,'</del>' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_nobr' | |
,'NOBR' | |
,'<nobr>' | |
,'</nobr>' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_footnote' | |
,'Footnote' | |
,'' | |
,'' | |
,'f' | |
) | |
); | |
edButtons.push( | |
new edButton( | |
'ed_via' | |
,'Via' | |
,'' | |
,'' | |
,'v' | |
) | |
); | |
function edLink(display, URL, newWin) { | |
this.display = display; | |
this.URL = URL; | |
if (!newWin) { | |
newWin = 0; | |
} | |
this.newWin = newWin; | |
} | |
edLinks[edLinks.length] = new edLink('alexking.org' | |
,'http://www.alexking.org/' | |
); | |
function edShowButton(which, button, i) { | |
if (button.access) { | |
var accesskey = ' accesskey = "' + button.access + '"' | |
} | |
else { | |
var accesskey = ''; | |
} | |
switch (button.id) { | |
case 'ed_img': | |
document.write('<input type="button" id="' + button.id + '_' + which + '" ' + accesskey + ' class="ed_button" onclick="edInsertImage(\'' + which + '\');" value="' + button.display + '" />'); | |
break; | |
case 'ed_link': | |
document.write('<input type="button" id="' + button.id + '_' + which + '" ' + accesskey + ' class="ed_button" onclick="edInsertLink(\'' + which + '\', ' + i + ');" value="' + button.display + '" />'); | |
break; | |
case 'ed_ext_link': | |
document.write('<input type="button" id="' + button.id + '_' + which + '" ' + accesskey + ' class="ed_button" onclick="edInsertExtLink(\'' + which + '\', ' + i + ');" value="' + button.display + '" />'); | |
break; | |
case 'ed_footnote': | |
document.write('<input type="button" id="' + button.id + '_' + which + '" ' + accesskey + ' class="ed_button" onclick="edInsertFootnote(\'' + which + '\');" value="' + button.display + '" />'); | |
break; | |
case 'ed_via': | |
document.write('<input type="button" id="' + button.id + '_' + which + '" ' + accesskey + ' class="ed_button" onclick="edInsertVia(\'' + which + '\');" value="' + button.display + '" />'); | |
break; | |
default: | |
document.write('<input type="button" id="' + button.id + '_' + which + '" ' + accesskey + ' class="ed_button" onclick="edInsertTag(\'' + which + '\', ' + i + ');" value="' + button.display + '" />'); | |
break; | |
} | |
} | |
function edShowLinks() { | |
var tempStr = '<select onchange="edQuickLink(this.options[this.selectedIndex].value, this);"><option value="-1" selected>(Quick Links)</option>'; | |
for (i = 0; i < edLinks.length; i++) { | |
tempStr += '<option value="' + i + '">' + edLinks[i].display + '</option>'; | |
} | |
tempStr += '</select>'; | |
document.write(tempStr); | |
} | |
function edAddTag(which, button) { | |
if (edButtons[button].tagEnd != '') { | |
edOpenTags[which][edOpenTags[which].length] = button; | |
document.getElementById(edButtons[button].id + '_' + which).value = '/' + document.getElementById(edButtons[button].id + '_' + which).value; | |
} | |
} | |
function edRemoveTag(which, button) { | |
for (i = 0; i < edOpenTags[which].length; i++) { | |
if (edOpenTags[which][i] == button) { | |
edOpenTags[which].splice(i, 1); | |
document.getElementById(edButtons[button].id + '_' + which).value = document.getElementById(edButtons[button].id + '_' + which).value.replace('/', ''); | |
} | |
} | |
} | |
function edCheckOpenTags(which, button) { | |
var tag = 0; | |
for (i = 0; i < edOpenTags[which].length; i++) { | |
if (edOpenTags[which][i] == button) { | |
tag++; | |
} | |
} | |
if (tag > 0) { | |
return true; // tag found | |
} | |
else { | |
return false; // tag not found | |
} | |
} | |
function edCloseAllTags(which) { | |
var count = edOpenTags[which].length; | |
for (o = 0; o < count; o++) { | |
edInsertTag(which, edOpenTags[which][edOpenTags[which].length - 1]); | |
} | |
} | |
function edQuickLink(i, thisSelect) { | |
if (i > -1) { | |
var newWin = ''; | |
if (edLinks[i].newWin == 1) { | |
newWin = ' target="_blank"'; | |
} | |
var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>' | |
+ edLinks[i].display | |
+ '</a>'; | |
thisSelect.selectedIndex = 0; | |
edInsertContent(edCanvas, tempStr); | |
} | |
else { | |
thisSelect.selectedIndex = 0; | |
} | |
} | |
function edSpell(which) { | |
myField = document.getElementById(which); | |
var word = ''; | |
if (document.selection) { | |
myField.focus(); | |
var sel = document.selection.createRange(); | |
if (sel.text.length > 0) { | |
word = sel.text; | |
} | |
} | |
else if (myField.selectionStart || myField.selectionStart == '0') { | |
var startPos = myField.selectionStart; | |
var endPos = myField.selectionEnd; | |
if (startPos != endPos) { | |
word = myField.value.substring(startPos, endPos); | |
} | |
} | |
if (word == '') { | |
word = prompt('Enter a word to look up:', ''); | |
} | |
if (word != '') { | |
window.open(dictionaryUrl + escape(word)); | |
} | |
} | |
function edToolbar(which) { | |
document.write('<div id="ed_toolbar_' + which + '"><span>'); | |
for (i = 0; i < extendedStart; i++) { | |
edShowButton(which, edButtons[i], i); | |
} | |
if (edShowExtraCookie()) { | |
document.write( | |
'<input type="button" id="ed_close_' + which + '" class="ed_button" onclick="edCloseAllTags(\'' + which + '\');" value="Close Tags" />' | |
+ '<input type="button" id="ed_spell_' + which + '" class="ed_button" onclick="edSpell(\'' + which + '\');" value="Dict" />' | |
+ '<input type="button" id="ed_extra_show_' + which + '" class="ed_button" onclick="edShowExtra(\'' + which + '\')" value="»" style="visibility: hidden;" />' | |
+ '</span><br />' | |
+ '<span id="ed_extra_buttons_' + which + '">' | |
+ '<input type="button" id="ed_extra_hide_' + which + '" class="ed_button" onclick="edHideExtra(\'' + which + '\');" value="«" />' | |
); | |
} | |
else { | |
document.write( | |
'<input type="button" id="ed_close_' + which + '" class="ed_button" onclick="edCloseAllTags(\'' + which + '\');" value="Close Tags" />' | |
+ '<input type="button" id="ed_spell_' + which + '" class="ed_button" onclick="edSpell(\'' + which + '\');" value="Dict" />' | |
+ '<input type="button" id="ed_extra_show_' + which + '" class="ed_button" onclick="edShowExtra(\'' + which + '\')" value="»" />' | |
+ '</span><br />' | |
+ '<span id="ed_extra_buttons_' + which + '" style="display: none;">' | |
+ '<input type="button" id="ed_extra_hide_' + which + '" class="ed_button" onclick="edHideExtra(\'' + which + '\');" value="«" />' | |
); | |
} | |
for (i = extendedStart; i < edButtons.length; i++) { | |
edShowButton(which, edButtons[i], i); | |
} | |
document.write('</span>'); | |
// edShowLinks(); | |
document.write('</div>'); | |
edOpenTags[which] = new Array(); | |
} | |
function edShowExtra(which) { | |
document.getElementById('ed_extra_show_' + which).style.visibility = 'hidden'; | |
document.getElementById('ed_extra_buttons_' + which).style.display = 'block'; | |
edSetCookie( | |
'js_quicktags_extra' | |
, 'show' | |
, new Date("December 31, 2100") | |
); | |
} | |
function edHideExtra(which) { | |
document.getElementById('ed_extra_buttons_' + which).style.display = 'none'; | |
document.getElementById('ed_extra_show_' + which).style.visibility = 'visible'; | |
edSetCookie( | |
'js_quicktags_extra' | |
, 'hide' | |
, new Date("December 31, 2100") | |
); | |
} | |
// insertion code | |
function edInsertTag(which, i) { | |
myField = document.getElementById(which); | |
//IE support | |
if (document.selection) { | |
myField.focus(); | |
sel = document.selection.createRange(); | |
if (sel.text.length > 0) { | |
sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd; | |
} | |
else { | |
if (!edCheckOpenTags(which, i) || edButtons[i].tagEnd == '') { | |
sel.text = edButtons[i].tagStart; | |
edAddTag(which, i); | |
} | |
else { | |
sel.text = edButtons[i].tagEnd; | |
edRemoveTag(which, i); | |
} | |
} | |
myField.focus(); | |
} | |
//MOZILLA/NETSCAPE support | |
else if (myField.selectionStart || myField.selectionStart == '0') { | |
var startPos = myField.selectionStart; | |
var endPos = myField.selectionEnd; | |
var cursorPos = endPos; | |
var scrollTop = myField.scrollTop; | |
if (startPos != endPos) { | |
myField.value = myField.value.substring(0, startPos) | |
+ edButtons[i].tagStart | |
+ myField.value.substring(startPos, endPos) | |
+ edButtons[i].tagEnd | |
+ myField.value.substring(endPos, myField.value.length); | |
cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length; | |
} | |
else { | |
if (!edCheckOpenTags(which, i) || edButtons[i].tagEnd == '') { | |
myField.value = myField.value.substring(0, startPos) | |
+ edButtons[i].tagStart | |
+ myField.value.substring(endPos, myField.value.length); | |
edAddTag(which, i); | |
cursorPos = startPos + edButtons[i].tagStart.length; | |
} | |
else { | |
myField.value = myField.value.substring(0, startPos) | |
+ edButtons[i].tagEnd | |
+ myField.value.substring(endPos, myField.value.length); | |
edRemoveTag(which, i); | |
cursorPos = startPos + edButtons[i].tagEnd.length; | |
} | |
} | |
myField.focus(); | |
myField.selectionStart = cursorPos; | |
myField.selectionEnd = cursorPos; | |
myField.scrollTop = scrollTop; | |
} | |
else { | |
if (!edCheckOpenTags(which, i) || edButtons[i].tagEnd == '') { | |
myField.value += edButtons[i].tagStart; | |
edAddTag(which, i); | |
} | |
else { | |
myField.value += edButtons[i].tagEnd; | |
edRemoveTag(which, i); | |
} | |
myField.focus(); | |
} | |
} | |
function edInsertContent(which, myValue) { | |
myField = document.getElementById(which); | |
//IE support | |
if (document.selection) { | |
myField.focus(); | |
sel = document.selection.createRange(); | |
sel.text = myValue; | |
myField.focus(); | |
} | |
//MOZILLA/NETSCAPE support | |
else if (myField.selectionStart || myField.selectionStart == '0') { | |
var startPos = myField.selectionStart; | |
var endPos = myField.selectionEnd; | |
var scrollTop = myField.scrollTop; | |
myField.value = myField.value.substring(0, startPos) | |
+ myValue | |
+ myField.value.substring(endPos, myField.value.length); | |
myField.focus(); | |
myField.selectionStart = startPos + myValue.length; | |
myField.selectionEnd = startPos + myValue.length; | |
myField.scrollTop = scrollTop; | |
} else { | |
myField.value += myValue; | |
myField.focus(); | |
} | |
} | |
function edInsertLink(which, i, defaultValue) { | |
myField = document.getElementById(which); | |
if (!defaultValue) { | |
defaultValue = 'http://'; | |
} | |
if (!edCheckOpenTags(which, i)) { | |
var URL = prompt('Enter the URL' ,defaultValue); | |
if (URL) { | |
edButtons[i].tagStart = '<a href="' + URL + '">'; | |
edInsertTag(which, i); | |
} | |
} | |
else { | |
edInsertTag(which, i); | |
} | |
} | |
function edInsertExtLink(which, i, defaultValue) { | |
myField = document.getElementById(which); | |
if (!defaultValue) { | |
defaultValue = 'http://'; | |
} | |
if (!edCheckOpenTags(which, i)) { | |
var URL = prompt('Enter the URL' ,defaultValue); | |
if (URL) { | |
edButtons[i].tagStart = '<a href="' + URL + '" rel="external">'; | |
edInsertTag(which, i); | |
} | |
} | |
else { | |
edInsertTag(which, i); | |
} | |
} | |
function edInsertImage(which) { | |
myField = document.getElementById(which); | |
var myValue = prompt('Enter the URL of the image', 'http://'); | |
if (myValue) { | |
myValue = '<img src="' | |
+ myValue | |
+ '" alt="' + prompt('Enter a description of the image', '') | |
+ '" />'; | |
edInsertContent(which, myValue); | |
} | |
} | |
function edInsertFootnote(which) { | |
myField = document.getElementById(which); | |
var note = prompt('Enter the footnote:', ''); | |
if (!note || note == '') { | |
return false; | |
} | |
var now = new Date; | |
var fnId = 'fn' + now.getTime(); | |
var fnStart = myField.value.indexOf('<ol class="footnotes">'); | |
if (fnStart != -1) { | |
var fnStr1 = myField.value.substring(0, fnStart) | |
var fnStr2 = myField.value.substring(fnStart, myField.value.length) | |
var count = countInstances(fnStr2, '<li id="') + 1; | |
} | |
else { | |
var count = 1; | |
} | |
var count = '<sup><a href="#' + fnId + 'n" id="' + fnId + '" class="footnote">' + count + '</a></sup>'; | |
edInsertContent(which, count); | |
if (fnStart != -1) { | |
fnStr1 = myField.value.substring(0, fnStart + count.length) | |
fnStr2 = myField.value.substring(fnStart + count.length, myField.value.length) | |
} | |
else { | |
var fnStr1 = myField.value; | |
var fnStr2 = "\n\n" + '<ol class="footnotes">' + "\n" | |
+ '</ol>' + "\n"; | |
} | |
var footnote = ' <li id="' + fnId + 'n">' + note + ' [<a href="#' + fnId + '">back</a>]</li>' + "\n" | |
+ '</ol>'; | |
myField.value = fnStr1 + fnStr2.replace('</ol>', footnote); | |
} | |
function countInstances(string, substr) { | |
var count = string.split(substr); | |
return count.length - 1; | |
} | |
function edInsertVia(which) { | |
myField = document.getElementById(which); | |
var myValue = prompt('Enter the URL of the source link', 'http://'); | |
if (myValue) { | |
myValue = '(Thanks <a href="' + myValue + '" rel="external">' | |
+ prompt('Enter the name of the source', '') | |
+ '</a>)'; | |
edInsertContent(which, myValue); | |
} | |
} | |
function edSetCookie(name, value, expires, path, domain) { | |
document.cookie= name + "=" + escape(value) + | |
((expires) ? "; expires=" + expires.toGMTString() : "") + | |
((path) ? "; path=" + path : "") + | |
((domain) ? "; domain=" + domain : ""); | |
} | |
function edShowExtraCookie() { | |
var cookies = document.cookie.split(';'); | |
for (var i=0;i < cookies.length; i++) { | |
var cookieData = cookies[i]; | |
while (cookieData.charAt(0) ==' ') { | |
cookieData = cookieData.substring(1, cookieData.length); | |
} | |
if (cookieData.indexOf('js_quicktags_extra') == 0) { | |
if (cookieData.substring(19, cookieData.length) == 'show') { | |
return true; | |
} | |
else { | |
return false; | |
} | |
} | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment