ace.define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], function (require, exports, module) {
  "use strict";

  exports.isDark = false;
  exports.cssClass = "ace-tm";
  exports.cssText = ".ace-tm .ace_gutter {\
background: #f0f0f0;\
color: #333;\
}\
.ace-tm .ace_print-margin {\
width: 1px;\
background: #e8e8e8;\
}\
.ace-tm .ace_fold {\
background-color: #6B72E6;\
}\
.ace-tm {\
background-color: #FFFFFF;\
color: black;\
}\
.ace-tm .ace_cursor {\
color: black;\
}\
.ace-tm .ace_invisible {\
color: rgb(191, 191, 191);\
}\
.ace-tm .ace_storage,\
.ace-tm .ace_keyword {\
color: blue;\
}\
.ace-tm .ace_constant {\
color: rgb(197, 6, 11);\
}\
.ace-tm .ace_constant.ace_buildin {\
color: rgb(88, 72, 246);\
}\
.ace-tm .ace_constant.ace_language {\
color: rgb(88, 92, 246);\
}\
.ace-tm .ace_constant.ace_library {\
color: rgb(6, 150, 14);\
}\
.ace-tm .ace_invalid {\
background-color: rgba(255, 0, 0, 0.1);\
color: red;\
}\
.ace-tm .ace_support.ace_function {\
color: rgb(60, 76, 114);\
}\
.ace-tm .ace_support.ace_constant {\
color: rgb(6, 150, 14);\
}\
.ace-tm .ace_support.ace_type,\
.ace-tm .ace_support.ace_class {\
color: rgb(109, 121, 222);\
}\
.ace-tm .ace_keyword.ace_operator {\
color: rgb(104, 118, 135);\
}\
.ace-tm .ace_string {\
color: rgb(3, 106, 7);\
}\
.ace-tm .ace_comment {\
color: rgb(76, 136, 107);\
}\
.ace-tm .ace_comment.ace_doc {\
color: rgb(0, 102, 255);\
}\
.ace-tm .ace_comment.ace_doc.ace_tag {\
color: rgb(128, 159, 191);\
}\
.ace-tm .ace_constant.ace_numeric {\
color: rgb(0, 0, 205);\
}\
.ace-tm .ace_variable {\
color: rgb(49, 132, 149);\
}\
.ace-tm .ace_xml-pe {\
color: rgb(104, 104, 91);\
}\
.ace-tm .ace_entity.ace_name.ace_function {\
color: #0000A2;\
}\
.ace-tm .ace_heading {\
color: rgb(12, 7, 255);\
}\
.ace-tm .ace_list {\
color:rgb(185, 6, 144);\
}\
.ace-tm .ace_meta.ace_tag {\
color:rgb(0, 22, 142);\
}\
.ace-tm .ace_string.ace_regex {\
color: rgb(255, 0, 0)\
}\
.ace-tm .ace_marker-layer .ace_selection {\
background: rgb(181, 213, 255);\
}\
.ace-tm.ace_multiselect .ace_selection.ace_start {\
box-shadow: 0 0 3px 0px white;\
}\
.ace-tm .ace_marker-layer .ace_step {\
background: rgb(252, 255, 0);\
}\
.ace-tm .ace_marker-layer .ace_stack {\
background: rgb(164, 229, 101);\
}\
.ace-tm .ace_marker-layer .ace_bracket {\
margin: -1px 0 0 -1px;\
border: 1px solid rgb(192, 192, 192);\
}\
.ace-tm .ace_marker-layer .ace_active-line {\
background: rgba(0, 0, 0, 0.07);\
}\
.ace-tm .ace_gutter-active-line {\
background-color : #dcdcdc;\
}\
.ace-tm .ace_marker-layer .ace_selected-word {\
background: rgb(250, 250, 255);\
border: 1px solid rgb(200, 200, 250);\
}\
.ace-tm .ace_indent-guide {\
background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
}\
";
  exports.$id = "ace/theme/textmate";

  var dom = require("../lib/dom");

  dom.importCssString(exports.cssText, exports.cssClass);
});
ace.define("ace/ext/textarea", ["require", "exports", "module", "ace/lib/event", "ace/lib/useragent", "ace/lib/net", "ace/ace", "ace/theme/textmate"], function (require, exports, module) {
  "use strict";

  var event = require("../lib/event");

  var UA = require("../lib/useragent");

  var net = require("../lib/net");

  var ace = require("../ace");

  require("../theme/textmate");

  module.exports = exports = ace;

  var getCSSProperty = function getCSSProperty(element, container, property) {
    var ret = element.style[property];

    if (!ret) {
      if (window.getComputedStyle) {
        ret = window.getComputedStyle(element, '').getPropertyValue(property);
      } else {
        ret = element.currentStyle[property];
      }
    }

    if (!ret || ret == 'auto' || ret == 'intrinsic') {
      ret = container.style[property];
    }

    return ret;
  };

  function applyStyles(elm, styles) {
    for (var style in styles) {
      elm.style[style] = styles[style];
    }
  }

  function setupContainer(element, getValue) {
    if (element.type != 'textarea') {
      throw new Error("Textarea required!");
    }

    var parentNode = element.parentNode;
    var container = document.createElement('div');

    var resizeEvent = function resizeEvent() {
      var style = 'position:relative;';
      ['margin-top', 'margin-left', 'margin-right', 'margin-bottom'].forEach(function (item) {
        style += item + ':' + getCSSProperty(element, container, item) + ';';
      });
      var width = getCSSProperty(element, container, 'width') || element.clientWidth + "px";
      var height = getCSSProperty(element, container, 'height') || element.clientHeight + "px";
      style += 'height:' + height + ';width:' + width + ';';
      style += 'display:inline-block;';
      container.setAttribute('style', style);
    };

    event.addListener(window, 'resize', resizeEvent);
    resizeEvent();
    parentNode.insertBefore(container, element.nextSibling);

    while (parentNode !== document) {
      if (parentNode.tagName.toUpperCase() === 'FORM') {
        var oldSumit = parentNode.onsubmit;

        parentNode.onsubmit = function (evt) {
          element.value = getValue();

          if (oldSumit) {
            oldSumit.call(this, evt);
          }
        };

        break;
      }

      parentNode = parentNode.parentNode;
    }

    return container;
  }

  exports.transformTextarea = function (element, options) {
    var isFocused = element.autofocus || document.activeElement == element;
    var session;
    var container = setupContainer(element, function () {
      return session.getValue();
    });
    element.style.display = 'none';
    container.style.background = 'white';
    var editorDiv = document.createElement("div");
    applyStyles(editorDiv, {
      top: "0px",
      left: "0px",
      right: "0px",
      bottom: "0px",
      border: "1px solid gray",
      position: "absolute"
    });
    container.appendChild(editorDiv);
    var settingOpener = document.createElement("div");
    applyStyles(settingOpener, {
      position: "absolute",
      right: "0px",
      bottom: "0px",
      cursor: "nw-resize",
      border: "solid 9px",
      borderColor: "lightblue gray gray #ceade6",
      zIndex: 101
    });
    var settingDiv = document.createElement("div");
    var settingDivStyles = {
      top: "0px",
      left: "20%",
      right: "0px",
      bottom: "0px",
      position: "absolute",
      padding: "5px",
      zIndex: 100,
      color: "white",
      display: "none",
      overflow: "auto",
      fontSize: "14px",
      boxShadow: "-5px 2px 3px gray"
    };

    if (!UA.isOldIE) {
      settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)";
    } else {
      settingDivStyles.backgroundColor = "#333";
    }

    applyStyles(settingDiv, settingDivStyles);
    container.appendChild(settingDiv);
    options = options || exports.defaultOptions;
    var editor = ace.edit(editorDiv);
    session = editor.getSession();
    session.setValue(element.value || element.innerHTML);
    if (isFocused) editor.focus();
    container.appendChild(settingOpener);
    setupApi(editor, editorDiv, settingDiv, ace, options);
    setupSettingPanel(settingDiv, settingOpener, editor);
    var state = "";
    event.addListener(settingOpener, "mousemove", function (e) {
      var rect = this.getBoundingClientRect();
      var x = e.clientX - rect.left,
          y = e.clientY - rect.top;

      if (x + y < (rect.width + rect.height) / 2) {
        this.style.cursor = "pointer";
        state = "toggle";
      } else {
        state = "resize";
        this.style.cursor = "nw-resize";
      }
    });
    event.addListener(settingOpener, "mousedown", function (e) {
      e.preventDefault();

      if (state == "toggle") {
        editor.setDisplaySettings();
        return;
      }

      container.style.zIndex = 100000;
      var rect = container.getBoundingClientRect();
      var startX = rect.width + rect.left - e.clientX;
      var startY = rect.height + rect.top - e.clientY;
      event.capture(settingOpener, function (e) {
        container.style.width = e.clientX - rect.left + startX + "px";
        container.style.height = e.clientY - rect.top + startY + "px";
        editor.resize();
      }, function () {});
    });
    return editor;
  };

  function load(url, module, callback) {
    net.loadScript(url, function () {
      require([module], callback);
    });
  }

  function setupApi(editor, editorDiv, settingDiv, ace, options) {
    var session = editor.getSession();
    var renderer = editor.renderer;

    function toBool(value) {
      return value === "true" || value == true;
    }

    editor.setDisplaySettings = function (display) {
      if (display == null) display = settingDiv.style.display == "none";

      if (display) {
        settingDiv.style.display = "block";
        settingDiv.hideButton.focus();
        editor.on("focus", function onFocus() {
          editor.removeListener("focus", onFocus);
          settingDiv.style.display = "none";
        });
      } else {
        editor.focus();
      }
    };

    editor.$setOption = editor.setOption;
    editor.$getOption = editor.getOption;

    editor.setOption = function (key, value) {
      switch (key) {
        case "mode":
          editor.$setOption("mode", "ace/mode/" + value);
          break;

        case "theme":
          editor.$setOption("theme", "ace/theme/" + value);
          break;

        case "keybindings":
          switch (value) {
            case "vim":
              editor.setKeyboardHandler("ace/keyboard/vim");
              break;

            case "emacs":
              editor.setKeyboardHandler("ace/keyboard/emacs");
              break;

            default:
              editor.setKeyboardHandler(null);
          }

          break;

        case "wrap":
        case "fontSize":
          editor.$setOption(key, value);
          break;

        default:
          editor.$setOption(key, toBool(value));
      }
    };

    editor.getOption = function (key) {
      switch (key) {
        case "mode":
          return editor.$getOption("mode").substr("ace/mode/".length);
          break;

        case "theme":
          return editor.$getOption("theme").substr("ace/theme/".length);
          break;

        case "keybindings":
          var value = editor.getKeyboardHandler();

          switch (value && value.$id) {
            case "ace/keyboard/vim":
              return "vim";

            case "ace/keyboard/emacs":
              return "emacs";

            default:
              return "ace";
          }

          break;

        default:
          return editor.$getOption(key);
      }
    };

    editor.setOptions(options);
    return editor;
  }

  function setupSettingPanel(settingDiv, settingOpener, editor) {
    var BOOL = null;
    var desc = {
      mode: "Mode:",
      wrap: "Soft Wrap:",
      theme: "Theme:",
      fontSize: "Font Size:",
      showGutter: "Display Gutter:",
      keybindings: "Keyboard",
      showPrintMargin: "Show Print Margin:",
      useSoftTabs: "Use Soft Tabs:",
      showInvisibles: "Show Invisibles"
    };
    var optionValues = {
      mode: {
        text: "Plain",
        javascript: "JavaScript",
        xml: "XML",
        html: "HTML",
        css: "CSS",
        scss: "SCSS",
        python: "Python",
        php: "PHP",
        java: "Java",
        ruby: "Ruby",
        c_cpp: "C/C++",
        coffee: "CoffeeScript",
        json: "json",
        perl: "Perl",
        clojure: "Clojure",
        ocaml: "OCaml",
        csharp: "C#",
        haxe: "haXe",
        svg: "SVG",
        textile: "Textile",
        groovy: "Groovy",
        liquid: "Liquid",
        Scala: "Scala"
      },
      theme: {
        clouds: "Clouds",
        clouds_midnight: "Clouds Midnight",
        cobalt: "Cobalt",
        crimson_editor: "Crimson Editor",
        dawn: "Dawn",
        gob: "Green on Black",
        eclipse: "Eclipse",
        idle_fingers: "Idle Fingers",
        kr_theme: "Kr Theme",
        merbivore: "Merbivore",
        merbivore_soft: "Merbivore Soft",
        mono_industrial: "Mono Industrial",
        monokai: "Monokai",
        pastel_on_dark: "Pastel On Dark",
        solarized_dark: "Solarized Dark",
        solarized_light: "Solarized Light",
        textmate: "Textmate",
        twilight: "Twilight",
        vibrant_ink: "Vibrant Ink"
      },
      showGutter: BOOL,
      fontSize: {
        "10px": "10px",
        "11px": "11px",
        "12px": "12px",
        "14px": "14px",
        "16px": "16px"
      },
      wrap: {
        off: "Off",
        40: "40",
        80: "80",
        free: "Free"
      },
      keybindings: {
        ace: "ace",
        vim: "vim",
        emacs: "emacs"
      },
      showPrintMargin: BOOL,
      useSoftTabs: BOOL,
      showInvisibles: BOOL
    };
    var table = [];
    table.push("<table><tr><th>Setting</th><th>Value</th></tr>");

    function renderOption(builder, option, obj, cValue) {
      if (!obj) {
        builder.push("<input type='checkbox' title='", option, "' ", cValue + "" == "true" ? "checked='true'" : "", "'></input>");
        return;
      }

      builder.push("<select title='" + option + "'>");

      for (var value in obj) {
        builder.push("<option value='" + value + "' ");

        if (cValue == value) {
          builder.push(" selected ");
        }

        builder.push(">", obj[value], "</option>");
      }

      builder.push("</select>");
    }

    for (var option in exports.defaultOptions) {
      table.push("<tr><td>", desc[option], "</td>");
      table.push("<td>");
      renderOption(table, option, optionValues[option], editor.getOption(option));
      table.push("</td></tr>");
    }

    table.push("</table>");
    settingDiv.innerHTML = table.join("");

    var onChange = function onChange(e) {
      var select = e.currentTarget;
      editor.setOption(select.title, select.value);
    };

    var onClick = function onClick(e) {
      var cb = e.currentTarget;
      editor.setOption(cb.title, cb.checked);
    };

    var selects = settingDiv.getElementsByTagName("select");

    for (var i = 0; i < selects.length; i++) {
      selects[i].onchange = onChange;
    }

    var cbs = settingDiv.getElementsByTagName("input");

    for (var i = 0; i < cbs.length; i++) {
      cbs[i].onclick = onClick;
    }

    var button = document.createElement("input");
    button.type = "button";
    button.value = "Hide";
    event.addListener(button, "click", function () {
      editor.setDisplaySettings(false);
    });
    settingDiv.appendChild(button);
    settingDiv.hideButton = button;
  }

  exports.defaultOptions = {
    mode: "javascript",
    theme: "textmate",
    wrap: "off",
    fontSize: "12px",
    showGutter: "false",
    keybindings: "ace",
    showPrintMargin: "false",
    useSoftTabs: "true",
    showInvisibles: "false"
  };
});

(function () {
  ace.require(["ace/ext/textarea"], function (m) {
    if (typeof module == "object" && typeof exports == "object" && module) {
      module.exports = m;
    }
  });
})();