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