annotate media/js/markitup/jquery.markitup.js @ 271:4746df47a538

Follow on to last rev (r292) for #126. Missed updating a shoutbox template. Also the repoze.timeago package uses UTC time by default. Change this to local time for now until we decide to switch over to UTC for everything.
author Brian Neal <bgneal@gmail.com>
date Sun, 26 Sep 2010 17:42:00 +0000
parents a61b1c598001
children
rev   line source
gremmie@1 1 // ----------------------------------------------------------------------------
gremmie@1 2 // markItUp! Universal MarkUp Engine, JQuery plugin
bgneal@244 3 // v 1.1.x
gremmie@1 4 // Dual licensed under the MIT and GPL licenses.
gremmie@1 5 // ----------------------------------------------------------------------------
bgneal@185 6 // Copyright (C) 2007-2010 Jay Salvat
gremmie@1 7 // http://markitup.jaysalvat.com/
gremmie@1 8 // ----------------------------------------------------------------------------
gremmie@1 9 // Permission is hereby granted, free of charge, to any person obtaining a copy
gremmie@1 10 // of this software and associated documentation files (the "Software"), to deal
gremmie@1 11 // in the Software without restriction, including without limitation the rights
gremmie@1 12 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
gremmie@1 13 // copies of the Software, and to permit persons to whom the Software is
gremmie@1 14 // furnished to do so, subject to the following conditions:
gremmie@1 15 //
gremmie@1 16 // The above copyright notice and this permission notice shall be included in
gremmie@1 17 // all copies or substantial portions of the Software.
gremmie@1 18 //
gremmie@1 19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
gremmie@1 20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
gremmie@1 21 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
gremmie@1 22 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
gremmie@1 23 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gremmie@1 24 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
gremmie@1 25 // THE SOFTWARE.
gremmie@1 26 // ----------------------------------------------------------------------------
gremmie@1 27 (function($) {
gremmie@1 28 $.fn.markItUp = function(settings, extraSettings) {
gremmie@1 29 var options, ctrlKey, shiftKey, altKey;
gremmie@1 30 ctrlKey = shiftKey = altKey = false;
bgneal@244 31
gremmie@1 32 options = { id: '',
gremmie@1 33 nameSpace: '',
gremmie@1 34 root: '',
gremmie@1 35 previewInWindow: '', // 'width=800, height=600, resizable=yes, scrollbars=yes'
gremmie@1 36 previewAutoRefresh: true,
gremmie@1 37 previewPosition: 'after',
gremmie@1 38 previewTemplatePath: '~/templates/preview.html',
gremmie@1 39 previewParserPath: '',
gremmie@1 40 previewParserVar: 'data',
gremmie@1 41 resizeHandle: true,
gremmie@1 42 beforeInsert: '',
gremmie@1 43 afterInsert: '',
gremmie@1 44 onEnter: {},
gremmie@1 45 onShiftEnter: {},
gremmie@1 46 onCtrlEnter: {},
gremmie@1 47 onTab: {},
gremmie@1 48 markupSet: [ { /* set */ } ]
gremmie@1 49 };
gremmie@1 50 $.extend(options, settings, extraSettings);
gremmie@1 51
gremmie@1 52 // compute markItUp! path
gremmie@1 53 if (!options.root) {
gremmie@1 54 $('script').each(function(a, tag) {
gremmie@1 55 miuScript = $(tag).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/);
gremmie@1 56 if (miuScript !== null) {
gremmie@1 57 options.root = miuScript[1];
gremmie@1 58 }
gremmie@1 59 });
gremmie@1 60 }
gremmie@1 61
gremmie@1 62 return this.each(function() {
gremmie@1 63 var $$, textarea, levels, scrollPosition, caretPosition, caretOffset,
gremmie@1 64 clicked, hash, header, footer, previewWindow, template, iFrame, abort;
gremmie@1 65 $$ = $(this);
gremmie@1 66 textarea = this;
gremmie@1 67 levels = [];
gremmie@1 68 abort = false;
gremmie@1 69 scrollPosition = caretPosition = 0;
gremmie@1 70 caretOffset = -1;
gremmie@1 71
gremmie@1 72 options.previewParserPath = localize(options.previewParserPath);
gremmie@1 73 options.previewTemplatePath = localize(options.previewTemplatePath);
gremmie@1 74
gremmie@1 75 // apply the computed path to ~/
gremmie@1 76 function localize(data, inText) {
gremmie@1 77 if (inText) {
gremmie@1 78 return data.replace(/("|')~\//g, "$1"+options.root);
gremmie@1 79 }
gremmie@1 80 return data.replace(/^~\//, options.root);
gremmie@1 81 }
gremmie@1 82
gremmie@1 83 // init and build editor
gremmie@1 84 function init() {
gremmie@1 85 id = ''; nameSpace = '';
gremmie@1 86 if (options.id) {
gremmie@1 87 id = 'id="'+options.id+'"';
gremmie@1 88 } else if ($$.attr("id")) {
gremmie@1 89 id = 'id="markItUp'+($$.attr("id").substr(0, 1).toUpperCase())+($$.attr("id").substr(1))+'"';
gremmie@1 90
gremmie@1 91 }
gremmie@1 92 if (options.nameSpace) {
gremmie@1 93 nameSpace = 'class="'+options.nameSpace+'"';
gremmie@1 94 }
gremmie@1 95 $$.wrap('<div '+nameSpace+'></div>');
gremmie@1 96 $$.wrap('<div '+id+' class="markItUp"></div>');
gremmie@1 97 $$.wrap('<div class="markItUpContainer"></div>');
gremmie@1 98 $$.addClass("markItUpEditor");
gremmie@1 99
gremmie@1 100 // add the header before the textarea
gremmie@1 101 header = $('<div class="markItUpHeader"></div>').insertBefore($$);
gremmie@1 102 $(dropMenus(options.markupSet)).appendTo(header);
gremmie@1 103
gremmie@1 104 // add the footer after the textarea
gremmie@1 105 footer = $('<div class="markItUpFooter"></div>').insertAfter($$);
gremmie@1 106
gremmie@1 107 // add the resize handle after textarea
gremmie@1 108 if (options.resizeHandle === true && $.browser.safari !== true) {
gremmie@1 109 resizeHandle = $('<div class="markItUpResizeHandle"></div>')
gremmie@1 110 .insertAfter($$)
gremmie@1 111 .bind("mousedown", function(e) {
gremmie@1 112 var h = $$.height(), y = e.clientY, mouseMove, mouseUp;
gremmie@1 113 mouseMove = function(e) {
gremmie@1 114 $$.css("height", Math.max(20, e.clientY+h-y)+"px");
gremmie@1 115 return false;
gremmie@1 116 };
gremmie@1 117 mouseUp = function(e) {
gremmie@1 118 $("html").unbind("mousemove", mouseMove).unbind("mouseup", mouseUp);
gremmie@1 119 return false;
gremmie@1 120 };
gremmie@1 121 $("html").bind("mousemove", mouseMove).bind("mouseup", mouseUp);
gremmie@1 122 });
gremmie@1 123 footer.append(resizeHandle);
gremmie@1 124 }
gremmie@1 125
gremmie@1 126 // listen key events
gremmie@1 127 $$.keydown(keyPressed).keyup(keyPressed);
gremmie@1 128
gremmie@1 129 // bind an event to catch external calls
gremmie@1 130 $$.bind("insertion", function(e, settings) {
gremmie@1 131 if (settings.target !== false) {
gremmie@1 132 get();
gremmie@1 133 }
gremmie@1 134 if (textarea === $.markItUp.focused) {
gremmie@1 135 markup(settings);
gremmie@1 136 }
gremmie@1 137 });
gremmie@1 138
gremmie@1 139 // remember the last focus
gremmie@1 140 $$.focus(function() {
gremmie@1 141 $.markItUp.focused = this;
gremmie@1 142 });
gremmie@1 143 }
gremmie@1 144
gremmie@1 145 // recursively build header with dropMenus from markupset
gremmie@1 146 function dropMenus(markupSet) {
gremmie@1 147 var ul = $('<ul></ul>'), i = 0;
gremmie@1 148 $('li:hover > ul', ul).css('display', 'block');
gremmie@1 149 $.each(markupSet, function() {
gremmie@1 150 var button = this, t = '', title, li, j;
gremmie@1 151 title = (button.key) ? (button.name||'')+' [Ctrl+'+button.key+']' : (button.name||'');
gremmie@1 152 key = (button.key) ? 'accesskey="'+button.key+'"' : '';
gremmie@1 153 if (button.separator) {
gremmie@1 154 li = $('<li class="markItUpSeparator">'+(button.separator||'')+'</li>').appendTo(ul);
gremmie@1 155 } else {
gremmie@1 156 i++;
gremmie@1 157 for (j = levels.length -1; j >= 0; j--) {
gremmie@1 158 t += levels[j]+"-";
gremmie@1 159 }
gremmie@1 160 li = $('<li class="markItUpButton markItUpButton'+t+(i)+' '+(button.className||'')+'"><a href="" '+key+' title="'+title+'">'+(button.name||'')+'</a></li>')
gremmie@1 161 .bind("contextmenu", function() { // prevent contextmenu on mac and allow ctrl+click
gremmie@1 162 return false;
gremmie@1 163 }).click(function() {
gremmie@1 164 return false;
bgneal@244 165 }).focusin(function(){
bgneal@244 166 $$.focus();
bgneal@199 167 }).mousedown(function() {
gremmie@1 168 if (button.call) {
gremmie@1 169 eval(button.call)();
gremmie@1 170 }
bgneal@199 171 setTimeout(function() { markup(button) },1);
gremmie@1 172 return false;
gremmie@1 173 }).hover(function() {
gremmie@1 174 $('> ul', this).show();
gremmie@1 175 $(document).one('click', function() { // close dropmenu if click outside
gremmie@1 176 $('ul ul', header).hide();
gremmie@1 177 }
gremmie@1 178 );
gremmie@1 179 }, function() {
gremmie@1 180 $('> ul', this).hide();
gremmie@1 181 }
gremmie@1 182 ).appendTo(ul);
gremmie@1 183 if (button.dropMenu) {
gremmie@1 184 levels.push(i);
gremmie@1 185 $(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));
gremmie@1 186 }
gremmie@1 187 }
gremmie@1 188 });
gremmie@1 189 levels.pop();
gremmie@1 190 return ul;
gremmie@1 191 }
gremmie@1 192
gremmie@1 193 // markItUp! markups
gremmie@1 194 function magicMarkups(string) {
gremmie@1 195 if (string) {
gremmie@1 196 string = string.toString();
gremmie@1 197 string = string.replace(/\(\!\(([\s\S]*?)\)\!\)/g,
gremmie@1 198 function(x, a) {
gremmie@1 199 var b = a.split('|!|');
gremmie@1 200 if (altKey === true) {
gremmie@1 201 return (b[1] !== undefined) ? b[1] : b[0];
gremmie@1 202 } else {
gremmie@1 203 return (b[1] === undefined) ? "" : b[0];
gremmie@1 204 }
gremmie@1 205 }
gremmie@1 206 );
gremmie@1 207 // [![prompt]!], [![prompt:!:value]!]
gremmie@1 208 string = string.replace(/\[\!\[([\s\S]*?)\]\!\]/g,
gremmie@1 209 function(x, a) {
gremmie@1 210 var b = a.split(':!:');
gremmie@1 211 if (abort === true) {
gremmie@1 212 return false;
gremmie@1 213 }
gremmie@1 214 value = prompt(b[0], (b[1]) ? b[1] : '');
gremmie@1 215 if (value === null) {
gremmie@1 216 abort = true;
gremmie@1 217 }
gremmie@1 218 return value;
gremmie@1 219 }
gremmie@1 220 );
gremmie@1 221 return string;
gremmie@1 222 }
gremmie@1 223 return "";
gremmie@1 224 }
gremmie@1 225
gremmie@1 226 // prepare action
gremmie@1 227 function prepare(action) {
gremmie@1 228 if ($.isFunction(action)) {
gremmie@1 229 action = action(hash);
gremmie@1 230 }
gremmie@1 231 return magicMarkups(action);
gremmie@1 232 }
gremmie@1 233
gremmie@1 234 // build block to insert
gremmie@1 235 function build(string) {
gremmie@1 236 openWith = prepare(clicked.openWith);
gremmie@1 237 placeHolder = prepare(clicked.placeHolder);
gremmie@1 238 replaceWith = prepare(clicked.replaceWith);
gremmie@1 239 closeWith = prepare(clicked.closeWith);
gremmie@1 240 if (replaceWith !== "") {
gremmie@1 241 block = openWith + replaceWith + closeWith;
gremmie@1 242 } else if (selection === '' && placeHolder !== '') {
gremmie@1 243 block = openWith + placeHolder + closeWith;
gremmie@1 244 } else {
gremmie@1 245 block = openWith + (string||selection) + closeWith;
gremmie@1 246 }
gremmie@1 247 return { block:block,
gremmie@1 248 openWith:openWith,
gremmie@1 249 replaceWith:replaceWith,
gremmie@1 250 placeHolder:placeHolder,
gremmie@1 251 closeWith:closeWith
gremmie@1 252 };
gremmie@1 253 }
gremmie@1 254
gremmie@1 255 // define markup to insert
gremmie@1 256 function markup(button) {
gremmie@1 257 var len, j, n, i;
gremmie@1 258 hash = clicked = button;
gremmie@1 259 get();
gremmie@1 260
gremmie@1 261 $.extend(hash, { line:"",
gremmie@1 262 root:options.root,
gremmie@1 263 textarea:textarea,
gremmie@1 264 selection:(selection||''),
gremmie@1 265 caretPosition:caretPosition,
gremmie@1 266 ctrlKey:ctrlKey,
gremmie@1 267 shiftKey:shiftKey,
gremmie@1 268 altKey:altKey
gremmie@1 269 }
gremmie@1 270 );
gremmie@1 271 // callbacks before insertion
gremmie@1 272 prepare(options.beforeInsert);
gremmie@1 273 prepare(clicked.beforeInsert);
gremmie@1 274 if (ctrlKey === true && shiftKey === true) {
gremmie@1 275 prepare(clicked.beforeMultiInsert);
gremmie@1 276 }
gremmie@1 277 $.extend(hash, { line:1 });
gremmie@1 278
gremmie@1 279 if (ctrlKey === true && shiftKey === true) {
gremmie@1 280 lines = selection.split(/\r?\n/);
gremmie@1 281 for (j = 0, n = lines.length, i = 0; i < n; i++) {
gremmie@1 282 if ($.trim(lines[i]) !== '') {
gremmie@1 283 $.extend(hash, { line:++j, selection:lines[i] } );
gremmie@1 284 lines[i] = build(lines[i]).block;
gremmie@1 285 } else {
gremmie@1 286 lines[i] = "";
gremmie@1 287 }
gremmie@1 288 }
gremmie@1 289 string = { block:lines.join('\n')};
gremmie@1 290 start = caretPosition;
bgneal@244 291 len = string.block.length + (($.browser.opera) ? n-1 : 0);
gremmie@1 292 } else if (ctrlKey === true) {
gremmie@1 293 string = build(selection);
gremmie@1 294 start = caretPosition + string.openWith.length;
gremmie@1 295 len = string.block.length - string.openWith.length - string.closeWith.length;
gremmie@1 296 len -= fixIeBug(string.block);
gremmie@1 297 } else if (shiftKey === true) {
gremmie@1 298 string = build(selection);
gremmie@1 299 start = caretPosition;
gremmie@1 300 len = string.block.length;
gremmie@1 301 len -= fixIeBug(string.block);
gremmie@1 302 } else {
gremmie@1 303 string = build(selection);
gremmie@1 304 start = caretPosition + string.block.length ;
gremmie@1 305 len = 0;
gremmie@1 306 start -= fixIeBug(string.block);
gremmie@1 307 }
gremmie@1 308 if ((selection === '' && string.replaceWith === '')) {
gremmie@1 309 caretOffset += fixOperaBug(string.block);
gremmie@1 310
gremmie@1 311 start = caretPosition + string.openWith.length;
gremmie@1 312 len = string.block.length - string.openWith.length - string.closeWith.length;
gremmie@1 313
gremmie@1 314 caretOffset = $$.val().substring(caretPosition, $$.val().length).length;
gremmie@1 315 caretOffset -= fixOperaBug($$.val().substring(0, caretPosition));
gremmie@1 316 }
gremmie@1 317 $.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } );
gremmie@1 318
gremmie@1 319 if (string.block !== selection && abort === false) {
gremmie@1 320 insert(string.block);
gremmie@1 321 set(start, len);
gremmie@1 322 } else {
gremmie@1 323 caretOffset = -1;
gremmie@1 324 }
gremmie@1 325 get();
gremmie@1 326
gremmie@1 327 $.extend(hash, { line:'', selection:selection });
gremmie@1 328
gremmie@1 329 // callbacks after insertion
gremmie@1 330 if (ctrlKey === true && shiftKey === true) {
gremmie@1 331 prepare(clicked.afterMultiInsert);
gremmie@1 332 }
gremmie@1 333 prepare(clicked.afterInsert);
gremmie@1 334 prepare(options.afterInsert);
gremmie@1 335
gremmie@1 336 // refresh preview if opened
gremmie@1 337 if (previewWindow && options.previewAutoRefresh) {
gremmie@1 338 refreshPreview();
gremmie@1 339 }
gremmie@1 340
gremmie@1 341 // reinit keyevent
gremmie@1 342 shiftKey = altKey = ctrlKey = abort = false;
gremmie@1 343 }
gremmie@1 344
gremmie@1 345 // Substract linefeed in Opera
gremmie@1 346 function fixOperaBug(string) {
gremmie@1 347 if ($.browser.opera) {
gremmie@1 348 return string.length - string.replace(/\n*/g, '').length;
gremmie@1 349 }
gremmie@1 350 return 0;
gremmie@1 351 }
gremmie@1 352 // Substract linefeed in IE
gremmie@1 353 function fixIeBug(string) {
gremmie@1 354 if ($.browser.msie) {
gremmie@1 355 return string.length - string.replace(/\r*/g, '').length;
gremmie@1 356 }
gremmie@1 357 return 0;
gremmie@1 358 }
gremmie@1 359
gremmie@1 360 // add markup
gremmie@1 361 function insert(block) {
gremmie@1 362 if (document.selection) {
gremmie@1 363 var newSelection = document.selection.createRange();
gremmie@1 364 newSelection.text = block;
gremmie@1 365 } else {
bgneal@244 366 textarea.value = textarea.value.substring(0, caretPosition) + block + textarea.value.substring(caretPosition + selection.length, textarea.value.length);
gremmie@1 367 }
gremmie@1 368 }
gremmie@1 369
gremmie@1 370 // set a selection
gremmie@1 371 function set(start, len) {
gremmie@1 372 if (textarea.createTextRange){
gremmie@1 373 // quick fix to make it work on Opera 9.5
gremmie@1 374 if ($.browser.opera && $.browser.version >= 9.5 && len == 0) {
gremmie@1 375 return false;
gremmie@1 376 }
gremmie@1 377 range = textarea.createTextRange();
gremmie@1 378 range.collapse(true);
gremmie@1 379 range.moveStart('character', start);
gremmie@1 380 range.moveEnd('character', len);
gremmie@1 381 range.select();
gremmie@1 382 } else if (textarea.setSelectionRange ){
gremmie@1 383 textarea.setSelectionRange(start, start + len);
gremmie@1 384 }
gremmie@1 385 textarea.scrollTop = scrollPosition;
gremmie@1 386 textarea.focus();
gremmie@1 387 }
gremmie@1 388
gremmie@1 389 // get the selection
gremmie@1 390 function get() {
gremmie@1 391 textarea.focus();
gremmie@1 392
gremmie@1 393 scrollPosition = textarea.scrollTop;
gremmie@1 394 if (document.selection) {
gremmie@1 395 selection = document.selection.createRange().text;
gremmie@1 396 if ($.browser.msie) { // ie
gremmie@1 397 var range = document.selection.createRange(), rangeCopy = range.duplicate();
gremmie@1 398 rangeCopy.moveToElementText(textarea);
gremmie@1 399 caretPosition = -1;
bgneal@244 400 while(rangeCopy.inRange(range)) {
gremmie@1 401 rangeCopy.moveStart('character');
gremmie@1 402 caretPosition ++;
gremmie@1 403 }
gremmie@1 404 } else { // opera
gremmie@1 405 caretPosition = textarea.selectionStart;
gremmie@1 406 }
bgneal@199 407 } else { // gecko & webkit
gremmie@1 408 caretPosition = textarea.selectionStart;
bgneal@244 409 selection = textarea.value.substring(caretPosition, textarea.selectionEnd);
gremmie@1 410 }
gremmie@1 411 return selection;
gremmie@1 412 }
gremmie@1 413
gremmie@1 414 // open preview window
gremmie@1 415 function preview() {
gremmie@1 416 if (!previewWindow || previewWindow.closed) {
gremmie@1 417 if (options.previewInWindow) {
gremmie@1 418 previewWindow = window.open('', 'preview', options.previewInWindow);
bgneal@244 419 $(window).unload(function() {
bgneal@244 420 previewWindow.close();
bgneal@244 421 });
gremmie@1 422 } else {
gremmie@1 423 iFrame = $('<iframe class="markItUpPreviewFrame"></iframe>');
gremmie@1 424 if (options.previewPosition == 'after') {
gremmie@1 425 iFrame.insertAfter(footer);
gremmie@1 426 } else {
gremmie@1 427 iFrame.insertBefore(header);
gremmie@1 428 }
bgneal@185 429 previewWindow = iFrame[iFrame.length - 1].contentWindow || frame[iFrame.length - 1];
gremmie@1 430 }
gremmie@1 431 } else if (altKey === true) {
gremmie@1 432 if (iFrame) {
gremmie@1 433 iFrame.remove();
bgneal@185 434 } else {
bgneal@185 435 previewWindow.close();
gremmie@1 436 }
gremmie@1 437 previewWindow = iFrame = false;
gremmie@1 438 }
gremmie@1 439 if (!options.previewAutoRefresh) {
gremmie@1 440 refreshPreview();
gremmie@1 441 }
bgneal@244 442 if (options.previewInWindow) {
bgneal@244 443 previewWindow.focus();
bgneal@244 444 }
gremmie@1 445 }
gremmie@1 446
gremmie@1 447 // refresh Preview window
gremmie@1 448 function refreshPreview() {
bgneal@185 449 renderPreview();
bgneal@185 450 }
bgneal@185 451
bgneal@185 452 function renderPreview() {
bgneal@185 453 var phtml;
bgneal@185 454 if (options.previewParserPath !== '') {
bgneal@185 455 $.ajax( {
bgneal@185 456 type: 'POST',
bgneal@185 457 url: options.previewParserPath,
bgneal@185 458 data: options.previewParserVar+'='+encodeURIComponent($$.val()),
bgneal@185 459 success: function(data) {
bgneal@185 460 writeInPreview( localize(data, 1) );
bgneal@185 461 }
bgneal@185 462 } );
bgneal@185 463 } else {
bgneal@185 464 if (!template) {
bgneal@185 465 $.ajax( {
bgneal@185 466 url: options.previewTemplatePath,
bgneal@185 467 success: function(data) {
bgneal@185 468 writeInPreview( localize(data, 1).replace(/<!-- content -->/g, $$.val()) );
bgneal@185 469 }
bgneal@185 470 } );
bgneal@185 471 }
bgneal@185 472 }
bgneal@185 473 return false;
bgneal@185 474 }
bgneal@185 475
bgneal@185 476 function writeInPreview(data) {
gremmie@1 477 if (previewWindow.document) {
gremmie@1 478 try {
gremmie@1 479 sp = previewWindow.document.documentElement.scrollTop
gremmie@1 480 } catch(e) {
gremmie@1 481 sp = 0;
bgneal@185 482 }
gremmie@1 483 previewWindow.document.open();
bgneal@185 484 previewWindow.document.write(data);
gremmie@1 485 previewWindow.document.close();
gremmie@1 486 previewWindow.document.documentElement.scrollTop = sp;
gremmie@1 487 }
gremmie@1 488 }
gremmie@1 489
gremmie@1 490 // set keys pressed
gremmie@1 491 function keyPressed(e) {
gremmie@1 492 shiftKey = e.shiftKey;
gremmie@1 493 altKey = e.altKey;
gremmie@1 494 ctrlKey = (!(e.altKey && e.ctrlKey)) ? e.ctrlKey : false;
gremmie@1 495
gremmie@1 496 if (e.type === 'keydown') {
gremmie@1 497 if (ctrlKey === true) {
gremmie@1 498 li = $("a[accesskey="+String.fromCharCode(e.keyCode)+"]", header).parent('li');
gremmie@1 499 if (li.length !== 0) {
gremmie@1 500 ctrlKey = false;
bgneal@199 501 setTimeout(function() {
bgneal@199 502 li.triggerHandler('mousedown');
bgneal@199 503 },1);
gremmie@1 504 return false;
gremmie@1 505 }
gremmie@1 506 }
gremmie@1 507 if (e.keyCode === 13 || e.keyCode === 10) { // Enter key
gremmie@1 508 if (ctrlKey === true) { // Enter + Ctrl
gremmie@1 509 ctrlKey = false;
gremmie@1 510 markup(options.onCtrlEnter);
gremmie@1 511 return options.onCtrlEnter.keepDefault;
gremmie@1 512 } else if (shiftKey === true) { // Enter + Shift
gremmie@1 513 shiftKey = false;
gremmie@1 514 markup(options.onShiftEnter);
gremmie@1 515 return options.onShiftEnter.keepDefault;
gremmie@1 516 } else { // only Enter
gremmie@1 517 markup(options.onEnter);
gremmie@1 518 return options.onEnter.keepDefault;
gremmie@1 519 }
gremmie@1 520 }
gremmie@1 521 if (e.keyCode === 9) { // Tab key
bgneal@244 522 if (shiftKey == true || ctrlKey == true || altKey == true) {
gremmie@1 523 return false;
gremmie@1 524 }
gremmie@1 525 if (caretOffset !== -1) {
gremmie@1 526 get();
gremmie@1 527 caretOffset = $$.val().length - caretOffset;
gremmie@1 528 set(caretOffset, 0);
gremmie@1 529 caretOffset = -1;
gremmie@1 530 return false;
gremmie@1 531 } else {
gremmie@1 532 markup(options.onTab);
gremmie@1 533 return options.onTab.keepDefault;
gremmie@1 534 }
gremmie@1 535 }
gremmie@1 536 }
gremmie@1 537 }
gremmie@1 538
gremmie@1 539 init();
gremmie@1 540 });
gremmie@1 541 };
gremmie@1 542
gremmie@1 543 $.fn.markItUpRemove = function() {
gremmie@1 544 return this.each(function() {
bgneal@199 545 var $$ = $(this).unbind().removeClass('markItUpEditor');
gremmie@1 546 $$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);
gremmie@1 547 }
gremmie@1 548 );
gremmie@1 549 };
gremmie@1 550
gremmie@1 551 $.markItUp = function(settings) {
gremmie@1 552 var options = { target:false };
gremmie@1 553 $.extend(options, settings);
gremmie@1 554 if (options.target) {
gremmie@1 555 return $(options.target).each(function() {
gremmie@1 556 $(this).focus();
gremmie@1 557 $(this).trigger('insertion', [options]);
gremmie@1 558 });
gremmie@1 559 } else {
gremmie@1 560 $('textarea').trigger('insertion', [options]);
gremmie@1 561 }
gremmie@1 562 };
gremmie@1 563 })(jQuery);