ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/website/www.git/commit/?id=cb5e7a34145f3e78765638e8d20e55c9e7d517bd

commit cb5e7a34145f3e78765638e8d20e55c9e7d517bd
Author: Andy Williams <a...@andywilliams.me>
Date:   Wed Oct 25 11:34:20 2017 +0100

    Update to latest markdown plugin
---
 public_html/lib/plugins/markdownextra/action.php   |   10 +-
 .../lib/meltdown-tweaks/meltdown-tweaks.css        |   12 +-
 .../lib/meltdown-tweaks/meltdown-tweaks.js         |   14 +-
 .../plugins/markdownextra/lib/meltdown/README.md   |  131 +-
 .../markdownextra/lib/meltdown/css/meltdown.css    |  340 +++--
 .../lib/meltdown/fonts/meltdown.dev.svg            |    0
 .../markdownextra/lib/meltdown/fonts/meltdown.eot  |  Bin
 .../markdownextra/lib/meltdown/fonts/meltdown.svg  |    0
 .../markdownextra/lib/meltdown/fonts/meltdown.ttf  |  Bin
 .../markdownextra/lib/meltdown/fonts/meltdown.woff |  Bin
 .../lib/meltdown/js/jquery.meltdown.js             | 1371 ++++++++++++++------
 .../meltdown/js/lib/element_resize_detection.js    |   81 ++
 .../lib/meltdown/js/lib/js-markdown-extra.js       |    0
 13 files changed, 1451 insertions(+), 508 deletions(-)

diff --git a/public_html/lib/plugins/markdownextra/action.php 
b/public_html/lib/plugins/markdownextra/action.php
index 28a8d20c..3e84a548 100644
--- a/public_html/lib/plugins/markdownextra/action.php
+++ b/public_html/lib/plugins/markdownextra/action.php
@@ -63,11 +63,11 @@ class action_plugin_markdownextra extends 
DokuWiki_Action_Plugin {
            $event->data['script'][] = array(
                 'type'    => 'text/javascript',
                 '_data'   => '',
-                'src'     => $meltdownBase.'js/jquery.meltdown.js');
+                'src'     => $meltdownBase.'js/lib/js-markdown-extra.js');
            $event->data['script'][] = array(
                 'type'    => 'text/javascript',
                 '_data'   => '',
-                'src'     => $meltdownBase.'js/lib/js-markdown-extra.js');
+                'src'     => 
$meltdownBase.'js/lib/element_resize_detection.js');
            $event->data['script'][] = array(
                 'type'    => 'text/javascript',
                 '_data'   => '',
@@ -75,7 +75,11 @@ class action_plugin_markdownextra extends 
DokuWiki_Action_Plugin {
            $event->data['script'][] = array(
                 'type'    => 'text/javascript',
                 '_data'   => '',
+                'src'     => $meltdownBase.'js/jquery.meltdown.js');
+           $event->data['script'][] = array(
+                'type'    => 'text/javascript',
+                '_data'   => '',
                 'src'     => $meltdownTweaksBase.'meltdown-tweaks.js');
         }
    }
-}
\ No newline at end of file
+}
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css 
b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css
index 95989956..795c7cb2 100644
--- 
a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css
+++ 
b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css
@@ -21,4 +21,14 @@
 /* For CSS3 browsers: allow user to resize the preview: */
 .meltdown_preview { resize: vertical; }
 /* Cosmetic fixes due to editor and preview being reversed: */
-.meltdown_wrap textarea { margin-bottom: 5px !important; }
+.meltdown_wrap {
+       width: 100% !important;
+}
+
+.meltdown_wrap textarea {
+       padding: 0;
+}
+
+.meltdown_bar, .meltdown_bar .meltdown_control span {
+       box-sizing: content-box;
+}
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js 
b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js
index aba910fc..f81ecc85 100644
--- 
a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js
+++ 
b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js
@@ -1,18 +1,12 @@
 jQuery(document).ready(function($) {
-       // Disabling default DukuWiki toolbar (but allow users to renable it if 
needed):
-       
$("#tool__bar").addClass("markdownextra_disabledtools").append($("<div\>", {
-                       id: "markdownextra_tool__bar_overlay",
-                       "class": "markdownextra_disabledtools_overlay",
-                       text: "[ Activate DukuWiki toolbar ]",
-                       click: function() {
-                               $(this).fadeOut(200);
-               }}));
+       // Disabling default DukuWiki toolbar
+       $("#tool__bar").hide();
        
        // Activate Meltdown on the textarea:
        $("#wiki__text").meltdown();
-       
+
        // Put preview after the editor:
        $(".meltdown_wrap").append($(".meltdown_preview-wrap"));
        // Open the preview (There is no init option for this...):
        $(".meltdown_control-preview").click();
-});
\ No newline at end of file
+});
diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/README.md 
b/public_html/lib/plugins/markdownextra/lib/meltdown/README.md
old mode 100755
new mode 100644
index a1bfaaf9..1af02902
--- a/public_html/lib/plugins/markdownextra/lib/meltdown/README.md
+++ b/public_html/lib/plugins/markdownextra/lib/meltdown/README.md
@@ -1,32 +1,125 @@
 Meltdown (Markdown Extra Live Toolbox)
 ======================================
 
