{"version":3,"sources":["jsdelivr-header.js","/npm/simditor@2.3.28/lib/simditor.js"],"names":[],"mappings":"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","file":"/npm/simditor@2.3.28/lib/simditor.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/simditor@2.3.28/lib/simditor.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*!\n* Simditor v2.3.27\n* http://simditor.tower.im/\n* 2019-08-15\n*/\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define('simditor', [\"jquery\",\"simple-module\",\"simple-hotkeys\",\"simple-uploader\",\"dompurify\"], function ($, SimpleModule, simpleHotkeys, simpleUploader, DOMPurify) {\n      return (root['Simditor'] = factory($, SimpleModule, simpleHotkeys, simpleUploader, DOMPurify));\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"),require(\"simple-module\"),require(\"simple-hotkeys\"),require(\"simple-uploader\"),require(\"dompurify\"));\n  } else {\n    root['Simditor'] = factory(jQuery,SimpleModule,simple.hotkeys,simple.uploader,window.DOMPurify);\n  }\n}(this, function ($, SimpleModule, simpleHotkeys, simpleUploader, DOMPurify) {\n\nvar AlignmentButton, BlockquoteButton, BoldButton, Button, Clipboard, CodeButton, CodePopover, ColorButton, FontScaleButton, Formatter, HrButton, ImageButton, ImagePopover, IndentButton, Indentation, InputManager, ItalicButton, Keystroke, LinkButton, LinkPopover, ListButton, OrderListButton, OutdentButton, Popover, Selection, Simditor, StrikethroughButton, TableButton, TitleButton, Toolbar, UnderlineButton, UndoManager, UnorderListButton, Util,\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty,\n  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n  slice = [].slice;\n\nSelection = (function(superClass) {\n  extend(Selection, superClass);\n\n  function Selection() {\n    return Selection.__super__.constructor.apply(this, arguments);\n  }\n\n  Selection.pluginName = 'Selection';\n\n  Selection.prototype._range = null;\n\n  Selection.prototype._startNodes = null;\n\n  Selection.prototype._endNodes = null;\n\n  Selection.prototype._containerNode = null;\n\n  Selection.prototype._nodes = null;\n\n  Selection.prototype._blockNodes = null;\n\n  Selection.prototype._rootNodes = null;\n\n  Selection.prototype._init = function() {\n    this.editor = this._module;\n    this._selection = document.getSelection();\n    this.editor.on('selectionchanged', (function(_this) {\n      return function(e) {\n        _this.reset();\n        return _this._range = _this._selection.getRangeAt(0);\n      };\n    })(this));\n    this.editor.on('blur', (function(_this) {\n      return function(e) {\n        return _this.reset();\n      };\n    })(this));\n    return this.editor.on('focus', (function(_this) {\n      return function(e) {\n        _this.reset();\n        return _this._range = _this._selection.getRangeAt(0);\n      };\n    })(this));\n  };\n\n  Selection.prototype.reset = function() {\n    this._range = null;\n    this._startNodes = null;\n    this._endNodes = null;\n    this._containerNode = null;\n    this._nodes = null;\n    this._blockNodes = null;\n    return this._rootNodes = null;\n  };\n\n  Selection.prototype.clear = function() {\n    var e;\n    try {\n      this._selection.removeAllRanges();\n    } catch (_error) {\n      e = _error;\n    }\n    return this.reset();\n  };\n\n  Selection.prototype.range = function(range) {\n    var ffOrIE;\n    if (range) {\n      this.clear();\n      this._selection.addRange(range);\n      this._range = range;\n      ffOrIE = this.editor.util.browser.firefox || this.editor.util.browser.msie;\n      if (!this.editor.inputManager.focused && ffOrIE) {\n        this.editor.body.focus();\n      }\n    } else if (!this._range && this.editor.inputManager.focused && this._selection.rangeCount) {\n      this._range = this._selection.getRangeAt(0);\n    }\n    return this._range;\n  };\n\n  Selection.prototype.startNodes = function() {\n    if (this._range) {\n      this._startNodes || (this._startNodes = (function(_this) {\n        return function() {\n          var startNodes;\n          startNodes = $(_this._range.startContainer).parentsUntil(_this.editor.body).get();\n          startNodes.unshift(_this._range.startContainer);\n          return $(startNodes);\n        };\n      })(this)());\n    }\n    return this._startNodes;\n  };\n\n  Selection.prototype.endNodes = function() {\n    var endNodes;\n    if (this._range) {\n      this._endNodes || (this._endNodes = this._range.collapsed ? this.startNodes() : (endNodes = $(this._range.endContainer).parentsUntil(this.editor.body).get(), endNodes.unshift(this._range.endContainer), $(endNodes)));\n    }\n    return this._endNodes;\n  };\n\n  Selection.prototype.containerNode = function() {\n    if (this._range) {\n      this._containerNode || (this._containerNode = $(this._range.commonAncestorContainer));\n    }\n    return this._containerNode;\n  };\n\n  Selection.prototype.nodes = function() {\n    if (this._range) {\n      this._nodes || (this._nodes = (function(_this) {\n        return function() {\n          var nodes;\n          nodes = [];\n          if (_this.startNodes().first().is(_this.endNodes().first())) {\n            nodes = _this.startNodes().get();\n          } else {\n            _this.startNodes().each(function(i, node) {\n              var $endNode, $node, $nodes, endIndex, index, sharedIndex, startIndex;\n              $node = $(node);\n              if (_this.endNodes().index($node) > -1) {\n                return nodes.push(node);\n              } else if ($node.parent().is(_this.editor.body) || (sharedIndex = _this.endNodes().index($node.parent())) > -1) {\n                if (sharedIndex && sharedIndex > -1) {\n                  $endNode = _this.endNodes().eq(sharedIndex - 1);\n                } else {\n                  $endNode = _this.endNodes().last();\n                }\n                $nodes = $node.parent().contents();\n                startIndex = $nodes.index($node);\n                endIndex = $nodes.index($endNode);\n                return $.merge(nodes, $nodes.slice(startIndex, endIndex).get());\n              } else {\n                $nodes = $node.parent().contents();\n                index = $nodes.index($node);\n                return $.merge(nodes, $nodes.slice(index).get());\n              }\n            });\n            _this.endNodes().each(function(i, node) {\n              var $node, $nodes, index;\n              $node = $(node);\n              if ($node.parent().is(_this.editor.body) || _this.startNodes().index($node.parent()) > -1) {\n                nodes.push(node);\n                return false;\n              } else {\n                $nodes = $node.parent().contents();\n                index = $nodes.index($node);\n                return $.merge(nodes, $nodes.slice(0, index + 1));\n              }\n            });\n          }\n          return $($.unique(nodes));\n        };\n      })(this)());\n    }\n    return this._nodes;\n  };\n\n  Selection.prototype.blockNodes = function() {\n    if (!this._range) {\n      return;\n    }\n    this._blockNodes || (this._blockNodes = (function(_this) {\n      return function() {\n        return _this.nodes().filter(function(i, node) {\n          return _this.editor.util.isBlockNode(node);\n        });\n      };\n    })(this)());\n    return this._blockNodes;\n  };\n\n  Selection.prototype.rootNodes = function() {\n    if (!this._range) {\n      return;\n    }\n    this._rootNodes || (this._rootNodes = (function(_this) {\n      return function() {\n        return _this.nodes().filter(function(i, node) {\n          var $parent;\n          $parent = $(node).parent();\n          return $parent.is(_this.editor.body) || $parent.is('blockquote');\n        });\n      };\n    })(this)());\n    return this._rootNodes;\n  };\n\n  Selection.prototype.rangeAtEndOf = function(node, range) {\n    var afterLastNode, beforeLastNode, endNode, endNodeLength, lastNodeIsBr, result;\n    if (range == null) {\n      range = this.range();\n    }\n    if (!(range && range.collapsed)) {\n      return;\n    }\n    node = $(node)[0];\n    endNode = range.endContainer;\n    endNodeLength = this.editor.util.getNodeLength(endNode);\n    beforeLastNode = range.endOffset === endNodeLength - 1;\n    lastNodeIsBr = $(endNode).contents().last().is('br');\n    afterLastNode = range.endOffset === endNodeLength;\n    if (!((beforeLastNode && lastNodeIsBr) || afterLastNode)) {\n      return false;\n    }\n    if (node === endNode) {\n      return true;\n    } else if (!$.contains(node, endNode)) {\n      return false;\n    }\n    result = true;\n    $(endNode).parentsUntil(node).addBack().each(function(i, n) {\n      var $lastChild, beforeLastbr, isLastNode, nodes;\n      nodes = $(n).parent().contents().filter(function() {\n        return !(this !== n && this.nodeType === 3 && !this.nodeValue);\n      });\n      $lastChild = nodes.last();\n      isLastNode = $lastChild.get(0) === n;\n      beforeLastbr = $lastChild.is('br') && $lastChild.prev().get(0) === n;\n      if (!(isLastNode || beforeLastbr)) {\n        result = false;\n        return false;\n      }\n    });\n    return result;\n  };\n\n  Selection.prototype.rangeAtStartOf = function(node, range) {\n    var result, startNode;\n    if (range == null) {\n      range = this.range();\n    }\n    if (!(range && range.collapsed)) {\n      return;\n    }\n    node = $(node)[0];\n    startNode = range.startContainer;\n    if (range.startOffset !== 0) {\n      return false;\n    }\n    if (node === startNode) {\n      return true;\n    } else if (!$.contains(node, startNode)) {\n      return false;\n    }\n    result = true;\n    $(startNode).parentsUntil(node).addBack().each(function(i, n) {\n      var nodes;\n      nodes = $(n).parent().contents().filter(function() {\n        return !(this !== n && this.nodeType === 3 && !this.nodeValue);\n      });\n      if (nodes.first().get(0) !== n) {\n        return result = false;\n      }\n    });\n    return result;\n  };\n\n  Selection.prototype.insertNode = function(node, range) {\n    if (range == null) {\n      range = this.range();\n    }\n    if (!range) {\n      return;\n    }\n    node = $(node)[0];\n    range.insertNode(node);\n    return this.setRangeAfter(node, range);\n  };\n\n  Selection.prototype.setRangeAfter = function(node, range) {\n    if (range == null) {\n      range = this.range();\n    }\n    if (range == null) {\n      return;\n    }\n    node = $(node)[0];\n    range.setEndAfter(node);\n    range.collapse(false);\n    return this.range(range);\n  };\n\n  Selection.prototype.setRangeBefore = function(node, range) {\n    if (range == null) {\n      range = this.range();\n    }\n    if (range == null) {\n      return;\n    }\n    node = $(node)[0];\n    range.setEndBefore(node);\n    range.collapse(false);\n    return this.range(range);\n  };\n\n  Selection.prototype.setRangeAtStartOf = function(node, range) {\n    if (range == null) {\n      range = this.range();\n    }\n    node = $(node).get(0);\n    range.setEnd(node, 0);\n    range.collapse(false);\n    return this.range(range);\n  };\n\n  Selection.prototype.setRangeAtEndOf = function(node, range) {\n    var $lastNode, $node, contents, lastChild, lastChildLength, lastText, nodeLength;\n    if (range == null) {\n      range = this.range();\n    }\n    $node = $(node);\n    node = $node[0];\n    if (!node) {\n      return;\n    }\n    if ($node.is('pre')) {\n      contents = $node.contents();\n      if (contents.length > 0) {\n        lastChild = contents.last();\n        lastText = lastChild.text();\n        lastChildLength = this.editor.util.getNodeLength(lastChild[0]);\n        if (lastText.charAt(lastText.length - 1) === '\\n') {\n          range.setEnd(lastChild[0], lastChildLength - 1);\n        } else {\n          range.setEnd(lastChild[0], lastChildLength);\n        }\n      } else {\n        range.setEnd(node, 0);\n      }\n    } else {\n      nodeLength = this.editor.util.getNodeLength(node);\n      if (node.nodeType !== 3 && nodeLength > 0) {\n        $lastNode = $(node).contents().last();\n        if ($lastNode.is('br')) {\n          nodeLength -= 1;\n        } else if ($lastNode[0].nodeType !== 3 && this.editor.util.isEmptyNode($lastNode)) {\n          $lastNode.append(this.editor.util.phBr);\n          node = $lastNode[0];\n          nodeLength = 0;\n        }\n      }\n      range.setEnd(node, nodeLength);\n    }\n    range.collapse(false);\n    return this.range(range);\n  };\n\n  Selection.prototype.deleteRangeContents = function(range) {\n    var atEndOfBody, atStartOfBody, endRange, startRange;\n    if (range == null) {\n      range = this.range();\n    }\n    startRange = range.cloneRange();\n    endRange = range.cloneRange();\n    startRange.collapse(true);\n    endRange.collapse(false);\n    atStartOfBody = this.rangeAtStartOf(this.editor.body, startRange);\n    atEndOfBody = this.rangeAtEndOf(this.editor.body, endRange);\n    if (!range.collapsed && atStartOfBody && atEndOfBody) {\n      this.editor.body.empty();\n      range.setStart(this.editor.body[0], 0);\n      range.collapse(true);\n      this.range(range);\n    } else {\n      range.deleteContents();\n    }\n    return range;\n  };\n\n  Selection.prototype.breakBlockEl = function(el, range) {\n    var $el;\n    if (range == null) {\n      range = this.range();\n    }\n    $el = $(el);\n    if (!range.collapsed) {\n      return $el;\n    }\n    range.setStartBefore($el.get(0));\n    if (range.collapsed) {\n      return $el;\n    }\n    return $el.before(range.extractContents());\n  };\n\n  Selection.prototype.save = function(range) {\n    var endCaret, endRange, startCaret;\n    if (range == null) {\n      range = this.range();\n    }\n    if (this._selectionSaved) {\n      return;\n    }\n    endRange = range.cloneRange();\n    endRange.collapse(false);\n    startCaret = $('<span/>').addClass('simditor-caret-start');\n    endCaret = $('<span/>').addClass('simditor-caret-end');\n    endRange.insertNode(endCaret[0]);\n    range.insertNode(startCaret[0]);\n    this.clear();\n    return this._selectionSaved = true;\n  };\n\n  Selection.prototype.restore = function() {\n    var endCaret, endContainer, endOffset, range, startCaret, startContainer, startOffset;\n    if (!this._selectionSaved) {\n      return false;\n    }\n    startCaret = this.editor.body.find('.simditor-caret-start');\n    endCaret = this.editor.body.find('.simditor-caret-end');\n    if (startCaret.length && endCaret.length) {\n      startContainer = startCaret.parent();\n      startOffset = startContainer.contents().index(startCaret);\n      endContainer = endCaret.parent();\n      endOffset = endContainer.contents().index(endCaret);\n      if (startContainer[0] === endContainer[0]) {\n        endOffset -= 1;\n      }\n      range = document.createRange();\n      range.setStart(startContainer.get(0), startOffset);\n      range.setEnd(endContainer.get(0), endOffset);\n      startCaret.remove();\n      endCaret.remove();\n      this.range(range);\n    } else {\n      startCaret.remove();\n      endCaret.remove();\n    }\n    this._selectionSaved = false;\n    return range;\n  };\n\n  return Selection;\n\n})(SimpleModule);\n\nFormatter = (function(superClass) {\n  extend(Formatter, superClass);\n\n  function Formatter() {\n    return Formatter.__super__.constructor.apply(this, arguments);\n  }\n\n  Formatter.pluginName = 'Formatter';\n\n  Formatter.prototype.opts = {\n    allowedTags: [],\n    allowedAttributes: {},\n    allowedStyles: {}\n  };\n\n  Formatter.prototype._init = function() {\n    this.editor = this._module;\n    this._allowedTags = $.merge(['br', 'span', 'a', 'img', 'b', 'strong', 'i', 'strike', 'u', 'font', 'p', 'ul', 'ol', 'li', 'blockquote', 'pre', 'code', 'h1', 'h2', 'h3', 'h4', 'hr'], this.opts.allowedTags);\n    this._allowedAttributes = $.extend({\n      img: ['src', 'alt', 'width', 'height', 'data-non-image'],\n      a: ['href', 'target'],\n      font: ['color'],\n      code: ['class']\n    }, this.opts.allowedAttributes);\n    this._allowedStyles = $.extend({\n      span: ['color', 'font-size'],\n      b: ['color', 'font-size'],\n      i: ['color', 'font-size'],\n      strong: ['color', 'font-size'],\n      strike: ['color', 'font-size'],\n      u: ['color', 'font-size'],\n      p: ['margin-left', 'text-align'],\n      h1: ['margin-left', 'text-align'],\n      h2: ['margin-left', 'text-align'],\n      h3: ['margin-left', 'text-align'],\n      h4: ['margin-left', 'text-align']\n    }, this.opts.allowedStyles);\n    return this.editor.body.on('click', 'a', function(e) {\n      return false;\n    });\n  };\n\n  Formatter.prototype.decorate = function($el) {\n    if ($el == null) {\n      $el = this.editor.body;\n    }\n    this.editor.trigger('decorate', [$el]);\n    return $el;\n  };\n\n  Formatter.prototype.undecorate = function($el) {\n    if ($el == null) {\n      $el = this.editor.body.clone();\n    }\n    this.editor.trigger('undecorate', [$el]);\n    return $el;\n  };\n\n  Formatter.prototype.autolink = function($el) {\n    var $link, $node, findLinkNode, k, lastIndex, len, linkNodes, match, re, replaceEls, subStr, text, uri;\n    if ($el == null) {\n      $el = this.editor.body;\n    }\n    linkNodes = [];\n    findLinkNode = function($parentNode) {\n      return $parentNode.contents().each(function(i, node) {\n        var $node, text;\n        $node = $(node);\n        if ($node.is('a') || $node.closest('a, pre', $el).length) {\n          return;\n        }\n        if (!$node.is('iframe') && $node.contents().length) {\n          return findLinkNode($node);\n        } else if ((text = $node.text()) && /https?:\\/\\/|www\\./ig.test(text)) {\n          return linkNodes.push($node);\n        }\n      });\n    };\n    findLinkNode($el);\n    re = /(https?:\\/\\/|www\\.)[\\w\\-\\.\\?&=\\/#%:,@\\!\\+]+/ig;\n    for (k = 0, len = linkNodes.length; k < len; k++) {\n      $node = linkNodes[k];\n      text = $node.text();\n      replaceEls = [];\n      match = null;\n      lastIndex = 0;\n      while ((match = re.exec(text)) !== null) {\n        subStr = text.substring(lastIndex, match.index);\n        replaceEls.push(document.createTextNode(subStr));\n        lastIndex = re.lastIndex;\n        uri = /^(http(s)?:\\/\\/|\\/)/.test(match[0]) ? match[0] : 'http://' + match[0];\n        $link = $(\"<a href=\\\"\" + uri + \"\\\" rel=\\\"nofollow\\\"></a>\").text(match[0]);\n        replaceEls.push($link[0]);\n      }\n      replaceEls.push(document.createTextNode(text.substring(lastIndex)));\n      $node.replaceWith($(replaceEls));\n    }\n    return $el;\n  };\n\n  Formatter.prototype.format = function($el) {\n    var $node, blockNode, k, l, len, len1, n, node, ref, ref1;\n    if ($el == null) {\n      $el = this.editor.body;\n    }\n    if ($el.is(':empty')) {\n      $el.append('<p>' + this.editor.util.phBr + '</p>');\n      return $el;\n    }\n    ref = $el.contents();\n    for (k = 0, len = ref.length; k < len; k++) {\n      n = ref[k];\n      this.cleanNode(n, true);\n    }\n    ref1 = $el.contents();\n    for (l = 0, len1 = ref1.length; l < len1; l++) {\n      node = ref1[l];\n      $node = $(node);\n      if ($node.is('br')) {\n        if (typeof blockNode !== \"undefined\" && blockNode !== null) {\n          blockNode = null;\n        }\n        $node.remove();\n      } else if (this.editor.util.isBlockNode(node)) {\n        if ($node.is('li')) {\n          if (blockNode && blockNode.is('ul, ol')) {\n            blockNode.append(node);\n          } else {\n            blockNode = $('<ul/>').insertBefore(node);\n            blockNode.append(node);\n          }\n        } else {\n          blockNode = null;\n        }\n      } else {\n        if (!blockNode || blockNode.is('ul, ol')) {\n          blockNode = $('<p/>').insertBefore(node);\n        }\n        blockNode.append(node);\n        if (this.editor.util.isEmptyNode(blockNode)) {\n          blockNode.append(this.editor.util.phBr);\n        }\n      }\n    }\n    return $el;\n  };\n\n  Formatter.prototype.cleanNode = function(node, recursive) {\n    var $blockEls, $childImg, $node, $p, $td, allowedAttributes, attr, contents, isDecoration, k, l, len, len1, n, ref, ref1, text, textNode;\n    $node = $(node);\n    if (!($node.length > 0)) {\n      return;\n    }\n    if ($node[0].nodeType === 3) {\n      text = $node.text().replace(/(\\r\\n|\\n|\\r)/gm, '');\n      if (text) {\n        textNode = document.createTextNode(text);\n        $node.replaceWith(textNode);\n      } else {\n        $node.remove();\n      }\n      return;\n    }\n    contents = $node.is('iframe') ? null : $node.contents();\n    isDecoration = this.editor.util.isDecoratedNode($node);\n    if ($node.is(this._allowedTags.join(',')) || isDecoration) {\n      if ($node.is('a') && ($childImg = $node.find('img')).length > 0) {\n        $node.replaceWith($childImg);\n        $node = $childImg;\n        contents = null;\n      }\n      if ($node.is('td') && ($blockEls = $node.find(this.editor.util.blockNodes.join(','))).length > 0) {\n        $blockEls.each((function(_this) {\n          return function(i, blockEl) {\n            return $(blockEl).contents().unwrap();\n          };\n        })(this));\n        contents = $node.contents();\n      }\n      if ($node.is('img') && $node.hasClass('uploading')) {\n        $node.remove();\n      }\n      if (!isDecoration) {\n        allowedAttributes = this._allowedAttributes[$node[0].tagName.toLowerCase()];\n        ref = $.makeArray($node[0].attributes);\n        for (k = 0, len = ref.length; k < len; k++) {\n          attr = ref[k];\n          if (attr.name === 'style') {\n            continue;\n          }\n          if (!((allowedAttributes != null) && (ref1 = attr.name, indexOf.call(allowedAttributes, ref1) >= 0))) {\n            $node.removeAttr(attr.name);\n          }\n        }\n        this._cleanNodeStyles($node);\n        if ($node.is('span')) {\n          if ($node[0].attributes.length === 0) {\n            $node.contents().first().unwrap();\n          }\n          if ($node[0].style.length === 2 && $node[0].style.color === 'rgb(51, 51, 51)' && $node[0].style.fontSize === '16px') {\n            $node.contents().unwrap();\n          }\n        }\n      }\n    } else if ($node[0].nodeType === 1 && !$node.is(':empty')) {\n      if ($node.is('div, article, dl, header, footer, tr')) {\n        $node.append('<br/>');\n        contents.first().unwrap();\n      } else if ($node.is('table')) {\n        $p = $('<p/>');\n        $node.find('tr').each(function(i, tr) {\n          return $p.append($(tr).text() + '<br/>');\n        });\n        $node.replaceWith($p);\n        contents = null;\n      } else if ($node.is('thead, tfoot')) {\n        $node.remove();\n        contents = null;\n      } else if ($node.is('th')) {\n        $td = $('<td/>').append($node.contents());\n        $node.replaceWith($td);\n      } else {\n        contents.first().unwrap();\n      }\n    } else {\n      $node.remove();\n      contents = null;\n    }\n    if (recursive && (contents != null) && !$node.is('pre')) {\n      for (l = 0, len1 = contents.length; l < len1; l++) {\n        n = contents[l];\n        this.cleanNode(n, true);\n      }\n    }\n    return null;\n  };\n\n  Formatter.prototype._cleanNodeStyles = function($node) {\n    var allowedStyles, k, len, pair, ref, ref1, style, styleStr, styles;\n    styleStr = $node.attr('style');\n    if (!styleStr) {\n      return;\n    }\n    $node.removeAttr('style');\n    allowedStyles = this._allowedStyles[$node[0].tagName.toLowerCase()];\n    if (!(allowedStyles && allowedStyles.length > 0)) {\n      return $node;\n    }\n    styles = {};\n    ref = styleStr.split(';');\n    for (k = 0, len = ref.length; k < len; k++) {\n      style = ref[k];\n      style = $.trim(style);\n      pair = style.split(':');\n      if (pair.length !== 2) {\n        continue;\n      }\n      if (pair[0] === 'font-size' && pair[1].indexOf('px') > 0) {\n        if (parseInt(pair[1], 10) < 12) {\n          continue;\n        }\n      }\n      if (ref1 = pair[0], indexOf.call(allowedStyles, ref1) >= 0) {\n        styles[$.trim(pair[0])] = $.trim(pair[1]);\n      }\n    }\n    if (Object.keys(styles).length > 0) {\n      $node.css(styles);\n    }\n    return $node;\n  };\n\n  Formatter.prototype.clearHtml = function(html, lineBreak) {\n    var container, contents, result;\n    if (lineBreak == null) {\n      lineBreak = true;\n    }\n    container = $('<div/>').append(html);\n    contents = container.contents();\n    result = '';\n    contents.each((function(_this) {\n      return function(i, node) {\n        var $node, children;\n        if (node.nodeType === 3) {\n          return result += node.nodeValue;\n        } else if (node.nodeType === 1) {\n          $node = $(node);\n          children = $node.is('iframe') ? null : $node.contents();\n          if (children && children.length > 0) {\n            result += _this.clearHtml(children);\n          }\n          if (lineBreak && i < contents.length - 1 && $node.is('br, p, div, li,tr, pre, address, artticle, aside, dl, figcaption, footer, h1, h2,h3, h4, header')) {\n            return result += '\\n';\n          }\n        }\n      };\n    })(this));\n    return result;\n  };\n\n  Formatter.prototype.beautify = function($contents) {\n    var uselessP;\n    uselessP = function($el) {\n      return !!($el.is('p') && !$el.text() && $el.children(':not(br)').length < 1);\n    };\n    return $contents.each(function(i, el) {\n      var $el, invalid;\n      $el = $(el);\n      invalid = $el.is(':not(img, br, col, td, hr, [class^=\"simditor-\"]):empty');\n      if (invalid || uselessP($el)) {\n        $el.remove();\n      }\n      return $el.find(':not(img, br, col, td, hr, [class^=\"simditor-\"]):empty').remove();\n    });\n  };\n\n  return Formatter;\n\n})(SimpleModule);\n\nInputManager = (function(superClass) {\n  extend(InputManager, superClass);\n\n  function InputManager() {\n    return InputManager.__super__.constructor.apply(this, arguments);\n  }\n\n  InputManager.pluginName = 'InputManager';\n\n  InputManager.prototype._modifierKeys = [16, 17, 18, 91, 93, 224];\n\n  InputManager.prototype._arrowKeys = [37, 38, 39, 40];\n\n  InputManager.prototype._init = function() {\n    var selectAllKey, submitKey;\n    this.editor = this._module;\n    this.throttledValueChanged = this.editor.util.throttle((function(_this) {\n      return function(params) {\n        return setTimeout(function() {\n          return _this.editor.trigger('valuechanged', params);\n        }, 10);\n      };\n    })(this), 300);\n    this.throttledSelectionChanged = this.editor.util.throttle((function(_this) {\n      return function() {\n        return _this.editor.trigger('selectionchanged');\n      };\n    })(this), 50);\n    $(document).on('selectionchange.simditor' + this.editor.id, (function(_this) {\n      return function(e) {\n        var triggerEvent;\n        if (!(_this.focused && !_this.editor.clipboard.pasting)) {\n          return;\n        }\n        triggerEvent = function() {\n          if (_this._selectionTimer) {\n            clearTimeout(_this._selectionTimer);\n            _this._selectionTimer = null;\n          }\n          if (_this.editor.selection._selection.rangeCount > 0) {\n            return _this.throttledSelectionChanged();\n          } else {\n            return _this._selectionTimer = setTimeout(function() {\n              _this._selectionTimer = null;\n              if (_this.focused) {\n                return triggerEvent();\n              }\n            }, 10);\n          }\n        };\n        return triggerEvent();\n      };\n    })(this));\n    this.editor.on('valuechanged', (function(_this) {\n      return function() {\n        var $rootBlocks;\n        _this.lastCaretPosition = null;\n        $rootBlocks = _this.editor.body.children().filter(function(i, node) {\n          return _this.editor.util.isBlockNode(node);\n        });\n        if (_this.focused && $rootBlocks.length === 0) {\n          _this.editor.selection.save();\n          _this.editor.formatter.format();\n          _this.editor.selection.restore();\n        }\n        _this.editor.body.find('hr, pre, .simditor-table').each(function(i, el) {\n          var $el, formatted;\n          $el = $(el);\n          if ($el.parent().is('blockquote') || $el.parent()[0] === _this.editor.body[0]) {\n            formatted = false;\n            if ($el.next().length === 0) {\n              $('<p/>').append(_this.editor.util.phBr).insertAfter($el);\n              formatted = true;\n            }\n            if ($el.prev().length === 0) {\n              $('<p/>').append(_this.editor.util.phBr).insertBefore($el);\n              formatted = true;\n            }\n            if (formatted) {\n              return _this.throttledValueChanged();\n            }\n          }\n        });\n        _this.editor.body.find('pre:empty').append(_this.editor.util.phBr);\n        if (!_this.editor.util.support.onselectionchange && _this.focused) {\n          return _this.throttledSelectionChanged();\n        }\n      };\n    })(this));\n    this.editor.body.on('keydown', $.proxy(this._onKeyDown, this)).on('keypress', $.proxy(this._onKeyPress, this)).on('keyup', $.proxy(this._onKeyUp, this)).on('mouseup', $.proxy(this._onMouseUp, this)).on('focus', $.proxy(this._onFocus, this)).on('blur', $.proxy(this._onBlur, this)).on('drop', $.proxy(this._onDrop, this)).on('input', $.proxy(this._onInput, this));\n    if (this.editor.util.browser.firefox) {\n      this.editor.hotkeys.add('cmd+left', (function(_this) {\n        return function(e) {\n          e.preventDefault();\n          _this.editor.selection._selection.modify('move', 'backward', 'lineboundary');\n          return false;\n        };\n      })(this));\n      this.editor.hotkeys.add('cmd+right', (function(_this) {\n        return function(e) {\n          e.preventDefault();\n          _this.editor.selection._selection.modify('move', 'forward', 'lineboundary');\n          return false;\n        };\n      })(this));\n      selectAllKey = this.editor.util.os.mac ? 'cmd+a' : 'ctrl+a';\n      this.editor.hotkeys.add(selectAllKey, (function(_this) {\n        return function(e) {\n          var $children, firstBlock, lastBlock, range;\n          $children = _this.editor.body.children();\n          if (!($children.length > 0)) {\n            return;\n          }\n          firstBlock = $children.first().get(0);\n          lastBlock = $children.last().get(0);\n          range = document.createRange();\n          range.setStart(firstBlock, 0);\n          range.setEnd(lastBlock, _this.editor.util.getNodeLength(lastBlock));\n          _this.editor.selection.range(range);\n          return false;\n        };\n      })(this));\n    }\n    submitKey = this.editor.util.os.mac ? 'cmd+enter' : 'ctrl+enter';\n    return this.editor.hotkeys.add(submitKey, (function(_this) {\n      return function(e) {\n        _this.editor.sync();\n        _this.editor.el.closest('form').find('button:submit').click();\n        return false;\n      };\n    })(this));\n  };\n\n  InputManager.prototype._onFocus = function(e) {\n    if (this.editor.clipboard.pasting) {\n      return;\n    }\n    this.editor.el.addClass('focus').removeClass('error');\n    this.focused = true;\n    return setTimeout((function(_this) {\n      return function() {\n        var $blockEl, range;\n        range = _this.editor.selection._selection.getRangeAt(0);\n        if (range.startContainer === _this.editor.body[0]) {\n          if (_this.lastCaretPosition) {\n            _this.editor.undoManager.caretPosition(_this.lastCaretPosition);\n          } else {\n            $blockEl = _this.editor.body.children().first();\n            range = document.createRange();\n            _this.editor.selection.setRangeAtStartOf($blockEl, range);\n          }\n        }\n        _this.lastCaretPosition = null;\n        _this.editor.triggerHandler('focus');\n        if (!_this.editor.util.support.onselectionchange) {\n          return _this.throttledSelectionChanged();\n        }\n      };\n    })(this), 0);\n  };\n\n  InputManager.prototype._onBlur = function(e) {\n    var ref;\n    if (this.editor.clipboard.pasting) {\n      return;\n    }\n    this.editor.el.removeClass('focus');\n    this.editor.sync();\n    this.focused = false;\n    this.lastCaretPosition = (ref = this.editor.undoManager.currentState()) != null ? ref.caret : void 0;\n    return this.editor.triggerHandler('blur');\n  };\n\n  InputManager.prototype._onMouseUp = function(e) {\n    if (!this.editor.util.support.onselectionchange) {\n      return this.throttledSelectionChanged();\n    }\n  };\n\n  InputManager.prototype._onKeyDown = function(e) {\n    var ref, ref1;\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    if (this.editor.hotkeys.respondTo(e)) {\n      return;\n    }\n    if (this.editor.keystroke.respondTo(e)) {\n      this.throttledValueChanged();\n      return false;\n    }\n    if ((ref = e.which, indexOf.call(this._modifierKeys, ref) >= 0) || (ref1 = e.which, indexOf.call(this._arrowKeys, ref1) >= 0)) {\n      return;\n    }\n    if (this.editor.util.metaKey(e) && e.which === 86) {\n      return;\n    }\n    if (!this.editor.util.support.oninput) {\n      this.throttledValueChanged(['typing']);\n    }\n    return null;\n  };\n\n  InputManager.prototype._onKeyPress = function(e) {\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n  };\n\n  InputManager.prototype._onKeyUp = function(e) {\n    var p, ref;\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    if (!this.editor.util.support.onselectionchange && (ref = e.which, indexOf.call(this._arrowKeys, ref) >= 0)) {\n      this.throttledValueChanged();\n      return;\n    }\n    if ((e.which === 8 || e.which === 46) && this.editor.util.isEmptyNode(this.editor.body)) {\n      this.editor.body.empty();\n      p = $('<p/>').append(this.editor.util.phBr).appendTo(this.editor.body);\n      this.editor.selection.setRangeAtStartOf(p);\n    }\n  };\n\n  InputManager.prototype._onDrop = function(e) {\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    return this.throttledValueChanged();\n  };\n\n  InputManager.prototype._onInput = function(e) {\n    return this.throttledValueChanged(['oninput']);\n  };\n\n  return InputManager;\n\n})(SimpleModule);\n\nKeystroke = (function(superClass) {\n  extend(Keystroke, superClass);\n\n  function Keystroke() {\n    return Keystroke.__super__.constructor.apply(this, arguments);\n  }\n\n  Keystroke.pluginName = 'Keystroke';\n\n  Keystroke.prototype._init = function() {\n    this.editor = this._module;\n    this._keystrokeHandlers = {};\n    return this._initKeystrokeHandlers();\n  };\n\n  Keystroke.prototype.add = function(key, node, handler) {\n    key = key.toLowerCase();\n    key = this.editor.hotkeys.constructor.aliases[key] || key;\n    if (!this._keystrokeHandlers[key]) {\n      this._keystrokeHandlers[key] = {};\n    }\n    return this._keystrokeHandlers[key][node] = handler;\n  };\n\n  Keystroke.prototype.respondTo = function(e) {\n    var base, key, ref, result;\n    key = (ref = this.editor.hotkeys.constructor.keyNameMap[e.which]) != null ? ref.toLowerCase() : void 0;\n    if (!key) {\n      return;\n    }\n    if (key in this._keystrokeHandlers) {\n      result = typeof (base = this._keystrokeHandlers[key])['*'] === \"function\" ? base['*'](e) : void 0;\n      if (!result) {\n        this.editor.selection.startNodes().each((function(_this) {\n          return function(i, node) {\n            var handler, ref1;\n            if (node.nodeType !== Node.ELEMENT_NODE) {\n              return;\n            }\n            handler = (ref1 = _this._keystrokeHandlers[key]) != null ? ref1[node.tagName.toLowerCase()] : void 0;\n            result = typeof handler === \"function\" ? handler(e, $(node)) : void 0;\n            if (result === true || result === false) {\n              return false;\n            }\n          };\n        })(this));\n      }\n      if (result) {\n        return true;\n      }\n    }\n  };\n\n  Keystroke.prototype._initKeystrokeHandlers = function() {\n    var titleEnterHandler;\n    if (this.editor.util.browser.safari) {\n      this.add('enter', '*', (function(_this) {\n        return function(e) {\n          var $blockEl, $br;\n          if (!e.shiftKey) {\n            return;\n          }\n          $blockEl = _this.editor.selection.blockNodes().last();\n          if ($blockEl.is('pre')) {\n            return;\n          }\n          $br = $('<br/>');\n          if (_this.editor.selection.rangeAtEndOf($blockEl)) {\n            _this.editor.selection.insertNode($br);\n            _this.editor.selection.insertNode($('<br/>'));\n            _this.editor.selection.setRangeBefore($br);\n          } else {\n            _this.editor.selection.insertNode($br);\n          }\n          return true;\n        };\n      })(this));\n    }\n    if (this.editor.util.browser.webkit || this.editor.util.browser.msie) {\n      titleEnterHandler = (function(_this) {\n        return function(e, $node) {\n          var $p;\n          if (!_this.editor.selection.rangeAtEndOf($node)) {\n            return;\n          }\n          $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);\n          _this.editor.selection.setRangeAtStartOf($p);\n          return true;\n        };\n      })(this);\n      this.add('enter', 'h1', titleEnterHandler);\n      this.add('enter', 'h2', titleEnterHandler);\n      this.add('enter', 'h3', titleEnterHandler);\n      this.add('enter', 'h4', titleEnterHandler);\n      this.add('enter', 'h5', titleEnterHandler);\n      this.add('enter', 'h6', titleEnterHandler);\n    }\n    this.add('backspace', '*', (function(_this) {\n      return function(e) {\n        var $blockEl, $prevBlockEl, $rootBlock, isWebkit;\n        $rootBlock = _this.editor.selection.rootNodes().first();\n        $prevBlockEl = $rootBlock.prev();\n        if ($prevBlockEl.is('hr') && _this.editor.selection.rangeAtStartOf($rootBlock)) {\n          _this.editor.selection.save();\n          $prevBlockEl.remove();\n          _this.editor.selection.restore();\n          return true;\n        }\n        $blockEl = _this.editor.selection.blockNodes().last();\n        if ($blockEl.is('.simditor-resize-handle') && $rootBlock.is('.simditor-table')) {\n          e.preventDefault();\n          $rootBlock.remove();\n          _this.editor.selection.setRangeAtEndOf($prevBlockEl);\n        }\n        if ($prevBlockEl.is('.simditor-table') && !$blockEl.is('table') && _this.editor.util.isEmptyNode($blockEl)) {\n          e.preventDefault();\n          $blockEl.remove();\n          _this.editor.selection.setRangeAtEndOf($prevBlockEl);\n        }\n        isWebkit = _this.editor.util.browser.webkit;\n        if (isWebkit && _this.editor.selection.rangeAtStartOf($blockEl)) {\n          _this.editor.selection.save();\n          _this.editor.formatter.cleanNode($blockEl, true);\n          _this.editor.selection.restore();\n          return null;\n        }\n      };\n    })(this));\n    this.add('enter', 'div', (function(_this) {\n      return function(e, $node) {\n        var $blockEl, $p;\n        if ($node.is('.simditor-table')) {\n          $blockEl = _this.editor.selection.blockNodes().last();\n          if ($blockEl.is('.simditor-resize-handle')) {\n            e.preventDefault();\n            $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);\n            return _this.editor.selection.setRangeAtStartOf($p);\n          }\n        }\n      };\n    })(this));\n    this.add('enter', 'li', (function(_this) {\n      return function(e, $node) {\n        var $cloneNode, listEl, newBlockEl, newListEl;\n        $cloneNode = $node.clone();\n        $cloneNode.find('ul, ol').remove();\n        if (!(_this.editor.util.isEmptyNode($cloneNode) && $node.is(_this.editor.selection.blockNodes().last()))) {\n          return;\n        }\n        listEl = $node.parent();\n        if ($node.next('li').length > 0) {\n          if (!_this.editor.util.isEmptyNode($node)) {\n            return;\n          }\n          if (listEl.parent('li').length > 0) {\n            newBlockEl = $('<li/>').append(_this.editor.util.phBr).insertAfter(listEl.parent('li'));\n            newListEl = $('<' + listEl[0].tagName + '/>').append($node.nextAll('li'));\n            newBlockEl.append(newListEl);\n          } else {\n            newBlockEl = $('<p/>').append(_this.editor.util.phBr).insertAfter(listEl);\n            newListEl = $('<' + listEl[0].tagName + '/>').append($node.nextAll('li'));\n            newBlockEl.after(newListEl);\n          }\n        } else {\n          if (listEl.parent('li').length > 0) {\n            newBlockEl = $('<li/>').insertAfter(listEl.parent('li'));\n            if ($node.contents().length > 0) {\n              newBlockEl.append($node.contents());\n            } else {\n              newBlockEl.append(_this.editor.util.phBr);\n            }\n          } else {\n            newBlockEl = $('<p/>').append(_this.editor.util.phBr).insertAfter(listEl);\n            if ($node.children('ul, ol').length > 0) {\n              newBlockEl.after($node.children('ul, ol'));\n            }\n          }\n        }\n        if ($node.prev('li').length) {\n          $node.remove();\n        } else {\n          if ($node.prev('ul').length || $node.prev('ol').length) {\n            $node.remove();\n          } else {\n            listEl.remove();\n          }\n        }\n        _this.editor.selection.setRangeAtStartOf(newBlockEl);\n        return true;\n      };\n    })(this));\n    this.add('enter', 'pre', (function(_this) {\n      return function(e, $node) {\n        var $p, breakNode, range;\n        e.preventDefault();\n        if (e.shiftKey) {\n          $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);\n          _this.editor.selection.setRangeAtStartOf($p);\n          return true;\n        }\n        range = _this.editor.selection.range();\n        breakNode = null;\n        range.deleteContents();\n        if (!_this.editor.util.browser.msie && _this.editor.selection.rangeAtEndOf($node)) {\n          breakNode = document.createTextNode('\\n\\n');\n        } else {\n          breakNode = document.createTextNode('\\n');\n        }\n        range.insertNode(breakNode);\n        range.setEnd(breakNode, 1);\n        range.collapse(false);\n        _this.editor.selection.range(range);\n        return true;\n      };\n    })(this));\n    this.add('enter', 'blockquote', (function(_this) {\n      return function(e, $node) {\n        var $closestBlock, range;\n        $closestBlock = _this.editor.selection.blockNodes().last();\n        if (!($closestBlock.is('p') && !$closestBlock.next().length && _this.editor.util.isEmptyNode($closestBlock))) {\n          return;\n        }\n        $node.after($closestBlock);\n        range = document.createRange();\n        _this.editor.selection.setRangeAtStartOf($closestBlock, range);\n        return true;\n      };\n    })(this));\n    this.add('backspace', 'li', (function(_this) {\n      return function(e, $node) {\n        var $br, $childList, $newLi, $prevChildList, $prevNode, $textNode, isFF, range, text;\n        $childList = $node.children('ul, ol');\n        $prevNode = $node.prev('li');\n        if (!($childList.length > 0 && $prevNode.length > 0)) {\n          return false;\n        }\n        text = '';\n        $textNode = null;\n        $node.contents().each(function(i, n) {\n          if (n.nodeType === 1 && /UL|OL/.test(n.nodeName)) {\n            return false;\n          }\n          if (n.nodeType === 1 && /BR/.test(n.nodeName)) {\n            return;\n          }\n          if (n.nodeType === 3 && n.nodeValue) {\n            text += n.nodeValue;\n          } else if (n.nodeType === 1) {\n            text += $(n).text();\n          }\n          return $textNode = $(n);\n        });\n        isFF = _this.editor.util.browser.firefox && !$textNode.next('br').length;\n        if ($textNode && text.length === 1 && isFF) {\n          $br = $(_this.editor.util.phBr).insertAfter($textNode);\n          $textNode.remove();\n          _this.editor.selection.setRangeBefore($br);\n          return true;\n        } else if (text.length > 0) {\n          return false;\n        }\n        range = document.createRange();\n        $prevChildList = $prevNode.children('ul, ol');\n        if ($prevChildList.length > 0) {\n          $newLi = $('<li/>').append(_this.editor.util.phBr).appendTo($prevChildList);\n          $prevChildList.append($childList.children('li'));\n          $node.remove();\n          _this.editor.selection.setRangeAtEndOf($newLi, range);\n        } else {\n          _this.editor.selection.setRangeAtEndOf($prevNode, range);\n          $prevNode.append($childList);\n          $node.remove();\n          _this.editor.selection.range(range);\n        }\n        return true;\n      };\n    })(this));\n    this.add('backspace', 'pre', (function(_this) {\n      return function(e, $node) {\n        var $newNode, codeStr, range;\n        if (!_this.editor.selection.rangeAtStartOf($node)) {\n          return;\n        }\n        codeStr = $node.html().replace('\\n', '<br/>') || _this.editor.util.phBr;\n        $newNode = $('<p/>').append(codeStr).insertAfter($node);\n        $node.remove();\n        range = document.createRange();\n        _this.editor.selection.setRangeAtStartOf($newNode, range);\n        return true;\n      };\n    })(this));\n    return this.add('backspace', 'blockquote', (function(_this) {\n      return function(e, $node) {\n        var $firstChild, range;\n        if (!_this.editor.selection.rangeAtStartOf($node)) {\n          return;\n        }\n        $firstChild = $node.children().first().unwrap();\n        range = document.createRange();\n        _this.editor.selection.setRangeAtStartOf($firstChild, range);\n        return true;\n      };\n    })(this));\n  };\n\n  return Keystroke;\n\n})(SimpleModule);\n\nUndoManager = (function(superClass) {\n  extend(UndoManager, superClass);\n\n  function UndoManager() {\n    return UndoManager.__super__.constructor.apply(this, arguments);\n  }\n\n  UndoManager.pluginName = 'UndoManager';\n\n  UndoManager.prototype._index = -1;\n\n  UndoManager.prototype._capacity = 20;\n\n  UndoManager.prototype._startPosition = null;\n\n  UndoManager.prototype._endPosition = null;\n\n  UndoManager.prototype._init = function() {\n    var redoShortcut, undoShortcut;\n    this.editor = this._module;\n    this._stack = [];\n    if (this.editor.util.os.mac) {\n      undoShortcut = 'cmd+z';\n      redoShortcut = 'shift+cmd+z';\n    } else if (this.editor.util.os.win) {\n      undoShortcut = 'ctrl+z';\n      redoShortcut = 'ctrl+y';\n    } else {\n      undoShortcut = 'ctrl+z';\n      redoShortcut = 'shift+ctrl+z';\n    }\n    this.editor.hotkeys.add(undoShortcut, (function(_this) {\n      return function(e) {\n        e.preventDefault();\n        _this.undo();\n        return false;\n      };\n    })(this));\n    this.editor.hotkeys.add(redoShortcut, (function(_this) {\n      return function(e) {\n        e.preventDefault();\n        _this.redo();\n        return false;\n      };\n    })(this));\n    this.throttledPushState = this.editor.util.throttle((function(_this) {\n      return function() {\n        return _this._pushUndoState();\n      };\n    })(this), 2000);\n    this.editor.on('valuechanged', (function(_this) {\n      return function(e, src) {\n        if (src === 'undo' || src === 'redo') {\n          return;\n        }\n        return _this.throttledPushState();\n      };\n    })(this));\n    this.editor.on('selectionchanged', (function(_this) {\n      return function(e) {\n        _this.resetCaretPosition();\n        return _this.update();\n      };\n    })(this));\n    this.editor.on('focus', (function(_this) {\n      return function(e) {\n        if (_this._stack.length === 0) {\n          return _this._pushUndoState();\n        }\n      };\n    })(this));\n    return this.editor.on('blur', (function(_this) {\n      return function(e) {\n        return _this.resetCaretPosition();\n      };\n    })(this));\n  };\n\n  UndoManager.prototype.resetCaretPosition = function() {\n    this._startPosition = null;\n    return this._endPosition = null;\n  };\n\n  UndoManager.prototype.startPosition = function() {\n    if (this.editor.selection._range) {\n      this._startPosition || (this._startPosition = this._getPosition('start'));\n    }\n    return this._startPosition;\n  };\n\n  UndoManager.prototype.endPosition = function() {\n    if (this.editor.selection._range) {\n      this._endPosition || (this._endPosition = (function(_this) {\n        return function() {\n          var range;\n          range = _this.editor.selection.range();\n          if (range.collapsed) {\n            return _this._startPosition;\n          }\n          return _this._getPosition('end');\n        };\n      })(this)());\n    }\n    return this._endPosition;\n  };\n\n  UndoManager.prototype._pushUndoState = function() {\n    var caret;\n    if (this.editor.triggerHandler('pushundostate') === false) {\n      return;\n    }\n    caret = this.caretPosition();\n    if (!caret.start) {\n      return;\n    }\n    this._index += 1;\n    this._stack.length = this._index;\n    this._stack.push({\n      html: this.editor.body.html(),\n      caret: this.caretPosition()\n    });\n    if (this._stack.length > this._capacity) {\n      this._stack.shift();\n      return this._index -= 1;\n    }\n  };\n\n  UndoManager.prototype.currentState = function() {\n    if (this._stack.length && this._index > -1) {\n      return this._stack[this._index];\n    } else {\n      return null;\n    }\n  };\n\n  UndoManager.prototype.undo = function() {\n    var state;\n    if (this._index < 1 || this._stack.length < 2) {\n      return;\n    }\n    this.editor.hidePopover();\n    this._index -= 1;\n    state = this._stack[this._index];\n    this.editor.body.get(0).innerHTML = state.html;\n    this.caretPosition(state.caret);\n    this.editor.body.find('.selected').removeClass('selected');\n    this.editor.sync();\n    return this.editor.trigger('valuechanged', ['undo']);\n  };\n\n  UndoManager.prototype.redo = function() {\n    var state;\n    if (this._index < 0 || this._stack.length < this._index + 2) {\n      return;\n    }\n    this.editor.hidePopover();\n    this._index += 1;\n    state = this._stack[this._index];\n    this.editor.body.get(0).innerHTML = state.html;\n    this.caretPosition(state.caret);\n    this.editor.body.find('.selected').removeClass('selected');\n    this.editor.sync();\n    return this.editor.trigger('valuechanged', ['redo']);\n  };\n\n  UndoManager.prototype.update = function() {\n    var currentState;\n    currentState = this.currentState();\n    if (!currentState) {\n      return;\n    }\n    currentState.html = this.editor.body.html();\n    return currentState.caret = this.caretPosition();\n  };\n\n  UndoManager.prototype._getNodeOffset = function(node, index) {\n    var $parent, merging, offset;\n    if ($.isNumeric(index)) {\n      $parent = $(node);\n    } else {\n      $parent = $(node).parent();\n    }\n    offset = 0;\n    merging = false;\n    $parent.contents().each(function(i, child) {\n      if (node === child || (index === i && i === 0)) {\n        return false;\n      }\n      if (child.nodeType === Node.TEXT_NODE) {\n        if (!merging && child.nodeValue.length > 0) {\n          offset += 1;\n          merging = true;\n        }\n      } else {\n        offset += 1;\n        merging = false;\n      }\n      if (index - 1 === i) {\n        return false;\n      }\n      return null;\n    });\n    return offset;\n  };\n\n  UndoManager.prototype._getPosition = function(type) {\n    var $nodes, node, nodes, offset, position, prevNode, range;\n    if (type == null) {\n      type = 'start';\n    }\n    range = this.editor.selection.range();\n    offset = range[type + \"Offset\"];\n    $nodes = this.editor.selection[type + \"Nodes\"]();\n    node = $nodes.first()[0];\n    if (node.nodeType === Node.TEXT_NODE) {\n      prevNode = node.previousSibling;\n      while (prevNode && prevNode.nodeType === Node.TEXT_NODE) {\n        node = prevNode;\n        offset += this.editor.util.getNodeLength(prevNode);\n        prevNode = prevNode.previousSibling;\n      }\n      nodes = $nodes.get();\n      nodes[0] = node;\n      $nodes = $(nodes);\n    } else {\n      offset = this._getNodeOffset(node, offset);\n    }\n    position = [offset];\n    $nodes.each((function(_this) {\n      return function(i, node) {\n        return position.unshift(_this._getNodeOffset(node));\n      };\n    })(this));\n    return position;\n  };\n\n  UndoManager.prototype._getNodeByPosition = function(position) {\n    var child, childNodes, i, k, len, node, offset, ref;\n    node = this.editor.body[0];\n    ref = position.slice(0, position.length - 1);\n    for (i = k = 0, len = ref.length; k < len; i = ++k) {\n      offset = ref[i];\n      childNodes = node.childNodes;\n      if (offset > childNodes.length - 1) {\n        if (i === position.length - 2 && $(node).is(':empty')) {\n          child = document.createTextNode('');\n          node.appendChild(child);\n          childNodes = node.childNodes;\n        } else {\n          node = null;\n          break;\n        }\n      }\n      node = childNodes[offset];\n    }\n    return node;\n  };\n\n  UndoManager.prototype.caretPosition = function(caret) {\n    var endContainer, endOffset, range, startContainer, startOffset;\n    if (!caret) {\n      range = this.editor.selection.range();\n      caret = this.editor.inputManager.focused && (range != null) ? {\n        start: this.startPosition(),\n        end: this.endPosition(),\n        collapsed: range.collapsed\n      } : {};\n      return caret;\n    } else {\n      if (!caret.start) {\n        return;\n      }\n      startContainer = this._getNodeByPosition(caret.start);\n      startOffset = caret.start[caret.start.length - 1];\n      if (caret.collapsed) {\n        endContainer = startContainer;\n        endOffset = startOffset;\n      } else {\n        endContainer = this._getNodeByPosition(caret.end);\n        endOffset = caret.start[caret.start.length - 1];\n      }\n      if (!startContainer || !endContainer) {\n        if (typeof console !== \"undefined\" && console !== null) {\n          if (typeof console.info === \"function\") {\n            console.info('simditor: invalid caret state');\n          }\n        }\n        return;\n      }\n      range = document.createRange();\n      range.setStart(startContainer, startOffset);\n      range.setEnd(endContainer, endOffset);\n      return this.editor.selection.range(range);\n    }\n  };\n\n  return UndoManager;\n\n})(SimpleModule);\n\nUtil = (function(superClass) {\n  extend(Util, superClass);\n\n  function Util() {\n    return Util.__super__.constructor.apply(this, arguments);\n  }\n\n  Util.pluginName = 'Util';\n\n  Util.prototype._init = function() {\n    this.editor = this._module;\n    if (this.browser.msie && this.browser.version < 11) {\n      return this.phBr = '';\n    }\n  };\n\n  Util.prototype.phBr = '<br/>';\n\n  Util.prototype.os = (function() {\n    var os;\n    os = {};\n    if (/Mac/.test(navigator.appVersion)) {\n      os.mac = true;\n    } else if (/Linux/.test(navigator.appVersion)) {\n      os.linux = true;\n    } else if (/Win/.test(navigator.appVersion)) {\n      os.win = true;\n    } else if (/X11/.test(navigator.appVersion)) {\n      os.unix = true;\n    }\n    if (/Mobi/.test(navigator.appVersion)) {\n      os.mobile = true;\n    }\n    return os;\n  })();\n\n  Util.prototype.browser = (function() {\n    var chrome, edge, firefox, ie, ref, ref1, ref2, ref3, ref4, safari, ua;\n    ua = navigator.userAgent;\n    ie = /(msie|trident)/i.test(ua);\n    chrome = /chrome|crios/i.test(ua);\n    safari = /safari/i.test(ua) && !chrome;\n    firefox = /firefox/i.test(ua);\n    edge = /edge/i.test(ua);\n    if (ie) {\n      return {\n        msie: true,\n        version: ((ref = ua.match(/(msie |rv:)(\\d+(\\.\\d+)?)/i)) != null ? ref[2] : void 0) * 1\n      };\n    } else if (edge) {\n      return {\n        edge: true,\n        webkit: true,\n        version: ((ref1 = ua.match(/edge\\/(\\d+(\\.\\d+)?)/i)) != null ? ref1[1] : void 0) * 1\n      };\n    } else if (chrome) {\n      return {\n        webkit: true,\n        chrome: true,\n        version: ((ref2 = ua.match(/(?:chrome|crios)\\/(\\d+(\\.\\d+)?)/i)) != null ? ref2[1] : void 0) * 1\n      };\n    } else if (safari) {\n      return {\n        webkit: true,\n        safari: true,\n        version: ((ref3 = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null ? ref3[1] : void 0) * 1\n      };\n    } else if (firefox) {\n      return {\n        mozilla: true,\n        firefox: true,\n        version: ((ref4 = ua.match(/firefox\\/(\\d+(\\.\\d+)?)/i)) != null ? ref4[1] : void 0) * 1\n      };\n    } else {\n      return {};\n    }\n  })();\n\n  Util.prototype.support = (function() {\n    return {\n      onselectionchange: (function() {\n        var e, onselectionchange;\n        onselectionchange = document.onselectionchange;\n        if (onselectionchange !== void 0) {\n          try {\n            document.onselectionchange = 0;\n            return document.onselectionchange === null;\n          } catch (_error) {\n            e = _error;\n          } finally {\n            document.onselectionchange = onselectionchange;\n          }\n        }\n        return false;\n      })(),\n      oninput: (function() {\n        return !/(msie|trident)/i.test(navigator.userAgent);\n      })()\n    };\n  })();\n\n  Util.prototype.reflow = function(el) {\n    if (el == null) {\n      el = document;\n    }\n    return $(el)[0].offsetHeight;\n  };\n\n  Util.prototype.metaKey = function(e) {\n    var isMac;\n    isMac = /Mac/.test(navigator.userAgent);\n    if (isMac) {\n      return e.metaKey;\n    } else {\n      return e.ctrlKey;\n    }\n  };\n\n  Util.prototype.isEmptyNode = function(node) {\n    var $node;\n    $node = $(node);\n    return $node.is(':empty') || (!$node.text() && !$node.find(':not(br, span, div, b, a, strong, i, strike, font, u)').length);\n  };\n\n  Util.prototype.isDecoratedNode = function(node) {\n    return $(node).is('[class^=\"simditor-\"]');\n  };\n\n  Util.prototype.blockNodes = [\"div\", \"p\", \"ul\", \"ol\", \"li\", \"blockquote\", \"hr\", \"pre\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"table\"];\n\n  Util.prototype.isBlockNode = function(node) {\n    node = $(node)[0];\n    if (!node || node.nodeType === 3) {\n      return false;\n    }\n    return new RegExp(\"^(\" + (this.blockNodes.join('|')) + \")$\").test(node.nodeName.toLowerCase());\n  };\n\n  Util.prototype.getNodeLength = function(node) {\n    node = $(node)[0];\n    switch (node.nodeType) {\n      case 7:\n      case 10:\n        return 0;\n      case 3:\n      case 8:\n        return node.length;\n      default:\n        return node.childNodes.length;\n    }\n  };\n\n  Util.prototype.dataURLtoBlob = function(dataURL) {\n    var BlobBuilder, arrayBuffer, bb, blobArray, byteString, hasArrayBufferViewSupport, hasBlobConstructor, i, intArray, k, mimeString, ref, supportBlob;\n    hasBlobConstructor = window.Blob && (function() {\n      var e;\n      try {\n        return Boolean(new Blob());\n      } catch (_error) {\n        e = _error;\n        return false;\n      }\n    })();\n    hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && (function() {\n      var e;\n      try {\n        return new Blob([new Uint8Array(100)]).size === 100;\n      } catch (_error) {\n        e = _error;\n        return false;\n      }\n    })();\n    BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n    supportBlob = hasBlobConstructor || BlobBuilder;\n    if (!(supportBlob && window.atob && window.ArrayBuffer && window.Uint8Array)) {\n      return false;\n    }\n    if (dataURL.split(',')[0].indexOf('base64') >= 0) {\n      byteString = atob(dataURL.split(',')[1]);\n    } else {\n      byteString = decodeURIComponent(dataURL.split(',')[1]);\n    }\n    arrayBuffer = new ArrayBuffer(byteString.length);\n    intArray = new Uint8Array(arrayBuffer);\n    for (i = k = 0, ref = byteString.length; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {\n      intArray[i] = byteString.charCodeAt(i);\n    }\n    mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0];\n    if (hasBlobConstructor) {\n      blobArray = hasArrayBufferViewSupport ? intArray : arrayBuffer;\n      return new Blob([blobArray], {\n        type: mimeString\n      });\n    }\n    bb = new BlobBuilder();\n    bb.append(arrayBuffer);\n    return bb.getBlob(mimeString);\n  };\n\n  Util.prototype.throttle = function(func, wait) {\n    var args, call, ctx, last, rtn, throttled, timeoutID;\n    last = 0;\n    timeoutID = 0;\n    ctx = args = rtn = null;\n    call = function() {\n      timeoutID = 0;\n      last = +new Date();\n      rtn = func.apply(ctx, args);\n      ctx = null;\n      return args = null;\n    };\n    throttled = function() {\n      var delta;\n      ctx = this;\n      args = arguments;\n      delta = new Date() - last;\n      if (!timeoutID) {\n        if (delta >= wait) {\n          call();\n        } else {\n          timeoutID = setTimeout(call, wait - delta);\n        }\n      }\n      return rtn;\n    };\n    throttled.clear = function() {\n      if (!timeoutID) {\n        return;\n      }\n      clearTimeout(timeoutID);\n      return call();\n    };\n    return throttled;\n  };\n\n  Util.prototype.formatHTML = function(html) {\n    var cursor, indentString, lastMatch, level, match, re, repeatString, result, str;\n    re = /<(\\/?)(.+?)(\\/?)>/g;\n    result = '';\n    level = 0;\n    lastMatch = null;\n    indentString = '  ';\n    repeatString = function(str, n) {\n      return new Array(n + 1).join(str);\n    };\n    while ((match = re.exec(html)) !== null) {\n      match.isBlockNode = $.inArray(match[2], this.blockNodes) > -1;\n      match.isStartTag = match[1] !== '/' && match[3] !== '/';\n      match.isEndTag = match[1] === '/' || match[3] === '/';\n      cursor = lastMatch ? lastMatch.index + lastMatch[0].length : 0;\n      if ((str = html.substring(cursor, match.index)).length > 0 && $.trim(str)) {\n        result += str;\n      }\n      if (match.isBlockNode && match.isEndTag && !match.isStartTag) {\n        level -= 1;\n      }\n      if (match.isBlockNode && match.isStartTag) {\n        if (!(lastMatch && lastMatch.isBlockNode && lastMatch.isEndTag)) {\n          result += '\\n';\n        }\n        result += repeatString(indentString, level);\n      }\n      result += match[0];\n      if (match.isBlockNode && match.isEndTag) {\n        result += '\\n';\n      }\n      if (match.isBlockNode && match.isStartTag) {\n        level += 1;\n      }\n      lastMatch = match;\n    }\n    return $.trim(result);\n  };\n\n  return Util;\n\n})(SimpleModule);\n\nToolbar = (function(superClass) {\n  extend(Toolbar, superClass);\n\n  function Toolbar() {\n    return Toolbar.__super__.constructor.apply(this, arguments);\n  }\n\n  Toolbar.pluginName = 'Toolbar';\n\n  Toolbar.prototype.opts = {\n    toolbar: true,\n    toolbarFloat: true,\n    toolbarHidden: false,\n    toolbarFloatOffset: 0,\n    toolbarScrollContainer: window\n  };\n\n  Toolbar.prototype._tpl = {\n    wrapper: '<div class=\"simditor-toolbar\"><ul></ul></div>',\n    separator: '<li><span class=\"separator\"></span></li>'\n  };\n\n  Toolbar.prototype._init = function() {\n    var floatInitialized, initToolbarFloat, scrollContainerOffset, toolbarHeight;\n    this.editor = this._module;\n    if (!this.opts.toolbar) {\n      return;\n    }\n    if (!$.isArray(this.opts.toolbar)) {\n      this.opts.toolbar = ['bold', 'italic', 'underline', 'strikethrough', '|', 'ol', 'ul', 'blockquote', 'code', '|', 'link', 'image', '|', 'indent', 'outdent'];\n    }\n    this._render();\n    this.list.on('click', function(e) {\n      return false;\n    });\n    this.wrapper.on('mousedown', (function(_this) {\n      return function(e) {\n        return _this.list.find('.menu-on').removeClass('.menu-on');\n      };\n    })(this));\n    $(document).on('mousedown.simditor' + this.editor.id, (function(_this) {\n      return function(e) {\n        return _this.list.find('.menu-on').removeClass('.menu-on');\n      };\n    })(this));\n    if (!this.opts.toolbarHidden && this.opts.toolbarFloat) {\n      scrollContainerOffset = this.opts.toolbarScrollContainer === window ? {\n        top: 0,\n        left: 0\n      } : $(this.opts.toolbarScrollContainer).offset();\n      this.wrapper.css('top', scrollContainerOffset.top + this.opts.toolbarFloatOffset);\n      toolbarHeight = 0;\n      initToolbarFloat = (function(_this) {\n        return function() {\n          _this.wrapper.css('position', 'static');\n          _this.wrapper.width('auto');\n          _this.editor.util.reflow(_this.wrapper);\n          _this.wrapper.width(_this.wrapper.outerWidth());\n          _this.wrapper.css('left', _this.editor.util.os.mobile ? _this.wrapper.position().left : _this.wrapper.offset().left - scrollContainerOffset.left);\n          _this.wrapper.css('position', '');\n          toolbarHeight = _this.wrapper.outerHeight();\n          _this.editor.placeholderEl.css('top', scrollContainerOffset.top);\n          return true;\n        };\n      })(this);\n      floatInitialized = null;\n      $(window).on('resize.simditor-' + this.editor.id, function(e) {\n        return floatInitialized = initToolbarFloat();\n      });\n      $(this.opts.toolbarScrollContainer).on('scroll.simditor-' + this.editor.id, (function(_this) {\n        return function(e) {\n          var bottomEdge, scrollTop, topEdge;\n          if (!_this.wrapper.is(':visible')) {\n            return;\n          }\n          topEdge = _this.opts.toolbarScrollContainer === window ? _this.editor.wrapper.get(0).getBoundingClientRect().top : _this.editor.wrapper.offset().top - scrollContainerOffset.top;\n          bottomEdge = topEdge + _this.editor.wrapper.outerHeight() - 80;\n          scrollTop = $(_this.opts.toolbarScrollContainer).scrollTop() + _this.opts.toolbarFloatOffset;\n          if (topEdge > 0 || bottomEdge < 0) {\n            _this.editor.wrapper.removeClass('toolbar-floating').css('padding-top', '');\n            if (_this.editor.util.os.mobile) {\n              return _this.wrapper.css('top', _this.opts.toolbarFloatOffset);\n            }\n          } else {\n            floatInitialized || (floatInitialized = initToolbarFloat());\n            _this.editor.wrapper.addClass('toolbar-floating').css('padding-top', toolbarHeight);\n            if (_this.editor.util.os.mobile) {\n              return _this.wrapper.css('top', scrollTop - topEdge + _this.opts.toolbarFloatOffset);\n            }\n          }\n        };\n      })(this));\n    }\n    this.editor.on('destroy', (function(_this) {\n      return function() {\n        return _this.buttons.length = 0;\n      };\n    })(this));\n    return $(document).on(\"mousedown.simditor-\" + this.editor.id, (function(_this) {\n      return function(e) {\n        return _this.list.find('li.menu-on').removeClass('menu-on');\n      };\n    })(this));\n  };\n\n  Toolbar.prototype._render = function() {\n    var k, len, name, ref;\n    this.buttons = [];\n    this.wrapper = $(this._tpl.wrapper).prependTo(this.editor.wrapper);\n    this.list = this.wrapper.find('ul');\n    ref = this.opts.toolbar;\n    for (k = 0, len = ref.length; k < len; k++) {\n      name = ref[k];\n      if (name === '|') {\n        $(this._tpl.separator).appendTo(this.list);\n        continue;\n      }\n      if (!this.constructor.buttons[name]) {\n        throw new Error(\"simditor: invalid toolbar button \" + name);\n        continue;\n      }\n      this.buttons.push(new this.constructor.buttons[name]({\n        editor: this.editor\n      }));\n    }\n    if (this.opts.toolbarHidden) {\n      return this.wrapper.hide();\n    }\n  };\n\n  Toolbar.prototype.findButton = function(name) {\n    var button;\n    button = this.list.find('.toolbar-item-' + name).data('button');\n    return button != null ? button : null;\n  };\n\n  Toolbar.addButton = function(btn) {\n    return this.buttons[btn.prototype.name] = btn;\n  };\n\n  Toolbar.buttons = {};\n\n  return Toolbar;\n\n})(SimpleModule);\n\nIndentation = (function(superClass) {\n  extend(Indentation, superClass);\n\n  function Indentation() {\n    return Indentation.__super__.constructor.apply(this, arguments);\n  }\n\n  Indentation.pluginName = 'Indentation';\n\n  Indentation.prototype.opts = {\n    tabIndent: true\n  };\n\n  Indentation.prototype._init = function() {\n    this.editor = this._module;\n    return this.editor.keystroke.add('tab', '*', (function(_this) {\n      return function(e) {\n        var codeButton;\n        codeButton = _this.editor.toolbar.findButton('code');\n        if (!(_this.opts.tabIndent || (codeButton && codeButton.active))) {\n          return;\n        }\n        return _this.indent(e.shiftKey);\n      };\n    })(this));\n  };\n\n  Indentation.prototype.indent = function(isBackward) {\n    var $blockNodes, $endNodes, $startNodes, nodes, result;\n    $startNodes = this.editor.selection.startNodes();\n    $endNodes = this.editor.selection.endNodes();\n    $blockNodes = this.editor.selection.blockNodes();\n    nodes = [];\n    $blockNodes = $blockNodes.each(function(i, node) {\n      var include, j, k, len, n;\n      include = true;\n      for (j = k = 0, len = nodes.length; k < len; j = ++k) {\n        n = nodes[j];\n        if ($.contains(node, n)) {\n          include = false;\n          break;\n        } else if ($.contains(n, node)) {\n          nodes.splice(j, 1, node);\n          include = false;\n          break;\n        }\n      }\n      if (include) {\n        return nodes.push(node);\n      }\n    });\n    $blockNodes = $(nodes);\n    result = false;\n    $blockNodes.each((function(_this) {\n      return function(i, blockEl) {\n        var r;\n        r = isBackward ? _this.outdentBlock(blockEl) : _this.indentBlock(blockEl);\n        if (r) {\n          return result = r;\n        }\n      };\n    })(this));\n    return result;\n  };\n\n  Indentation.prototype.indentBlock = function(blockEl) {\n    var $blockEl, $childList, $nextTd, $nextTr, $parentLi, $pre, $td, $tr, marginLeft, tagName;\n    $blockEl = $(blockEl);\n    if (!$blockEl.length) {\n      return;\n    }\n    if ($blockEl.is('pre')) {\n      $pre = this.editor.selection.containerNode();\n      if (!($pre.is($blockEl) || $pre.closest('pre').is($blockEl))) {\n        return;\n      }\n      this.indentText(this.editor.selection.range());\n    } else if ($blockEl.is('li')) {\n      $parentLi = $blockEl.prev('li');\n      if ($parentLi.length < 1) {\n        return;\n      }\n      this.editor.selection.save();\n      tagName = $blockEl.parent()[0].tagName;\n      $childList = $parentLi.children('ul, ol');\n      if ($childList.length > 0) {\n        $childList.append($blockEl);\n      } else {\n        $('<' + tagName + '/>').append($blockEl).appendTo($parentLi);\n      }\n      this.editor.selection.restore();\n    } else if ($blockEl.is('p, h1, h2, h3, h4')) {\n      marginLeft = parseInt($blockEl.css('margin-left')) || 0;\n      marginLeft = (Math.round(marginLeft / this.opts.indentWidth) + 1) * this.opts.indentWidth;\n      $blockEl.css('margin-left', marginLeft);\n    } else if ($blockEl.is('table') || $blockEl.is('.simditor-table')) {\n      $td = this.editor.selection.containerNode().closest('td, th');\n      $nextTd = $td.next('td, th');\n      if (!($nextTd.length > 0)) {\n        $tr = $td.parent('tr');\n        $nextTr = $tr.next('tr');\n        if ($nextTr.length < 1 && $tr.parent().is('thead')) {\n          $nextTr = $tr.parent('thead').next('tbody').find('tr:first');\n        }\n        $nextTd = $nextTr.find('td:first, th:first');\n      }\n      if (!($td.length > 0 && $nextTd.length > 0)) {\n        return;\n      }\n      this.editor.selection.setRangeAtEndOf($nextTd);\n    } else {\n      return false;\n    }\n    return true;\n  };\n\n  Indentation.prototype.indentText = function(range) {\n    var text, textNode;\n    text = range.toString().replace(/^(?=.+)/mg, '\\u00A0\\u00A0');\n    textNode = document.createTextNode(text || '\\u00A0\\u00A0');\n    range.deleteContents();\n    range.insertNode(textNode);\n    if (text) {\n      range.selectNode(textNode);\n      return this.editor.selection.range(range);\n    } else {\n      return this.editor.selection.setRangeAfter(textNode);\n    }\n  };\n\n  Indentation.prototype.outdentBlock = function(blockEl) {\n    var $blockEl, $parent, $parentLi, $pre, $prevTd, $prevTr, $td, $tr, marginLeft, range;\n    $blockEl = $(blockEl);\n    if (!($blockEl && $blockEl.length > 0)) {\n      return;\n    }\n    if ($blockEl.is('pre')) {\n      $pre = this.editor.selection.containerNode();\n      if (!($pre.is($blockEl) || $pre.closest('pre').is($blockEl))) {\n        return;\n      }\n      this.outdentText(range);\n    } else if ($blockEl.is('li')) {\n      $parent = $blockEl.parent();\n      $parentLi = $parent.parent('li');\n      this.editor.selection.save();\n      if ($parentLi.length < 1) {\n        range = document.createRange();\n        range.setStartBefore($parent[0]);\n        range.setEndBefore($blockEl[0]);\n        $parent.before(range.extractContents());\n        $('<p/>').insertBefore($parent).after($blockEl.children('ul, ol')).append($blockEl.contents());\n        $blockEl.remove();\n      } else {\n        if ($blockEl.next('li').length > 0) {\n          $('<' + $parent[0].tagName + '/>').append($blockEl.nextAll('li')).appendTo($blockEl);\n        }\n        $blockEl.insertAfter($parentLi);\n        if ($parent.children('li').length < 1) {\n          $parent.remove();\n        }\n      }\n      this.editor.selection.restore();\n    } else if ($blockEl.is('p, h1, h2, h3, h4')) {\n      marginLeft = parseInt($blockEl.css('margin-left')) || 0;\n      marginLeft = Math.max(Math.round(marginLeft / this.opts.indentWidth) - 1, 0) * this.opts.indentWidth;\n      $blockEl.css('margin-left', marginLeft === 0 ? '' : marginLeft);\n    } else if ($blockEl.is('table') || $blockEl.is('.simditor-table')) {\n      $td = this.editor.selection.containerNode().closest('td, th');\n      $prevTd = $td.prev('td, th');\n      if (!($prevTd.length > 0)) {\n        $tr = $td.parent('tr');\n        $prevTr = $tr.prev('tr');\n        if ($prevTr.length < 1 && $tr.parent().is('tbody')) {\n          $prevTr = $tr.parent('tbody').prev('thead').find('tr:first');\n        }\n        $prevTd = $prevTr.find('td:last, th:last');\n      }\n      if (!($td.length > 0 && $prevTd.length > 0)) {\n        return;\n      }\n      this.editor.selection.setRangeAtEndOf($prevTd);\n    } else {\n      return false;\n    }\n    return true;\n  };\n\n  Indentation.prototype.outdentText = function(range) {};\n\n  return Indentation;\n\n})(SimpleModule);\n\nClipboard = (function(superClass) {\n  extend(Clipboard, superClass);\n\n  function Clipboard() {\n    return Clipboard.__super__.constructor.apply(this, arguments);\n  }\n\n  Clipboard.pluginName = 'Clipboard';\n\n  Clipboard.prototype.opts = {\n    pasteImage: false,\n    cleanPaste: false\n  };\n\n  Clipboard.prototype._init = function() {\n    this.editor = this._module;\n    if (this.opts.pasteImage && typeof this.opts.pasteImage !== 'string') {\n      this.opts.pasteImage = 'inline';\n    }\n    return this.editor.body.on('paste', (function(_this) {\n      return function(e) {\n        var pasteBinAnchor, range;\n        if (_this.pasting || _this._pasteBin) {\n          return;\n        }\n        if (_this.editor.triggerHandler(e) === false) {\n          return false;\n        }\n        range = _this.editor.selection.deleteRangeContents();\n        if (_this.editor.body.html()) {\n          if (!range.collapsed) {\n            range.collapse(true);\n          }\n        } else {\n          _this.editor.formatter.format();\n          _this.editor.selection.setRangeAtStartOf(_this.editor.body.find('p:first'));\n          range = _this.editor.selection._range;\n        }\n        if (_this._processPasteByClipboardApi(e)) {\n          return false;\n        }\n        pasteBinAnchor = $('<span>');\n        range.insertNode(pasteBinAnchor[0]);\n        _this._createPasteBin(pasteBinAnchor);\n        pasteBinAnchor.remove();\n        range.collapse(true);\n        _this.editor.selection.range(range);\n        _this.editor.inputManager.throttledValueChanged.clear();\n        _this.editor.inputManager.throttledSelectionChanged.clear();\n        _this.editor.undoManager.throttledPushState.clear();\n        _this.editor.selection.reset();\n        _this.editor.undoManager.resetCaretPosition();\n        _this.pasting = true;\n        return _this._getPasteContent(function(pasteContent) {\n          _this._processPasteContent(pasteContent);\n          _this._pasteInBlockEl = null;\n          _this._pastePlainText = null;\n          return _this.pasting = false;\n        });\n      };\n    })(this));\n  };\n\n  Clipboard.prototype._processPasteByClipboardApi = function(e) {\n    var imageFile, pasteItem, ref, uploadOpt;\n    if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.items && e.originalEvent.clipboardData.items.length > 0) {\n      pasteItem = e.originalEvent.clipboardData.items[0];\n      if (/^image\\//.test(pasteItem.type)) {\n        imageFile = pasteItem.getAsFile();\n        if (!((imageFile != null) && this.opts.pasteImage)) {\n          return;\n        }\n        if (!imageFile.name) {\n          imageFile.name = \"Clipboard Image.png\";\n        }\n        if (this.editor.triggerHandler('pasting', [imageFile]) === false) {\n          return;\n        }\n        uploadOpt = {};\n        uploadOpt[this.opts.pasteImage] = true;\n        if ((ref = this.editor.uploader) != null) {\n          ref.upload(imageFile, uploadOpt);\n        }\n        return true;\n      }\n    }\n  };\n\n  Clipboard.prototype._createPasteBin = function(anchorNode) {\n    var anchorOffset, editorOffset;\n    anchorOffset = anchorNode.offset();\n    editorOffset = this.editor.el.offset();\n    return this._pasteBin = $('<div contenteditable=\"true\" />').addClass('simditor-paste-bin').attr('tabIndex', '-1').css({\n      top: anchorOffset.top - editorOffset.top,\n      left: anchorOffset.left - editorOffset.left\n    }).appendTo(this.editor.el);\n  };\n\n  Clipboard.prototype._getPasteContent = function(callback) {\n    var state;\n    state = {\n      html: this.editor.body.html(),\n      caret: this.editor.undoManager.caretPosition()\n    };\n    this._pasteBin.focus();\n    return setTimeout((function(_this) {\n      return function() {\n        var pasteContent;\n        _this.editor.hidePopover();\n        _this.editor.body.get(0).innerHTML = DOMPurify ? DOMPurify.sanitize(state.html) : state.html;\n        _this.editor.undoManager.caretPosition(state.caret);\n        _this.editor.body.focus();\n        _this.editor.selection.reset();\n        _this.editor.selection.range();\n        _this._pasteInBlockEl = _this.editor.selection.blockNodes().last();\n        _this._pastePlainText = _this.opts.cleanPaste || _this._pasteInBlockEl.is('pre, table');\n        if (_this._pastePlainText) {\n          pasteContent = _this.editor.formatter.clearHtml(_this._pasteBin.html(), true);\n        } else {\n          pasteContent = $('<div/>').append(_this._pasteBin.contents());\n          pasteContent.find('style').remove();\n          pasteContent.find('table colgroup').remove();\n          _this._cleanPasteFontSize(pasteContent);\n          _this.editor.formatter.format(pasteContent);\n          _this.editor.formatter.decorate(pasteContent);\n          _this.editor.formatter.beautify(pasteContent.children());\n          pasteContent = pasteContent.contents();\n        }\n        _this._pasteBin.remove();\n        _this._pasteBin = null;\n        return callback(pasteContent);\n      };\n    })(this), 0);\n  };\n\n  Clipboard.prototype._processPasteContent = function(pasteContent) {\n    var $blockEl, $img, blob, children, dataURLtoBlob, img, insertPosition, k, l, lastLine, len, len1, len2, len3, len4, line, lines, m, node, o, q, ref, ref1, ref2, uploadOpt, uploader;\n    if (this.editor.triggerHandler('pasting', [pasteContent]) === false) {\n      return;\n    }\n    $blockEl = this._pasteInBlockEl;\n    if (!pasteContent) {\n      return;\n    }\n    if (this._pastePlainText) {\n      if ($blockEl.is('table')) {\n        lines = pasteContent.split('\\n');\n        lastLine = lines.pop();\n        for (k = 0, len = lines.length; k < len; k++) {\n          line = lines[k];\n          this.editor.selection.insertNode(document.createTextNode(line));\n          this.editor.selection.insertNode($('<br/>'));\n        }\n        this.editor.selection.insertNode(document.createTextNode(lastLine));\n      } else {\n        pasteContent = $('<div/>').text(pasteContent);\n        ref = pasteContent.contents();\n        for (l = 0, len1 = ref.length; l < len1; l++) {\n          node = ref[l];\n          this.editor.selection.insertNode($(node)[0]);\n        }\n      }\n    } else if ($blockEl.is(this.editor.body)) {\n      for (m = 0, len2 = pasteContent.length; m < len2; m++) {\n        node = pasteContent[m];\n        this.editor.selection.insertNode(node);\n      }\n    } else if (pasteContent.length < 1) {\n      return;\n    } else if (pasteContent.length === 1) {\n      if (pasteContent.is('p')) {\n        children = pasteContent.contents();\n        if ($blockEl.is('h1, h2, h3, h4, h5')) {\n          if (children.length) {\n            children.css('font-size', '');\n          }\n        }\n        if (children.length === 1 && children.is('img')) {\n          $img = children;\n          if (/^data:image/.test($img.attr('src'))) {\n            if (!this.opts.pasteImage) {\n              return;\n            }\n            blob = this.editor.util.dataURLtoBlob($img.attr(\"src\"));\n            blob.name = \"Clipboard Image.png\";\n            uploadOpt = {};\n            uploadOpt[this.opts.pasteImage] = true;\n            if ((ref1 = this.editor.uploader) != null) {\n              ref1.upload(blob, uploadOpt);\n            }\n            return;\n          } else if (new RegExp('^blob:' + location.origin + '/').test($img.attr('src'))) {\n            if (!this.opts.pasteImage) {\n              return;\n            }\n            uploadOpt = {};\n            uploadOpt[this.opts.pasteImage] = true;\n            dataURLtoBlob = this.editor.util.dataURLtoBlob;\n            uploader = this.editor.uploader;\n            img = new Image;\n            img.onload = function() {\n              var canvas;\n              canvas = document.createElement('canvas');\n              canvas.width = img.naturalWidth;\n              canvas.height = img.naturalHeight;\n              canvas.getContext('2d').drawImage(img, 0, 0);\n              blob = dataURLtoBlob(canvas.toDataURL('image/png'));\n              blob.name = 'Clipboard Image.png';\n              if (uploader !== null) {\n                uploader.upload(blob, uploadOpt);\n              }\n            };\n            img.src = $img.attr('src');\n            return;\n          } else if ($img.is('img[src^=\"webkit-fake-url://\"]')) {\n            return;\n          }\n        }\n        for (o = 0, len3 = children.length; o < len3; o++) {\n          node = children[o];\n          this.editor.selection.insertNode(node);\n        }\n      } else if ($blockEl.is('p') && this.editor.util.isEmptyNode($blockEl)) {\n        $blockEl.replaceWith(pasteContent);\n        this.editor.selection.setRangeAtEndOf(pasteContent);\n      } else if (pasteContent.is('ul, ol')) {\n        if (pasteContent.find('li').length === 1) {\n          pasteContent = $('<div/>').text(pasteContent.text());\n          ref2 = pasteContent.contents();\n          for (q = 0, len4 = ref2.length; q < len4; q++) {\n            node = ref2[q];\n            this.editor.selection.insertNode($(node)[0]);\n          }\n        } else if ($blockEl.is('li')) {\n          $blockEl.parent().after(pasteContent);\n          this.editor.selection.setRangeAtEndOf(pasteContent);\n        } else {\n          $blockEl.after(pasteContent);\n          this.editor.selection.setRangeAtEndOf(pasteContent);\n        }\n      } else {\n        $blockEl.after(pasteContent);\n        this.editor.selection.setRangeAtEndOf(pasteContent);\n      }\n    } else {\n      if ($blockEl.is('li')) {\n        $blockEl = $blockEl.parent();\n      }\n      if (this.editor.selection.rangeAtStartOf($blockEl)) {\n        insertPosition = 'before';\n      } else if (this.editor.selection.rangeAtEndOf($blockEl)) {\n        insertPosition = 'after';\n      } else {\n        this.editor.selection.breakBlockEl($blockEl);\n        insertPosition = 'before';\n      }\n      $blockEl[insertPosition](pasteContent);\n      this.editor.selection.setRangeAtEndOf(pasteContent.last());\n    }\n    return this.editor.inputManager.throttledValueChanged();\n  };\n\n  Clipboard.prototype._cleanPasteFontSize = function(node) {\n    var $node, sizeMap;\n    $node = $(node);\n    if (!($node.length > 0)) {\n      return;\n    }\n    sizeMap = ['1.5em', '1.25em', '0.75em', '0.5em'];\n    return $node.find('[style*=\"font-size\"]').map(function(i, el) {\n      var $el;\n      $el = $(el);\n      if ($.inArray($el.css('font-size'), sizeMap) < 0) {\n        return $el.css('font-size', '');\n      }\n    });\n  };\n\n  return Clipboard;\n\n})(SimpleModule);\n\nSimditor = (function(superClass) {\n  extend(Simditor, superClass);\n\n  function Simditor() {\n    return Simditor.__super__.constructor.apply(this, arguments);\n  }\n\n  Simditor.connect(Util);\n\n  Simditor.connect(InputManager);\n\n  Simditor.connect(Selection);\n\n  Simditor.connect(UndoManager);\n\n  Simditor.connect(Keystroke);\n\n  Simditor.connect(Formatter);\n\n  Simditor.connect(Toolbar);\n\n  Simditor.connect(Indentation);\n\n  Simditor.connect(Clipboard);\n\n  Simditor.count = 0;\n\n  Simditor.prototype.opts = {\n    textarea: null,\n    placeholder: '',\n    defaultImage: 'images/image.png',\n    params: {},\n    upload: false,\n    indentWidth: 40\n  };\n\n  Simditor.prototype._init = function() {\n    var e, editor, uploadOpts;\n    this.textarea = $(this.opts.textarea);\n    this.opts.placeholder = this.opts.placeholder || this.textarea.attr('placeholder');\n    if (!this.textarea.length) {\n      throw new Error('simditor: param textarea is required.');\n      return;\n    }\n    editor = this.textarea.data('simditor');\n    if (editor != null) {\n      editor.destroy();\n    }\n    this.id = ++Simditor.count;\n    this._render();\n    if (simpleHotkeys) {\n      this.hotkeys = simpleHotkeys({\n        el: this.body\n      });\n    } else {\n      throw new Error('simditor: simple-hotkeys is required.');\n      return;\n    }\n    if (this.opts.upload && simpleUploader) {\n      uploadOpts = typeof this.opts.upload === 'object' ? this.opts.upload : {};\n      this.uploader = simpleUploader(uploadOpts);\n    }\n    this.on('initialized', (function(_this) {\n      return function() {\n        if (_this.opts.placeholder) {\n          _this.on('valuechanged', function() {\n            return _this._placeholder();\n          });\n        }\n        _this.setValue(_this.textarea.val().trim() || '');\n        if (_this.textarea.attr('autofocus')) {\n          return _this.focus();\n        }\n      };\n    })(this));\n    if (this.util.browser.mozilla) {\n      this.util.reflow();\n      try {\n        document.execCommand('enableObjectResizing', false, false);\n        return document.execCommand('enableInlineTableEditing', false, false);\n      } catch (_error) {\n        e = _error;\n      }\n    }\n  };\n\n  Simditor.prototype._tpl = \"<div class=\\\"simditor\\\">\\n  <div class=\\\"simditor-wrapper\\\">\\n    <div class=\\\"simditor-placeholder\\\"></div>\\n    <div class=\\\"simditor-body\\\" contenteditable=\\\"true\\\">\\n    </div>\\n  </div>\\n</div>\";\n\n  Simditor.prototype._render = function() {\n    var key, ref, results, val;\n    this.el = $(this._tpl).insertBefore(this.textarea);\n    this.wrapper = this.el.find('.simditor-wrapper');\n    this.body = this.wrapper.find('.simditor-body');\n    this.placeholderEl = this.wrapper.find('.simditor-placeholder').append(this.opts.placeholder);\n    this.el.data('simditor', this);\n    this.wrapper.append(this.textarea);\n    this.textarea.data('simditor', this).blur();\n    this.body.attr('tabindex', this.textarea.attr('tabindex'));\n    if (this.util.os.mac) {\n      this.el.addClass('simditor-mac');\n    } else if (this.util.os.linux) {\n      this.el.addClass('simditor-linux');\n    }\n    if (this.util.os.mobile) {\n      this.el.addClass('simditor-mobile');\n    }\n    if (this.opts.params) {\n      ref = this.opts.params;\n      results = [];\n      for (key in ref) {\n        val = ref[key];\n        results.push($('<input/>', {\n          type: 'hidden',\n          name: key,\n          value: val\n        }).insertAfter(this.textarea));\n      }\n      return results;\n    }\n  };\n\n  Simditor.prototype._placeholder = function() {\n    var children;\n    children = this.body.children();\n    if (children.length === 0 || (children.length === 1 && this.util.isEmptyNode(children) && parseInt(children.css('margin-left') || 0) < this.opts.indentWidth)) {\n      return this.placeholderEl.show();\n    } else {\n      return this.placeholderEl.hide();\n    }\n  };\n\n  Simditor.prototype.setValue = function(val) {\n    this.hidePopover();\n    this.textarea.val(val);\n    this.body.get(0).innerHTML = DOMPurify ? DOMPurify.sanitize(val) : val;\n    this.formatter.format();\n    this.formatter.decorate();\n    this.util.reflow(this.body);\n    this.inputManager.lastCaretPosition = null;\n    return this.trigger('valuechanged');\n  };\n\n  Simditor.prototype.getValue = function() {\n    return this.sync();\n  };\n\n  Simditor.prototype.sync = function() {\n    var children, cloneBody, emptyP, firstP, lastP, val;\n    cloneBody = this.body.clone();\n    this.formatter.undecorate(cloneBody);\n    this.formatter.format(cloneBody);\n    this.formatter.autolink(cloneBody);\n    children = cloneBody.children();\n    lastP = children.last('p');\n    firstP = children.first('p');\n    while (lastP.is('p') && this.util.isEmptyNode(lastP)) {\n      emptyP = lastP;\n      lastP = lastP.prev('p');\n      emptyP.remove();\n    }\n    while (firstP.is('p') && this.util.isEmptyNode(firstP)) {\n      emptyP = firstP;\n      firstP = lastP.next('p');\n      emptyP.remove();\n    }\n    cloneBody.find('img.uploading').remove();\n    val = $.trim(cloneBody.html());\n    this.textarea.val(val);\n    return val;\n  };\n\n  Simditor.prototype.focus = function() {\n    var $blockEl, range;\n    if (!(this.body.is(':visible') && this.body.is('[contenteditable]'))) {\n      this.el.find('textarea:visible').focus();\n      return;\n    }\n    if (this.inputManager.lastCaretPosition) {\n      this.undoManager.caretPosition(this.inputManager.lastCaretPosition);\n      return this.inputManager.lastCaretPosition = null;\n    } else {\n      $blockEl = this.body.children().last();\n      if (!$blockEl.is('p')) {\n        $blockEl = $('<p/>').append(this.util.phBr).appendTo(this.body);\n      }\n      range = document.createRange();\n      return this.selection.setRangeAtEndOf($blockEl, range);\n    }\n  };\n\n  Simditor.prototype.blur = function() {\n    if (this.body.is(':visible') && this.body.is('[contenteditable]')) {\n      return this.body.blur();\n    } else {\n      return this.body.find('textarea:visible').blur();\n    }\n  };\n\n  Simditor.prototype.hidePopover = function() {\n    return this.el.find('.simditor-popover').each(function(i, popover) {\n      popover = $(popover).data('popover');\n      if (popover.active) {\n        return popover.hide();\n      }\n    });\n  };\n\n  Simditor.prototype.destroy = function() {\n    this.triggerHandler('destroy');\n    this.textarea.closest('form').off('.simditor .simditor-' + this.id);\n    this.selection.clear();\n    this.inputManager.focused = false;\n    this.textarea.insertBefore(this.el).hide().val('').removeData('simditor');\n    this.el.remove();\n    $(document).off('.simditor-' + this.id);\n    $(window).off('.simditor-' + this.id);\n    return this.off();\n  };\n\n  return Simditor;\n\n})(SimpleModule);\n\nSimditor.i18n = {\n  'zh-CN': {\n    'blockquote': '引用',\n    'bold': '加粗文字',\n    'code': '插入代码',\n    'color': '文字颜色',\n    'coloredText': '彩色文字',\n    'hr': '分隔线',\n    'image': '插入图片',\n    'externalImage': '外链图片',\n    'uploadImage': '上传图片',\n    'uploadFailed': '上传失败了',\n    'uploadError': '上传出错了',\n    'imageUrl': '图片地址',\n    'imageSize': '图片尺寸',\n    'imageAlt': '图片描述',\n    'restoreImageSize': '还原图片尺寸',\n    'uploading': '正在上传',\n    'indent': '向右缩进',\n    'outdent': '向左缩进',\n    'italic': '斜体文字',\n    'link': '插入链接',\n    'linkText': '链接文字',\n    'linkUrl': '链接地址',\n    'linkTarget': '打开方式',\n    'openLinkInCurrentWindow': '在当前窗口中打开',\n    'openLinkInNewWindow': '在新窗口中打开',\n    'removeLink': '移除链接',\n    'ol': '有序列表',\n    'ul': '无序列表',\n    'strikethrough': '删除线文字',\n    'table': '表格',\n    'deleteRow': '删除行',\n    'insertRowAbove': '在上面插入行',\n    'insertRowBelow': '在下面插入行',\n    'deleteColumn': '删除列',\n    'insertColumnLeft': '在左边插入列',\n    'insertColumnRight': '在右边插入列',\n    'deleteTable': '删除表格',\n    'title': '标题',\n    'normalText': '普通文本',\n    'underline': '下划线文字',\n    'alignment': '水平对齐',\n    'alignCenter': '居中',\n    'alignLeft': '居左',\n    'alignRight': '居右',\n    'selectLanguage': '选择程序语言',\n    'fontScale': '字体大小',\n    'fontScaleXLarge': '超大字体',\n    'fontScaleLarge': '大号字体',\n    'fontScaleNormal': '正常大小',\n    'fontScaleSmall': '小号字体',\n    'fontScaleXSmall': '超小字体'\n  },\n  'en-US': {\n    'blockquote': 'Block Quote',\n    'bold': 'Bold',\n    'code': 'Code',\n    'color': 'Text Color',\n    'coloredText': 'Colored Text',\n    'hr': 'Horizontal Line',\n    'image': 'Insert Image',\n    'externalImage': 'External Image',\n    'uploadImage': 'Upload Image',\n    'uploadFailed': 'Upload failed',\n    'uploadError': 'Error occurs during upload',\n    'imageUrl': 'Url',\n    'imageSize': 'Size',\n    'imageAlt': 'Alt',\n    'restoreImageSize': 'Restore Origin Size',\n    'uploading': 'Uploading',\n    'indent': 'Indent',\n    'outdent': 'Outdent',\n    'italic': 'Italic',\n    'link': 'Insert Link',\n    'linkText': 'Text',\n    'linkUrl': 'Url',\n    'linkTarget': 'Target',\n    'openLinkInCurrentWindow': 'Open link in current window',\n    'openLinkInNewWindow': 'Open link in new window',\n    'removeLink': 'Remove Link',\n    'ol': 'Ordered List',\n    'ul': 'Unordered List',\n    'strikethrough': 'Strikethrough',\n    'table': 'Table',\n    'deleteRow': 'Delete Row',\n    'insertRowAbove': 'Insert Row Above',\n    'insertRowBelow': 'Insert Row Below',\n    'deleteColumn': 'Delete Column',\n    'insertColumnLeft': 'Insert Column Left',\n    'insertColumnRight': 'Insert Column Right',\n    'deleteTable': 'Delete Table',\n    'title': 'Title',\n    'normalText': 'Text',\n    'underline': 'Underline',\n    'alignment': 'Alignment',\n    'alignCenter': 'Align Center',\n    'alignLeft': 'Align Left',\n    'alignRight': 'Align Right',\n    'selectLanguage': 'Select Language',\n    'fontScale': 'Font Size',\n    'fontScaleXLarge': 'X Large Size',\n    'fontScaleLarge': 'Large Size',\n    'fontScaleNormal': 'Normal Size',\n    'fontScaleSmall': 'Small Size',\n    'fontScaleXSmall': 'X Small Size'\n  }\n};\n\nButton = (function(superClass) {\n  extend(Button, superClass);\n\n  Button.prototype._tpl = {\n    item: '<li><a tabindex=\"-1\" unselectable=\"on\" class=\"toolbar-item\" href=\"javascript:;\"><span></span></a></li>',\n    menuWrapper: '<div class=\"toolbar-menu\"></div>',\n    menuItem: '<li><a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\" href=\"javascript:;\"><span></span></a></li>',\n    separator: '<li><span class=\"separator\"></span></li>'\n  };\n\n  Button.prototype.name = '';\n\n  Button.prototype.icon = '';\n\n  Button.prototype.title = '';\n\n  Button.prototype.text = '';\n\n  Button.prototype.htmlTag = '';\n\n  Button.prototype.disableTag = '';\n\n  Button.prototype.menu = false;\n\n  Button.prototype.active = false;\n\n  Button.prototype.disabled = false;\n\n  Button.prototype.needFocus = true;\n\n  Button.prototype.shortcut = null;\n\n  function Button(opts) {\n    this.editor = opts.editor;\n    this.title = this._t(this.name);\n    Button.__super__.constructor.call(this, opts);\n  }\n\n  Button.prototype._init = function() {\n    var k, len, ref, tag;\n    this.render();\n    this.el.on('mousedown', (function(_this) {\n      return function(e) {\n        var exceed, noFocus, param;\n        e.preventDefault();\n        noFocus = _this.needFocus && !_this.editor.inputManager.focused;\n        if (_this.el.hasClass('disabled')) {\n          return false;\n        }\n        if (noFocus) {\n          _this.editor.focus();\n        }\n        if (_this.menu) {\n          _this.wrapper.toggleClass('menu-on').siblings('li').removeClass('menu-on');\n          if (_this.wrapper.is('.menu-on')) {\n            exceed = _this.menuWrapper.offset().left + _this.menuWrapper.outerWidth() + 5 - _this.editor.wrapper.offset().left - _this.editor.wrapper.outerWidth();\n            if (exceed > 0) {\n              _this.menuWrapper.css({\n                'left': 'auto',\n                'right': 0\n              });\n            }\n            _this.trigger('menuexpand');\n          }\n          return false;\n        }\n        param = _this.el.data('param');\n        _this.command(param);\n        return false;\n      };\n    })(this));\n    this.wrapper.on('click', 'a.menu-item', (function(_this) {\n      return function(e) {\n        var btn, noFocus, param;\n        e.preventDefault();\n        btn = $(e.currentTarget);\n        _this.wrapper.removeClass('menu-on');\n        noFocus = _this.needFocus && !_this.editor.inputManager.focused;\n        if (btn.hasClass('disabled') || noFocus) {\n          return false;\n        }\n        _this.editor.toolbar.wrapper.removeClass('menu-on');\n        param = btn.data('param');\n        _this.command(param);\n        return false;\n      };\n    })(this));\n    this.wrapper.on('mousedown', 'a.menu-item', function(e) {\n      return false;\n    });\n    this.editor.on('blur', (function(_this) {\n      return function() {\n        var editorActive;\n        editorActive = _this.editor.body.is(':visible') && _this.editor.body.is('[contenteditable]');\n        if (!(editorActive && !_this.editor.clipboard.pasting)) {\n          return;\n        }\n        _this.setActive(false);\n        return _this.setDisabled(false);\n      };\n    })(this));\n    if (this.shortcut != null) {\n      this.editor.hotkeys.add(this.shortcut, (function(_this) {\n        return function(e) {\n          _this.el.mousedown();\n          return false;\n        };\n      })(this));\n    }\n    ref = this.htmlTag.split(',');\n    for (k = 0, len = ref.length; k < len; k++) {\n      tag = ref[k];\n      tag = $.trim(tag);\n      if (tag && $.inArray(tag, this.editor.formatter._allowedTags) < 0) {\n        this.editor.formatter._allowedTags.push(tag);\n      }\n    }\n    return this.editor.on('selectionchanged', (function(_this) {\n      return function(e) {\n        if (_this.editor.inputManager.focused) {\n          return _this._status();\n        }\n      };\n    })(this));\n  };\n\n  Button.prototype.iconClassOf = function(icon) {\n    if (icon) {\n      return \"simditor-icon simditor-icon-\" + icon;\n    } else {\n      return '';\n    }\n  };\n\n  Button.prototype.setIcon = function(icon) {\n    return this.el.find('span').removeClass().addClass(this.iconClassOf(icon)).text(this.text);\n  };\n\n  Button.prototype.render = function() {\n    this.wrapper = $(this._tpl.item).appendTo(this.editor.toolbar.list);\n    this.el = this.wrapper.find('a.toolbar-item');\n    this.el.attr('title', this.title).addClass(\"toolbar-item-\" + this.name).data('button', this);\n    this.setIcon(this.icon);\n    if (!this.menu) {\n      return;\n    }\n    this.menuWrapper = $(this._tpl.menuWrapper).appendTo(this.wrapper);\n    this.menuWrapper.addClass(\"toolbar-menu-\" + this.name);\n    return this.renderMenu();\n  };\n\n  Button.prototype.renderMenu = function() {\n    var $menuBtnEl, $menuItemEl, k, len, menuItem, ref, ref1, results;\n    if (!$.isArray(this.menu)) {\n      return;\n    }\n    this.menuEl = $('<ul/>').appendTo(this.menuWrapper);\n    ref = this.menu;\n    results = [];\n    for (k = 0, len = ref.length; k < len; k++) {\n      menuItem = ref[k];\n      if (menuItem === '|') {\n        $(this._tpl.separator).appendTo(this.menuEl);\n        continue;\n      }\n      $menuItemEl = $(this._tpl.menuItem).appendTo(this.menuEl);\n      $menuBtnEl = $menuItemEl.find('a.menu-item').attr({\n        'title': (ref1 = menuItem.title) != null ? ref1 : menuItem.text,\n        'data-param': menuItem.param\n      }).addClass('menu-item-' + menuItem.name);\n      if (menuItem.icon) {\n        results.push($menuBtnEl.find('span').addClass(this.iconClassOf(menuItem.icon)));\n      } else {\n        results.push($menuBtnEl.find('span').text(menuItem.text));\n      }\n    }\n    return results;\n  };\n\n  Button.prototype.setActive = function(active) {\n    if (active === this.active) {\n      return;\n    }\n    this.active = active;\n    return this.el.toggleClass('active', this.active);\n  };\n\n  Button.prototype.setDisabled = function(disabled) {\n    if (disabled === this.disabled) {\n      return;\n    }\n    this.disabled = disabled;\n    return this.el.toggleClass('disabled', this.disabled);\n  };\n\n  Button.prototype._disableStatus = function() {\n    var disabled, endNodes, startNodes;\n    startNodes = this.editor.selection.startNodes();\n    endNodes = this.editor.selection.endNodes();\n    disabled = startNodes.filter(this.disableTag).length > 0 || endNodes.filter(this.disableTag).length > 0;\n    this.setDisabled(disabled);\n    if (this.disabled) {\n      this.setActive(false);\n    }\n    return this.disabled;\n  };\n\n  Button.prototype._activeStatus = function() {\n    var active, endNode, endNodes, startNode, startNodes;\n    startNodes = this.editor.selection.startNodes();\n    endNodes = this.editor.selection.endNodes();\n    startNode = startNodes.filter(this.htmlTag);\n    endNode = endNodes.filter(this.htmlTag);\n    active = startNode.length > 0 && endNode.length > 0 && startNode.is(endNode);\n    this.node = active ? startNode : null;\n    this.setActive(active);\n    return this.active;\n  };\n\n  Button.prototype._status = function() {\n    this._disableStatus();\n    if (this.disabled) {\n      return;\n    }\n    return this._activeStatus();\n  };\n\n  Button.prototype.command = function(param) {};\n\n  Button.prototype._t = function() {\n    var args, ref, result;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    result = Button.__super__._t.apply(this, args);\n    if (!result) {\n      result = (ref = this.editor)._t.apply(ref, args);\n    }\n    return result;\n  };\n\n  return Button;\n\n})(SimpleModule);\n\nSimditor.Button = Button;\n\nPopover = (function(superClass) {\n  extend(Popover, superClass);\n\n  Popover.prototype.offset = {\n    top: 4,\n    left: 0\n  };\n\n  Popover.prototype.target = null;\n\n  Popover.prototype.active = false;\n\n  function Popover(opts) {\n    this.button = opts.button;\n    this.editor = opts.button.editor;\n    Popover.__super__.constructor.call(this, opts);\n  }\n\n  Popover.prototype._init = function() {\n    this.el = $('<div class=\"simditor-popover\"></div>').appendTo(this.editor.el).data('popover', this);\n    this.render();\n    this.el.on('mouseenter', (function(_this) {\n      return function(e) {\n        return _this.el.addClass('hover');\n      };\n    })(this));\n    return this.el.on('mouseleave', (function(_this) {\n      return function(e) {\n        return _this.el.removeClass('hover');\n      };\n    })(this));\n  };\n\n  Popover.prototype.render = function() {};\n\n  Popover.prototype._initLabelWidth = function() {\n    var $fields;\n    $fields = this.el.find('.settings-field');\n    if (!($fields.length > 0)) {\n      return;\n    }\n    this._labelWidth = 0;\n    $fields.each((function(_this) {\n      return function(i, field) {\n        var $field, $label;\n        $field = $(field);\n        $label = $field.find('label');\n        if (!($label.length > 0)) {\n          return;\n        }\n        return _this._labelWidth = Math.max(_this._labelWidth, $label.width());\n      };\n    })(this));\n    return $fields.find('label').width(this._labelWidth);\n  };\n\n  Popover.prototype.show = function($target, position) {\n    if (position == null) {\n      position = 'bottom';\n    }\n    if ($target == null) {\n      return;\n    }\n    this.el.siblings('.simditor-popover').each(function(i, popover) {\n      popover = $(popover).data('popover');\n      if (popover && popover.active) {\n        return popover.hide();\n      }\n    });\n    if (this.active && this.target) {\n      this.target.removeClass('selected');\n    }\n    this.target = $target.addClass('selected');\n    if (this.active) {\n      this.refresh(position);\n      return this.trigger('popovershow');\n    } else {\n      this.active = true;\n      this.el.css({\n        left: -9999\n      }).show();\n      if (!this._labelWidth) {\n        this._initLabelWidth();\n      }\n      this.editor.util.reflow();\n      this.refresh(position);\n      return this.trigger('popovershow');\n    }\n  };\n\n  Popover.prototype.hide = function() {\n    if (!this.active) {\n      return;\n    }\n    if (this.target) {\n      this.target.removeClass('selected');\n    }\n    this.target = null;\n    this.active = false;\n    this.el.hide();\n    return this.trigger('popoverhide');\n  };\n\n  Popover.prototype.refresh = function(position) {\n    var editorOffset, left, maxLeft, targetH, targetOffset, top;\n    if (position == null) {\n      position = 'bottom';\n    }\n    if (!this.active) {\n      return;\n    }\n    editorOffset = this.editor.el.offset();\n    targetOffset = this.target.offset();\n    targetH = this.target.outerHeight();\n    if (position === 'bottom') {\n      top = targetOffset.top - editorOffset.top + targetH;\n    } else if (position === 'top') {\n      top = targetOffset.top - editorOffset.top - this.el.height();\n    }\n    maxLeft = this.editor.wrapper.width() - this.el.outerWidth() - 10;\n    left = Math.min(targetOffset.left - editorOffset.left, maxLeft);\n    return this.el.css({\n      top: top + this.offset.top,\n      left: left + this.offset.left\n    });\n  };\n\n  Popover.prototype.destroy = function() {\n    this.target = null;\n    this.active = false;\n    this.editor.off('.linkpopover');\n    return this.el.remove();\n  };\n\n  Popover.prototype._t = function() {\n    var args, ref, result;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    result = Popover.__super__._t.apply(this, args);\n    if (!result) {\n      result = (ref = this.button)._t.apply(ref, args);\n    }\n    return result;\n  };\n\n  return Popover;\n\n})(SimpleModule);\n\nSimditor.Popover = Popover;\n\nTitleButton = (function(superClass) {\n  extend(TitleButton, superClass);\n\n  function TitleButton() {\n    return TitleButton.__super__.constructor.apply(this, arguments);\n  }\n\n  TitleButton.prototype.name = 'title';\n\n  TitleButton.prototype.htmlTag = 'h1, h2, h3, h4, h5';\n\n  TitleButton.prototype.disableTag = 'pre, table';\n\n  TitleButton.prototype._init = function() {\n    this.menu = [\n      {\n        name: 'normal',\n        text: this._t('normalText'),\n        param: 'p'\n      }, '|', {\n        name: 'h1',\n        text: this._t('title') + ' 1',\n        param: 'h1'\n      }, {\n        name: 'h2',\n        text: this._t('title') + ' 2',\n        param: 'h2'\n      }, {\n        name: 'h3',\n        text: this._t('title') + ' 3',\n        param: 'h3'\n      }, {\n        name: 'h4',\n        text: this._t('title') + ' 4',\n        param: 'h4'\n      }, {\n        name: 'h5',\n        text: this._t('title') + ' 5',\n        param: 'h5'\n      }\n    ];\n    return TitleButton.__super__._init.call(this);\n  };\n\n  TitleButton.prototype.setActive = function(active, param) {\n    TitleButton.__super__.setActive.call(this, active);\n    if (active) {\n      param || (param = this.node[0].tagName.toLowerCase());\n    }\n    this.el.removeClass('active-p active-h1 active-h2 active-h3 active-h4 active-h5');\n    if (active) {\n      return this.el.addClass('active active-' + param);\n    }\n  };\n\n  TitleButton.prototype.command = function(param) {\n    var $rootNodes;\n    $rootNodes = this.editor.selection.rootNodes();\n    this.editor.selection.save();\n    $rootNodes.each((function(_this) {\n      return function(i, node) {\n        var $node;\n        $node = $(node);\n        if ($node.is('blockquote') || $node.is(param) || $node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node)) {\n          return;\n        }\n        return $('<' + param + '/>').append($node.contents()).replaceAll($node);\n      };\n    })(this));\n    this.editor.selection.restore();\n    return this.editor.trigger('valuechanged');\n  };\n\n  return TitleButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(TitleButton);\n\nFontScaleButton = (function(superClass) {\n  extend(FontScaleButton, superClass);\n\n  function FontScaleButton() {\n    return FontScaleButton.__super__.constructor.apply(this, arguments);\n  }\n\n  FontScaleButton.prototype.name = 'fontScale';\n\n  FontScaleButton.prototype.icon = 'font';\n\n  FontScaleButton.prototype.htmlTag = 'span';\n\n  FontScaleButton.prototype.disableTag = 'pre, h1, h2, h3, h4, h5';\n\n  FontScaleButton.prototype.sizeMap = {\n    'x-large': '1.5em',\n    'large': '1.25em',\n    'small': '.75em',\n    'x-small': '.5em'\n  };\n\n  FontScaleButton.prototype._init = function() {\n    this.menu = [\n      {\n        name: '150%',\n        text: this._t('fontScaleXLarge'),\n        param: '5'\n      }, {\n        name: '125%',\n        text: this._t('fontScaleLarge'),\n        param: '4'\n      }, {\n        name: '100%',\n        text: this._t('fontScaleNormal'),\n        param: '3'\n      }, {\n        name: '75%',\n        text: this._t('fontScaleSmall'),\n        param: '2'\n      }, {\n        name: '50%',\n        text: this._t('fontScaleXSmall'),\n        param: '1'\n      }\n    ];\n    return FontScaleButton.__super__._init.call(this);\n  };\n\n  FontScaleButton.prototype._activeStatus = function() {\n    var active, endNode, endNodes, range, startNode, startNodes;\n    range = this.editor.selection.range();\n    startNodes = this.editor.selection.startNodes();\n    endNodes = this.editor.selection.endNodes();\n    startNode = startNodes.filter('span[style*=\"font-size\"]');\n    endNode = endNodes.filter('span[style*=\"font-size\"]');\n    active = startNodes.length > 0 && endNodes.length > 0 && startNode.is(endNode);\n    this.setActive(active);\n    return this.active;\n  };\n\n  FontScaleButton.prototype.command = function(param) {\n    var $scales, containerNode, range;\n    range = this.editor.selection.range();\n    if (range.collapsed) {\n      return;\n    }\n    this.editor.selection.range(range);\n    document.execCommand('styleWithCSS', false, true);\n    document.execCommand('fontSize', false, param);\n    document.execCommand('styleWithCSS', false, false);\n    this.editor.selection.reset();\n    this.editor.selection.range();\n    containerNode = this.editor.selection.containerNode();\n    if (containerNode[0].nodeType === Node.TEXT_NODE) {\n      $scales = containerNode.closest('span[style*=\"font-size\"]');\n    } else {\n      $scales = containerNode.find('span[style*=\"font-size\"]');\n    }\n    $scales.each((function(_this) {\n      return function(i, n) {\n        var $span, size;\n        $span = $(n);\n        size = n.style.fontSize;\n        if (/large|x-large|small|x-small/.test(size)) {\n          return $span.css('fontSize', _this.sizeMap[size]);\n        } else if (size === 'medium') {\n          if ($span[0].style.length > 1) {\n            return $span.css('fontSize', '');\n          } else {\n            return $span.replaceWith($span.contents());\n          }\n        }\n      };\n    })(this));\n    return this.editor.trigger('valuechanged');\n  };\n\n  return FontScaleButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(FontScaleButton);\n\nBoldButton = (function(superClass) {\n  extend(BoldButton, superClass);\n\n  function BoldButton() {\n    return BoldButton.__super__.constructor.apply(this, arguments);\n  }\n\n  BoldButton.prototype.name = 'bold';\n\n  BoldButton.prototype.icon = 'bold';\n\n  BoldButton.prototype.htmlTag = 'b, strong';\n\n  BoldButton.prototype.disableTag = 'pre';\n\n  BoldButton.prototype.shortcut = 'cmd+b';\n\n  BoldButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + b )';\n    } else {\n      this.title = this.title + ' ( Ctrl + b )';\n      this.shortcut = 'ctrl+b';\n    }\n    return BoldButton.__super__._init.call(this);\n  };\n\n  BoldButton.prototype._activeStatus = function() {\n    var active;\n    active = document.queryCommandState('bold') === true;\n    this.setActive(active);\n    return this.active;\n  };\n\n  BoldButton.prototype.command = function() {\n    document.execCommand('bold');\n    if (!this.editor.util.support.oninput) {\n      this.editor.trigger('valuechanged');\n    }\n    return $(document).trigger('selectionchange');\n  };\n\n  return BoldButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(BoldButton);\n\nItalicButton = (function(superClass) {\n  extend(ItalicButton, superClass);\n\n  function ItalicButton() {\n    return ItalicButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ItalicButton.prototype.name = 'italic';\n\n  ItalicButton.prototype.icon = 'italic';\n\n  ItalicButton.prototype.htmlTag = 'i';\n\n  ItalicButton.prototype.disableTag = 'pre';\n\n  ItalicButton.prototype.shortcut = 'cmd+i';\n\n  ItalicButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + \" ( Cmd + i )\";\n    } else {\n      this.title = this.title + \" ( Ctrl + i )\";\n      this.shortcut = 'ctrl+i';\n    }\n    return ItalicButton.__super__._init.call(this);\n  };\n\n  ItalicButton.prototype._activeStatus = function() {\n    var active;\n    active = document.queryCommandState('italic') === true;\n    this.setActive(active);\n    return this.active;\n  };\n\n  ItalicButton.prototype.command = function() {\n    document.execCommand('italic');\n    if (!this.editor.util.support.oninput) {\n      this.editor.trigger('valuechanged');\n    }\n    return $(document).trigger('selectionchange');\n  };\n\n  return ItalicButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(ItalicButton);\n\nUnderlineButton = (function(superClass) {\n  extend(UnderlineButton, superClass);\n\n  function UnderlineButton() {\n    return UnderlineButton.__super__.constructor.apply(this, arguments);\n  }\n\n  UnderlineButton.prototype.name = 'underline';\n\n  UnderlineButton.prototype.icon = 'underline';\n\n  UnderlineButton.prototype.htmlTag = 'u';\n\n  UnderlineButton.prototype.disableTag = 'pre';\n\n  UnderlineButton.prototype.shortcut = 'cmd+u';\n\n  UnderlineButton.prototype.render = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + u )';\n    } else {\n      this.title = this.title + ' ( Ctrl + u )';\n      this.shortcut = 'ctrl+u';\n    }\n    return UnderlineButton.__super__.render.call(this);\n  };\n\n  UnderlineButton.prototype._activeStatus = function() {\n    var active;\n    active = document.queryCommandState('underline') === true;\n    this.setActive(active);\n    return this.active;\n  };\n\n  UnderlineButton.prototype.command = function() {\n    document.execCommand('underline');\n    if (!this.editor.util.support.oninput) {\n      this.editor.trigger('valuechanged');\n    }\n    return $(document).trigger('selectionchange');\n  };\n\n  return UnderlineButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(UnderlineButton);\n\nColorButton = (function(superClass) {\n  extend(ColorButton, superClass);\n\n  function ColorButton() {\n    return ColorButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ColorButton.prototype.name = 'color';\n\n  ColorButton.prototype.icon = 'tint';\n\n  ColorButton.prototype.disableTag = 'pre';\n\n  ColorButton.prototype.menu = true;\n\n  ColorButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    return ColorButton.__super__.render.apply(this, args);\n  };\n\n  ColorButton.prototype.renderMenu = function() {\n    $('<ul class=\"color-list\">\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-1\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-2\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-3\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-4\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-5\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-6\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-7\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-default\"></a></li>\\n</ul>').appendTo(this.menuWrapper);\n    this.menuWrapper.on('mousedown', '.color-list', function(e) {\n      return false;\n    });\n    return this.menuWrapper.on('click', '.font-color', (function(_this) {\n      return function(e) {\n        var $link, $p, hex, range, rgb, textNode;\n        _this.wrapper.removeClass('menu-on');\n        $link = $(e.currentTarget);\n        if ($link.hasClass('font-color-default')) {\n          $p = _this.editor.body.find('p, li');\n          if (!($p.length > 0)) {\n            return;\n          }\n          rgb = window.getComputedStyle($p[0], null).getPropertyValue('color');\n          hex = _this._convertRgbToHex(rgb);\n        } else {\n          rgb = window.getComputedStyle($link[0], null).getPropertyValue('background-color');\n          hex = _this._convertRgbToHex(rgb);\n        }\n        if (!hex) {\n          return;\n        }\n        range = _this.editor.selection.range();\n        if (!$link.hasClass('font-color-default') && range.collapsed) {\n          textNode = document.createTextNode(_this._t('coloredText'));\n          range.insertNode(textNode);\n          range.selectNodeContents(textNode);\n        }\n        _this.editor.selection.range(range);\n        document.execCommand('styleWithCSS', false, true);\n        document.execCommand('foreColor', false, hex);\n        document.execCommand('styleWithCSS', false, false);\n        if (!_this.editor.util.support.oninput) {\n          return _this.editor.trigger('valuechanged');\n        }\n      };\n    })(this));\n  };\n\n  ColorButton.prototype._convertRgbToHex = function(rgb) {\n    var match, re, rgbToHex;\n    re = /rgb\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/g;\n    match = re.exec(rgb);\n    if (!match) {\n      return '';\n    }\n    rgbToHex = function(r, g, b) {\n      var componentToHex;\n      componentToHex = function(c) {\n        var hex;\n        hex = c.toString(16);\n        if (hex.length === 1) {\n          return '0' + hex;\n        } else {\n          return hex;\n        }\n      };\n      return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n    };\n    return rgbToHex(match[1] * 1, match[2] * 1, match[3] * 1);\n  };\n\n  return ColorButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(ColorButton);\n\nListButton = (function(superClass) {\n  extend(ListButton, superClass);\n\n  function ListButton() {\n    return ListButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ListButton.prototype.type = '';\n\n  ListButton.prototype.disableTag = 'pre, table';\n\n  ListButton.prototype.command = function(param) {\n    var $list, $rootNodes, anotherType;\n    $rootNodes = this.editor.selection.blockNodes();\n    anotherType = this.type === 'ul' ? 'ol' : 'ul';\n    this.editor.selection.save();\n    $list = null;\n    $rootNodes.each((function(_this) {\n      return function(i, node) {\n        var $node;\n        $node = $(node);\n        if ($node.is('blockquote, li') || $node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node) || !$.contains(document, node)) {\n          return;\n        }\n        if ($node.is(_this.type)) {\n          $node.children('li').each(function(i, li) {\n            var $childList, $li;\n            $li = $(li);\n            $childList = $li.children('ul, ol').insertAfter($node);\n            return $('<p/>').append($(li).html() || _this.editor.util.phBr).insertBefore($node);\n          });\n          return $node.remove();\n        } else if ($node.is(anotherType)) {\n          return $('<' + _this.type + '/>').append($node.contents()).replaceAll($node);\n        } else if ($list && $node.prev().is($list)) {\n          $('<li/>').append($node.html() || _this.editor.util.phBr).appendTo($list);\n          return $node.remove();\n        } else {\n          $list = $(\"<\" + _this.type + \"><li></li></\" + _this.type + \">\");\n          $list.find('li').append($node.html() || _this.editor.util.phBr);\n          return $list.replaceAll($node);\n        }\n      };\n    })(this));\n    this.editor.selection.restore();\n    return this.editor.trigger('valuechanged');\n  };\n\n  return ListButton;\n\n})(Button);\n\nOrderListButton = (function(superClass) {\n  extend(OrderListButton, superClass);\n\n  function OrderListButton() {\n    return OrderListButton.__super__.constructor.apply(this, arguments);\n  }\n\n  OrderListButton.prototype.type = 'ol';\n\n  OrderListButton.prototype.name = 'ol';\n\n  OrderListButton.prototype.icon = 'list-ol';\n\n  OrderListButton.prototype.htmlTag = 'ol';\n\n  OrderListButton.prototype.shortcut = 'cmd+/';\n\n  OrderListButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + / )';\n    } else {\n      this.title = this.title + ' ( ctrl + / )';\n      this.shortcut = 'ctrl+/';\n    }\n    return OrderListButton.__super__._init.call(this);\n  };\n\n  return OrderListButton;\n\n})(ListButton);\n\nUnorderListButton = (function(superClass) {\n  extend(UnorderListButton, superClass);\n\n  function UnorderListButton() {\n    return UnorderListButton.__super__.constructor.apply(this, arguments);\n  }\n\n  UnorderListButton.prototype.type = 'ul';\n\n  UnorderListButton.prototype.name = 'ul';\n\n  UnorderListButton.prototype.icon = 'list-ul';\n\n  UnorderListButton.prototype.htmlTag = 'ul';\n\n  UnorderListButton.prototype.shortcut = 'cmd+.';\n\n  UnorderListButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + . )';\n    } else {\n      this.title = this.title + ' ( Ctrl + . )';\n      this.shortcut = 'ctrl+.';\n    }\n    return UnorderListButton.__super__._init.call(this);\n  };\n\n  return UnorderListButton;\n\n})(ListButton);\n\nSimditor.Toolbar.addButton(OrderListButton);\n\nSimditor.Toolbar.addButton(UnorderListButton);\n\nBlockquoteButton = (function(superClass) {\n  extend(BlockquoteButton, superClass);\n\n  function BlockquoteButton() {\n    return BlockquoteButton.__super__.constructor.apply(this, arguments);\n  }\n\n  BlockquoteButton.prototype.name = 'blockquote';\n\n  BlockquoteButton.prototype.icon = 'quote-left';\n\n  BlockquoteButton.prototype.htmlTag = 'blockquote';\n\n  BlockquoteButton.prototype.disableTag = 'pre, table';\n\n  BlockquoteButton.prototype.command = function() {\n    var $rootNodes, clearCache, nodeCache;\n    $rootNodes = this.editor.selection.rootNodes();\n    $rootNodes = $rootNodes.filter(function(i, node) {\n      return !$(node).parent().is('blockquote');\n    });\n    this.editor.selection.save();\n    nodeCache = [];\n    clearCache = (function(_this) {\n      return function() {\n        if (nodeCache.length > 0) {\n          $(\"<\" + _this.htmlTag + \"/>\").insertBefore(nodeCache[0]).append(nodeCache);\n          return nodeCache.length = 0;\n        }\n      };\n    })(this);\n    $rootNodes.each((function(_this) {\n      return function(i, node) {\n        var $node;\n        $node = $(node);\n        if (!$node.parent().is(_this.editor.body)) {\n          return;\n        }\n        if ($node.is(_this.htmlTag)) {\n          clearCache();\n          return $node.children().unwrap();\n        } else if ($node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node)) {\n          return clearCache();\n        } else {\n          return nodeCache.push(node);\n        }\n      };\n    })(this));\n    clearCache();\n    this.editor.selection.restore();\n    return this.editor.trigger('valuechanged');\n  };\n\n  return BlockquoteButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(BlockquoteButton);\n\nCodeButton = (function(superClass) {\n  extend(CodeButton, superClass);\n\n  function CodeButton() {\n    return CodeButton.__super__.constructor.apply(this, arguments);\n  }\n\n  CodeButton.prototype.name = 'code';\n\n  CodeButton.prototype.icon = 'code';\n\n  CodeButton.prototype.htmlTag = 'pre';\n\n  CodeButton.prototype.disableTag = 'ul, ol, table';\n\n  CodeButton.prototype._init = function() {\n    CodeButton.__super__._init.call(this);\n    this.editor.on('decorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('pre').each(function(i, pre) {\n          return _this.decorate($(pre));\n        });\n      };\n    })(this));\n    return this.editor.on('undecorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('pre').each(function(i, pre) {\n          return _this.undecorate($(pre));\n        });\n      };\n    })(this));\n  };\n\n  CodeButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    CodeButton.__super__.render.apply(this, args);\n    return this.popover = new CodePopover({\n      button: this\n    });\n  };\n\n  CodeButton.prototype._checkMode = function() {\n    var $blockNodes, range;\n    range = this.editor.selection.range();\n    if (($blockNodes = $(range.cloneContents()).find(this.editor.util.blockNodes.join(','))) > 0 || (range.collapsed && this.editor.selection.startNodes().filter('code').length === 0)) {\n      this.inlineMode = false;\n      return this.htmlTag = 'pre';\n    } else {\n      this.inlineMode = true;\n      return this.htmlTag = 'code';\n    }\n  };\n\n  CodeButton.prototype._status = function() {\n    this._checkMode();\n    CodeButton.__super__._status.call(this);\n    if (this.inlineMode) {\n      return;\n    }\n    if (this.active) {\n      return this.popover.show(this.node);\n    } else {\n      return this.popover.hide();\n    }\n  };\n\n  CodeButton.prototype.decorate = function($pre) {\n    var $code, lang, ref, ref1;\n    $code = $pre.find('> code');\n    if ($code.length > 0) {\n      lang = (ref = $code.attr('class')) != null ? (ref1 = ref.match(/lang-(\\S+)/)) != null ? ref1[1] : void 0 : void 0;\n      $code.contents().unwrap();\n      if (lang) {\n        return $pre.attr('data-lang', lang);\n      }\n    }\n  };\n\n  CodeButton.prototype.undecorate = function($pre) {\n    var $code, lang;\n    lang = $pre.attr('data-lang');\n    $code = $('<code/>');\n    if (lang && lang !== -1) {\n      $code.addClass('lang-' + lang);\n    }\n    return $pre.wrapInner($code).removeAttr('data-lang');\n  };\n\n  CodeButton.prototype.command = function() {\n    if (this.inlineMode) {\n      return this._inlineCommand();\n    } else {\n      return this._blockCommand();\n    }\n  };\n\n  CodeButton.prototype._blockCommand = function() {\n    var $rootNodes, clearCache, nodeCache, resultNodes;\n    $rootNodes = this.editor.selection.rootNodes();\n    nodeCache = [];\n    resultNodes = [];\n    clearCache = (function(_this) {\n      return function() {\n        var $pre;\n        if (!(nodeCache.length > 0)) {\n          return;\n        }\n        $pre = $(\"<\" + _this.htmlTag + \"/>\").insertBefore(nodeCache[0]).text(_this.editor.formatter.clearHtml(nodeCache));\n        resultNodes.push($pre[0]);\n        return nodeCache.length = 0;\n      };\n    })(this);\n    $rootNodes.each((function(_this) {\n      return function(i, node) {\n        var $node, $p;\n        $node = $(node);\n        if ($node.is(_this.htmlTag)) {\n          clearCache();\n          $p = $('<p/>').append($node.html().replace('\\n', '<br/>')).replaceAll($node);\n          return resultNodes.push($p[0]);\n        } else if ($node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node) || $node.is('blockquote')) {\n          return clearCache();\n        } else {\n          return nodeCache.push(node);\n        }\n      };\n    })(this));\n    clearCache();\n    this.editor.selection.setRangeAtEndOf($(resultNodes).last());\n    return this.editor.trigger('valuechanged');\n  };\n\n  CodeButton.prototype._inlineCommand = function() {\n    var $code, $contents, range;\n    range = this.editor.selection.range();\n    if (this.active) {\n      range.selectNodeContents(this.node[0]);\n      this.editor.selection.save(range);\n      this.node.contents().unwrap();\n      this.editor.selection.restore();\n    } else {\n      $contents = $(range.extractContents());\n      $code = $(\"<\" + this.htmlTag + \"/>\").append($contents.contents());\n      range.insertNode($code[0]);\n      range.selectNodeContents($code[0]);\n      this.editor.selection.range(range);\n    }\n    return this.editor.trigger('valuechanged');\n  };\n\n  return CodeButton;\n\n})(Button);\n\nCodePopover = (function(superClass) {\n  extend(CodePopover, superClass);\n\n  function CodePopover() {\n    return CodePopover.__super__.constructor.apply(this, arguments);\n  }\n\n  CodePopover.prototype.render = function() {\n    var $option, k, lang, len, ref;\n    this._tpl = \"<div class=\\\"code-settings\\\">\\n  <div class=\\\"settings-field\\\">\\n    <select class=\\\"select-lang\\\">\\n      <option value=\\\"-1\\\">\" + (this._t('selectLanguage')) + \"</option>\\n    </select>\\n  </div>\\n</div>\";\n    this.langs = this.editor.opts.codeLanguages || [\n      {\n        name: 'Bash',\n        value: 'bash'\n      }, {\n        name: 'C++',\n        value: 'c++'\n      }, {\n        name: 'C#',\n        value: 'cs'\n      }, {\n        name: 'CSS',\n        value: 'css'\n      }, {\n        name: 'Erlang',\n        value: 'erlang'\n      }, {\n        name: 'Less',\n        value: 'less'\n      }, {\n        name: 'Sass',\n        value: 'sass'\n      }, {\n        name: 'Diff',\n        value: 'diff'\n      }, {\n        name: 'CoffeeScript',\n        value: 'coffeescript'\n      }, {\n        name: 'HTML,XML',\n        value: 'html'\n      }, {\n        name: 'JSON',\n        value: 'json'\n      }, {\n        name: 'Java',\n        value: 'java'\n      }, {\n        name: 'JavaScript',\n        value: 'js'\n      }, {\n        name: 'Markdown',\n        value: 'markdown'\n      }, {\n        name: 'Objective C',\n        value: 'oc'\n      }, {\n        name: 'PHP',\n        value: 'php'\n      }, {\n        name: 'Perl',\n        value: 'parl'\n      }, {\n        name: 'Python',\n        value: 'python'\n      }, {\n        name: 'Ruby',\n        value: 'ruby'\n      }, {\n        name: 'SQL',\n        value: 'sql'\n      }\n    ];\n    this.el.addClass('code-popover').append(this._tpl);\n    this.selectEl = this.el.find('.select-lang');\n    ref = this.langs;\n    for (k = 0, len = ref.length; k < len; k++) {\n      lang = ref[k];\n      $option = $('<option/>', {\n        text: lang.name,\n        value: lang.value\n      }).appendTo(this.selectEl);\n    }\n    this.selectEl.on('change', (function(_this) {\n      return function(e) {\n        var selected;\n        _this.lang = _this.selectEl.val();\n        selected = _this.target.hasClass('selected');\n        _this.target.removeClass().removeAttr('data-lang');\n        if (_this.lang !== -1) {\n          _this.target.attr('data-lang', _this.lang);\n        }\n        if (selected) {\n          _this.target.addClass('selected');\n        }\n        return _this.editor.trigger('valuechanged');\n      };\n    })(this));\n    return this.editor.on('valuechanged', (function(_this) {\n      return function(e) {\n        if (_this.active) {\n          return _this.refresh();\n        }\n      };\n    })(this));\n  };\n\n  CodePopover.prototype.show = function() {\n    var args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    CodePopover.__super__.show.apply(this, args);\n    this.lang = this.target.attr('data-lang');\n    if (this.lang != null) {\n      return this.selectEl.val(this.lang);\n    } else {\n      return this.selectEl.val(-1);\n    }\n  };\n\n  return CodePopover;\n\n})(Popover);\n\nSimditor.Toolbar.addButton(CodeButton);\n\nLinkButton = (function(superClass) {\n  extend(LinkButton, superClass);\n\n  function LinkButton() {\n    return LinkButton.__super__.constructor.apply(this, arguments);\n  }\n\n  LinkButton.prototype.name = 'link';\n\n  LinkButton.prototype.icon = 'link';\n\n  LinkButton.prototype.htmlTag = 'a';\n\n  LinkButton.prototype.disableTag = 'pre';\n\n  LinkButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    LinkButton.__super__.render.apply(this, args);\n    return this.popover = new LinkPopover({\n      button: this\n    });\n  };\n\n  LinkButton.prototype._status = function() {\n    LinkButton.__super__._status.call(this);\n    if (this.active && !this.editor.selection.rangeAtEndOf(this.node)) {\n      return this.popover.show(this.node);\n    } else {\n      return this.popover.hide();\n    }\n  };\n\n  LinkButton.prototype.command = function() {\n    var $contents, $link, $newBlock, linkText, range, txtNode;\n    range = this.editor.selection.range();\n    if (this.active) {\n      txtNode = document.createTextNode(this.node.text());\n      this.node.replaceWith(txtNode);\n      range.selectNode(txtNode);\n    } else {\n      $contents = $(range.extractContents());\n      linkText = this.editor.formatter.clearHtml($contents.contents(), false);\n      $link = $('<a/>', {\n        href: '',\n        target: '_blank',\n        text: linkText || this._t('linkText')\n      });\n      if (this.editor.selection.blockNodes().length > 0) {\n        range.insertNode($link[0]);\n      } else {\n        $newBlock = $('<p/>').append($link);\n        range.insertNode($newBlock[0]);\n      }\n      range.selectNodeContents($link[0]);\n      this.popover.one('popovershow', (function(_this) {\n        return function() {\n          if (linkText) {\n            _this.popover.urlEl.focus();\n            return _this.popover.urlEl[0].select();\n          } else {\n            _this.popover.textEl.focus();\n            return _this.popover.textEl[0].select();\n          }\n        };\n      })(this));\n    }\n    this.editor.selection.range(range);\n    return this.editor.trigger('valuechanged');\n  };\n\n  return LinkButton;\n\n})(Button);\n\nLinkPopover = (function(superClass) {\n  extend(LinkPopover, superClass);\n\n  function LinkPopover() {\n    return LinkPopover.__super__.constructor.apply(this, arguments);\n  }\n\n  LinkPopover.prototype.render = function() {\n    var tpl;\n    tpl = \"<div class=\\\"link-settings\\\">\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('linkText')) + \"</label>\\n    <input class=\\\"link-text\\\" type=\\\"text\\\"/>\\n    <a class=\\\"btn-unlink\\\" href=\\\"javascript:;\\\" title=\\\"\" + (this._t('removeLink')) + \"\\\"\\n      tabindex=\\\"-1\\\">\\n      <span class=\\\"simditor-icon simditor-icon-unlink\\\"></span>\\n    </a>\\n  </div>\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('linkUrl')) + \"</label>\\n    <input class=\\\"link-url\\\" type=\\\"text\\\"/>\\n  </div>\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('linkTarget')) + \"</label>\\n    <select class=\\\"link-target\\\">\\n      <option value=\\\"_blank\\\">\" + (this._t('openLinkInNewWindow')) + \" (_blank)</option>\\n      <option value=\\\"_self\\\">\" + (this._t('openLinkInCurrentWindow')) + \" (_self)</option>\\n    </select>\\n  </div>\\n</div>\";\n    this.el.addClass('link-popover').append(tpl);\n    this.textEl = this.el.find('.link-text');\n    this.urlEl = this.el.find('.link-url');\n    this.unlinkEl = this.el.find('.btn-unlink');\n    this.selectTarget = this.el.find('.link-target');\n    this.textEl.on('keyup', (function(_this) {\n      return function(e) {\n        if (e.which === 13) {\n          return;\n        }\n        _this.target.text(_this.textEl.val());\n        return _this.editor.inputManager.throttledValueChanged();\n      };\n    })(this));\n    this.urlEl.on('keyup', (function(_this) {\n      return function(e) {\n        var val;\n        if (e.which === 13) {\n          return;\n        }\n        val = _this.urlEl.val();\n        if (!(/^(http|https|ftp|ftps|file)?:\\/\\/|^(mailto|tel)?:|^\\//ig.test(val) || !val)) {\n          val = 'http://' + val;\n        }\n        _this.target.attr('href', val);\n        return _this.editor.inputManager.throttledValueChanged();\n      };\n    })(this));\n    $([this.urlEl[0], this.textEl[0]]).on('keydown', (function(_this) {\n      return function(e) {\n        var range;\n        if (e.which === 13 || e.which === 27 || (!e.shiftKey && e.which === 9 && $(e.target).hasClass('link-url'))) {\n          e.preventDefault();\n          range = document.createRange();\n          _this.editor.selection.setRangeAfter(_this.target, range);\n          _this.hide();\n          return _this.editor.inputManager.throttledValueChanged();\n        }\n      };\n    })(this));\n    this.unlinkEl.on('click', (function(_this) {\n      return function(e) {\n        var range, txtNode;\n        txtNode = document.createTextNode(_this.target.text());\n        _this.target.replaceWith(txtNode);\n        _this.hide();\n        range = document.createRange();\n        _this.editor.selection.setRangeAfter(txtNode, range);\n        return _this.editor.inputManager.throttledValueChanged();\n      };\n    })(this));\n    return this.selectTarget.on('change', (function(_this) {\n      return function(e) {\n        _this.target.attr('target', _this.selectTarget.val());\n        return _this.editor.inputManager.throttledValueChanged();\n      };\n    })(this));\n  };\n\n  LinkPopover.prototype.show = function() {\n    var args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    LinkPopover.__super__.show.apply(this, args);\n    this.textEl.val(this.target.text());\n    return this.urlEl.val(this.target.attr('href'));\n  };\n\n  return LinkPopover;\n\n})(Popover);\n\nSimditor.Toolbar.addButton(LinkButton);\n\nImageButton = (function(superClass) {\n  extend(ImageButton, superClass);\n\n  function ImageButton() {\n    return ImageButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ImageButton.prototype.name = 'image';\n\n  ImageButton.prototype.icon = 'picture-o';\n\n  ImageButton.prototype.htmlTag = 'img';\n\n  ImageButton.prototype.disableTag = 'pre, table';\n\n  ImageButton.prototype.defaultImage = '';\n\n  ImageButton.prototype.needFocus = false;\n\n  ImageButton.prototype._init = function() {\n    var item, k, len, ref;\n    if (this.editor.opts.imageButton) {\n      if (Array.isArray(this.editor.opts.imageButton)) {\n        this.menu = [];\n        ref = this.editor.opts.imageButton;\n        for (k = 0, len = ref.length; k < len; k++) {\n          item = ref[k];\n          this.menu.push({\n            name: item + '-image',\n            text: this._t(item + 'Image')\n          });\n        }\n      } else {\n        this.menu = false;\n      }\n    } else {\n      if (this.editor.uploader != null) {\n        this.menu = [\n          {\n            name: 'upload-image',\n            text: this._t('uploadImage')\n          }, {\n            name: 'external-image',\n            text: this._t('externalImage')\n          }\n        ];\n      } else {\n        this.menu = false;\n      }\n    }\n    this.defaultImage = this.editor.opts.defaultImage;\n    this.editor.body.on('click', 'img:not([data-non-image])', (function(_this) {\n      return function(e) {\n        var $img, range;\n        $img = $(e.currentTarget);\n        range = document.createRange();\n        range.selectNode($img[0]);\n        _this.editor.selection.range(range);\n        if (!_this.editor.util.support.onselectionchange) {\n          _this.editor.trigger('selectionchanged');\n        }\n        return false;\n      };\n    })(this));\n    this.editor.body.on('mouseup', 'img:not([data-non-image])', function(e) {\n      return false;\n    });\n    this.editor.on('selectionchanged.image', (function(_this) {\n      return function() {\n        var $contents, $img, range;\n        range = _this.editor.selection.range();\n        if (range == null) {\n          return;\n        }\n        $contents = $(range.cloneContents()).contents();\n        if ($contents.length === 1 && $contents.is('img:not([data-non-image])')) {\n          $img = $(range.startContainer).contents().eq(range.startOffset);\n          return _this.popover.show($img);\n        } else {\n          return _this.popover.hide();\n        }\n      };\n    })(this));\n    this.editor.on('valuechanged.image', (function(_this) {\n      return function() {\n        var $masks;\n        $masks = _this.editor.wrapper.find('.simditor-image-loading');\n        if (!($masks.length > 0)) {\n          return;\n        }\n        return $masks.each(function(i, mask) {\n          var $img, $mask, file;\n          $mask = $(mask);\n          $img = $mask.data('img');\n          if (!($img && $img.parent().length > 0)) {\n            $mask.remove();\n            if ($img) {\n              file = $img.data('file');\n              if (file) {\n                _this.editor.uploader.cancel(file);\n                if (_this.editor.body.find('img.uploading').length < 1) {\n                  return _this.editor.uploader.trigger('uploadready', [file]);\n                }\n              }\n            }\n          }\n        });\n      };\n    })(this));\n    return ImageButton.__super__._init.call(this);\n  };\n\n  ImageButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    ImageButton.__super__.render.apply(this, args);\n    this.popover = new ImagePopover({\n      button: this\n    });\n    if (this.editor.opts.imageButton === 'upload') {\n      return this._initUploader(this.el);\n    }\n  };\n\n  ImageButton.prototype.renderMenu = function() {\n    ImageButton.__super__.renderMenu.call(this);\n    return this._initUploader();\n  };\n\n  ImageButton.prototype._initUploader = function($uploadItem) {\n    var $input, createInput, uploadProgress;\n    if ($uploadItem == null) {\n      $uploadItem = this.menuEl.find('.menu-item-upload-image');\n    }\n    if (this.editor.uploader == null) {\n      this.el.find('.btn-upload').remove();\n      return;\n    }\n    $input = null;\n    createInput = (function(_this) {\n      return function() {\n        if ($input) {\n          $input.remove();\n        }\n        return $input = $('<input/>', {\n          type: 'file',\n          title: _this._t('uploadImage'),\n          multiple: true,\n          accept: 'image/gif,image/jpeg,image/jpg,image/png,image/svg'\n        }).appendTo($uploadItem);\n      };\n    })(this);\n    createInput();\n    $uploadItem.on('click mousedown', 'input[type=file]', function(e) {\n      return e.stopPropagation();\n    });\n    $uploadItem.on('change', 'input[type=file]', (function(_this) {\n      return function(e) {\n        if (_this.editor.inputManager.focused) {\n          _this.editor.uploader.upload($input, {\n            inline: true\n          });\n          createInput();\n        } else {\n          _this.editor.one('focus', function(e) {\n            _this.editor.uploader.upload($input, {\n              inline: true\n            });\n            return createInput();\n          });\n          _this.editor.focus();\n        }\n        return _this.wrapper.removeClass('menu-on');\n      };\n    })(this));\n    this.editor.uploader.on('beforeupload', (function(_this) {\n      return function(e, file) {\n        var $img;\n        if (!file.inline) {\n          return;\n        }\n        if (file.img) {\n          $img = $(file.img);\n        } else {\n          $img = _this.createImage(file.name);\n          file.img = $img;\n        }\n        $img.addClass('uploading');\n        $img.data('file', file);\n        return _this.editor.uploader.readImageFile(file.obj, function(img) {\n          var src;\n          if (!$img.hasClass('uploading')) {\n            return;\n          }\n          src = img ? img.src : _this.defaultImage;\n          return _this.loadImage($img, src, function() {\n            if (_this.popover.active) {\n              _this.popover.refresh();\n              return _this.popover.srcEl.val(_this._t('uploading')).prop('disabled', true);\n            }\n          });\n        });\n      };\n    })(this));\n    uploadProgress = $.proxy(this.editor.util.throttle(function(e, file, loaded, total) {\n      var $img, $mask, percent;\n      if (!file.inline) {\n        return;\n      }\n      $mask = file.img.data('mask');\n      if (!$mask) {\n        return;\n      }\n      $img = $mask.data('img');\n      if (!($img && $img.hasClass('uploading') && $img.parent().length > 0)) {\n        $mask.remove();\n        return;\n      }\n      percent = loaded / total;\n      percent = (percent * 100).toFixed(0);\n      if (percent > 99) {\n        percent = 99;\n      }\n      return $mask.find('.progress').height((100 - percent) + \"%\");\n    }, 500), this);\n    this.editor.uploader.on('uploadprogress', uploadProgress);\n    this.editor.uploader.on('uploadsuccess', (function(_this) {\n      return function(e, file, result) {\n        var $img, img_path, msg;\n        if (!file.inline) {\n          return;\n        }\n        $img = file.img;\n        if (!($img.hasClass('uploading') && $img.parent().length > 0)) {\n          return;\n        }\n        if (typeof result !== 'object') {\n          try {\n            result = $.parseJSON(result);\n          } catch (_error) {\n            e = _error;\n            result = {\n              success: false\n            };\n          }\n        }\n        if (result.success === false) {\n          msg = result.msg || _this._t('uploadFailed');\n          alert(msg);\n          img_path = _this.defaultImage;\n        } else {\n          img_path = result.file_path;\n        }\n        _this.loadImage($img, img_path, function() {\n          var $mask;\n          $img.removeData('file');\n          $img.removeClass('uploading').removeClass('loading');\n          $mask = $img.data('mask');\n          if ($mask) {\n            $mask.remove();\n          }\n          $img.removeData('mask');\n          _this.editor.trigger('valuechanged');\n          if (_this.editor.body.find('img.uploading').length < 1) {\n            return _this.editor.uploader.trigger('uploadready', [file, result]);\n          }\n        });\n        if (_this.popover.active) {\n          _this.popover.srcEl.prop('disabled', false);\n          return _this.popover.srcEl.val(result.file_path);\n        }\n      };\n    })(this));\n    return this.editor.uploader.on('uploaderror', (function(_this) {\n      return function(e, file, xhr) {\n        var $img, msg, result;\n        if (!file.inline) {\n          return;\n        }\n        if (xhr.statusText === 'abort') {\n          return;\n        }\n        if (xhr.responseText) {\n          try {\n            result = $.parseJSON(xhr.responseText);\n            msg = result.msg;\n          } catch (_error) {\n            e = _error;\n            msg = _this._t('uploadError');\n          }\n        }\n        $img = file.img;\n        if (!($img.hasClass('uploading') && $img.parent().length > 0)) {\n          return;\n        }\n        _this.loadImage($img, _this.defaultImage, function() {\n          var $mask;\n          $img.removeData('file');\n          $img.removeClass('uploading').removeClass('loading');\n          $mask = $img.data('mask');\n          if ($mask) {\n            $mask.remove();\n          }\n          return $img.removeData('mask');\n        });\n        if (_this.popover.active) {\n          _this.popover.srcEl.prop('disabled', false);\n          _this.popover.srcEl.val(_this.defaultImage);\n        }\n        _this.editor.trigger('valuechanged');\n        if (_this.editor.body.find('img.uploading').length < 1) {\n          return _this.editor.uploader.trigger('uploadready', [file, result]);\n        }\n      };\n    })(this));\n  };\n\n  ImageButton.prototype._status = function() {\n    return this._disableStatus();\n  };\n\n  ImageButton.prototype.loadImage = function($img, src, callback) {\n    var $mask, img, positionMask;\n    positionMask = (function(_this) {\n      return function() {\n        var imgOffset, wrapperOffset;\n        imgOffset = $img.offset();\n        wrapperOffset = _this.editor.wrapper.offset();\n        return $mask.css({\n          top: imgOffset.top - wrapperOffset.top,\n          left: imgOffset.left - wrapperOffset.left,\n          width: $img.width(),\n          height: $img.height()\n        }).show();\n      };\n    })(this);\n    $img.addClass('loading');\n    $mask = $img.data('mask');\n    if (!$mask) {\n      $mask = $('<div class=\"simditor-image-loading\">\\n  <div class=\"progress\"></div>\\n</div>').hide().appendTo(this.editor.wrapper);\n      positionMask();\n      $img.data('mask', $mask);\n      $mask.data('img', $img);\n    }\n    img = new Image();\n    img.onload = (function(_this) {\n      return function() {\n        var height, width;\n        if (!$img.hasClass('loading') && !$img.hasClass('uploading')) {\n          return;\n        }\n        width = img.width;\n        height = img.height;\n        $img.attr({\n          src: src,\n          width: width,\n          height: height,\n          'data-image-size': width + ',' + height\n        }).removeClass('loading');\n        if ($img.hasClass('uploading')) {\n          _this.editor.util.reflow(_this.editor.body);\n          positionMask();\n        } else {\n          $mask.remove();\n          $img.removeData('mask');\n        }\n        if ($.isFunction(callback)) {\n          return callback(img);\n        }\n      };\n    })(this);\n    img.onerror = function() {\n      if ($.isFunction(callback)) {\n        callback(false);\n      }\n      $mask.remove();\n      return $img.removeData('mask').removeClass('loading');\n    };\n    return img.setAttribute('src', src);\n  };\n\n  ImageButton.prototype.createImage = function(name) {\n    var $img, range;\n    if (name == null) {\n      name = 'Image';\n    }\n    if (!this.editor.inputManager.focused) {\n      this.editor.focus();\n    }\n    range = this.editor.selection.range();\n    range.deleteContents();\n    this.editor.selection.range(range);\n    $img = $('<img/>').attr('alt', name);\n    range.insertNode($img[0]);\n    this.editor.selection.setRangeAfter($img, range);\n    this.editor.trigger('valuechanged');\n    return $img;\n  };\n\n  ImageButton.prototype.command = function(src) {\n    var $img;\n    $img = this.createImage();\n    return this.loadImage($img, src || this.defaultImage, (function(_this) {\n      return function() {\n        _this.editor.trigger('valuechanged');\n        _this.editor.util.reflow($img);\n        $img.click();\n        return _this.popover.one('popovershow', function() {\n          _this.popover.srcEl.focus();\n          return _this.popover.srcEl[0].select();\n        });\n      };\n    })(this));\n  };\n\n  return ImageButton;\n\n})(Button);\n\nImagePopover = (function(superClass) {\n  extend(ImagePopover, superClass);\n\n  function ImagePopover() {\n    return ImagePopover.__super__.constructor.apply(this, arguments);\n  }\n\n  ImagePopover.prototype.offset = {\n    top: 6,\n    left: -4\n  };\n\n  ImagePopover.prototype.render = function() {\n    var tpl;\n    tpl = \"<div class=\\\"link-settings\\\">\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('imageUrl')) + \"</label>\\n    <input class=\\\"image-src\\\" type=\\\"text\\\" tabindex=\\\"1\\\" />\\n    <a class=\\\"btn-upload\\\" href=\\\"javascript:;\\\"\\n      title=\\\"\" + (this._t('uploadImage')) + \"\\\" tabindex=\\\"-1\\\">\\n      <span class=\\\"simditor-icon simditor-icon-upload\\\"></span>\\n    </a>\\n  </div>\\n  <div class='settings-field'>\\n    <label>\" + (this._t('imageAlt')) + \"</label>\\n    <input class=\\\"image-alt\\\" id=\\\"image-alt\\\" type=\\\"text\\\" tabindex=\\\"1\\\" />\\n  </div>\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('imageSize')) + \"</label>\\n    <input class=\\\"image-size\\\" id=\\\"image-width\\\" type=\\\"text\\\" tabindex=\\\"2\\\" />\\n    <span class=\\\"times\\\">×</span>\\n    <input class=\\\"image-size\\\" id=\\\"image-height\\\" type=\\\"text\\\" tabindex=\\\"3\\\" />\\n    <a class=\\\"btn-restore\\\" href=\\\"javascript:;\\\"\\n      title=\\\"\" + (this._t('restoreImageSize')) + \"\\\" tabindex=\\\"-1\\\">\\n      <span class=\\\"simditor-icon simditor-icon-undo\\\"></span>\\n    </a>\\n  </div>\\n</div>\";\n    this.el.addClass('image-popover').append(tpl);\n    this.srcEl = this.el.find('.image-src');\n    this.widthEl = this.el.find('#image-width');\n    this.heightEl = this.el.find('#image-height');\n    this.altEl = this.el.find('#image-alt');\n    this.srcEl.on('keydown', (function(_this) {\n      return function(e) {\n        var range;\n        if (!(e.which === 13 && !_this.target.hasClass('uploading'))) {\n          return;\n        }\n        e.preventDefault();\n        range = document.createRange();\n        _this.button.editor.selection.setRangeAfter(_this.target, range);\n        return _this.hide();\n      };\n    })(this));\n    this.srcEl.on('blur', (function(_this) {\n      return function(e) {\n        return _this._loadImage(_this.srcEl.val());\n      };\n    })(this));\n    this.el.find('.image-size').on('blur', (function(_this) {\n      return function(e) {\n        _this._resizeImg($(e.currentTarget));\n        return _this.el.data('popover').refresh();\n      };\n    })(this));\n    this.el.find('.image-size').on('keyup', (function(_this) {\n      return function(e) {\n        var inputEl;\n        inputEl = $(e.currentTarget);\n        if (!(e.which === 13 || e.which === 27 || e.which === 9)) {\n          return _this._resizeImg(inputEl, true);\n        }\n      };\n    })(this));\n    this.el.find('.image-size').on('keydown', (function(_this) {\n      return function(e) {\n        var $img, inputEl, range;\n        inputEl = $(e.currentTarget);\n        if (e.which === 13 || e.which === 27) {\n          e.preventDefault();\n          if (e.which === 13) {\n            _this._resizeImg(inputEl);\n          } else {\n            _this._restoreImg();\n          }\n          $img = _this.target;\n          _this.hide();\n          range = document.createRange();\n          return _this.button.editor.selection.setRangeAfter($img, range);\n        } else if (e.which === 9) {\n          return _this.el.data('popover').refresh();\n        }\n      };\n    })(this));\n    this.altEl.on('keydown', (function(_this) {\n      return function(e) {\n        var range;\n        if (e.which === 13) {\n          e.preventDefault();\n          range = document.createRange();\n          _this.button.editor.selection.setRangeAfter(_this.target, range);\n          return _this.hide();\n        }\n      };\n    })(this));\n    this.altEl.on('keyup', (function(_this) {\n      return function(e) {\n        if (e.which === 13 || e.which === 27 || e.which === 9) {\n          return;\n        }\n        _this.alt = _this.altEl.val();\n        return _this.target.attr('alt', _this.alt);\n      };\n    })(this));\n    this.el.find('.btn-restore').on('click', (function(_this) {\n      return function(e) {\n        _this._restoreImg();\n        return _this.el.data('popover').refresh();\n      };\n    })(this));\n    this.editor.on('valuechanged', (function(_this) {\n      return function(e) {\n        if (_this.active) {\n          return _this.refresh();\n        }\n      };\n    })(this));\n    return this._initUploader();\n  };\n\n  ImagePopover.prototype._initUploader = function() {\n    var $uploadBtn, createInput;\n    $uploadBtn = this.el.find('.btn-upload');\n    if (this.editor.uploader == null) {\n      $uploadBtn.remove();\n      return;\n    }\n    createInput = (function(_this) {\n      return function() {\n        if (_this.input) {\n          _this.input.remove();\n        }\n        return _this.input = $('<input/>', {\n          type: 'file',\n          title: _this._t('uploadImage'),\n          multiple: true,\n          accept: 'image/gif,image/jpeg,image/jpg,image/png,image/svg'\n        }).appendTo($uploadBtn);\n      };\n    })(this);\n    createInput();\n    this.el.on('click mousedown', 'input[type=file]', function(e) {\n      return e.stopPropagation();\n    });\n    return this.el.on('change', 'input[type=file]', (function(_this) {\n      return function(e) {\n        _this.editor.uploader.upload(_this.input, {\n          inline: true,\n          img: _this.target\n        });\n        return createInput();\n      };\n    })(this));\n  };\n\n  ImagePopover.prototype._resizeImg = function(inputEl, onlySetVal) {\n    var height, value, width;\n    if (onlySetVal == null) {\n      onlySetVal = false;\n    }\n    value = inputEl.val() * 1;\n    if (!(this.target && ($.isNumeric(value) || value < 0))) {\n      return;\n    }\n    if (inputEl.is(this.widthEl)) {\n      width = value;\n      height = this.height * value / this.width;\n      this.heightEl.val(height);\n    } else {\n      height = value;\n      width = this.width * value / this.height;\n      this.widthEl.val(width);\n    }\n    if (!onlySetVal) {\n      this.target.attr({\n        width: width,\n        height: height\n      });\n      return this.editor.trigger('valuechanged');\n    }\n  };\n\n  ImagePopover.prototype._restoreImg = function() {\n    var ref, size;\n    size = ((ref = this.target.data('image-size')) != null ? ref.split(\",\") : void 0) || [this.width, this.height];\n    this.target.attr({\n      width: size[0] * 1,\n      height: size[1] * 1\n    });\n    this.widthEl.val(size[0]);\n    this.heightEl.val(size[1]);\n    return this.editor.trigger('valuechanged');\n  };\n\n  ImagePopover.prototype._loadImage = function(src, callback) {\n    if (/^data:image/.test(src) && !this.editor.uploader) {\n      if (callback) {\n        callback(false);\n      }\n      return;\n    }\n    if (this.target.attr('src') === src) {\n      return;\n    }\n    return this.button.loadImage(this.target, src, (function(_this) {\n      return function(img) {\n        var blob;\n        if (!img) {\n          return;\n        }\n        if (_this.active) {\n          _this.width = img.width;\n          _this.height = img.height;\n          _this.widthEl.val(_this.width);\n          _this.heightEl.val(_this.height);\n        }\n        if (/^data:image/.test(src)) {\n          blob = _this.editor.util.dataURLtoBlob(src);\n          blob.name = \"Base64 Image.png\";\n          _this.editor.uploader.upload(blob, {\n            inline: true,\n            img: _this.target\n          });\n        } else {\n          _this.editor.trigger('valuechanged');\n        }\n        if (callback) {\n          return callback(img);\n        }\n      };\n    })(this));\n  };\n\n  ImagePopover.prototype.show = function() {\n    var $img, args;\n    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n    ImagePopover.__super__.show.apply(this, args);\n    $img = this.target;\n    this.width = $img.width();\n    this.height = $img.height();\n    this.alt = $img.attr('alt');\n    if ($img.hasClass('uploading')) {\n      return this.srcEl.val(this._t('uploading')).prop('disabled', true);\n    } else {\n      this.srcEl.val($img.attr('src')).prop('disabled', false);\n      this.widthEl.val(this.width);\n      this.heightEl.val(this.height);\n      return this.altEl.val(this.alt);\n    }\n  };\n\n  return ImagePopover;\n\n})(Popover);\n\nSimditor.Toolbar.addButton(ImageButton);\n\nIndentButton = (function(superClass) {\n  extend(IndentButton, superClass);\n\n  function IndentButton() {\n    return IndentButton.__super__.constructor.apply(this, arguments);\n  }\n\n  IndentButton.prototype.name = 'indent';\n\n  IndentButton.prototype.icon = 'indent';\n\n  IndentButton.prototype._init = function() {\n    var hotkey;\n    hotkey = this.editor.opts.tabIndent === false ? '' : ' (Tab)';\n    this.title = this._t(this.name) + hotkey;\n    return IndentButton.__super__._init.call(this);\n  };\n\n  IndentButton.prototype._status = function() {};\n\n  IndentButton.prototype.command = function() {\n    return this.editor.indentation.indent();\n  };\n\n  return IndentButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(IndentButton);\n\nOutdentButton = (function(superClass) {\n  extend(OutdentButton, superClass);\n\n  function OutdentButton() {\n    return OutdentButton.__super__.constructor.apply(this, arguments);\n  }\n\n  OutdentButton.prototype.name = 'outdent';\n\n  OutdentButton.prototype.icon = 'outdent';\n\n  OutdentButton.prototype._init = function() {\n    var hotkey;\n    hotkey = this.editor.opts.tabIndent === false ? '' : ' (Shift + Tab)';\n    this.title = this._t(this.name) + hotkey;\n    return OutdentButton.__super__._init.call(this);\n  };\n\n  OutdentButton.prototype._status = function() {};\n\n  OutdentButton.prototype.command = function() {\n    return this.editor.indentation.indent(true);\n  };\n\n  return OutdentButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(OutdentButton);\n\nHrButton = (function(superClass) {\n  extend(HrButton, superClass);\n\n  function HrButton() {\n    return HrButton.__super__.constructor.apply(this, arguments);\n  }\n\n  HrButton.prototype.name = 'hr';\n\n  HrButton.prototype.icon = 'minus';\n\n  HrButton.prototype.htmlTag = 'hr';\n\n  HrButton.prototype._status = function() {};\n\n  HrButton.prototype.command = function() {\n    var $hr, $newBlock, $nextBlock, $rootBlock;\n    $rootBlock = this.editor.selection.rootNodes().first();\n    $nextBlock = $rootBlock.next();\n    if ($nextBlock.length > 0) {\n      this.editor.selection.save();\n    } else {\n      $newBlock = $('<p/>').append(this.editor.util.phBr);\n    }\n    $hr = $('<hr/>').insertAfter($rootBlock);\n    if ($newBlock) {\n      $newBlock.insertAfter($hr);\n      this.editor.selection.setRangeAtStartOf($newBlock);\n    } else {\n      this.editor.selection.restore();\n    }\n    return this.editor.trigger('valuechanged');\n  };\n\n  return HrButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(HrButton);\n\nTableButton = (function(superClass) {\n  extend(TableButton, superClass);\n\n  function TableButton() {\n    return TableButton.__super__.constructor.apply(this, arguments);\n  }\n\n  TableButton.prototype.name = 'table';\n\n  TableButton.prototype.icon = 'table';\n\n  TableButton.prototype.htmlTag = 'table';\n\n  TableButton.prototype.disableTag = 'pre, li, blockquote';\n\n  TableButton.prototype.menu = true;\n\n  TableButton.prototype._init = function() {\n    TableButton.__super__._init.call(this);\n    $.merge(this.editor.formatter._allowedTags, ['thead', 'th', 'tbody', 'tr', 'td', 'colgroup', 'col']);\n    $.extend(this.editor.formatter._allowedAttributes, {\n      td: ['rowspan', 'colspan'],\n      col: ['width']\n    });\n    $.extend(this.editor.formatter._allowedStyles, {\n      td: ['text-align'],\n      th: ['text-align']\n    });\n    this._initShortcuts();\n    this._initResize();\n    this.editor.on('decorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('table').each(function(i, table) {\n          return _this.decorate($(table));\n        });\n      };\n    })(this));\n    this.editor.on('undecorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('table').each(function(i, table) {\n          return _this.undecorate($(table));\n        });\n      };\n    })(this));\n    this.editor.on('selectionchanged.table', (function(_this) {\n      return function(e) {\n        var $container, range;\n        _this.editor.body.find('.simditor-table td, .simditor-table th').removeClass('active');\n        range = _this.editor.selection.range();\n        if (!range) {\n          return;\n        }\n        $container = _this.editor.selection.containerNode();\n        if (range.collapsed && $container.is('.simditor-table')) {\n          _this.editor.selection.setRangeAtEndOf($container);\n        }\n        return $container.closest('td, th', _this.editor.body).addClass('active');\n      };\n    })(this));\n    this.editor.on('blur.table', (function(_this) {\n      return function(e) {\n        return _this.editor.body.find('.simditor-table td, .simditor-table th').removeClass('active');\n      };\n    })(this));\n    this.editor.keystroke.add('up', 'td', (function(_this) {\n      return function(e, $node) {\n        _this._tdNav($node, 'up');\n        return true;\n      };\n    })(this));\n    this.editor.keystroke.add('up', 'th', (function(_this) {\n      return function(e, $node) {\n        _this._tdNav($node, 'up');\n        return true;\n      };\n    })(this));\n    this.editor.keystroke.add('down', 'td', (function(_this) {\n      return function(e, $node) {\n        _this._tdNav($node, 'down');\n        return true;\n      };\n    })(this));\n    return this.editor.keystroke.add('down', 'th', (function(_this) {\n      return function(e, $node) {\n        _this._tdNav($node, 'down');\n        return true;\n      };\n    })(this));\n  };\n\n  TableButton.prototype._tdNav = function($td, direction) {\n    var $anotherTr, $tr, action, anotherTag, index, parentTag, ref;\n    if (direction == null) {\n      direction = 'up';\n    }\n    action = direction === 'up' ? 'prev' : 'next';\n    ref = direction === 'up' ? ['tbody', 'thead'] : ['thead', 'tbody'], parentTag = ref[0], anotherTag = ref[1];\n    $tr = $td.parent('tr');\n    $anotherTr = this[\"_\" + action + \"Row\"]($tr);\n    if (!($anotherTr.length > 0)) {\n      return true;\n    }\n    index = $tr.find('td, th').index($td);\n    return this.editor.selection.setRangeAtEndOf($anotherTr.find('td, th').eq(index));\n  };\n\n  TableButton.prototype._nextRow = function($tr) {\n    var $nextTr;\n    $nextTr = $tr.next('tr');\n    if ($nextTr.length < 1 && $tr.parent('thead').length > 0) {\n      $nextTr = $tr.parent('thead').next('tbody').find('tr:first');\n    }\n    return $nextTr;\n  };\n\n  TableButton.prototype._prevRow = function($tr) {\n    var $prevTr;\n    $prevTr = $tr.prev('tr');\n    if ($prevTr.length < 1 && $tr.parent('tbody').length > 0) {\n      $prevTr = $tr.parent('tbody').prev('thead').find('tr');\n    }\n    return $prevTr;\n  };\n\n  TableButton.prototype._initResize = function() {\n    var $editor;\n    $editor = this.editor;\n    $(document).on('mousemove.simditor-table', '.simditor-table td, .simditor-table th', function(e) {\n      var $col, $colgroup, $resizeHandle, $td, $wrapper, index, ref, ref1, x;\n      $wrapper = $(this).parents('.simditor-table');\n      $resizeHandle = $wrapper.find('.simditor-resize-handle');\n      $colgroup = $wrapper.find('colgroup');\n      if ($wrapper.hasClass('resizing')) {\n        return;\n      }\n      $td = $(e.currentTarget);\n      x = e.pageX - $(e.currentTarget).offset().left;\n      if (x < 5 && $td.prev().length > 0) {\n        $td = $td.prev();\n      }\n      if ($td.next('td, th').length < 1) {\n        $resizeHandle.hide();\n        return;\n      }\n      if ((ref = $resizeHandle.data('td')) != null ? ref.is($td) : void 0) {\n        $resizeHandle.show();\n        return;\n      }\n      index = $td.parent().find('td, th').index($td);\n      $col = $colgroup.find('col').eq(index);\n      if ((ref1 = $resizeHandle.data('col')) != null ? ref1.is($col) : void 0) {\n        $resizeHandle.show();\n        return;\n      }\n      return $resizeHandle.css('left', $td.position().left + $td.outerWidth() - 5).data('td', $td).data('col', $col).show();\n    });\n    $(document).on('mouseleave.simditor-table', '.simditor-table', function(e) {\n      return $(this).find('.simditor-resize-handle').hide();\n    });\n    return $(document).on('mousedown.simditor-resize-handle', '.simditor-resize-handle', function(e) {\n      var $handle, $leftCol, $leftTd, $rightCol, $rightTd, $wrapper, minWidth, startHandleLeft, startLeftWidth, startRightWidth, startX, tableWidth;\n      $wrapper = $(this).parent('.simditor-table');\n      $handle = $(e.currentTarget);\n      $leftTd = $handle.data('td');\n      $leftCol = $handle.data('col');\n      $rightTd = $leftTd.next('td, th');\n      $rightCol = $leftCol.next('col');\n      startX = e.pageX;\n      startLeftWidth = $leftTd.outerWidth() * 1;\n      startRightWidth = $rightTd.outerWidth() * 1;\n      startHandleLeft = parseFloat($handle.css('left'));\n      tableWidth = $leftTd.closest('table').width();\n      minWidth = 50;\n      $(document).on('mousemove.simditor-resize-table', function(e) {\n        var deltaX, leftWidth, rightWidth;\n        deltaX = e.pageX - startX;\n        leftWidth = startLeftWidth + deltaX;\n        rightWidth = startRightWidth - deltaX;\n        if (leftWidth < minWidth) {\n          leftWidth = minWidth;\n          deltaX = minWidth - startLeftWidth;\n          rightWidth = startRightWidth - deltaX;\n        } else if (rightWidth < minWidth) {\n          rightWidth = minWidth;\n          deltaX = startRightWidth - minWidth;\n          leftWidth = startLeftWidth + deltaX;\n        }\n        $leftCol.attr('width', (leftWidth / tableWidth * 100) + '%');\n        $rightCol.attr('width', (rightWidth / tableWidth * 100) + '%');\n        return $handle.css('left', startHandleLeft + deltaX);\n      });\n      $(document).one('mouseup.simditor-resize-table', function(e) {\n        $editor.sync();\n        $(document).off('.simditor-resize-table');\n        return $wrapper.removeClass('resizing');\n      });\n      $wrapper.addClass('resizing');\n      return false;\n    });\n  };\n\n  TableButton.prototype._initShortcuts = function() {\n    this.editor.hotkeys.add('ctrl+alt+up', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertRowAbove]').click();\n        return false;\n      };\n    })(this));\n    this.editor.hotkeys.add('ctrl+alt+down', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertRowBelow]').click();\n        return false;\n      };\n    })(this));\n    this.editor.hotkeys.add('ctrl+alt+left', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertColLeft]').click();\n        return false;\n      };\n    })(this));\n    return this.editor.hotkeys.add('ctrl+alt+right', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertColRight]').click();\n        return false;\n      };\n    })(this));\n  };\n\n  TableButton.prototype.decorate = function($table) {\n    var $colgroup, $headRow, $resizeHandle, $tbody, $thead, $wrapper;\n    if ($table.parent('.simditor-table').length > 0) {\n      this.undecorate($table);\n    }\n    $table.wrap('<div class=\"simditor-table\"></div>');\n    $wrapper = $table.parent('.simditor-table');\n    $colgroup = $table.find('colgroup');\n    if ($table.find('thead').length < 1) {\n      $thead = $('<thead />');\n      $headRow = $table.find('tr').first();\n      $thead.append($headRow);\n      this._changeCellTag($headRow, 'th');\n      $tbody = $table.find('tbody');\n      if ($tbody.length > 0) {\n        $tbody.before($thead);\n      } else {\n        $table.prepend($thead);\n      }\n    }\n    if ($colgroup.length < 1) {\n      $colgroup = $('<colgroup/>').prependTo($table);\n      $table.find('thead tr th').each(function(i, td) {\n        var $col;\n        return $col = $('<col/>').appendTo($colgroup);\n      });\n      this.refreshTableWidth($table);\n    }\n    $resizeHandle = $('<div />', {\n      \"class\": 'simditor-resize-handle',\n      contenteditable: 'false'\n    }).appendTo($wrapper);\n    return $table.parent();\n  };\n\n  TableButton.prototype.undecorate = function($table) {\n    if (!($table.parent('.simditor-table').length > 0)) {\n      return;\n    }\n    return $table.parent().replaceWith($table);\n  };\n\n  TableButton.prototype.renderMenu = function() {\n    var $table;\n    $(\"<div class=\\\"menu-create-table\\\">\\n</div>\\n<div class=\\\"menu-edit-table\\\">\\n  <ul>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"deleteRow\\\">\\n        <span>\" + (this._t('deleteRow')) + \"</span>\\n      </a>\\n    </li>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"insertRowAbove\\\">\\n        <span>\" + (this._t('insertRowAbove')) + \" ( Ctrl + Alt + ↑ )</span>\\n      </a>\\n    </li>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"insertRowBelow\\\">\\n        <span>\" + (this._t('insertRowBelow')) + \" ( Ctrl + Alt + ↓ )</span>\\n      </a>\\n    </li>\\n    <li><span class=\\\"separator\\\"></span></li>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"deleteCol\\\">\\n        <span>\" + (this._t('deleteColumn')) + \"</span>\\n      </a>\\n    </li>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"insertColLeft\\\">\\n        <span>\" + (this._t('insertColumnLeft')) + \" ( Ctrl + Alt + ← )</span>\\n      </a>\\n    </li>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"insertColRight\\\">\\n        <span>\" + (this._t('insertColumnRight')) + \" ( Ctrl + Alt + → )</span>\\n      </a>\\n    </li>\\n    <li><span class=\\\"separator\\\"></span></li>\\n    <li>\\n      <a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\"\\n        href=\\\"javascript:;\\\" data-param=\\\"deleteTable\\\">\\n        <span>\" + (this._t('deleteTable')) + \"</span>\\n      </a>\\n    </li>\\n  </ul>\\n</div>\").appendTo(this.menuWrapper);\n    this.createMenu = this.menuWrapper.find('.menu-create-table');\n    this.editMenu = this.menuWrapper.find('.menu-edit-table');\n    $table = this.createTable(6, 6).appendTo(this.createMenu);\n    this.createMenu.on('mouseenter', 'td, th', (function(_this) {\n      return function(e) {\n        var $td, $tr, $trs, num;\n        _this.createMenu.find('td, th').removeClass('selected');\n        $td = $(e.currentTarget);\n        $tr = $td.parent();\n        num = $tr.find('td, th').index($td) + 1;\n        $trs = $tr.prevAll('tr').addBack();\n        if ($tr.parent().is('tbody')) {\n          $trs = $trs.add($table.find('thead tr'));\n        }\n        return $trs.find(\"td:lt(\" + num + \"), th:lt(\" + num + \")\").addClass('selected');\n      };\n    })(this));\n    this.createMenu.on('mouseleave', function(e) {\n      return $(e.currentTarget).find('td, th').removeClass('selected');\n    });\n    return this.createMenu.on('mousedown', 'td, th', (function(_this) {\n      return function(e) {\n        var $closestBlock, $td, $tr, colNum, rowNum;\n        _this.wrapper.removeClass('menu-on');\n        if (!_this.editor.inputManager.focused) {\n          return;\n        }\n        $td = $(e.currentTarget);\n        $tr = $td.parent();\n        colNum = $tr.find('td').index($td) + 1;\n        rowNum = $tr.prevAll('tr').length + 1;\n        if ($tr.parent().is('tbody')) {\n          rowNum += 1;\n        }\n        $table = _this.createTable(rowNum, colNum, true);\n        $closestBlock = _this.editor.selection.blockNodes().last();\n        if (_this.editor.util.isEmptyNode($closestBlock)) {\n          $closestBlock.replaceWith($table);\n        } else {\n          $closestBlock.after($table);\n        }\n        _this.decorate($table);\n        _this.editor.selection.setRangeAtStartOf($table.find('th:first'));\n        _this.editor.trigger('valuechanged');\n        return false;\n      };\n    })(this));\n  };\n\n  TableButton.prototype.createTable = function(row, col, phBr) {\n    var $table, $tbody, $td, $thead, $tr, c, k, l, r, ref, ref1;\n    $table = $('<table/>');\n    $thead = $('<thead/>').appendTo($table);\n    $tbody = $('<tbody/>').appendTo($table);\n    for (r = k = 0, ref = row; 0 <= ref ? k < ref : k > ref; r = 0 <= ref ? ++k : --k) {\n      $tr = $('<tr/>');\n      $tr.appendTo(r === 0 ? $thead : $tbody);\n      for (c = l = 0, ref1 = col; 0 <= ref1 ? l < ref1 : l > ref1; c = 0 <= ref1 ? ++l : --l) {\n        $td = $(r === 0 ? '<th/>' : '<td/>').appendTo($tr);\n        if (phBr) {\n          $td.append(this.editor.util.phBr);\n        }\n      }\n    }\n    return $table;\n  };\n\n  TableButton.prototype.refreshTableWidth = function($table) {\n    return setTimeout((function(_this) {\n      return function() {\n        var cols, tableWidth;\n        tableWidth = $table.width();\n        cols = $table.find('col');\n        return $table.find('thead tr th').each(function(i, td) {\n          var $col;\n          $col = cols.eq(i);\n          return $col.attr('width', ($(td).outerWidth() / tableWidth * 100) + '%');\n        });\n      };\n    })(this), 0);\n  };\n\n  TableButton.prototype.setActive = function(active) {\n    TableButton.__super__.setActive.call(this, active);\n    if (active) {\n      this.createMenu.hide();\n      return this.editMenu.show();\n    } else {\n      this.createMenu.show();\n      return this.editMenu.hide();\n    }\n  };\n\n  TableButton.prototype._changeCellTag = function($tr, tagName) {\n    return $tr.find('td, th').each(function(i, cell) {\n      var $cell;\n      $cell = $(cell);\n      return $cell.replaceWith(\"<\" + tagName + \">\" + ($cell.html()) + \"</\" + tagName + \">\");\n    });\n  };\n\n  TableButton.prototype.deleteRow = function($td) {\n    var $newTr, $tr, index;\n    $tr = $td.parent('tr');\n    if ($tr.closest('table').find('tr').length < 1) {\n      return this.deleteTable($td);\n    } else {\n      $newTr = this._nextRow($tr);\n      if (!($newTr.length > 0)) {\n        $newTr = this._prevRow($tr);\n      }\n      index = $tr.find('td, th').index($td);\n      if ($tr.parent().is('thead')) {\n        $newTr.appendTo($tr.parent());\n        this._changeCellTag($newTr, 'th');\n      }\n      $tr.remove();\n      return this.editor.selection.setRangeAtEndOf($newTr.find('td, th').eq(index));\n    }\n  };\n\n  TableButton.prototype.insertRow = function($td, direction) {\n    var $newTr, $table, $tr, cellTag, colNum, i, index, k, ref;\n    if (direction == null) {\n      direction = 'after';\n    }\n    $tr = $td.parent('tr');\n    $table = $tr.closest('table');\n    colNum = 0;\n    $table.find('tr').each(function(i, tr) {\n      return colNum = Math.max(colNum, $(tr).find('td').length);\n    });\n    index = $tr.find('td, th').index($td);\n    $newTr = $('<tr/>');\n    cellTag = 'td';\n    if (direction === 'after' && $tr.parent().is('thead')) {\n      $tr.parent().next('tbody').prepend($newTr);\n    } else if (direction === 'before' && $tr.parent().is('thead')) {\n      $tr.before($newTr);\n      $tr.parent().next('tbody').prepend($tr);\n      this._changeCellTag($tr, 'td');\n      cellTag = 'th';\n    } else {\n      $tr[direction]($newTr);\n    }\n    for (i = k = 1, ref = colNum; 1 <= ref ? k <= ref : k >= ref; i = 1 <= ref ? ++k : --k) {\n      $(\"<\" + cellTag + \"/>\").append(this.editor.util.phBr).appendTo($newTr);\n    }\n    return this.editor.selection.setRangeAtStartOf($newTr.find('td, th').eq(index));\n  };\n\n  TableButton.prototype.deleteCol = function($td) {\n    var $newTd, $table, $tr, index, noOtherCol, noOtherRow;\n    $tr = $td.parent('tr');\n    noOtherRow = $tr.closest('table').find('tr').length < 2;\n    noOtherCol = $td.siblings('td, th').length < 1;\n    if (noOtherRow && noOtherCol) {\n      return this.deleteTable($td);\n    } else {\n      index = $tr.find('td, th').index($td);\n      $newTd = $td.next('td, th');\n      if (!($newTd.length > 0)) {\n        $newTd = $tr.prev('td, th');\n      }\n      $table = $tr.closest('table');\n      $table.find('col').eq(index).remove();\n      $table.find('tr').each(function(i, tr) {\n        return $(tr).find('td, th').eq(index).remove();\n      });\n      this.refreshTableWidth($table);\n      return this.editor.selection.setRangeAtEndOf($newTd);\n    }\n  };\n\n  TableButton.prototype.insertCol = function($td, direction) {\n    var $col, $newCol, $newTd, $table, $tr, index, tableWidth, width;\n    if (direction == null) {\n      direction = 'after';\n    }\n    $tr = $td.parent('tr');\n    index = $tr.find('td, th').index($td);\n    $table = $td.closest('table');\n    $col = $table.find('col').eq(index);\n    $table.find('tr').each((function(_this) {\n      return function(i, tr) {\n        var $newTd, cellTag;\n        cellTag = $(tr).parent().is('thead') ? 'th' : 'td';\n        $newTd = $(\"<\" + cellTag + \"/>\").append(_this.editor.util.phBr);\n        return $(tr).find('td, th').eq(index)[direction]($newTd);\n      };\n    })(this));\n    $newCol = $('<col/>');\n    $col[direction]($newCol);\n    tableWidth = $table.width();\n    width = Math.max(parseFloat($col.attr('width')) / 2, 50 / tableWidth * 100);\n    $col.attr('width', width + '%');\n    $newCol.attr('width', width + '%');\n    this.refreshTableWidth($table);\n    $newTd = direction === 'after' ? $td.next('td, th') : $td.prev('td, th');\n    return this.editor.selection.setRangeAtStartOf($newTd);\n  };\n\n  TableButton.prototype.deleteTable = function($td) {\n    var $block, $table;\n    $table = $td.closest('.simditor-table');\n    $block = $table.next('p');\n    $table.remove();\n    if ($block.length > 0) {\n      return this.editor.selection.setRangeAtStartOf($block);\n    }\n  };\n\n  TableButton.prototype.command = function(param) {\n    var $td;\n    $td = this.editor.selection.containerNode().closest('td, th');\n    if (!($td.length > 0)) {\n      return;\n    }\n    if (param === 'deleteRow') {\n      this.deleteRow($td);\n    } else if (param === 'insertRowAbove') {\n      this.insertRow($td, 'before');\n    } else if (param === 'insertRowBelow') {\n      this.insertRow($td);\n    } else if (param === 'deleteCol') {\n      this.deleteCol($td);\n    } else if (param === 'insertColLeft') {\n      this.insertCol($td, 'before');\n    } else if (param === 'insertColRight') {\n      this.insertCol($td);\n    } else if (param === 'deleteTable') {\n      this.deleteTable($td);\n    } else {\n      return;\n    }\n    return this.editor.trigger('valuechanged');\n  };\n\n  return TableButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(TableButton);\n\nStrikethroughButton = (function(superClass) {\n  extend(StrikethroughButton, superClass);\n\n  function StrikethroughButton() {\n    return StrikethroughButton.__super__.constructor.apply(this, arguments);\n  }\n\n  StrikethroughButton.prototype.name = 'strikethrough';\n\n  StrikethroughButton.prototype.icon = 'strikethrough';\n\n  StrikethroughButton.prototype.htmlTag = 'strike';\n\n  StrikethroughButton.prototype.disableTag = 'pre';\n\n  StrikethroughButton.prototype._activeStatus = function() {\n    var active;\n    active = document.queryCommandState('strikethrough') === true;\n    this.setActive(active);\n    return this.active;\n  };\n\n  StrikethroughButton.prototype.command = function() {\n    document.execCommand('strikethrough');\n    if (!this.editor.util.support.oninput) {\n      this.editor.trigger('valuechanged');\n    }\n    return $(document).trigger('selectionchange');\n  };\n\n  return StrikethroughButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(StrikethroughButton);\n\nAlignmentButton = (function(superClass) {\n  extend(AlignmentButton, superClass);\n\n  function AlignmentButton() {\n    return AlignmentButton.__super__.constructor.apply(this, arguments);\n  }\n\n  AlignmentButton.prototype.name = \"alignment\";\n\n  AlignmentButton.prototype.icon = 'align-left';\n\n  AlignmentButton.prototype.htmlTag = 'p, h1, h2, h3, h4, td, th';\n\n  AlignmentButton.prototype._init = function() {\n    this.menu = [\n      {\n        name: 'left',\n        text: this._t('alignLeft'),\n        icon: 'align-left',\n        param: 'left'\n      }, {\n        name: 'center',\n        text: this._t('alignCenter'),\n        icon: 'align-center',\n        param: 'center'\n      }, {\n        name: 'right',\n        text: this._t('alignRight'),\n        icon: 'align-right',\n        param: 'right'\n      }\n    ];\n    return AlignmentButton.__super__._init.call(this);\n  };\n\n  AlignmentButton.prototype.setActive = function(active, align) {\n    if (align == null) {\n      align = 'left';\n    }\n    if (align !== 'left' && align !== 'center' && align !== 'right') {\n      align = 'left';\n    }\n    if (align === 'left') {\n      AlignmentButton.__super__.setActive.call(this, false);\n    } else {\n      AlignmentButton.__super__.setActive.call(this, active);\n    }\n    this.el.removeClass('align-left align-center align-right');\n    if (active) {\n      this.el.addClass('align-' + align);\n    }\n    this.setIcon('align-' + align);\n    return this.menuEl.find('.menu-item').show().end().find('.menu-item-' + align).hide();\n  };\n\n  AlignmentButton.prototype._status = function() {\n    this.nodes = this.editor.selection.nodes().filter(this.htmlTag);\n    if (this.nodes.length < 1) {\n      this.setDisabled(true);\n      return this.setActive(false);\n    } else {\n      this.setDisabled(false);\n      return this.setActive(true, this.nodes.first().css('text-align'));\n    }\n  };\n\n  AlignmentButton.prototype.command = function(align) {\n    if (align !== 'left' && align !== 'center' && align !== 'right') {\n      throw new Error(\"simditor alignment button: invalid align \" + align);\n    }\n    this.nodes.css({\n      'text-align': align === 'left' ? '' : align\n    });\n    this.editor.trigger('valuechanged');\n    return this.editor.inputManager.throttledSelectionChanged();\n  };\n\n  return AlignmentButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(AlignmentButton);\n\nreturn Simditor;\n\n}));\n"]}