annotate media/js/markitup/jquery.markitup.js @ 6:b6263ac72052

Use DRY principle to manage third party javascript libraries. Created script_tags template tags to generate the correct link and script tags for 3rd party libraries. The settings.py file is the only place where the full path name is specified.
author Brian Neal <bgneal@gmail.com>
date Sat, 11 Apr 2009 22:50:56 +0000
parents dbd703f7d63a
children afb65fa947f1
rev   line source
gremmie@1 1 // ----------------------------------------------------------------------------
gremmie@1 2 // markItUp! Universal MarkUp Engine, JQuery plugin
gremmie@1 3 // v 1.1.5
gremmie@1 4 // Dual licensed under the MIT and GPL licenses.
gremmie@1 5 // ----------------------------------------------------------------------------
gremmie@1 6 // Copyright (C) 2007-2008 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;
gremmie@1 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;
gremmie@1 165 }).mouseup(function() {
gremmie@1 166 if (button.call) {
gremmie@1 167 eval(button.call)();
gremmie@1 168 }
gremmie@1 169 markup(button);
gremmie@1 170 return false;
gremmie@1 171 }).hover(function() {
gremmie@1 172 $('> ul', this).show();
gremmie@1 173 $(document).one('click', function() { // close dropmenu if click outside
gremmie@1 174 $('ul ul', header).hide();
gremmie@1 175 }
gremmie@1 176 );
gremmie@1 177 }, function() {
gremmie@1 178 $('> ul', this).hide();
gremmie@1 179 }
gremmie@1 180 ).appendTo(ul);
gremmie@1 181 if (button.dropMenu) {
gremmie@1 182 levels.push(i);
gremmie@1 183 $(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));
gremmie@1 184 }
gremmie@1 185 }
gremmie@1 186 });
gremmie@1 187 levels.pop();
gremmie@1 188 return ul;
gremmie@1 189 }
gremmie@1 190
gremmie@1 191 // markItUp! markups
gremmie@1 192 function magicMarkups(string) {
gremmie@1 193 if (string) {
gremmie@1 194 string = string.toString();
gremmie@1 195 string = string.replace(/\(\!\(([\s\S]*?)\)\!\)/g,
gremmie@1 196 function(x, a) {
gremmie@1 197 var b = a.split('|!|');
gremmie@1 198 if (altKey === true) {
gremmie@1 199 return (b[1] !== undefined) ? b[1] : b[0];
gremmie@1 200 } else {
gremmie@1 201 return (b[1] === undefined) ? "" : b[0];
gremmie@1 202 }
gremmie@1 203 }
gremmie@1 204 );
gremmie@1 205 // [![prompt]!], [![prompt:!:value]!]
gremmie@1 206 string = string.replace(/\[\!\[([\s\S]*?)\]\!\]/g,
gremmie@1 207 function(x, a) {
gremmie@1 208 var b = a.split(':!:');
gremmie@1 209 if (abort === true) {
gremmie@1 210 return false;
gremmie@1 211 }
gremmie@1 212 value = prompt(b[0], (b[1]) ? b[1] : '');
gremmie@1 213 if (value === null) {
gremmie@1 214 abort = true;
gremmie@1 215 }
gremmie@1 216 return value;
gremmie@1 217 }
gremmie@1 218 );
gremmie@1 219 return string;
gremmie@1 220 }
gremmie@1 221 return "";
gremmie@1 222 }
gremmie@1 223
gremmie@1 224 // prepare action
gremmie@1 225 function prepare(action) {
gremmie@1 226 if ($.isFunction(action)) {
gremmie@1 227 action = action(hash);
gremmie@1 228 }
gremmie@1 229 return magicMarkups(action);
gremmie@1 230 }
gremmie@1 231
gremmie@1 232 // build block to insert
gremmie@1 233 function build(string) {
gremmie@1 234 openWith = prepare(clicked.openWith);
gremmie@1 235 placeHolder = prepare(clicked.placeHolder);
gremmie@1 236 replaceWith = prepare(clicked.replaceWith);
gremmie@1 237 closeWith = prepare(clicked.closeWith);
gremmie@1 238 if (replaceWith !== "") {
gremmie@1 239 block = openWith + replaceWith + closeWith;
gremmie@1 240 } else if (selection === '' && placeHolder !== '') {
gremmie@1 241 block = openWith + placeHolder + closeWith;
gremmie@1 242 } else {
gremmie@1 243 block = openWith + (string||selection) + closeWith;
gremmie@1 244 }
gremmie@1 245 return { block:block,
gremmie@1 246 openWith:openWith,
gremmie@1 247 replaceWith:replaceWith,
gremmie@1 248 placeHolder:placeHolder,
gremmie@1 249 closeWith:closeWith
gremmie@1 250 };
gremmie@1 251 }
gremmie@1 252
gremmie@1 253 // define markup to insert
gremmie@1 254 function markup(button) {
gremmie@1 255 var len, j, n, i;
gremmie@1 256 hash = clicked = button;
gremmie@1 257 get();
gremmie@1 258
gremmie@1 259 $.extend(hash, { line:"",
gremmie@1 260 root:options.root,
gremmie@1 261 textarea:textarea,
gremmie@1 262 selection:(selection||''),
gremmie@1 263 caretPosition:caretPosition,
gremmie@1 264 ctrlKey:ctrlKey,
gremmie@1 265 shiftKey:shiftKey,
gremmie@1 266 altKey:altKey
gremmie@1 267 }
gremmie@1 268 );
gremmie@1 269 // callbacks before insertion
gremmie@1 270 prepare(options.beforeInsert);
gremmie@1 271 prepare(clicked.beforeInsert);
gremmie@1 272 if (ctrlKey === true && shiftKey === true) {
gremmie@1 273 prepare(clicked.beforeMultiInsert);
gremmie@1 274 }
gremmie@1 275 $.extend(hash, { line:1 });
gremmie@1 276
gremmie@1 277 if (ctrlKey === true && shiftKey === true) {
gremmie@1 278 lines = selection.split(/\r?\n/);
gremmie@1 279 for (j = 0, n = lines.length, i = 0; i < n; i++) {
gremmie@1 280 if ($.trim(lines[i]) !== '') {
gremmie@1 281 $.extend(hash, { line:++j, selection:lines[i] } );
gremmie@1 282 lines[i] = build(lines[i]).block;
gremmie@1 283 } else {
gremmie@1 284 lines[i] = "";
gremmie@1 285 }
gremmie@1 286 }
gremmie@1 287 string = { block:lines.join('\n')};
gremmie@1 288 start = caretPosition;
gremmie@1 289 len = string.block.length + (($.browser.opera) ? n : 0);
gremmie@1 290 } else if (ctrlKey === true) {
gremmie@1 291 string = build(selection);
gremmie@1 292 start = caretPosition + string.openWith.length;
gremmie@1 293 len = string.block.length - string.openWith.length - string.closeWith.length;
gremmie@1 294 len -= fixIeBug(string.block);
gremmie@1 295 } else if (shiftKey === true) {
gremmie@1 296 string = build(selection);
gremmie@1 297 start = caretPosition;
gremmie@1 298 len = string.block.length;
gremmie@1 299 len -= fixIeBug(string.block);
gremmie@1 300 } else {
gremmie@1 301 string = build(selection);
gremmie@1 302 start = caretPosition + string.block.length ;
gremmie@1 303 len = 0;
gremmie@1 304 start -= fixIeBug(string.block);
gremmie@1 305 }
gremmie@1 306 if ((selection === '' && string.replaceWith === '')) {
gremmie@1 307 caretOffset += fixOperaBug(string.block);
gremmie@1 308
gremmie@1 309 start = caretPosition + string.openWith.length;
gremmie@1 310 len = string.block.length - string.openWith.length - string.closeWith.length;
gremmie@1 311
gremmie@1 312 caretOffset = $$.val().substring(caretPosition, $$.val().length).length;
gremmie@1 313 caretOffset -= fixOperaBug($$.val().substring(0, caretPosition));
gremmie@1 314 }
gremmie@1 315 $.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } );
gremmie@1 316
gremmie@1 317 if (string.block !== selection && abort === false) {
gremmie@1 318 insert(string.block);
gremmie@1 319 set(start, len);
gremmie@1 320 } else {
gremmie@1 321 caretOffset = -1;
gremmie@1 322 }
gremmie@1 323 get();
gremmie@1 324
gremmie@1 325 $.extend(hash, { line:'', selection:selection });
gremmie@1 326
gremmie@1 327 // callbacks after insertion
gremmie@1 328 if (ctrlKey === true && shiftKey === true) {
gremmie@1 329 prepare(clicked.afterMultiInsert);
gremmie@1 330 }
gremmie@1 331 prepare(clicked.afterInsert);
gremmie@1 332 prepare(options.afterInsert);
gremmie@1 333
gremmie@1 334 // refresh preview if opened
gremmie@1 335 if (previewWindow && options.previewAutoRefresh) {
gremmie@1 336 refreshPreview();
gremmie@1 337 }
gremmie@1 338
gremmie@1 339 // reinit keyevent
gremmie@1 340 shiftKey = altKey = ctrlKey = abort = false;
gremmie@1 341 }
gremmie@1 342
gremmie@1 343 // Substract linefeed in Opera
gremmie@1 344 function fixOperaBug(string) {
gremmie@1 345 if ($.browser.opera) {
gremmie@1 346 return string.length - string.replace(/\n*/g, '').length;
gremmie@1 347 }
gremmie@1 348 return 0;
gremmie@1 349 }
gremmie@1 350 // Substract linefeed in IE
gremmie@1 351 function fixIeBug(string) {
gremmie@1 352 if ($.browser.msie) {
gremmie@1 353 return string.length - string.replace(/\r*/g, '').length;
gremmie@1 354 }
gremmie@1 355 return 0;
gremmie@1 356 }
gremmie@1 357
gremmie@1 358 // add markup
gremmie@1 359 function insert(block) {
gremmie@1 360 if (document.selection) {
gremmie@1 361 var newSelection = document.selection.createRange();
gremmie@1 362 newSelection.text = block;
gremmie@1 363 } else {
gremmie@1 364 $$.val($$.val().substring(0, caretPosition) + block + $$.val().substring(caretPosition + selection.length, $$.val().length));
gremmie@1 365 }
gremmie@1 366 }
gremmie@1 367
gremmie@1 368 // set a selection
gremmie@1 369 function set(start, len) {
gremmie@1 370 if (textarea.createTextRange){
gremmie@1 371 // quick fix to make it work on Opera 9.5
gremmie@1 372 if ($.browser.opera && $.browser.version >= 9.5 && len == 0) {
gremmie@1 373 return false;
gremmie@1 374 }
gremmie@1 375 range = textarea.createTextRange();
gremmie@1 376 range.collapse(true);
gremmie@1 377 range.moveStart('character', start);
gremmie@1 378 range.moveEnd('character', len);
gremmie@1 379 range.select();
gremmie@1 380 } else if (textarea.setSelectionRange ){
gremmie@1 381 textarea.setSelectionRange(start, start + len);
gremmie@1 382 }
gremmie@1 383 textarea.scrollTop = scrollPosition;
gremmie@1 384 textarea.focus();
gremmie@1 385 }
gremmie@1 386
gremmie@1 387 // get the selection
gremmie@1 388 function get() {
gremmie@1 389 textarea.focus();
gremmie@1 390
gremmie@1 391 scrollPosition = textarea.scrollTop;
gremmie@1 392 if (document.selection) {
gremmie@1 393 selection = document.selection.createRange().text;
gremmie@1 394 if ($.browser.msie) { // ie
gremmie@1 395 var range = document.selection.createRange(), rangeCopy = range.duplicate();
gremmie@1 396 rangeCopy.moveToElementText(textarea);
gremmie@1 397 caretPosition = -1;
gremmie@1 398 while(rangeCopy.inRange(range)) { // fix most of the ie bugs with linefeeds...
gremmie@1 399 rangeCopy.moveStart('character');
gremmie@1 400 caretPosition ++;
gremmie@1 401 }
gremmie@1 402 } else { // opera
gremmie@1 403 caretPosition = textarea.selectionStart;
gremmie@1 404 }
gremmie@1 405 } else { // gecko
gremmie@1 406 caretPosition = textarea.selectionStart;
gremmie@1 407 selection = $$.val().substring(caretPosition, textarea.selectionEnd);
gremmie@1 408 }
gremmie@1 409 return selection;
gremmie@1 410 }
gremmie@1 411
gremmie@1 412 // open preview window
gremmie@1 413 function preview() {
gremmie@1 414 if (!previewWindow || previewWindow.closed) {
gremmie@1 415 if (options.previewInWindow) {
gremmie@1 416 previewWindow = window.open('', 'preview', options.previewInWindow);
gremmie@1 417 } else {
gremmie@1 418 iFrame = $('<iframe class="markItUpPreviewFrame"></iframe>');
gremmie@1 419 if (options.previewPosition == 'after') {
gremmie@1 420 iFrame.insertAfter(footer);
gremmie@1 421 } else {
gremmie@1 422 iFrame.insertBefore(header);
gremmie@1 423 }
gremmie@1 424 previewWindow = iFrame[iFrame.length-1].contentWindow || frame[iFrame.length-1];
gremmie@1 425 }
gremmie@1 426 } else if (altKey === true) {
gremmie@1 427 if (iFrame) {
gremmie@1 428 iFrame.remove();
gremmie@1 429 }
gremmie@1 430 previewWindow.close();
gremmie@1 431 previewWindow = iFrame = false;
gremmie@1 432 }
gremmie@1 433 if (!options.previewAutoRefresh) {
gremmie@1 434 refreshPreview();
gremmie@1 435 }
gremmie@1 436 }
gremmie@1 437
gremmie@1 438 // refresh Preview window
gremmie@1 439 function refreshPreview() {
gremmie@1 440 if (previewWindow.document) {
gremmie@1 441 try {
gremmie@1 442 sp = previewWindow.document.documentElement.scrollTop
gremmie@1 443 } catch(e) {
gremmie@1 444 sp = 0;
gremmie@1 445 }
gremmie@1 446 previewWindow.document.open();
gremmie@1 447 previewWindow.document.write(renderPreview());
gremmie@1 448 previewWindow.document.close();
gremmie@1 449 previewWindow.document.documentElement.scrollTop = sp;
gremmie@1 450 }
gremmie@1 451 if (options.previewInWindow) {
gremmie@1 452 previewWindow.focus();
gremmie@1 453 }
gremmie@1 454 }
gremmie@1 455
gremmie@1 456 function renderPreview() {
gremmie@1 457 if (options.previewParserPath !== '') {
gremmie@1 458 $.ajax( {
gremmie@1 459 type: 'POST',
gremmie@1 460 async: false,
gremmie@1 461 url: options.previewParserPath,
gremmie@1 462 data: options.previewParserVar+'='+encodeURIComponent($$.val()),
gremmie@1 463 success: function(data) {
gremmie@1 464 phtml = localize(data, 1);
gremmie@1 465 }
gremmie@1 466 } );
gremmie@1 467 } else {
gremmie@1 468 if (!template) {
gremmie@1 469 $.ajax( {
gremmie@1 470 async: false,
gremmie@1 471 url: options.previewTemplatePath,
gremmie@1 472 success: function(data) {
gremmie@1 473 template = localize(data, 1);
gremmie@1 474 }
gremmie@1 475 } );
gremmie@1 476 }
gremmie@1 477 phtml = template.replace(/<!-- content -->/g, $$.val());
gremmie@1 478 }
gremmie@1 479 return phtml;
gremmie@1 480 }
gremmie@1 481
gremmie@1 482 // set keys pressed
gremmie@1 483 function keyPressed(e) {
gremmie@1 484 shiftKey = e.shiftKey;
gremmie@1 485 altKey = e.altKey;
gremmie@1 486 ctrlKey = (!(e.altKey && e.ctrlKey)) ? e.ctrlKey : false;
gremmie@1 487
gremmie@1 488 if (e.type === 'keydown') {
gremmie@1 489 if (ctrlKey === true) {
gremmie@1 490 li = $("a[accesskey="+String.fromCharCode(e.keyCode)+"]", header).parent('li');
gremmie@1 491 if (li.length !== 0) {
gremmie@1 492 ctrlKey = false;
gremmie@1 493 li.triggerHandler('mouseup');
gremmie@1 494 return false;
gremmie@1 495 }
gremmie@1 496 }
gremmie@1 497 if (e.keyCode === 13 || e.keyCode === 10) { // Enter key
gremmie@1 498 if (ctrlKey === true) { // Enter + Ctrl
gremmie@1 499 ctrlKey = false;
gremmie@1 500 markup(options.onCtrlEnter);
gremmie@1 501 return options.onCtrlEnter.keepDefault;
gremmie@1 502 } else if (shiftKey === true) { // Enter + Shift
gremmie@1 503 shiftKey = false;
gremmie@1 504 markup(options.onShiftEnter);
gremmie@1 505 return options.onShiftEnter.keepDefault;
gremmie@1 506 } else { // only Enter
gremmie@1 507 markup(options.onEnter);
gremmie@1 508 return options.onEnter.keepDefault;
gremmie@1 509 }
gremmie@1 510 }
gremmie@1 511 if (e.keyCode === 9) { // Tab key
gremmie@1 512 if (shiftKey == true || ctrlKey == true || altKey == true) { // Thx Dr Floob.
gremmie@1 513 return false;
gremmie@1 514 }
gremmie@1 515 if (caretOffset !== -1) {
gremmie@1 516 get();
gremmie@1 517 caretOffset = $$.val().length - caretOffset;
gremmie@1 518 set(caretOffset, 0);
gremmie@1 519 caretOffset = -1;
gremmie@1 520 return false;
gremmie@1 521 } else {
gremmie@1 522 markup(options.onTab);
gremmie@1 523 return options.onTab.keepDefault;
gremmie@1 524 }
gremmie@1 525 }
gremmie@1 526 }
gremmie@1 527 }
gremmie@1 528
gremmie@1 529 init();
gremmie@1 530 });
gremmie@1 531 };
gremmie@1 532
gremmie@1 533 $.fn.markItUpRemove = function() {
gremmie@1 534 return this.each(function() {
gremmie@1 535 $$ = $(this).unbind().removeClass('markItUpEditor');
gremmie@1 536 $$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);
gremmie@1 537 }
gremmie@1 538 );
gremmie@1 539 };
gremmie@1 540
gremmie@1 541 $.markItUp = function(settings) {
gremmie@1 542 var options = { target:false };
gremmie@1 543 $.extend(options, settings);
gremmie@1 544 if (options.target) {
gremmie@1 545 return $(options.target).each(function() {
gremmie@1 546 $(this).focus();
gremmie@1 547 $(this).trigger('insertion', [options]);
gremmie@1 548 });
gremmie@1 549 } else {
gremmie@1 550 $('textarea').trigger('insertion', [options]);
gremmie@1 551 }
gremmie@1 552 };
gremmie@1 553 })(jQuery);