-A JQuery plugin that adds Markdown Extra live previews, and a toolbar for 
common markdown actions. **Check out the [project 
page](http://iphands.github.com/Meltdown/) for a live demo**
+A JQuery plugin that adds Markdown Extra live previews, and a toolbar for 
common markdown editions. **Check out the [project 
page](http://iphands.github.com/Meltdown/) for a live demo.**
+
+It also features a fullscreen and a side-by-side mode (vertically split 
screen). The editor and the preview can be resized with your mouse (in browsers 
supporting the CSS `resize` property).
+
+
+## Usage
+
+### Simple, standard, awesome
 
-##Usage
-###Simple, standard, awesome
 ~~~
-jQuery('some_selector').meltdown();
+jQuery('texterea').meltdown();
 ~~~
-###Advanced, changing the preview slider timeout and adding an example widget, 
still awesome
+
+### Advanced, fullscreen with preview on the side, still awesome
+
 ~~~
-jQuery('some_selector').meltdown({
-  previewTimeout: 4000,
-  examples['test'] = {
-    label: "Test",
-    altText: "A test example/opt",
-    markdown: "this is a test"
-  }
+jQuery('#my_textarea').meltdown({
+  fullscreen: true,
+  openPreview: true,
+  sidebyside: true
 });
 ~~~
 
-##Libraries that Meltdown uses
-* [jQuery](http://jquery.com/)
-* [jQuery UI](http://jqueryui.com/) [1]
-* [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra 
"Github link to js-markdown-extra")
-* [rangyinputs](http://code.google.com/p/rangyinputs/ "Google code link to 
rangyinputs") [1]
 
-[1] jQuery UI and rangyinputs are optional. For now Meltdown will still 
function without these plugins.
+## Options
+
+Option  |  Default  |  Description
+------  |  -------  |  -----------
+`fullscreen`  | `false`   | Set to `true` to go in fullscreen mode.
+`openPreview`  | `false`   | Set to `true` to open the preview area.
+`previewHeight`  | `"editorHeight"`   | With `"editorHeight"` the preview will 
have the same height as the textarea. With `"auto"` its height will adapt to 
its content. Also accepts any CSS height value (like `"300px"`).
+`previewCollapses`  | `true`   | If set to `false`, the editor will expand 
over the preview when the preview is toggled.
+`sidebyside`  | `false`   | Set to `true` to go in side-by-side editing mode.
+`autoScrollPreview`  | `true`   | Keeps the preview area scrolled at the 
bottom when you are typing text. Set to `false` to disable.
+`parser`  | `window.Markdown`   | `window.Markdown` is the parser function 
from [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra 
"Github link to js-markdown-extra"). `false` will directly parse the text as 
HTML. A parser function takes a text string as input and returns an HTML 
formatted string. _(More infos in the Parser section below.)_
+
+Note: the default options can be changed in: `jQuery.meltdown.defaults`
+
+
+## API
+
+Calling a method:
+
+~~~
+$("#my_textarea").meltdown("methodName", arg1, arg2);
+~~~
+
+Note: methods are chainnable.
+
+
+### Methods
+
+### `update([force])`
+
+Update the preview with the content of the editor. Set `force` to `true` to 
force the the update even if the content of the editor is the same as the last 
update.
+
+### `updateWith(text, [force])`
+
+Update the preview with the given `text`. The `text`will be parsed before 
being rendered. Set `force` to `true` to force the the update even if the 
`text` is the same as the last update.
+
+#### `isPreviewOpen()`
+
+Returns `true` if the preview is open. Otherwise `false`.
+
+#### `togglePreview([open])`
+
+If `open` is `true`, open the preview, if `false` close it. If `undefined` or 
not given, toggle preview.
+
+#### `isFullscreen()`
+
+Returns `true` if meltdown is in fullscreen. Otherwise `false`.
+
+#### `toggleFullscreen([full])`
+
+If `full` is `true`, go fullscreen, if `false` leave fullscreen. If 
`undefined` or not given, toggle fullscreen.
+
+#### `isSidebyside()`
+
+Returns `true` if meltdown is in side-by-side. Otherwise `false`.
+
+#### `toggleSidebyside([sidebyside])`
+
+If `sidebyside` is `true`, go side-by-side, if `false` leave side-by-side. If 
`undefined` or not given, toggle side-by-side.
+
+
+## Parser
+
+By default, uses the 
[js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra "Github 
link to js-markdown-extra") parser. You can change it to any parser you want 
(even a non Markdown parser).
+
+
+## Requirements
+
+* A modern browser: any recent version of Firefox, Chrome, IE 9+, Safari or 
Opera. _Note: works in IE 8 but with some disabled features._
+* jQuery 1.9.1+ _Note: works with jQuery 1.7.2+, but with some disabled 
features._
+
+## Changelog
+
+* **v0.2** (??-APR-2014)
+  
+  * Fullscreen mode
+  * Side-by-side mode
+  * Editor and preview can be resized with the mouse
+  * Customizable parser
+  * Debounced preview updates (while typing)
+  * Renamed and added init options
+  * Added API to control meltdown from JavaScript (Now the parser must be 
loaded before jquery.meltdown.js)
+  * Dropped IE 6-7 support
+  * Removed jQuery-ui dependency
+
+* **v0.1**
+
+
+## Libraries used
+
+* [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra 
"Github link to js-markdown-extra"): provides the markdown extra parser.
+* [Rangyinputs](http://code.google.com/p/rangyinputs/ "Google code link to 
rangyinputs"): manipulation of text selections.
+* 
[element_resize_detection](http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/):
 detects `resize` events on any DOM element.
+
+
+## License
 
-##License
 Copyright (c) 2013 Ian Page Hands and Mark Caron. Licensed under the GPLv3 
license.
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css 
b/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css
old mode 100755
new mode 100644
index fd3eb144..4e255f58
--- a/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css
+++ b/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css
@@ -1,14 +1,41 @@
+/* Prevent text selection while mouse dragging.
+   (See: 
http://blog.herdhound.com/2012/02/prevent-text-selection-during-mousemove.html) 
*/
+.unselectable * {
+-webkit-user-select: none;
+-khtml-user-select: none;
+-moz-user-select: none;
+-o-user-select: none;
+user-select: none;
+}
+
+
 /* Meltdown Wrap
 =======================================================================*/
 
 .meltdown_wrap {
        position: relative;
        margin-bottom: 10px;
-       padding: 5px;
+       padding: 0 5px;
        background: #c8c8c8;
        -moz-border-radius: 5px;
        -webkit-border-radius: 5px;
        border-radius: 5px;
+       overflow: hidden;
+}
+
+/* Fix for conflict with Bootstrap 3 / normalize.css */
+.meltdown_wrap, .meltdown_wrap * {
+       -webkit-box-sizing: content-box;
+       -moz-box-sizing: content-box;
+       box-sizing: content-box;
+}
+
+/* Allow the margins to collapse with the other childrens of .meltdown_wrap: */
+.meltdown_topmargin {
+       margin-bottom: 5px;
+}
+.meltdown_bottommargin {
+       margin-top: 5px;
 }
 
 /* Meltdown Font Icons
@@ -104,6 +131,65 @@ you can use the generic selector below, but it's slower:
        content: "\2b";
 }
 
+
+/* Meltdown Editor
+=======================================================================*/
+
+.meltdown_editor-wrap {
+}
+
+.meltdown_editor-deco {
+       border: 1px solid #a8a8a8;
+       padding: 5px;
+       background: #fff;
+       -moz-border-radius: 3px;
+       -webkit-border-radius: 3px;
+       border-radius: 3px;
+}
+.meltdown_editor-deco.focus {
+       border-color: #5c8cd0;
+}
+
+.meltdown_editor {
+       display: block; /* Removes the bottom space. */
+       margin: 0;
+       border: 0;
+       width: 100%;
+       resize: vertical;
+       min-height: 15px;
+}
+
+.meltdown_editor {
+       outline: none;
+}
+
+
+/* Resize handle
+=======================================================================*/
+
+
+.sidebyside .meltdown_preview-wrap2 {
+       position: relative;
+       padding-left: 8px;
+}
+.meltdown_resizehandle {
+       text-align: center;
+       margin: -2px 0 -5px;
+       font-size: 12px;
+}
+.meltdown_resizehandle > span:before {
+       content: "•";
+       color: #686868;
+}
+
+.meltdown_resizehandle-horiz {
+       cursor: auto;
+}
+.meltdown_resizehandle-vert {
+       cursor: row-resize;
+}
+
+
 /* Meltdown Toolbar
 =======================================================================*/
 
@@ -132,18 +218,14 @@ ul.meltdown_controls {
        padding: 0 !important;
        list-style: none;
 }
-li.meltdown_control,
-li.meltdown_controlgroup {
+li.meltdown_controlbutton {
        position: relative;
        float: left;
        margin: 0 0 0 5px;
        padding: 0;
 }
-       .meltdown_controls li.meltdown_control-preview { float: right; 
margin-right: 5px; }
-       .meltdown_controls li.meltdown_control-table,
-       .meltdown_controls li.meltdown_controlgroup-kitchenSink { padding-left: 
5px; border-left: 1px solid #ccc; }
-li.meltdown_control span,
-li.meltdown_controlgroup > span {
+.meltdown_controls li.meltdown_control-preview { float: right; margin-right: 
5px; }
+li.meltdown_controlbutton > span {
        float: left;
        padding: 6px;
        line-height: 1em;
@@ -157,42 +239,50 @@ li.meltdown_controlgroup > span {
        font-size: 12px;
        cursor: pointer;
 }
-li.meltdown_control:hover span,
-li.meltdown_control:focus span {
+.meltdown_controls li.meltdown_controlsep > span {
+       min-width: 1px;
+       width: 1px;
+       background-color: #ccc;
+       padding-right: 0;
+       padding-left: 0;
+       cursor: auto;
+}
+li.meltdown_controlbutton:hover > span,
+li.meltdown_controlbutton:focus > span {
        color: #06c;
 }
-.meltdown_controls li.meltdown_control-bold span,
-.meltdown_controls li.meltdown_control-italics span,
-.meltdown_controls li.meltdown_control-ul span,
-.meltdown_controls li.meltdown_control-ol span,
-.meltdown_controls li.meltdown_control-hr span,
-.meltdown_controls li.meltdown_control-table span,
-.meltdown_controls li.meltdown_control-preview span,
-.meltdown_controls li.meltdown_control-link span,
-.meltdown_controls li.meltdown_control-img span,
-.meltdown_controls li.meltdown_control-blockquote span,
-.meltdown_controls li.meltdown_control-codeblock span,
-.meltdown_controls li.meltdown_control-code span,
-.meltdown_controls li.meltdown_control-footnote span,
+.meltdown_controls li.meltdown_control-bold > span,
+.meltdown_controls li.meltdown_control-italics > span,
+.meltdown_controls li.meltdown_control-ul > span,
+.meltdown_controls li.meltdown_control-ol > span,
+.meltdown_controls li.meltdown_control-hr > span,
+.meltdown_controls li.meltdown_control-table > span,
+.meltdown_controls li.meltdown_control-preview > span,
+.meltdown_controls li.meltdown_control-link > span,
+.meltdown_controls li.meltdown_control-img > span,
+.meltdown_controls li.meltdown_control-blockquote > span,
+.meltdown_controls li.meltdown_control-codeblock > span,
+.meltdown_controls li.meltdown_control-code > span,
+.meltdown_controls li.meltdown_control-footnote > span,
 .meltdown_controls li.meltdown_controlgroup-kitchenSink > span {
        height: 12px;
        position: relative;
        text-indent: -9000em;
        width: 12px;
 }
-.meltdown_controls li.meltdown_control-bold span:before,
-.meltdown_controls li.meltdown_control-italics span:before,
-.meltdown_controls li.meltdown_control-ul span:before,
-.meltdown_controls li.meltdown_control-ol span:before,
-.meltdown_controls li.meltdown_control-hr span:before,
-.meltdown_controls li.meltdown_control-table span:before,
-.meltdown_controls li.meltdown_control-preview span:before,
-.meltdown_controls li.meltdown_control-link span:before,
-.meltdown_controls li.meltdown_control-img span:before,
-.meltdown_controls li.meltdown_control-blockquote span:before,
-.meltdown_controls li.meltdown_control-codeblock span:before,
-.meltdown_controls li.meltdown_control-code span:before,
-.meltdown_controls li.meltdown_control-footnote span:before,
+.meltdown_controls li.meltdown_control-bold > span:before,
+.meltdown_controls li.meltdown_control-italics > span:before,
+.meltdown_controls li.meltdown_control-ul > span:before,
+.meltdown_controls li.meltdown_control-ol > span:before,
+.meltdown_controls li.meltdown_control-hr > span:before,
+.meltdown_controls li.meltdown_control-table > span:before,
+.meltdown_controls li.meltdown_control-preview > span:before,
+.meltdown_controls li.meltdown_control-link > span:before,
+.meltdown_controls li.meltdown_control-img > span:before,
+.meltdown_controls li.meltdown_control-blockquote > span:before,
+.meltdown_controls li.meltdown_control-codeblock > span:before,
+.meltdown_controls li.meltdown_control-code > span:before,
+.meltdown_controls li.meltdown_control-footnote > span:before,
 .meltdown_controls li.meltdown_controlgroup-kitchenSink > span:before {
        position: absolute;
                left: 4px;
@@ -207,57 +297,57 @@ li.meltdown_control:focus span {
        text-indent: 0;
 }
 /* Resize and reposition Bold */
-.meltdown_controls li.meltdown_control-bold span:before {
+.meltdown_controls li.meltdown_control-bold > span:before {
        content: "\62";
        font-size: 12px;
        left: 7px;
        top: 7px;
 }
 /* Resize and reposition Italics */
-.meltdown_controls li.meltdown_control-italics span:before {
+.meltdown_controls li.meltdown_control-italics > span:before {
        content: "\69";
        font-size: 12px;
        left: 8px;
        top: 7px;
 }
-.meltdown_controls li.meltdown_control-ul span:before {
+.meltdown_controls li.meltdown_control-ul > span:before {
        content: "\2a";
 }
-.meltdown_controls li.meltdown_control-ol span:before {
+.meltdown_controls li.meltdown_control-ol > span:before {
        content: "\31";
 }
-.meltdown_controls li.meltdown_control-table span:before {
+.meltdown_controls li.meltdown_control-table > span:before {
        content: "\74";
 }
-.meltdown_controls li.meltdown_control-preview span:before {
+.meltdown_controls li.meltdown_control-preview > span:before {
        content: "\73";
 }
-       .meltdown_controls li.meltdown_preview-showing span:before {
-               content: "\68"; /* Toggle to Closed Eye */
-               color: #06c;
-       }
+.meltdown_wrap.openpreview .meltdown_controls li.meltdown_control-preview > 
span:before {
+       content: "\68"; /* Toggle to Closed Eye */
+       color: #06c;
+}
 .meltdown_controls li.meltdown_controlgroup-kitchenSink > span:before {
        content: "\2b";
 }
-.meltdown_controls li.meltdown_control-link span:before {
+.meltdown_controls li.meltdown_control-link > span:before {
        content: "\6c";
 }
-.meltdown_controls li.meltdown_control-img span:before {
+.meltdown_controls li.meltdown_control-img > span:before {
        content: "\70";
 }
-.meltdown_controls li.meltdown_control-blockquote span:before {
+.meltdown_controls li.meltdown_control-blockquote > span:before {
        content: "\22";
 }
-.meltdown_controls li.meltdown_control-codeblock span:before {
+.meltdown_controls li.meltdown_control-codeblock > span:before {
        content: "\5b";
 }
-.meltdown_controls li.meltdown_control-code span:before {
+.meltdown_controls li.meltdown_control-code > span:before {
        content: "\3c";
 }
-.meltdown_controls li.meltdown_control-footnote span:before {
+.meltdown_controls li.meltdown_control-footnote > span:before {
        content: "\66";
 }
-.meltdown_controls li.meltdown_control-hr span:before {
+.meltdown_controls li.meltdown_control-hr > span:before {
        content: "\5f";
 }
 
@@ -281,12 +371,12 @@ li.meltdown_controlgroup ul {
        -webkit-border-radius: 3px;
        border-radius: 3px;
 }
-       .meltdown_controls li.meltdown_controlgroup-kitchenSink > ul {
-               width: 120px;
-       }
-       li.meltdown_controlgroup-open > span {
-               color: #06c;
-       }
+.meltdown_controls li.meltdown_controlgroup-kitchenSink > ul {
+       width: 120px;
+}
+li.meltdown_controlgroup-open > span {
+       color: #06c;
+}
 .meltdown_controls li.meltdown_controlgroup i.meltdown-icon-caret-down {
        
 }
@@ -296,11 +386,26 @@ li.meltdown_controlgroup li {
 }
 .meltdown_controls li.meltdown_controlgroup-kitchenSink li { float: left; 
margin-left: 5px; }
 li.meltdown_controlgroup li span { display: block; float: none; }
-       
+
+.meltdown_controlbutton.disabled > span,
+li.meltdown_controlbutton.disabled:hover > span,
+li.meltdown_controlbutton.disabled:focus > span {
+       color: grey;
+       cursor: not-allowed;
+}
+
+.meltdown_controlbutton.overflowedControl {
+       display: none;
+}
+
 
 /* Meltdown Preview
 =======================================================================*/
 
+.meltdown_preview-wrap {
+       overflow: hidden;       /* Prevent resizeHandle's negative margins from 
adding extra pixels to the height. */
+}
+
 .meltdown_preview-header {
        display: block;
        padding: 2px 5px;
@@ -325,11 +430,14 @@ li.meltdown_controlgroup li span { display: block; float: 
none; }
        -moz-border-radius-topright: 3px;
        border-top-left-radius: 3px;
        border-top-right-radius: 3px;
+       overflow: hidden;
+       white-space: nowrap;
+       text-overflow: ellipsis;
 }
+
 .meltdown_preview {
        border: 1px solid #a8a8a8;
        border-top: 0;
-       margin-bottom: 3px;
        padding: 5px;
        overflow: auto;
        background: #fff;
@@ -339,19 +447,101 @@ li.meltdown_controlgroup li span { display: block; 
float: none; }
        -moz-border-radius-bottomleft: 3px;
        border-bottom-right-radius: 3px;
        border-bottom-left-radius: 3px;
+       resize: vertical;
+       min-height: 15px;
 }
-       .meltdownvisible .meltdown_preview {
-       
-       }
-.meltdown_wrap textarea {
-       margin: 0 !important;
-       padding: 5px;
-       border: 1px solid #a8a8a8;
-       -moz-border-radius: 3px;
-       -webkit-border-radius: 3px;
-       border-radius: 3px;
+
+
+/* HeightsManaged
+=======================================================================*/
+
+.meltdown_wrap.heightsManaged {
+       resize: vertical;
+}
+
+.meltdown_wrap.heightsManaged .meltdown_editor {
+       resize: none;
+}
+
+.meltdown_wrap.heightsManaged .meltdown_preview {
+       resize: none;
+}
+
+
+/* Sidebyside
+=======================================================================*/
+
+.meltdown_wrap.sidebyside .meltdown_editor-wrap,
+.meltdown_wrap.sidebyside .meltdown_preview-wrap {
+       display: table-cell;
+       vertical-align: top;
+}
+
+.sidebyside .meltdown_resizehandle {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       width: 10px;
+       margin: 0;
+}
+.sidebyside .meltdown_resizehandle > span {
+       position: absolute;
+       top: 50%;
+       left: 2px;
+       margin-top: -4px;
+}
+
+.sidebyside .meltdown_resizehandle-vert {
+       cursor: auto;
+}
+.sidebyside .meltdown_resizehandle-horiz {
+       cursor: col-resize;
+}
+
+
+/* Fullscreen
+=======================================================================*/
+
+.meltdown_wrap.fullscreen {
+       position: fixed;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       width: auto !important;
+       height: auto !important;
+       margin: 0;
+       -moz-border-radius: 0;
+       -webkit-border-radius: 0;
+       border-radius: 0;
+       z-index: 1000;
+       resize: none;
+}
+
+
+/* element_resize_detection.js
+   Source: 
http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
+=======================================================================*/
+
+.resize-triggers {
+       visibility: hidden;
+}
+.resize-triggers, .resize-triggers > div, .contract-trigger:before {
+  content: " ";
+  display: block;
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 100%;
+  overflow: hidden;
+}
+.resize-triggers > div {
+  background: #eee;
+  overflow: auto;
+}
+.contract-trigger:before {
+  width: 200%;
+  height: 200%;
 }
-       .meltdown_wrap textarea:focus {
-               outline: none;
-               border-color: #5c8cd0;
-       }
\ No newline at end of file
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.dev.svg 
b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.dev.svg
old mode 100755
new mode 100644
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.eot 
b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.eot
old mode 100755
new mode 100644
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.svg 
b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.svg
old mode 100755
new mode 100644
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.ttf 
b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.ttf
old mode 100755
new mode 100644
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.woff 
b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.woff
old mode 100755
new mode 100644
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js 
b/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js
old mode 100755
new mode 100644
index 9d9f1b04..da699df2
--- a/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js
+++ b/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js
@@ -1,405 +1,976 @@
-/*global jQuery, console, Markdown*/
+/*global jQuery, addResizeListener*/
 
 /*
  * Meltdown (Markup Extra Live Toolbox)
- * Version: 0.1 (13-FEB-2013)
- * Requires: jQuery v1.7.2 or later
+ * Version: 0.2 (??-APR-2014)
+ * Requires: jQuery v1.7.2 or later (1.9.1 recommended)
  */
 
-(function (jQuery) {
-       'use strict';
-
-       var ver, name, dbg;
-       ver = '0.1';
-       name = 'meltdown';
-       dbg = true;
-
-       function debug(msg) {
-               if ((typeof console !== 'undefined') && (dbg === true)) {
-                       console.log(msg);
-               }
-       }
-
-       function update(previewArea, input) {
-               var mde = Markdown;
-               previewArea.height(input.outerHeight());
-               previewArea.html(mde(input.val()));
-       }
-
-       function addEventHandler(thees, example, control) {
-               control.click(function (e) {
-                       var text, selection, before, placeholder, after, 
lineStart, lineEnd, charBefore, charAfter;
-                       before = example.before || "";
-                       placeholder =  example.placeholder || "";
-                       after = example.after || "";
-                       if (typeof thees.surroundSelectedText !== 'undefined') {
-                               text = thees.val();
-                               selection = thees.getSelection();
-                               if (example.lineSelect) {
-                                       lineStart = text.lastIndexOf('\n', 
selection.start) + 1;
-                                       lineEnd = text.indexOf('\n', 
selection.end);
-                                       if(lineEnd === -1) {
-                                               lineEnd = text.length;
-                                       }
-                                       thees.setSelection(lineStart, lineEnd);
-                                       selection = thees.getSelection();
-                               }
-                               if(selection.length > 0) {
-                                       placeholder = selection.text;
-                               }
-                               if (example.isBlock) {
-                                       for (var i = 0; i < 2; i++) {
-                                               charBefore = 
text.charAt(selection.start - 1 - i);
-                                               charAfter = 
text.charAt(selection.end + i);
-                                               if (charBefore !== "\n" && 
charBefore !== "") {
-                                                       before = "\n" + before;
-                                               }
-                                               if (charAfter !== "\n" && 
charAfter !== "") {
-                                                       after = after + "\n";
-                                               }
-                                       }
-                               }
-                               if (selection.text !== placeholder) {
-                                       thees.replaceSelectedText(placeholder, 
"select");
-                               }
-                               thees.surroundSelectedText(before, after, 
"select");
-                       } else {
-                               debug('Failed to load surroundSelectedText');
-                               thees.val(before + placeholder + after + "\n\n" 
+ thees.val());
-                       }
-                       e.preventDefault();
-                       thees.focus();
-                       thees.keyup();
-               });
-       }
-
-       function buildControls(opts, thees, controls) {
-               var controlList, example, control, tuple, t, groupClass, group, 
outer, tmpThis;
-               controlList = [];
-
-               for (example in opts.examples) {
-                       if (opts.examples.hasOwnProperty(example)) {
-                               example = opts.examples[example];
-
-                               control = jQuery('<li><span>' + example.label + 
'</span></li>');
-                               control.addClass(name + '_control');
-                               if (typeof example.styleClass !== 'undefined') {
-                                       control.addClass(example.styleClass);
-                               }
-
-                               control.children(":first").attr('title', 
example.altText);
-                               addEventHandler(thees, example, control);
-
-                               tuple = {};
-                               tuple.example = example;
-                               tuple.control = control;
-                               controlList.push(tuple);
-                       }
-               }
-
-               function addClickHandler(outer) {
-                       outer.on('click', function () {
-                var element = jQuery(this);
-                               element.siblings('li').removeClass(name + 
'_controlgroup-open').children('ul').hide();
-                               element.toggleClass(name + 
'_controlgroup-open').children('ul').toggle();
-                       });
-               }
-
-               for (t in controlList) {
-                       if (controlList.hasOwnProperty(t)) {
-                               t = controlList[t];
-                               if (t.example.group && t.example.groupLabel) {
-                                       groupClass = name + "_controlgroup-" + 
t.example.group;
-                                       group = controls.find("ul." + 
groupClass);
-                                       outer = jQuery('<li />');
-                                       if (group.length === 0) {
-                                               group = jQuery('<ul 
style="display: none;" />');
-                                               group.addClass(name + 
'_controlgroup-dropdown ' + groupClass);
-                                               outer.addClass(name + 
'_controlgroup ' + groupClass);
-                                               outer.append('<span>' + 
t.example.groupLabel + ' <i 
class="meltdown-icon-caret-down"></i></span><b></b>');
-                                               outer.append(group);
-                                               controls.append(outer);
-                                       }
-                                       group.append(t.control);
-                                       addClickHandler(outer);
-                               } else {
-                                       controls.append(t.control);
-                               }
-                       }
-               }
-       }
-
-       function getAddExampleControl(options, thees, previewArea, example) {
-               var control = jQuery('<li><span>' + example.label + 
'</span></li>');
-               control.addClass(name + '_control');
-               if (typeof example.styleClass !== 'undefined') {
-                       control.addClass(example.styleClass);
-               }
-               control.children(":first").attr('title', example.altText);
-               control.on('click', function () {
-                       thees.val(example.markdown + "\n\n\n" + thees.val());
-                       thees.keyup();
-               });
-               return control;
-       }
-
-       function getPreviewControl(options, thees, previewArea) {
-               var control = jQuery('<li class="' + name + '_control ' + name 
+ '_control-preview"><span title="Show preview">Show preview</span></li>');
-               control.on('click', function () {
-
-                       if (control.hasClass('disabled')) {
-                               return;
-                       }
-
-                       if (!previewArea.is(':visible')) {
-                               
previewArea.find('.meltdown_preview').height(thees.outerHeight());
-                               if (options.hasEffects) {
-                                       
previewArea.slideToggle(options.previewTimeout);
-                               } else {
-                                       previewArea.fadeIn();
-                               }
-                               previewArea.addClass(name + 'visible');
-                               control.children(':eq(0)').text('Hide preview');
-                               control.addClass(name + '_preview-showing');
-                               update(previewArea.children(':eq(1)'), thees);
-                       } else {
-                               if (options.hasEffects) {
-                                       
previewArea.slideToggle(options.previewTimeout);
-                               } else {
-                                       previewArea.fadeOut();
-                               }
-                               previewArea.removeClass(name + 'visible');
-                               control.removeClass(name + '_preview-showing');
-                               control.children(':eq(0)').text('Show preview');
-                       }
-               });
-               return control;
-       }
-
-       function getExamples() {
-               var key, examples, pounds, i, j;
-               examples = {
-                       bold: {
-                               label: "B",
-                               altText: "Bold",
-                               before: "**",
-                               after: "**"
-                       },
-                       italics: {
-                               label: "I",
-                               altText: "Italics",
-                               before: "*",
-                               after: "*"
-                       },
-                       ul: {
-                               label: "UL",
-                               altText: "Unordered List",
-                               before: "* ",
-                               placeholder: "Item\n* Item",
-                               lineSelect: true,
-                               isBlock: true
-                       },
-                       ol: {
-                               label: "OL",
-                               altText: "Ordered List",
-                               before: "1. ",
-                               placeholder: "Item 1\n2. Item 2\n3. Item 3",
-                               lineSelect: true,
-                               isBlock: true
-                       },
-                       table: {
-                               label: "Table",
-                               altText: "Table",
-                               before: "First Header  | Second 
Header\n------------- | -------------\nContent Cell  | Content Cell\nContent 
Cell  | Content Cell\n",
-                               isBlock: true
-                       }
-               };
-
-               pounds = "";
-               for (i = 1; i <= 6; i += 1) {
-                       pounds = pounds + "#";
-                       examples['h' + i] = {
-                               group: "h",
-                               groupLabel: "Headers",
-                               label: "H" + i,
-                               altText: "Header " + i,
-                               before: pounds + " ",
-                               lineSelect: true
-                       };
-               }
-
-               examples.link = {
-                       label: "Link",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Link",
-                       before: "[",
-                       placeholder: "Example link",
-                       after: "](http:// \"Link title\")"
-               };
-
-               examples.img = {
-                       label: "Image",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Image",
-                       before: "![Alt text](",
-                       placeholder: "http://";,
-                       after: ")"
-               };
-
-               examples.blockquote = {
-                       label: "Blockquote",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Blockquote",
-                       before: "> ",
-                       placeholder: "Quoted text",
-                       lineSelect: true,
-                       isBlock: true
-               };
-
-               examples.codeblock = {
-                       label: "Code Block",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Code Block",
-                       before: "~~~\n",
-                       placeholder: "Code",
-                       after: "\n~~~",
-                       lineSelect: true,
-                       isBlock: true
-               };
-
-               examples.code = {
-                       label: "Code",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Inline Code",
-                       before: "`",
-                       placeholder: "code",
-                       after: "`",
-               };
-
-               examples.footnote = {
-                       label: "Footnote",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Footnote",
-                       before: "[^1]\n\n[^1]:",
-                       placeholder: "Example footnote",
-                       isBlock: true
-               };
-
-               examples.hr = {
-                       label: "HR",
-                       group: "kitchenSink",
-                       groupLabel: "Kitchen Sink",
-                       altText: "Horizontal Rule",
-                       before: "----------",
-                       placeholder: "",
-                       isBlock: true
-               };
-
-               for (key in examples) {
-                       if (examples.hasOwnProperty(key)) {
-                               examples[key].styleClass = name + "_control-" + 
key;
-                       }
-               }
-
-               return examples;
-       }
-
-       function addToolTip(wrap) {
-               var tip, preview;
-
-               preview = wrap.find('.meltdown_control-preview');
-               if (typeof jQuery.qtip !== 'undefined') {
-                       // Disable the preview
-                       preview.addClass('disabled');
-                       tip = preview.qtip({
-                               content: "Warning this feature is a tech 
preview feature.<br/>"
-                                                + "There is a <a 
target=\"_blank\" href=\"https://github.com/iphands/Meltdown/issues/1\";>known 
issue</a> with one of the libraries used to generate the live 
preview.<br/><br/>"
-                                                + "Live previews <b>can</b> 
cause the browser tab to stop responding.<br/><br/>"
-                                                + "This warning will be 
removed when <a href=\"#\" target=\"_blank\" 
href=\"https://github.com/iphands/Meltdown/issues/1\";>the issue</a> is 
resolved.<br/></br>"
-                                                + "<input type=\"button\" 
class=\"meltdown_control-preview-enabler\" value=\"Click here\"> to remove this 
warning and enable live previews",
-                               show: {
-                                       delay: 0,
-                                       when: {
-                                               event: 'mouseover'
-                                       }
-                               },
-                               hide: {
-                                       delay: 5000,
-                                       when: {
-                                               event: 'mouseout'
-                                       }
-                               },
-                               position: {
-                                       corner: {
-                                               target: 'leftMiddle',
-                                               tooltip: 'rightMiddle'
-                                       }
-                               },
-                               api: {
-                                       onRender: function () {
-                                               
jQuery('.meltdown_control-preview-enabler').click(function () {
-                                                       tip.qtip('destroy');
-                                                       
jQuery('.meltdown_control-preview').removeClass('disabled');
-                                                       preview.click();
-                                               });
-                                       }
-                               },
-                               style: {
-                                       classes: 'meltdown_techpreview-qtip',
-                                       name: 'dark',
-                                       lineHeight: '1.3em',
-                                       padding: '12px',
-                                       width: {
-                                               max: 300,
-                                               min: 0
-                                       },
-                                       tip: true
-                               }
-                       });
-               }
-       }
-
-       jQuery.fn.meltdown = function (userOptions) {
-               return this.each(function () {
-                       var defaults, opts, thees, wrap, previewWrap, preview, 
bar, controls;
-                       defaults = jQuery.fn.meltdown.defaults;
-                       opts = jQuery.extend(true, {}, defaults, userOptions);
-                       opts.hasEffects = typeof jQuery.ui !== 'undefined';
-
-                       thees = jQuery(this);
-                       thees.wrap('<div class="' + name + '_wrap" />');
-                       thees.before('<div><div style="display: none;" class="' 
+ name + '_preview-wrap"><span class="' + name + '_preview-header">Preview Area 
(<a class="meltdown_techpreview" 
href="https://github.com/iphands/Meltdown/issues/1";>Tech 
Preview</a>)</span><div class="' + name + '_preview"></div></div></div><div 
class="meltdown_bar"><ul class="' + name + '_controls"></ul></div>');
-                       wrap = thees.parent();
-                       previewWrap = 
wrap.children(':eq(0)').children(':eq(0)'); /* wrapper for the preview area, 
but not where the updated content goes */
-                       preview = previewWrap.children(':eq(1)'); /* preview 
area where updates happen */
-                       bar = wrap.children(':eq(1)');
-                       controls = bar.children().first();
-
-                       buildControls(opts, thees, controls);
-                       controls.append(getPreviewControl(opts, thees, 
previewWrap));
-
-                       wrap.width(thees.outerWidth());
-                       preview.height(thees.outerHeight());
-
-                       thees.on('keyup', function (event) {
-                               if (previewWrap.is(':visible')) {
-                                       update(preview, thees);
-                               }
-                       });
-
-                       addToolTip(wrap);
-               });
-       };
-
-       jQuery.fn.meltdown.defaults = {
-               examples: getExamples(),
-               previewTimeout: 400
-       };
-
-}(jQuery));
+(function ($, window, document, undefined) {
+    'use strict';
+
+    var ver = '0.2',
+        plgName = 'meltdown',
+        dbg = true,
+        isIE8 = document.all && !document.addEventListener,  // From: 
http://tanalin.com/en/articles/ie-version-js/
+        jqueryRequired = [1, 8, 0],
+        jqueryCurrent  = $.fn.jquery.split(' ')[0].split('.'), // first split 
to get rid of any amd related extras
+        isOldjQuery = false,
+        doc = $(document),
+        body = $("body");
+
+    for (var i = 0; i < jqueryRequired.length; i++) {
+        var required = jqueryRequired[i],
+            current = parseInt(jqueryCurrent[i], 10);
+        if (required > current) {
+            isOldjQuery = true;
+            break;
+        } else if (current > required) {
+            break;
+        }
+    }
+
+    function debug(msg) {
+        if (window.console && dbg) {
+            window.console.log(msg);
+        }
+    }
+
+    // Used to test the bottom offset of elements:
+    var bottomPositionTest = $('<div style="bottom: 0;" />');
+
+    // Helper for users that want to change the controls (For usage, see: 
$.meltdown.defaults.controls below)
+    var controlsGroup = function(name, label, controls) {
+        controls.name = name;
+        controls.label = label;
+        return controls;
+    };
+
+    $.meltdown = {
+        version: ver,
+
+        // Expose publicly:
+        controlsGroup: controlsGroup,
+
+        // Default meltdown options:
+        defaults: {
+            // Use $.meltdown.controlsGroup() to make groups and subgroups of 
controls.
+            // The available control names come from the keys of 
$.meltdown.controlDefs (see below)
+            controls: controlsGroup("", "", [
+                "preview",
+                "bold",
+                "italics",
+                "ul",
+                "ol",
+                "|",
+                "table",
+                controlsGroup("h", "Headers", ["h1", "h2", "h3", "h4", "h5", 
"h6"]),
+                "|",
+                controlsGroup("kitchenSink", "Kitchen Sink", [
+                    "link",
+                    "img",
+                    "blockquote",
+                    "codeblock",
+                    "code",
+                    "footnote",
+                    "hr"
+                ]),
+                "fullscreen",
+                "sidebyside"
+            ]),
+
+            // If true, goes directly in fullscreen mode:
+            fullscreen: false,
+
+            // Should the preview be visible by default ?
+            openPreview: false,
+
+            // A CSS height or "editorHeight" or "auto" (to let the height 
adjust to the content).
+            previewHeight: "editorHeight",
+
+            // If true, when the preview is toggled it will (un)collapse 
resulting in the total height of the wrap to change.
+            // Set this to false if you want the editor to expand/shrinkin the 
opposite way of the preview.
+            // Setting this to false can be useful if you want to restrict or 
lock the total height.
+            previewCollapses: true,
+
+            // If true, editor and preview will be displayed side by side 
instead of one on the other.
+            sidebyside: false,
+
+            // If true, when the preview is fully scrolled it will stay 
scrolled while typing.
+            // Very convenient when typing/adding text at the end of the 
editor.
+            autoScrollPreview: true,
+
+            // Duration of the preview toggle animation:
+            previewDuration: 400,
+
+            // The parser. The function takes a string and returns an html 
formatted string.
+            // Set this to false to use an _identity_ function (for a direct 
HTML "parser").
+            parser: window.Markdown
+        },
+
+        // Definitions for the toolbar controls:
+        controlDefs: {
+            bold: {
+                label: "B",
+                altText: "Bold",
+                before: "**",
+                after: "**"
+            },
+            italics: {
+                label: "I",
+                altText: "Italics",
+                before: "*",
+                after: "*"
+            },
+            ul: {
+                label: "UL",
+                altText: "Unordered List",
+                preselectLine: true,
+                before: "* ",
+                placeholder: "Item\n* Item",
+                isBlock: true
+            },
+            ol: {
+                label: "OL",
+                altText: "Ordered List",
+                preselectLine: true,
+                before: "1. ",
+                placeholder: "Item 1\n2. Item 2\n3. Item 3",
+                isBlock: true
+            },
+            table: {
+                label: "Table",
+                altText: "Table",
+                before: "First Header  | Second Header\n------------- | 
-------------\nContent Cell  | Content Cell\nContent Cell  | Content Cell\n",
+                isBlock: true
+            },
+            link: {
+                label: "Link",
+                altText: "Link",
+                before: "[",
+                placeholder: "Example link",
+                after: "](http:// \"Link title\")"
+            },
+            img: {
+                label: "Image",
+                altText: "Image",
+                before: "![Alt text](",
+                placeholder: "http://";,
+                after: ")"
+            },
+            blockquote: {
+                label: "Blockquote",
+                altText: "Blockquote",
+                preselectLine: true,
+                before: "> ",
+                placeholder: "Quoted text",
+                isBlock: true
+            },
+            codeblock: {
+                label: "Code Block",
+                altText: "Code Block",
+                preselectLine: true,
+                before: "~~~\n",
+                placeholder: "Code",
+                after: "\n~~~",
+                isBlock: true
+            },
+            code: {
+                label: "Code",
+                altText: "Inline Code",
+                before: "`",
+                placeholder: "code",
+                after: "`"
+            },
+            footnote: {
+                label: "Footnote",
+                altText: "Footnote",
+                before: "[^1]\n\n[^1]:",
+                placeholder: "Example footnote",
+                isBlock: true
+            },
+            hr: {
+                label: "HR",
+                altText: "Horizontal Rule",
+                before: "----------",
+                placeholder: "",
+                isBlock: true
+            },
+            fullscreen: {
+                label: "Fullscreen",
+                altText: "Toggle fullscreen",
+                click: function(meltdown /*, def, control, execAction */) {
+                    meltdown.toggleFullscreen();
+                }
+            },
+            sidebyside: {
+                label: "Sidebyside",
+                altText: "Toggle sidebyside",
+                click: function(meltdown /*, def, control, execAction */) {
+                    meltdown.toggleSidebyside();
+                }
+            },
+            preview: {
+                label: "Preview",
+                altText: "Toggle preview",
+                click: function(meltdown /*, def, control, execAction */) {
+                    meltdown.togglePreview();
+                }
+            }
+        }
+    };
+
+    // Add h1...h6 control definitions to $.meltdown.controlDefs:
+    (function(controlDefs) {
+        for (var pounds = "", i = 1; i <= 6; i++) {
+            pounds += "#";
+            controlDefs['h' + i] = {
+                label: "H" + i,
+                altText: "Header " + i,
+                preselectLine: true,
+                before: pounds + " "
+            };
+        }
+    })($.meltdown.controlDefs);
+
+
+    function addControlEventHandler(meltdown, def, control) {
+        var editor = meltdown.editor,
+            execAction = function () {
+                var text = editor.val(),
+                    selection = editor.getSelection(),
+                    before = def.before || "",
+                    placeholder =  def.placeholder || "",
+                    after = def.after || "";
+
+                // Extend selection if needed:
+                if (def.preselectLine) {
+                    var lineStart = text.lastIndexOf('\n', selection.start) + 
1,
+                        lineEnd = text.indexOf('\n', selection.end);
+
+                    if (lineEnd === -1) {
+                        lineEnd = text.length;
+                    }
+                    editor.setSelection(lineStart, lineEnd);
+                    selection = editor.getSelection();
+                }
+
+                // placeholder is only used if there is no selected text:
+                if (selection.length > 0) {
+                    placeholder = selection.text;
+                }
+
+                // isBlock means that there should be empty line before and 
after the selection:
+                if (def.isBlock) {
+                    for (var i = 0; i < 2; i++) {
+                        var charBefore = text.charAt(selection.start - 1 - i),
+                            charAfter = text.charAt(selection.end + i);
+
+                        if (charBefore !== "\n" && charBefore !== "") {
+                            before = "\n" + before;
+                        }
+                        if (charAfter !== "\n" && charAfter !== "") {
+                            after = after + "\n";
+                        }
+                    }
+                }
+
+                // Insert placeholder:
+                if (selection.text !== placeholder) {
+                    editor.replaceSelectedText(placeholder, "select");
+                }
+                // Insert before and after selection:
+                editor.surroundSelectedText(before, after, "select");
+            };
+
+        control.click(function (e) {
+            if (!control.hasClass('disabled')) {
+                if (def.click) {
+                    def.click(meltdown, def, control, execAction);
+                } else {
+                    execAction();
+                }
+                meltdown.update();
+            }
+            editor.focus();
+            e.preventDefault();
+        });
+    }
+
+    function addGroupClickHandler(control) {
+        control.on('click', function () {
+            control.siblings('li').removeClass(plgName + 
'_controlgroup-open').children('ul').hide();
+            control.toggleClass(plgName + 
'_controlgroup-open').children('ul').toggle();
+        });
+    }
+
+    function buildControls(meltdown, controlsGroup, subGroup) {
+        var controlList = $('<ul />');
+        if (subGroup) {
+            controlList.css("display", "none");
+            controlList.addClass(plgName + "_controlgroup-" + 
controlsGroup.name + " " + plgName + '_controlgroup-dropdown');
+        } else {
+            controlList.addClass("meltdown_controls");
+        }
+
+        for (var i = 0; i < controlsGroup.length; i++) {
+            var controlName = controlsGroup[i],
+                control = $('<li />'),
+                span = $('<span />').appendTo(control);
+            if ($.type(controlName) === "string") {
+                if (controlName === "|") {  // Separator
+                    controlList.append(control.addClass(plgName + '_controlsep 
' + plgName + '_controlbutton'));
+                    continue;
+                }
+                var def = $.meltdown.controlDefs[controlName];
+                if (def === undefined) {
+                    debug("Control not found: " + controlName);
+                    continue;
+                }
+                control.addClass(plgName + "_control-" + controlName + " " + 
plgName + '_control ' + plgName + '_controlbutton ' + (def.styleClass || ""));
+                span.text(def.label).attr("title", def.altText);
+                addControlEventHandler(meltdown, def, control);
+
+            } else if ($.isArray(controlName)) {
+                control.addClass(plgName + "_controlgroup-" + controlName.name 
+ " " + plgName + '_controlgroup ' + plgName + '_controlbutton');
+                span.text(controlName.label).append('<i 
class="meltdown-icon-caret-down" />');
+                addGroupClickHandler(control);
+                control.append(buildControls(meltdown, controlName, true));
+            }
+            controlList.append(control);
+        }
+
+        return controlList;
+    }
+
+    function addWarning(meltdown, element) {
+        element.click(function(e) {
+            var warning = $('<div class"' + plgName + 
'_warning"/>').html('<center><b>The preview area is a tech preview 
feature</b></center><br/>'
+                                                                         + 
'Live previews <b>can</b> cause the browser tab to stop responding.<br/><br/>'
+                                                                         + 
'There is a <a target="_blank" 
href="https://github.com/iphands/Meltdown/issues/1";>known issue</a> with <a 
target="_blank" 
href="https://github.com/tanakahisateru/js-markdown-extra#notice";>one of the 
libraries</a> used to generate the live preview.<br/><br/>'
+                                                                         + 
'This warning will be removed when the issue is resolved.<br/><br/>'
+                                                                         + 
'<center><i>Click to continue.</i></center>').css({background: "#fdd", cursor: 
"pointer"});
+            warning.on("click", function(e) {
+                if (!$(e.target).is("a, a *")) {    // Ignore clicks on links
+                    meltdown.update(true);
+                }
+            });
+            meltdown.preview.empty().append(warning);
+            e.preventDefault();
+        });
+    }
+
+    // Setup event handlers for the resize handle:
+    function setupResizeHandle(resizeHandle, firstElem, lastElem, vertical, 
meltdown) {
+        resizeHandle.addClass("meltdown_resizehandle-" + (vertical ? "vert" : 
"horiz"));
+        var propName = vertical ? "height" : "width",
+            pageName = vertical ? "pageY" : "pageX",
+            lastEditorPercentName = vertical ? "lastEditorPercentHeight" : 
"lastEditorPercentWidth",
+            minSize = vertical ? 15 : 60;
+
+        var startPos, minPos, maxPos, originalFirstElemSize, 
originalLastElemSize,
+            moveEventHandler = function(e) {
+                var delta = Math.min(Math.max(e[pageName] , minPos), maxPos) - 
startPos,
+                    firstElemSize = originalFirstElemSize + delta,
+                    lastElemSize = originalLastElemSize - delta;
+                firstElem[propName](firstElemSize);
+                lastElem[propName](lastElemSize);
+                if (!vertical) {
+                    firstElem[0].style.maxWidth = firstElemSize + "px";
+                    lastElem[0].style.maxWidth = lastElemSize + "px";
+                }
+
+                var editorElem = vertical ? meltdown.editor[0] : 
meltdown.editorWrap[0],
+                    editorSize = firstElem[0] === editorElem ? firstElemSize : 
lastElemSize;
+                meltdown[lastEditorPercentName] = editorSize / (firstElemSize 
+ lastElemSize);
+            };
+
+        // Init dragging handlers only on mousedown:
+        resizeHandle.on("mousedown", function(e) {
+            if (meltdown.isSidebyside() === vertical) {
+                return;
+            }
+            // Sort elems in document order:
+            var elems = firstElem.add(lastElem);
+            // The first elem is assumed to be before resizeHandle, and the 
last is after:
+            firstElem = elems.first();
+            lastElem = elems.last();
+
+            // Init dragging properties:
+            startPos = e[pageName];
+            originalFirstElemSize = firstElem[propName]();
+            originalLastElemSize = lastElem[propName]();
+            minPos = startPos - originalFirstElemSize + minSize;
+            maxPos = startPos + originalLastElemSize - minSize;
+
+            // Setup event handlers:
+            doc.on("mousemove", moveEventHandler).one("mouseup", function() {
+                doc.off("mousemove", moveEventHandler);
+                body.removeClass("unselectable");
+                meltdown.editor.focus();
+            });
+            // Prevent text selection while dragging:
+            body.addClass("unselectable");
+        });
+    }
+
+    function debounce(func, wait, returnValue) {
+        var context, args, timeout,
+            exec = function() {
+                func.apply(context, args);
+            };
+        return function() {
+            context = this;
+            args = arguments;
+            clearTimeout(timeout);
+            timeout = setTimeout(exec, wait);
+            return returnValue;
+        };
+    }
+
+    // Return true, false or undefined.
+    // If newState is undefined or not a boolean, return !state (this is the 
toggle action)
+    // If newState === state, return newState or if force, return undefined 
(to tell that no state change is required)
+    function checkToggleState(newState, state, force) {
+        if (newState !== true && newState !== false) {
+            return !state;
+        }
+        if (newState === state) {
+            return force ? newState : undefined;
+        }
+        return newState;
+    }
+
+    function splitSize(availableSize, firstPercentSize, minSize) {
+        var firstSize = Math.round(firstPercentSize * availableSize),
+            lastSize = availableSize - firstSize;
+        if (firstSize < minSize) {
+            lastSize -= minSize - firstSize;
+            firstSize = minSize;
+        } else if (lastSize < minSize) {
+            firstSize -= minSize - lastSize;
+            lastSize = minSize;
+        }
+        return {firstSize: firstSize, lastSize: lastSize};
+    }
+
+
+    // Meltdown base class:
+    var Meltdown = $.meltdown.Meltdown = function(elem) {
+        this.element = $(elem);
+    };
+
+    // The Meltdown methods.
+    // Methods are publicly available: elem.meltdown("methodName", args...)
+    $.meltdown.methods = $.extend(Meltdown.prototype, {
+        _init: function(userOptions) {
+            var self = this,
+                _options = this._options = $.extend({}, $.meltdown.defaults, 
userOptions);
+
+            this._lastUpdateText = "";
+
+            // If parser is false, use a HTML parser (ie. directly use the 
text as the HTML source)
+            this.parser = _options.parser || function(text) {
+                return text;
+            };
+
+            this.editorPreInitOuterWidth = this.element.outerWidth();
+
+            // Setup everything detached from the document:
+            this.wrap = $('<div class="' + plgName + '_wrap previewopen" />');
+            this.topmargin = $('<div class="' + plgName + 
'_topmargin"/>').appendTo(this.wrap);
+            this.bar =  $('<div 
class="meltdown_bar"></div>').appendTo(this.wrap);
+            this.editorWrap =  $('<div class="' + plgName + '_editor-wrap" 
/>').appendTo(this.wrap);
+            this.editorDeco =  $('<div class="' + plgName + '_editor-deco" 
/>').appendTo(this.editorWrap);
+            this.editor = this.element.addClass("meltdown_editor");
+            this.previewWrap =  $('<div class="' + plgName + '_preview-wrap" 
/>').appendTo(this.wrap);
+            this.resizeHandle = $('<div class="' + plgName + 
'_resizehandle"><span></span></div>').appendTo(this.previewWrap);
+            this.previewHeader =  $('<span class="' + plgName + 
'_preview-header">Preview Area (<a class="meltdown_techpreview" 
href="https://github.com/iphands/Meltdown/issues/1";>Tech 
Preview</a>)</span>').appendTo(this.previewWrap);
+            this.preview =  $('<div class="' + plgName + '_preview" 
/>').appendTo(this.previewWrap);
+            this.bottommargin = $('<div class="' + plgName + 
'_bottommargin"/>').appendTo(this.wrap);
+
+            // Setup meltdown sizes:
+            this.wrap.outerWidth(this.editorPreInitOuterWidth); // jQuery 1.8+ 
(undocumented: http://bugs.jquery.com/ticket/10877)
+            if (isOldjQuery) this.wrap.width(this.editorPreInitOuterWidth); // 
Good enough.
+            var previewHeight = _options.previewHeight;
+            if (previewHeight === "editorHeight") {
+                previewHeight = this.editor.height();
+            }
+            this.preview.height(previewHeight);
+
+            // Build toolbar:
+            this.controls = buildControls(this, 
_options.controls).appendTo(this.bar);
+            addWarning(this, this.previewHeader.find(".meltdown_techpreview"));
+
+            // editorDeco's CSS need a bit of help:
+            this.editor.focus(function() {
+                self.editorDeco.addClass("focus");
+            }).blur(function() {
+                self.editorDeco.removeClass("focus");
+            });
+
+            // Need to put a div in the wrap to allow absolute positioning for 
child elements.
+            // Bug in FF < 31: 
https://bugzilla.mozilla.org/show_bug.cgi?id=63895
+            this.previewWrap2 = $('<div class="' + plgName + 
'_preview-wrap2"></div>').appendTo(this.previewWrap);
+            this.previewWrap2.append(this.resizeHandle, this.previewHeader, 
this.preview);
+            setupResizeHandle(this.resizeHandle, this.editor, this.preview, 
true, this);
+            setupResizeHandle(this.resizeHandle, this.editorWrap, 
this.previewWrap, false, this);
+
+            // Setup update:
+            this.debouncedUpdate = debounce(this.update, 350, this);
+            this.editor.on('keyup', $.proxy(this.debouncedUpdate, this));
+
+            // Store datas needed by fullscreen mode:
+            this.fullscreenData = {};
+
+            // Insert meltdown in the document:
+            this.editor.after(this.wrap).appendTo(this.editorDeco);
+            this._checkToolbarOverflowedControls();
+
+            // Setup display state (preview open and _heightsManaged):
+            this._previewCollapses = _options.previewCollapses;
+            this.togglePreview(true, 0, true, !_options.openPreview);   // Do 
not update the preview if !_options.openPreview
+            if (!this.isPreviewCollapses() && _options.previewHeight === 
"auto") {
+                this.preview.height("+=0"); // If !_previewCollapses, we 
cannot have a dynamic height.
+            }
+            this._checkHeightsManaged("", undefined, true); // Set CSS height 
of wrap.
+
+            // Define the wrap min height from the editor and the preview min 
heights:
+            var wrapHeight = this.wrap.height(),
+                minWrapHeights = parseFloat(this.editor.css("minHeight")) + 
parseFloat(this.preview.css("minHeight")),
+                editorHeight = this.editor.height();
+            previewHeight = this.preview.height();
+            this.wrap.css("minHeight", wrapHeight - editorHeight - 
previewHeight + minWrapHeights);
+
+            // Setup editor and preview resizing when wrap is resized:
+            this.lastWrapWidth = this.wrap.width();
+            this.lastWrapHeight = wrapHeight;
+            this.lastEditorPercentWidth = 0.5;
+            this.lastEditorPercentHeight = editorHeight / (editorHeight + 
previewHeight);
+            addResizeListener(this.wrap[0], $.proxy(this._wrapResizeListener, 
this));
+
+            // Now that all measures were made, we can close the preview if 
needed:
+            if (!_options.openPreview) {
+                this.togglePreview(false, 0);
+            }
+            // And set the sidebyside and fullscreen modes:
+            this.toggleSidebyside(_options.sidebyside, true);
+            if (_options.fullscreen) {
+                this.toggleFullscreen(_options.fullscreen);
+            }
+
+            return this;    // Chaining
+        },
+        options: function(name, value) {
+            if (arguments.length === 1) {
+                return this._options[name];
+            } else if (arguments.length > 1) {
+                this._options[name] = value;
+                return this;    // Chaining
+            }
+        },
+        update: function(force) {
+            return this.updateWith(this.editor.val(), force);
+        },
+        updateWith: function(text, force) {
+            if (force === true || (this.isPreviewOpen() && text !== 
this._lastUpdateText)) {
+                // If the preview is scrolled to the bottom, keept it scrolled 
after update:
+                var previewNode = this.preview[0],
+                    scrolledToBottom = previewNode.scrollHeight - 
previewNode.scrollTop === previewNode.clientHeight;
+                this.preview.html(this.parser(text));
+                if (scrolledToBottom) {
+                    previewNode.scrollTop = previewNode.scrollHeight;
+                }
+                this._lastUpdateText = text;
+            }
+            return this;    // Chaining
+        },
+        isPreviewOpen: function() {
+            return this.wrap.hasClass("previewopen");
+        },
+        togglePreview: function(open, duration, force, noUpdate) {
+            open = checkToggleState(open, this.isPreviewOpen(), force);
+            if (open === undefined) {
+                return this;    // Chaining
+            }
+            if (duration === undefined) {
+                duration = this._options.previewDuration;
+            }
+
+            // Function to resize the editor when the preview is resized:
+            var self = this,
+                editorHeight = this.editor.height(),
+                previewWrapHeightStart = open ? 0 : 
this.previewWrap.outerHeight(),
+                availableHeight = editorHeight + previewWrapHeightStart,
+                progress = this._isHeightsManaged() ? function(/* animation, 
progress */) {
+                    self.editor.height(availableHeight - 
self.previewWrap.outerHeight());
+                } : $.noop,
+                editorWrapWidth = this.editorWrap.width(),
+                previewWrapWidth = open ? 0 : this.previewWrap.width(),
+                sidebysideStep = function (now /*, fx */) {
+                    self.previewWrap[0].style.maxWidth = now + "px";
+                    var newEditorWrapWidth = editorWrapWidth + 
(previewWrapWidth - now);
+                    self.editorWrap.width(newEditorWrapWidth);
+                    self.editorWrap[0].style.maxWidth = newEditorWrapWidth + 
"px";
+                },
+                        unsetPreviewWrapDisplay = function() {
+                            self.previewWrap.css("display", "");
+                        };
+
+            if (open) {
+                this.wrap.addClass("previewopen");
+                if (!noUpdate) {
+                    this.update();
+                }
+                if (this.isSidebyside()) {
+                    this.previewWrap.stop().animate({
+                        width: "show"
+                    }, {
+                        duration: duration,
+                        step: sidebysideStep,
+                        start: function(fx) {   // jQuery 1.8+
+                            var sizes = splitSize(self.wrap.width(), 
self.lastEditorPercentWidth, 60);
+                            fx.tweens[0].end = sizes.lastSize;
+                            unsetPreviewWrapDisplay();  // Why jQuery sets 
this to "block" ?
+                        },
+                        complete: unsetPreviewWrapDisplay   // Why jQuery sets 
this to "block" ?
+                    });
+                } else {
+                    var previewWrapHeightUsed = this.previewWrap.outerHeight();
+                    // Check that preview is not too big:
+                    if (this._heightsManaged && previewWrapHeightUsed > 
editorHeight - 15) {
+                        this.preview.height("-=" + (previewWrapHeightUsed - 
(editorHeight - 15)));
+                    }
+                    if (!isOldjQuery) {
+                        this.previewWrap.stop().slideDown({
+                            duration: duration,
+                            progress: progress, // jQuery 1.8+
+                            start: unsetPreviewWrapDisplay, // Why jQuery sets 
this to "block" ?    // jQuery 1.8+
+                            complete: unsetPreviewWrapDisplay   // Why jQuery 
sets this to "block" ?
+                        });
+                    } else {
+                        if (this._heightsManaged) {
+                            this.editor.height("-=" + previewWrapHeightUsed);
+                        }
+                        this.previewWrap.stop().show();
+                        unsetPreviewWrapDisplay();  // Why jQuery sets this to 
"block" ?
+                    }
+                }
+            } else {
+                if (this.isSidebyside()) {
+                    this.previewWrap.stop().animate({
+                        width: "hide"
+                    }, {
+                        duration: duration,
+                        step: sidebysideStep,
+                        complete: function() {
+                            self.previewWrap.css("max-width", "");
+                        }
+                    });
+                } else {
+                    if (!isOldjQuery && this.previewWrap.is(":visible") && 
duration > 0) {  // slideUp() doesn't work on hidden elements.
+                        this.previewWrap.stop().slideUp({
+                            duration: duration,
+                            progress: progress  // jQuery 1.8+
+                        });
+                    } else {
+                        this.previewWrap.stop().hide();
+                        if (this._heightsManaged) {
+                            this.editor.height(availableHeight);
+                        }
+                    }
+                }
+                this.wrap.removeClass("previewopen");
+            }
+
+            return this;    // Chaining
+        },
+        isFullscreen: function() {
+            return this.wrap.hasClass('fullscreen');
+        },
+        toggleFullscreen: function(full) {
+            full = checkToggleState(full, this.isFullscreen());
+            if (full === undefined) {
+                return this;    // Chaining
+            }
+
+            var data = this.fullscreenData;
+            if (full) {
+                data.originalWrapHeight = this.wrap.height();
+                data.availableHeight = this.editor.height() + 
this.preview.height();
+                // Keep height in case it is "auto" or "" or whatever:
+                data.originalWrapStyleHeight = this.wrap[0].style.height;
+                this._checkHeightsManaged("fullscreen", true);
+
+                this.wrap.addClass('fullscreen');
+                var self = this;
+                doc.on("keypress." + plgName + ".fullscreenEscKey", 
function(e) {
+                    if (e.keyCode === 27) { // Esc key
+                        self.toggleFullscreen(false);
+                    }
+                });
+            } else {
+                doc.off("keypress." + plgName + ".fullscreenEscKey");
+                this.wrap.removeClass('fullscreen');
+
+                if (this._isHeightsManaged()) {
+                    this._adjustHeights(data.originalWrapHeight);
+                    this.lastWrapHeight = data.originalWrapHeight;
+                } else {
+                    var sizes = splitSize(data.availableHeight, 
this.lastEditorPercentHeight, 15);
+                    this.editor.height(sizes.firstSize);
+                    this.preview.height(sizes.lastSize);
+                }
+                this._checkHeightsManaged("fullscreen", false);
+                this.wrap[0].style.height = data.originalWrapStyleHeight;
+            }
+            this._wrapResizeListener();
+
+            return this;    // Chaining
+        },
+        isSidebyside: function() {
+            return this.wrap.hasClass('sidebyside');
+        },
+        toggleSidebyside: function(sidebyside, force) {
+            sidebyside = checkToggleState(sidebyside, this.isSidebyside(), 
force);
+            if (sidebyside === undefined) {
+                return this;    // Chaining
+            }
+
+            var isPreviewOpen = this.isPreviewOpen(),
+                originalBottommarginTop = this.bottommargin.offset().top;
+            if (sidebyside) {
+                this.wrap.addClass("sidebyside");
+                this._adjustWidths(this.wrap.width());
+                if (!isPreviewOpen) {
+                    this.togglePreview(true, 0, false, true);
+                }
+                var editorBottom = 
bottomPositionTest.appendTo(this.editorWrap).offset().top,
+                    previewBottom = 
bottomPositionTest.appendTo(this.previewWrap).offset().top;
+                bottomPositionTest.detach();
+                if (!isPreviewOpen) {
+                    this.togglePreview(false, 0, false, true);
+                }
+                var diffHeights = editorBottom - previewBottom;
+                this.preview.height("+=" + diffHeights);
+
+                var deltaWrapHeight = originalBottommarginTop - 
this.bottommargin.offset().top;
+                this.editor.height("+=" + deltaWrapHeight);
+                this.preview.height("+=" + deltaWrapHeight);
+                this._checkHeightsManaged("sidebyside", true);
+            } else {
+                if (!isPreviewOpen) {
+                    this.togglePreview(true, 0, false, true);
+                }
+                var originalWrapHeight = this.wrap.height();
+                this.editorWrap.css("width", "");
+                this._checkHeightsManaged("sidebyside", false);
+                this.editorWrap.css({width: "", maxWidth: ""});
+                this.previewWrap.css({width: "", maxWidth: ""});
+                this.wrap.removeClass("sidebyside");
+
+                var deltaBottommarginTop = this.bottommargin.offset().top - 
originalBottommarginTop;
+                this.lastWrapHeight = originalWrapHeight + 
deltaBottommarginTop;
+                this._adjustHeights(originalWrapHeight);
+                this.lastWrapHeight = originalWrapHeight;
+                if (!isPreviewOpen) {
+                    this.togglePreview(false, 0, false, true);
+                }
+            }
+
+            return this;    // Chaining
+        },
+        isPreviewCollapses: function() {
+            return this._previewCollapses;
+        },
+        togglePreviewCollapses: function(previewCollapses, force) {
+            previewCollapses = checkToggleState(previewCollapses, 
this._previewCollapses, force);
+            if (previewCollapses === undefined) {
+                return this;    // Chaining
+            }
+
+            this._previewCollapses = previewCollapses;
+            this._checkHeightsManaged();
+
+            return this;    // Chaining
+        },
+        _isHeightsManaged: function() {
+            return this._heightsManaged;
+        },
+        _toggleHeightsManaged: function(manage, force) {
+            manage = checkToggleState(manage, this._heightsManaged, force);
+            if (manage === undefined) {
+                return this;    // Chaining
+            }
+
+            if (manage) {
+                this.wrap.height("+=0").addClass("heightsManaged");
+            } else {
+                this.wrap.height("auto").removeClass("heightsManaged");
+            }
+            this._heightsManaged = manage;
+
+            return this;    // Chaining
+        },
+        _checkHeightsManaged: function(change, value, force) {
+            var previewCollapses = change === "previewCollapses" ? value : 
this._previewCollapses,
+                fullscreen = change === "fullscreen" ? value : 
this.isFullscreen(),
+                sidebyside = change === "sidebyside" ? value : 
this.isSidebyside(),
+                manage = !previewCollapses || fullscreen || sidebyside;
+            if (force || manage !== this._heightsManaged) {
+                this._toggleHeightsManaged(manage, force);
+            }
+        },
+        _wrapResizeListener: function() {
+            var newWidth = this.wrap.width(),
+                newHeight = this.wrap.height();
+            if (newWidth !== this.lastWrapWidth) {
+                this._checkToolbarOverflowedControls();
+                this._adjustWidths(newWidth);
+                this.lastWrapWidth = newWidth;
+            }
+            if (newHeight !== this.lastWrapHeight) {
+                if (this._heightsManaged) {
+                    this._adjustHeights(newHeight);
+                } else {
+                    var editorHeight = this.editor.height();
+                    this.lastEditorPercentHeight = editorHeight / 
(editorHeight + this.preview.height());
+                }
+                this.lastWrapHeight = newHeight;
+            }
+        },
+        // When the wrap height changes, this will resize the editor and the 
preview,
+        // keeping the height ratio between them.
+        _adjustHeights: function(wrapHeight) {
+            // To avoid document reflow, we only set the values at the end.
+            var sizes;
+            if (this.isSidebyside()) {
+                var deltaHeight = wrapHeight - this.lastWrapHeight;
+                sizes = {
+                    firstSize: this.editor.height() + deltaHeight,
+                    lastSize: this.preview.height() + deltaHeight
+                };
+            } else {
+                var isPreviewOpen = this.isPreviewOpen(),
+                    editorHeight = this.editor.height(),
+                    previewHeight = isPreviewOpen ? this.preview.height() : 0,
+                    availableHeight = editorHeight + previewHeight + 
(wrapHeight - this.lastWrapHeight);
+                sizes = splitSize(availableHeight, 
this.lastEditorPercentHeight, 15);
+                if (!isPreviewOpen) {
+                    // Keep the previewHeight for when the preview will slide 
down again.
+                    // But allow editorHeight to take the whole available 
height:
+                    sizes.firstSize = editorHeight + (wrapHeight - 
this.lastWrapHeight);
+                }
+            }
+            this.editor.height(sizes.firstSize);
+            this.preview.height(sizes.lastSize);
+
+            return this;    // Chaining
+        },
+        _adjustWidths: function(wrapWidth) {
+            if (this.isSidebyside()) {
+                var sizes = splitSize(wrapWidth, this.lastEditorPercentWidth, 
60);
+                if (!this.isPreviewOpen()) {
+                    sizes.firstSize += sizes.lastSize;
+                }
+                this.editorWrap.width(sizes.firstSize);
+                this.previewWrap.width(sizes.lastSize);
+                this.editorWrap[0].style.maxWidth = sizes.firstSize + "px";
+                this.previewWrap[0].style.maxWidth = sizes.lastSize + "px";
+            }
+
+            return this;    // Chaining
+        },
+        // Call this to manage controls that are overflowing the toolbar
+        // when its width changes:
+        _checkToolbarOverflowedControls: function() {
+            var controls = this.controls.children(),
+                control = $(controls[0]),
+                defaultTop = control.position().top,
+                foundOverflowed = false;
+
+            // First we look for overflowed controls:
+            for (var i = controls.length - 1; i > 1; i--) {
+                control = $(controls[i]);
+                if (control.hasClass("overflowedControl")) {
+                    continue;
+                }
+                else if (control.position().top <= defaultTop) {
+                    break;
+                }
+                control.addClass("overflowedControl");
+                foundOverflowed = true;
+            }
+
+            // If no new overflowed control was found,
+            // then look for controls that are no more overflowed:
+            if (!foundOverflowed) {
+                for (; i < controls.length; i++) {
+                    control = $(controls[i]);
+                    if (!$(controls[i]).hasClass("overflowedControl")) {
+                        continue;
+                    }
+                    // Test if it would overflow:
+                    control.removeClass("overflowedControl");
+                    if (control.position().top > defaultTop) {
+                        control.addClass("overflowedControl");
+                        break;
+                    }
+                }
+            }
+
+            return this;    // Chaining
+        }
+    });
+
+    // THE $(...).meltdown() function:
+    // Inspired by: http://api.jqueryui.com/jQuery.widget/
+    $.fn.meltdown = function (arg) {
+        // Get method name and method arguments:
+        var methodName = $.type(arg) === "string" ? arg : "_init",
+            args = Array.prototype.slice.call(arguments, methodName === 
"_init" ? 0 : 1);
+
+        // Dispatch method call:
+        for (var elem, meltdown, returnValue, i = 0; i < this.length; i++) {
+            elem = this[i];
+            // Get the Meltdown object or create it:
+            meltdown = $.data(elem, "Meltdown");
+            if (methodName === "_init") {
+                if (meltdown) continue; // Don't re-create it.
+                meltdown = new Meltdown(elem);
+                $.data(elem, "Meltdown", meltdown);
+            }
+            // Call the method:
+            returnValue = meltdown[methodName].apply(meltdown, args);
+            // If the method is a getter, return the value
+            // (See: 
http://bililite.com/blog/2009/04/23/improving-jquery-ui-widget-getterssetters/)
+            if (returnValue !== meltdown) {
+                return returnValue;
+            }
+        }
+
+        return this;    // Chaining
+    };
+
+
+    if (isIE8||true) {
+        // Fixing the textarea deselection on click:
+        // 
(http://stackoverflow.com/questions/3558939/javascript-get-selected-text-from-textarea-in-ie8)
+        var oldBuildControls = buildControls;
+        buildControls = function() {
+            var ret = oldBuildControls.apply(this, arguments);
+            ret.find("span").attr("unselectable", "on");
+            return ret;
+        };
+    }
+
+    if (isOldjQuery) {
+        $.meltdown.controlDefs.sidebyside.styleClass = "disabled";
+        $.meltdown.controlDefs.sidebyside.altText = "Disabled: requires jQuery 
1.8+";
+        Meltdown.prototype.toggleSidebyside = function() {
+            debug("Requires jQuery 1.8+");
+            return this;
+        };
+    }
+
+}(jQuery, window, document));
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/element_resize_detection.js
 
b/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/element_resize_detection.js
new file mode 100644
index 00000000..e90664b5
--- /dev/null
+++ 
b/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/element_resize_detection.js
@@ -0,0 +1,81 @@
+/* Source: 
http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
 */
+(function(){
+       var attachEvent = document.attachEvent;
+       
+       if (!attachEvent) {
+               var requestFrame = (function(){
+                 var raf = window.requestAnimationFrame || 
window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||
+                                       function(fn){ return 
window.setTimeout(fn, 20); };
+                 return function(fn){ return raf(fn); };
+               })();
+               
+               var cancelFrame = (function(){
+                 var cancel = window.cancelAnimationFrame || 
window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame ||
+                                          window.clearTimeout;
+                 return function(id){ return cancel(id); };
+               })();
+       
+               function resetTriggers(element){
+                       var triggers = element.__resizeTriggers__,
+                               expand = triggers.firstElementChild,
+                               contract = triggers.lastElementChild,
+                               expandChild = expand.firstElementChild;
+                       contract.scrollLeft = contract.scrollWidth;
+                       contract.scrollTop = contract.scrollHeight;
+                       expandChild.style.width = expand.offsetWidth + 1 + 'px';
+                       expandChild.style.height = expand.offsetHeight + 1 + 
'px';
+                       expand.scrollLeft = expand.scrollWidth;
+                       expand.scrollTop = expand.scrollHeight;
+               };
+
+               function checkTriggers(element){
+                 return element.offsetWidth != element.__resizeLast__.width ||
+                                element.offsetHeight != 
element.__resizeLast__.height;
+               }
+               
+               function scrollListener(e){
+                       var element = this;
+                       resetTriggers(this);
+                       if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);
+                       this.__resizeRAF__ = requestFrame(function(){
+                               if (checkTriggers(element)) {
+                                       element.__resizeLast__.width = 
element.offsetWidth;
+                                       element.__resizeLast__.height = 
element.offsetHeight;
+                                       
element.__resizeListeners__.forEach(function(fn){
+                                               fn.call(element, e);
+                                       });
+                               }
+                       });
+               };
+       }
+       
+       window.addResizeListener = function(element, fn){
+               if (attachEvent) element.attachEvent('onresize', fn);
+               else {
+                       if (!element.__resizeTriggers__) {
+                               if (getComputedStyle(element).position == 
'static') element.style.position = 'relative';
+                               element.__resizeLast__ = {};
+                               element.__resizeListeners__ = [];
+                               (element.__resizeTriggers__ = 
document.createElement('div')).className = 'resize-triggers';
+                               element.__resizeTriggers__.innerHTML = '<div 
class="expand-trigger"><div></div></div>' +
+                                                                               
                           '<div class="contract-trigger"></div>';
+                               element.appendChild(element.__resizeTriggers__);
+                               resetTriggers(element);
+                               element.addEventListener('scroll', 
scrollListener, true);
+                       }
+                       element.__resizeListeners__.push(fn);
+               }
+       };
+       
+       window.removeResizeListener = function(element, fn){
+               if (attachEvent) element.detachEvent('onresize', fn);
+               else {
+                       
element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
+                       if (!element.__resizeListeners__.length) {
+                               element.removeEventListener('scroll', 
scrollListener);
+                               element.__resizeTriggers__ = 
!element.removeChild(element.__resizeTriggers__);
+                       }
+               }
+       }
+       
+})();
\ No newline at end of file
diff --git 
a/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/js-markdown-extra.js
 
b/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/js-markdown-extra.js
old mode 100755
new mode 100644

-- 


Reply via email to