| 5 | | var edButtons = new Array(), edLinks = new Array(), edOpenTags = new Array(), now = new Date(), datetime; |
| 6 | | |
| 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 |
| 14 | | } |
| 15 | | |
| 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 } |
| 22 | | return str; |
| 23 | | } |
| 24 | | |
| 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) + |
| 31 | | '+00:00'; |
| 32 | | |
| 33 | | edButtons[edButtons.length] = |
| 34 | | new edButton('ed_strong' |
| 35 | | ,'b' |
| 36 | | ,'<strong>' |
| 37 | | ,'</strong>' |
| 38 | | ,'b' |
| 39 | | ); |
| 40 | | |
| 41 | | edButtons[edButtons.length] = |
| 42 | | new edButton('ed_em' |
| 43 | | ,'i' |
| 44 | | ,'<em>' |
| 45 | | ,'</em>' |
| 46 | | ,'i' |
| 47 | | ); |
| 48 | | |
| 49 | | edButtons[edButtons.length] = |
| 50 | | new edButton('ed_link' |
| 51 | | ,'link' |
| 52 | | ,'' |
| 53 | | ,'</a>' |
| 54 | | ,'a' |
| 55 | | ); // special case |
| 56 | | |
| 57 | | edButtons[edButtons.length] = |
| 58 | | new edButton('ed_block' |
| 59 | | ,'b-quote' |
| 60 | | ,'\n\n<blockquote>' |
| 61 | | ,'</blockquote>\n\n' |
| 62 | | ,'q' |
| 63 | | ); |
| 64 | | |
| 65 | | |
| 66 | | edButtons[edButtons.length] = |
| 67 | | new edButton('ed_del' |
| 68 | | ,'del' |
| 69 | | ,'<del datetime="' + datetime + '">' |
| 70 | | ,'</del>' |
| 71 | | ,'d' |
| 72 | | ); |
| 73 | | |
| 74 | | edButtons[edButtons.length] = |
| 75 | | new edButton('ed_ins' |
| 76 | | ,'ins' |
| 77 | | ,'<ins datetime="' + datetime + '">' |
| 78 | | ,'</ins>' |
| 79 | | ,'s' |
| 80 | | ); |
| 81 | | |
| 82 | | edButtons[edButtons.length] = |
| 83 | | new edButton('ed_img' |
| 84 | | ,'img' |
| 85 | | ,'' |
| 86 | | ,'' |
| 87 | | ,'m' |
| 88 | | ,-1 |
| 89 | | ); // special case |
| 90 | | |
| 91 | | edButtons[edButtons.length] = |
| 92 | | new edButton('ed_ul' |
| 93 | | ,'ul' |
| 94 | | ,'<ul>\n' |
| 95 | | ,'</ul>\n\n' |
| 96 | | ,'u' |
| 97 | | ); |
| 98 | | |
| 99 | | edButtons[edButtons.length] = |
| 100 | | new edButton('ed_ol' |
| 101 | | ,'ol' |
| 102 | | ,'<ol>\n' |
| 103 | | ,'</ol>\n\n' |
| 104 | | ,'o' |
| 105 | | ); |
| | 7 | var QuickTags; |
| 107 | | edButtons[edButtons.length] = |
| 108 | | new edButton('ed_li' |
| 109 | | ,'li' |
| 110 | | ,'\t<li>' |
| 111 | | ,'</li>\n' |
| 112 | | ,'l' |
| 113 | | ); |
| 114 | | |
| 115 | | edButtons[edButtons.length] = |
| 116 | | new edButton('ed_code' |
| 117 | | ,'code' |
| 118 | | ,'<code>' |
| 119 | | ,'</code>' |
| 120 | | ,'c' |
| 121 | | ); |
| 122 | | |
| 123 | | edButtons[edButtons.length] = |
| 124 | | new edButton('ed_more' |
| 125 | | ,'more' |
| 126 | | ,'<!--more-->' |
| 127 | | ,'' |
| 128 | | ,'t' |
| 129 | | ,-1 |
| 130 | | ); |
| 131 | | /* |
| 132 | | edButtons[edButtons.length] = |
| 133 | | new edButton('ed_next' |
| 134 | | ,'page' |
| 135 | | ,'<!--nextpage-->' |
| 136 | | ,'' |
| 137 | | ,'p' |
| 138 | | ,-1 |
| 139 | | ); |
| 140 | | */ |
| 141 | | function edLink() { |
| 142 | | this.display = ''; |
| 143 | | this.URL = ''; |
| 144 | | this.newWin = 0; |
| 145 | | } |
| 146 | | |
| 147 | | edLinks[edLinks.length] = new edLink('WordPress' |
| 148 | | ,'http://wordpress.org/' |
| 149 | | ); |
| 150 | | |
| 151 | | edLinks[edLinks.length] = new edLink('alexking.org' |
| 152 | | ,'http://www.alexking.org/' |
| 153 | | ); |
| 154 | | |
| 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 + '" />'); |
| 158 | | } |
| 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 + '" />'); |
| 161 | | } |
| 162 | | else { |
| 163 | | document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '" />'); |
| 164 | | } |
| 165 | | } |
| 166 | | |
| 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>'; |
| 171 | | } |
| 172 | | tempStr += '</select>'; |
| 173 | | document.write(tempStr); |
| 174 | | } |
| 175 | | |
| 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; |
| 180 | | } |
| 181 | | } |
| 182 | | |
| 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('/', ''); |
| 188 | | } |
| 189 | | } |
| 190 | | } |
| 191 | | |
| 192 | | function edCheckOpenTags(button) { |
| 193 | | var tag = 0, i; |
| 194 | | for (i = 0; i < edOpenTags.length; i++) { |
| 195 | | if (edOpenTags[i] == button) { |
| 196 | | tag++; |
| 197 | | } |
| 198 | | } |
| 199 | | if (tag > 0) { |
| 200 | | return true; // tag found |
| 201 | | } |
| 202 | | else { |
| 203 | | return false; // tag not found |
| 204 | | } |
| 205 | | } |
| | 9 | (function(){ |
| | 10 | // private stuff is prefixed with an underscore |
| | 11 | var _domReady = function(func) { |
| | 12 | if (typeof jQuery != 'undefined') { |
| | 13 | jQuery(document).ready(func); |
| | 14 | } else { |
| | 15 | var t = _domReady, DOMContentLoaded, top; |
| | 16 | t.funcs = []; |
| | 17 | |
| | 18 | t.ready = function() { |
| | 19 | if (! t.isReady) { |
| | 20 | t.isReady = true; |
| | 21 | for (var i=0; i < t.funcs.length; i++) { |
| | 22 | t.funcs[i](); |
| | 23 | } |
| | 24 | } |
| | 25 | }; |
| 214 | | function edQuickLink(i, thisSelect) { |
| 215 | | if (i > -1) { |
| 216 | | var newWin = '', tempStr; |
| 217 | | if (edLinks[i].newWin == 1) { |
| 218 | | newWin = ' target="_blank"'; |
| 219 | | } |
| 220 | | tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>' |
| 221 | | + edLinks[i].display |
| 222 | | + '</a>'; |
| 223 | | thisSelect.selectedIndex = 0; |
| 224 | | edInsertContent(edCanvas, tempStr); |
| 225 | | } |
| 226 | | else { |
| 227 | | thisSelect.selectedIndex = 0; |
| 228 | | } |
| 229 | | } |
| | 33 | if ( ! t.eventAttached ) { |
| | 34 | if (document.addEventListener) { |
| | 35 | DOMContentLoaded = function(){document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false);t.ready();}; |
| | 36 | document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); |
| | 37 | window.addEventListener('load', t.ready, false); |
| | 38 | } else if (document.attachEvent) { |
| | 39 | DOMContentLoaded = function(){if (document.readyState === 'complete'){ document.detachEvent('onreadystatechange', DOMContentLoaded);t.ready();}}; |
| | 40 | document.attachEvent('onreadystatechange', DOMContentLoaded); |
| | 41 | window.attachEvent('onload', t.ready); |
| | 42 | |
| | 43 | (function(){ |
| | 44 | try { |
| | 45 | document.documentElement.doScroll("left"); |
| | 46 | } catch(e) { |
| | 47 | setTimeout(arguments.callee, 50); |
| | 48 | return; |
| | 49 | } |
| | 50 | |
| | 51 | t.ready(); |
| | 52 | })(); |
| | 53 | } |
| 246 | | } |
| 247 | | if (word == '') { |
| 248 | | word = prompt(quicktagsL10n.wordLookup, ''); |
| 249 | | } |
| 250 | | if (word !== null && /^\w[\w ]*$/.test(word)) { |
| 251 | | window.open('http://www.answers.com/' + escape(word)); |
| 252 | | } |
| 253 | | } |
| 254 | | |
| 255 | | function edToolbar() { |
| 256 | | document.write('<div id="ed_toolbar">'); |
| 257 | | for (var i = 0; i < edButtons.length; i++) { |
| 258 | | edShowButton(edButtons[i], i); |
| 259 | | } |
| 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 | | // edShowLinks(); // disabled by default |
| 263 | | document.write('</div>'); |
| 264 | | } |
| 265 | | |
| 266 | | // insertion code |
| 267 | | |
| 268 | | function edInsertTag(myField, i) { |
| 269 | | //IE support |
| 270 | | if (document.selection) { |
| 271 | | myField.focus(); |
| 272 | | var sel = document.selection.createRange(); |
| 273 | | if (sel.text.length > 0) { |
| 274 | | sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd; |
| | 66 | if (number < 0) { str = str.substr(1, str.length); } |
| | 67 | while (str.length < threshold) { str = "0" + str; } |
| | 68 | if (number < 0) { str = '-' + str; } |
| | 69 | return str; |
| | 70 | }; |
| | 71 | |
| | 72 | var _dateToString = function(d) { |
| | 73 | return '' + |
| | 74 | d.getUTCFullYear() + '-' + |
| | 75 | _zeroise(d.getUTCMonth() + 1, 2) + '-' + |
| | 76 | _zeroise(d.getUTCDate(), 2) + 'T' + |
| | 77 | _zeroise(d.getUTCHours(), 2) + ':' + |
| | 78 | _zeroise(d.getUTCMinutes(), 2) + ':' + |
| | 79 | _zeroise(d.getUTCSeconds() ,2) + |
| | 80 | '+00:00'; |
| | 81 | }; |
| | 82 | |
| | 83 | var _instances = [], |
| | 84 | _now = new Date(), |
| | 85 | _datetime = _dateToString(_now), |
| | 86 | _customButtons = {}, qt; |
| | 87 | |
| | 88 | qt = QuickTags = function(name, id, container, disabled) { |
| | 89 | var t = this, |
| | 90 | cont = document.getElementById(container), |
| | 91 | buttons = {}, |
| | 92 | links = [], |
| | 93 | openTags = [], |
| | 94 | i, c, p, tb, html, canvas; |
| | 95 | |
| | 96 | t.name = name; |
| | 97 | t.id = id; |
| | 98 | |
| | 99 | disabled = (typeof disabled == 'undefined') ? '' : ',' + disabled + ','; |
| | 100 | |
| | 101 | // default buttons |
| | 102 | buttons = { |
| | 103 | 'strong' : new qt.TagButton('strong','b','<strong>','</strong>','b'), |
| | 104 | 'em' : new qt.TagButton('em','i','<em>','</em>','i'), |
| | 105 | 'link' : new qt.LinkButton(), // special case |
| | 106 | 'block' : new qt.TagButton('block','b-quote','\n\n<blockquote>','</blockquote>\n\n','q'), |
| | 107 | 'del' : new qt.TagButton('del','del','<del datetime="' + _datetime + '">','</del>','d'), |
| | 108 | 'ins' : new qt.TagButton('ins','ins','<ins datetime="' + _datetime + '">','</ins>','s'), |
| | 109 | 'img' : new qt.ImgButton(), // special case |
| | 110 | 'ul' : new qt.TagButton('ul','ul','<ul>\n','</ul>\n\n','u'), |
| | 111 | 'ol' : new qt.TagButton('ol','ol','<ol>\n','</ol>\n\n','o'), |
| | 112 | 'li' : new qt.TagButton('li','li','\t<li>','</li>\n','l'), |
| | 113 | 'code' : new qt.TagButton('code','code','<code>','</code>','c'), |
| | 114 | 'more' : new qt.TagButton('more','more','<!--more-->','','t',-1), |
| | 115 | 'spell' : new qt.SpellButton(), |
| | 116 | 'close' : new qt.CloseButton() |
| | 117 | }; |
| | 118 | |
| | 119 | // add custom buttons |
| | 120 | for (i in _customButtons) { |
| | 121 | buttons[i] = new _customButtons[i](); |
| 300 | | else { |
| 301 | | if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') { |
| 302 | | myField.value = myField.value.substring(0, startPos) |
| 303 | | + edButtons[i].tagStart |
| 304 | | + myField.value.substring(endPos, myField.value.length); |
| 305 | | edAddTag(i); |
| 306 | | cursorPos = startPos + edButtons[i].tagStart.length; |
| 307 | | } |
| 308 | | else { |
| 309 | | myField.value = myField.value.substring(0, startPos) |
| 310 | | + edButtons[i].tagEnd |
| 311 | | + myField.value.substring(endPos, myField.value.length); |
| 312 | | edRemoveTag(i); |
| 313 | | cursorPos = startPos + edButtons[i].tagEnd.length; |
| | 131 | html += "</div>"; |
| | 132 | cont.innerHTML = html + cont.innerHTML; |
| | 133 | |
| | 134 | // listen for click events |
| | 135 | this.toolbar = tb = document.getElementById(name + '_toolbar'); |
| | 136 | |
| | 137 | |
| | 138 | var onclick = function(e) { |
| | 139 | e = e || window.event; |
| | 140 | var target = e.target || e.srcElement, i; |
| | 141 | |
| | 142 | // as long as it has the class ed_button, execute the callback |
| | 143 | if (/\s+ed_button\s+/.test(' ' + target.className + ' ')) { |
| | 144 | // we have to reassign canvas here |
| | 145 | t.canvas = canvas = document.getElementById(id); |
| | 146 | i = target.id.replace(name + '_', ''); |
| | 147 | if (buttons[i]) { |
| | 148 | buttons[i].callback.call(buttons[i], target, canvas, t); |
| | 149 | } |
| 316 | | myField.focus(); |
| 317 | | myField.selectionStart = cursorPos; |
| 318 | | myField.selectionEnd = cursorPos; |
| 319 | | myField.scrollTop = scrollTop; |
| 320 | | } |
| 321 | | else { |
| 322 | | if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') { |
| 323 | | myField.value += edButtons[i].tagStart; |
| 324 | | edAddTag(i); |
| 325 | | } |
| 326 | | else { |
| 327 | | myField.value += edButtons[i].tagEnd; |
| 328 | | edRemoveTag(i); |
| 329 | | } |
| 330 | | myField.focus(); |
| 331 | | } |
| 332 | | } |
| 333 | | |
| 334 | | function edInsertContent(myField, myValue) { |
| 335 | | var sel, startPos, endPos, scrollTop; |
| 336 | | |
| 337 | | //IE support |
| 338 | | if (document.selection) { |
| 339 | | myField.focus(); |
| 340 | | sel = document.selection.createRange(); |
| 341 | | sel.text = myValue; |
| 342 | | myField.focus(); |
| 343 | | } |
| 344 | | //MOZILLA/NETSCAPE support |
| 345 | | else if (myField.selectionStart || myField.selectionStart == '0') { |
| 346 | | startPos = myField.selectionStart; |
| 347 | | endPos = myField.selectionEnd; |
| 348 | | scrollTop = myField.scrollTop; |
| 349 | | myField.value = myField.value.substring(0, startPos) |
| 350 | | + myValue |
| 351 | | + myField.value.substring(endPos, myField.value.length); |
| 352 | | myField.focus(); |
| 353 | | myField.selectionStart = startPos + myValue.length; |
| 354 | | myField.selectionEnd = startPos + myValue.length; |
| 355 | | myField.scrollTop = scrollTop; |
| 356 | | } else { |
| 357 | | myField.value += myValue; |
| 358 | | myField.focus(); |
| 359 | | } |
| 360 | | } |
| 361 | | |
| 362 | | function edInsertLink(myField, i, defaultValue) { |
| 363 | | if (!defaultValue) { |
| 364 | | defaultValue = 'http://'; |
| 365 | | } |
| 366 | | if (!edCheckOpenTags(i)) { |
| 367 | | var URL = prompt(quicktagsL10n.enterURL, defaultValue); |
| 368 | | if (URL) { |
| 369 | | edButtons[i].tagStart = '<a href="' + URL + '">'; |
| 370 | | edInsertTag(myField, i); |
| 371 | | } |
| 372 | | } |
| 373 | | else { |
| 374 | | edInsertTag(myField, i); |
| 375 | | } |
| 376 | | } |
| 377 | | |
| 378 | | function edInsertImage(myField) { |
| 379 | | var myValue = prompt(quicktagsL10n.enterImageURL, 'http://'); |
| 380 | | if (myValue) { |
| 381 | | myValue = '<img src="' |
| 382 | | + myValue |
| 383 | | + '" alt="' + prompt(quicktagsL10n.enterImageDescription, '') |
| 384 | | + '" />'; |
| 385 | | edInsertContent(myField, myValue); |
| 386 | | } |
| 387 | | } |
| 388 | | |
| 389 | | |
| 390 | | // Allow multiple instances. |
| 391 | | // Name = unique value, id = textarea id, container = container div. |
| 392 | | // Can disable some buttons by passing comma delimited string as 4th param. |
| 393 | | var QTags = function(name, id, container, disabled) { |
| 394 | | var t = this, cont = document.getElementById(container), i, tag, tb, html, sel; |
| 395 | | |
| 396 | | t.Buttons = []; |
| 397 | | t.Links = []; |
| 398 | | t.OpenTags = []; |
| 399 | | t.Canvas = document.getElementById(id); |
| 400 | | |
| 401 | | if ( ! t.Canvas || ! cont ) |
| 402 | | return; |
| 403 | | |
| 404 | | disabled = ( typeof disabled != 'undefined' ) ? ','+disabled+',' : ''; |
| 405 | | |
| 406 | | t.edShowButton = function(button, i) { |
| 407 | | if ( disabled && (disabled.indexOf(','+button.display+',') != -1) ) |
| 408 | | return ''; |
| 409 | | else if ( button.id == name+'_img' ) |
| 410 | | return '<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage('+name+'.Canvas);" value="' + button.display + '" />'; |
| 411 | | else if (button.id == name+'_link') |
| 412 | | return '<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="'+name+'.edInsertLink('+i+');" value="'+button.display+'" />'; |
| 413 | | else |
| 414 | | return '<input type="button" id="' + button.id + '" accesskey="'+button.access+'" class="ed_button" onclick="'+name+'.edInsertTag('+i+');" value="'+button.display+'" />'; |
| | 158 | |
| | 159 | t.getButton = function(id){ |
| | 160 | return buttons[id]; |
| | 161 | }; |
| | 162 | |
| | 163 | _instances[id] = t; |
| 448 | | |
| 449 | | this.edQuickLink = function(i, thisSelect) { |
| 450 | | if ( i > -1 ) { |
| 451 | | var newWin = '', tempStr; |
| 452 | | if ( Links[i].newWin == 1 ) { |
| 453 | | newWin = ' target="_blank"'; |
| | 188 | qt.Button.prototype.html = function(idPrefix) { |
| | 189 | var access = this.access ? ' accesskey="' + this.access + '"' : ''; |
| | 190 | return '<input type="button" id="' + idPrefix + this.id + '"' + access + ' class="ed_button" value="' + this.display + '" />'; |
| | 191 | }; |
| | 192 | qt.Button.prototype.callback = function(canvas) {}; |
| | 193 | |
| | 194 | // a button that inserts HTML tag |
| | 195 | qt.TagButton = function(id, display, tagStart, tagEnd, access, open) { |
| | 196 | var t = this; |
| | 197 | qt.Button.call(t, id, display, access); |
| | 198 | t.tagStart = tagStart; |
| | 199 | t.tagEnd = tagEnd; |
| | 200 | t.open = open; |
| | 201 | }; |
| | 202 | qt.TagButton.prototype = new qt.Button(); |
| | 203 | qt.TagButton.prototype.openTag = function(e, tb) { |
| | 204 | var t = this; |
| | 205 | t.isOpen = true; |
| | 206 | if (! tb._openTags) { |
| | 207 | tb._openTags = []; |
| | 208 | } |
| | 209 | if (t.tagEnd) { |
| | 210 | tb._openTags.push(t.id); |
| | 211 | e.value = '/' + e.value; |
| | 212 | } |
| | 213 | }; |
| | 214 | qt.TagButton.prototype.closeTag = function(e, tb) { |
| | 215 | var t = this, i; |
| | 216 | t.isOpen = false; |
| | 217 | if (tb._openTags) { |
| | 218 | for (i=0; i < tb._openTags.length; i ++ ) { |
| | 219 | if (tb._openTags[i] == t.id) { |
| | 220 | tb._openTags.splice(i, 1); |
| | 221 | } |
| 482 | | t.Canvas.focus(); |
| 483 | | } else if ( t.Canvas.selectionStart || t.Canvas.selectionStart == '0' ) { //MOZILLA/NETSCAPE support |
| 484 | | var startPos = t.Canvas.selectionStart, endPos = t.Canvas.selectionEnd, cursorPos = endPos, scrollTop = t.Canvas.scrollTop; |
| 485 | | |
| 486 | | if ( startPos != endPos ) { |
| 487 | | t.Canvas.value = t.Canvas.value.substring(0, startPos) |
| 488 | | + t.Buttons[i].tagStart |
| 489 | | + t.Canvas.value.substring(startPos, endPos) |
| 490 | | + t.Buttons[i].tagEnd |
| 491 | | + t.Canvas.value.substring(endPos, t.Canvas.value.length); |
| 492 | | cursorPos += t.Buttons[i].tagStart.length + t.Buttons[i].tagEnd.length; |
| | 246 | canvas.focus(); |
| | 247 | } |
| | 248 | // moz, webkit, opera |
| | 249 | else if (canvas.selectionStart || canvas.selectionStart == '0') { |
| | 250 | startPos = canvas.selectionStart; |
| | 251 | endPos = canvas.selectionEnd; |
| | 252 | cursorPos = endPos; |
| | 253 | scrollTop = canvas.scrollTop; |
| | 254 | l = v.substring(0, startPos); // left of the selection |
| | 255 | r = v.substring(endPos, v.length); // right of the selection |
| | 256 | i = v.substring(startPos, endPos); // inside the selection |
| | 257 | if (startPos != endPos) { |
| | 258 | canvas.value = l + t.tagStart + i + t.tagEnd + r; |
| | 259 | if (t.tagEnd === '') { |
| | 260 | cursorPos = startPos; |
| | 261 | } |
| | 262 | cursorPos += t.tagStart.length + t.tagEnd.length; |
| 523 | | |
| 524 | | this.edInsertLink = function(i, defaultValue) { |
| 525 | | if ( ! defaultValue ) |
| | 292 | |
| | 293 | // the spell button |
| | 294 | qt.SpellButton = function() { |
| | 295 | qt.Button.call(this, 'spell', quicktagsL10n.lookup, ''); |
| | 296 | }; |
| | 297 | qt.SpellButton.prototype = new qt.Button(); |
| | 298 | qt.SpellButton.prototype.callback = function(element, canvas, toolbar) { |
| | 299 | var word = '', sel, startPos, endPos; |
| | 300 | |
| | 301 | if (document.selection) { |
| | 302 | canvas.focus(); |
| | 303 | sel = document.selection.createRange(); |
| | 304 | if (sel.text.length > 0) { |
| | 305 | word = sel.text; |
| | 306 | } |
| | 307 | } |
| | 308 | else if (canvas.selectionStart || canvas.selectionStart == '0') { |
| | 309 | startPos = canvas.selectionStart; |
| | 310 | endPos = canvas.selectionEnd; |
| | 311 | if (startPos != endPos) { |
| | 312 | word = canvas.value.substring(startPos, endPos); |
| | 313 | } |
| | 314 | } |
| | 315 | |
| | 316 | if (word === '') { |
| | 317 | word = prompt(quicktagsL10n.wordLookup, ''); |
| | 318 | } |
| | 319 | |
| | 320 | if (word !== null && /^\w[\w ]*$/.test(word)) { |
| | 321 | window.open('http://www.answers.com/' + encodeURIComponent(word)); |
| | 322 | } |
| | 323 | }; |
| | 324 | |
| | 325 | // the close button |
| | 326 | qt.CloseButton = function() { |
| | 327 | qt.Button.call(this, 'close', quicktagsL10n.closeAllOpenTags, ''); |
| | 328 | }; |
| | 329 | qt.CloseButton.prototype = new qt.Button(); |
| | 330 | qt.CloseButton.prototype.callback = function(e, c, tb) { |
| | 331 | var button, i, element; |
| | 332 | if (tb._openTags) { |
| | 333 | while (tb._openTags.length > 0) { |
| | 334 | button = tb.getButton(tb._openTags[tb._openTags.length - 1]); |
| | 335 | element = document.getElementById(tb.name + '_' + button.id); |
| | 336 | button.callback.call(button, element, c, tb); |
| | 337 | } |
| | 338 | } |
| | 339 | }; |
| | 340 | qt.prototype.closeAllTags = function() { |
| | 341 | var btn = this.getButton('close'); |
| | 342 | btn.callback.call(btn, '', this.canvas, this.toolbar); |
| | 343 | }; |
| | 344 | |
| | 345 | // the link button |
| | 346 | qt.LinkButton = function() { |
| | 347 | qt.TagButton.call(this, 'link', 'link', '', '</a>', 'a'); |
| | 348 | }; |
| | 349 | qt.LinkButton.prototype = new qt.TagButton(); |
| | 350 | qt.LinkButton.prototype.callback = function(e, c, tb, defaultValue) { |
| | 351 | var URL, t = this; |
| | 352 | |
| | 353 | if (! defaultValue) { |
| 538 | | |
| 539 | | this.edInsertImage = function() { |
| 540 | | var myValue = prompt(quicktagsL10n.enterImageURL, 'http://'); |
| 541 | | if ( myValue ) { |
| 542 | | myValue = '<img src="' |
| 543 | | + myValue |
| 544 | | + '" alt="' + prompt(quicktagsL10n.enterImageDescription, '') |
| 545 | | + '" />'; |
| 546 | | edInsertContent(t.Canvas, myValue); |
| | 367 | |
| | 368 | // the img button |
| | 369 | qt.ImgButton = function() { |
| | 370 | qt.TagButton.call(this, 'img', 'img', '', '', 'm', -1); |
| | 371 | }; |
| | 372 | qt.ImgButton.prototype = new qt.TagButton(); |
| | 373 | qt.ImgButton.prototype.callback = function(e, c, tb, defaultValue) { |
| | 374 | if (! defaultValue) { |
| | 375 | defaultValue = 'http://'; |
| | 376 | } |
| | 377 | var src = prompt(quicktagsL10n.enterImageURL, defaultValue), alt; |
| | 378 | if (src) { |
| | 379 | alt = prompt(quicktagsL10n.enterImageDescription, ''); |
| | 380 | this.tagStart = '<img src="' + src + '" alt="' + alt + '" />'; |
| | 381 | qt.TagButton.prototype.callback.call(this, e, c, tb); |
| 549 | | |
| 550 | | t.Buttons[t.Buttons.length] = new edButton(name+'_strong','b','<strong>','</strong>','b'); |
| 551 | | t.Buttons[t.Buttons.length] = new edButton(name+'_em','i','<em>','</em>','i'); |
| 552 | | t.Buttons[t.Buttons.length] = new edButton(name+'_link','link','','</a>','a'); // special case |
| 553 | | t.Buttons[t.Buttons.length] = new edButton(name+'_block','b-quote','\n\n<blockquote>','</blockquote>\n\n','q'); |
| 554 | | t.Buttons[t.Buttons.length] = new edButton(name+'_del','del','<del datetime="' + datetime + '">','</del>','d'); |
| 555 | | t.Buttons[t.Buttons.length] = new edButton(name+'_ins','ins','<ins datetime="' + datetime + '">','</ins>','s'); |
| 556 | | t.Buttons[t.Buttons.length] = new edButton(name+'_img','img','','','m',-1); // special case |
| 557 | | t.Buttons[t.Buttons.length] = new edButton(name+'_ul','ul','<ul>\n','</ul>\n\n','u'); |
| 558 | | t.Buttons[t.Buttons.length] = new edButton(name+'_ol','ol','<ol>\n','</ol>\n\n','o'); |
| 559 | | t.Buttons[t.Buttons.length] = new edButton(name+'_li','li','\t<li>','</li>\n','l'); |
| 560 | | t.Buttons[t.Buttons.length] = new edButton(name+'_code','code','<code>','</code>','c'); |
| 561 | | t.Buttons[t.Buttons.length] = new edButton(name+'_more','more','<!--more-->','','t',-1); |
| 562 | | // t.Buttons[t.Buttons.length] = new edButton(name+'_next','page','<!--nextpage-->','','p',-1); |
| 563 | | |
| 564 | | tb = document.createElement('div'); |
| 565 | | tb.id = name+'_qtags'; |
| 566 | | |
| 567 | | html = '<div id="'+name+'_toolbar">'; |
| 568 | | for (i = 0; i < t.Buttons.length; i++) |
| 569 | | html += t.edShowButton(t.Buttons[i], i); |
| 570 | | |
| 571 | | html += '<input type="button" id="'+name+'_ed_spell" class="ed_button" onclick="edSpell('+name+'.Canvas);" title="' + quicktagsL10n.dictionaryLookup + '" value="' + quicktagsL10n.lookup + '" />'; |
| 572 | | html += '<input type="button" id="'+name+'_ed_close" class="ed_button" onclick="'+name+'.edCloseAllTags();" title="' + quicktagsL10n.closeAllOpenTags + '" value="' + quicktagsL10n.closeTags + '" /></div>'; |
| 573 | | |
| 574 | | tb.innerHTML = html; |
| 575 | | cont.parentNode.insertBefore(tb, cont); |
| 576 | | |
| 577 | | }; |
| | 384 | })(); |
| | 385 | No newline at end of file |