diff --git a/e_lib/summernote/font/summernote.eot b/e_lib/summernote/font/summernote.eot
new file mode 100644
index 00000000..4f5d02c2
Binary files /dev/null and b/e_lib/summernote/font/summernote.eot differ
diff --git a/e_lib/summernote/font/summernote.ttf b/e_lib/summernote/font/summernote.ttf
new file mode 100644
index 00000000..a5976dbf
Binary files /dev/null and b/e_lib/summernote/font/summernote.ttf differ
diff --git a/e_lib/summernote/font/summernote.woff b/e_lib/summernote/font/summernote.woff
new file mode 100644
index 00000000..6c6dfaaa
Binary files /dev/null and b/e_lib/summernote/font/summernote.woff differ
diff --git a/e_lib/summernote/lang/summernote-ko-KR.js b/e_lib/summernote/lang/summernote-ko-KR.js
new file mode 100644
index 00000000..6dfde797
--- /dev/null
+++ b/e_lib/summernote/lang/summernote-ko-KR.js
@@ -0,0 +1,155 @@
+(function($) {
+ $.extend($.summernote.lang, {
+ 'ko-KR': {
+ font: {
+ bold: '굵게',
+ italic: '기울임꼴',
+ underline: '밑줄',
+ clear: '글자 효과 없애기',
+ height: '줄간격',
+ name: '글꼴',
+ superscript: '위 첨자',
+ subscript: '아래 첨자',
+ strikethrough: '취소선',
+ size: '글자 크기'
+ },
+ image: {
+ image: '사진',
+ insert: '사진 추가',
+ resizeFull: '100% 크기로 변경',
+ resizeHalf: '50% 크기로 변경',
+ resizeQuarter: '25% 크기로 변경',
+ floatLeft: '왼쪽 정렬',
+ floatRight: '오른쪽 정렬',
+ floatNone: '정렬하지 않음',
+ shapeRounded: '스타일: 둥근 모서리',
+ shapeCircle: '스타일: 원형',
+ shapeThumbnail: '스타일: 액자',
+ shapeNone: '스타일: 없음',
+ dragImageHere: '텍스트 혹은 사진을 이곳으로 끌어오세요',
+ dropImage: '텍스트 혹은 사진을 내려놓으세요',
+ selectFromFiles: '파일 선택',
+ maximumFileSize: 'Maximum file size',
+ maximumFileSizeError: 'Maximum file size exceeded.',
+ url: '사진 URL',
+ remove: '사진 삭제',
+ original: 'Original'
+ },
+ video: {
+ video: '동영상',
+ videoLink: '동영상 링크',
+ insert: '동영상 추가',
+ url: '동영상 URL',
+ providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku 사용 가능)'
+ },
+ link: {
+ link: '링크',
+ insert: '링크 추가',
+ unlink: '링크 삭제',
+ edit: '수정',
+ textToDisplay: '링크에 표시할 내용',
+ url: '이동할 URL',
+ openInNewWindow: '새창으로 열기'
+ },
+ table: {
+ table: '테이블',
+ addRowAbove: 'Add row above',
+ addRowBelow: 'Add row below',
+ addColLeft: 'Add column left',
+ addColRight: 'Add column right',
+ delRow: 'Delete row',
+ delCol: 'Delete column',
+ delTable: 'Delete table'
+ },
+ hr: {
+ insert: '구분선 추가'
+ },
+ style: {
+ style: '스타일',
+ p: '본문',
+ blockquote: '인용구',
+ pre: '코드',
+ h1: '제목 1',
+ h2: '제목 2',
+ h3: '제목 3',
+ h4: '제목 4',
+ h5: '제목 5',
+ h6: '제목 6'
+ },
+ lists: {
+ unordered: '글머리 기호',
+ ordered: '번호 매기기'
+ },
+ options: {
+ help: '도움말',
+ fullscreen: '전체 화면',
+ codeview: '코드 보기'
+ },
+ paragraph: {
+ paragraph: '문단 정렬',
+ outdent: '내어쓰기',
+ indent: '들여쓰기',
+ left: '왼쪽 정렬',
+ center: '가운데 정렬',
+ right: '오른쪽 정렬',
+ justify: '양쪽 정렬'
+ },
+ color: {
+ recent: '마지막으로 사용한 색',
+ more: '다른 색 선택',
+ background: '배경색',
+ foreground: '글자색',
+ transparent: '투명',
+ setTransparent: '투명',
+ reset: '취소',
+ resetToDefault: '기본 값으로 변경'
+ },
+ shortcut: {
+ shortcuts: '키보드 단축키',
+ close: '닫기',
+ textFormatting: '글자 스타일 적용',
+ action: '기능',
+ paragraphFormatting: '문단 스타일 적용',
+ documentStyle: '문서 스타일 적용',
+ extraKeys: 'Extra keys'
+ },
+ help: {
+ 'insertParagraph': 'Insert Paragraph',
+ 'undo': 'Undoes the last command',
+ 'redo': 'Redoes the last command',
+ 'tab': 'Tab',
+ 'untab': 'Untab',
+ 'bold': 'Set a bold style',
+ 'italic': 'Set a italic style',
+ 'underline': 'Set a underline style',
+ 'strikethrough': 'Set a strikethrough style',
+ 'removeFormat': 'Clean a style',
+ 'justifyLeft': 'Set left align',
+ 'justifyCenter': 'Set center align',
+ 'justifyRight': 'Set right align',
+ 'justifyFull': 'Set full align',
+ 'insertUnorderedList': 'Toggle unordered list',
+ 'insertOrderedList': 'Toggle ordered list',
+ 'outdent': 'Outdent on current paragraph',
+ 'indent': 'Indent on current paragraph',
+ 'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+ 'formatH1': 'Change current block\'s format as H1',
+ 'formatH2': 'Change current block\'s format as H2',
+ 'formatH3': 'Change current block\'s format as H3',
+ 'formatH4': 'Change current block\'s format as H4',
+ 'formatH5': 'Change current block\'s format as H5',
+ 'formatH6': 'Change current block\'s format as H6',
+ 'insertHorizontalRule': 'Insert horizontal rule',
+ 'linkDialog.show': 'Show Link Dialog'
+ },
+ history: {
+ undo: '실행 취소',
+ redo: '다시 실행'
+ },
+ specialChar: {
+ specialChar: '특수문자',
+ select: '특수문자를 선택하세요'
+ }
+ }
+ });
+})(jQuery);
diff --git a/e_lib/summernote/plugin/databasic/summernote-ext-databasic.css b/e_lib/summernote/plugin/databasic/summernote-ext-databasic.css
new file mode 100644
index 00000000..6232dde9
--- /dev/null
+++ b/e_lib/summernote/plugin/databasic/summernote-ext-databasic.css
@@ -0,0 +1,16 @@
+.ext-databasic {
+ position: relative;
+ display: block;
+ min-height: 50px;
+ background-color: cyan;
+ text-align: center;
+ padding: 20px;
+ border: 1px solid white;
+ border-radius: 10px;
+}
+
+.ext-databasic p {
+ color: white;
+ font-size: 1.2em;
+ margin: 0;
+}
diff --git a/e_lib/summernote/plugin/databasic/summernote-ext-databasic.js b/e_lib/summernote/plugin/databasic/summernote-ext-databasic.js
new file mode 100644
index 00000000..efe0d4dc
--- /dev/null
+++ b/e_lib/summernote/plugin/databasic/summernote-ext-databasic.js
@@ -0,0 +1,292 @@
+(function(factory) {
+ /* global define */
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // Node/CommonJS
+ module.exports = factory(require('jquery'));
+ } else {
+ // Browser globals
+ factory(window.jQuery);
+ }
+}(function($) {
+ // pull in some summernote core functions
+ var ui = $.summernote.ui;
+ var dom = $.summernote.dom;
+
+ // define the popover plugin
+ var DataBasicPlugin = function(context) {
+ var self = this;
+ var options = context.options;
+ var lang = options.langInfo;
+
+ self.icon = '';
+
+ // add context menu button for dialog
+ context.memo('button.databasic', function() {
+ return ui.button({
+ contents: self.icon,
+ tooltip: lang.databasic.insert,
+ click: context.createInvokeHandler('databasic.showDialog')
+ }).render();
+ });
+
+ // add popover edit button
+ context.memo('button.databasicDialog', function() {
+ return ui.button({
+ contents: self.icon,
+ tooltip: lang.databasic.edit,
+ click: context.createInvokeHandler('databasic.showDialog')
+ }).render();
+ });
+
+ // add popover size buttons
+ context.memo('button.databasicSize100', function() {
+ return ui.button({
+ contents: '100%',
+ tooltip: lang.image.resizeFull,
+ click: context.createInvokeHandler('editor.resize', '1')
+ }).render();
+ });
+ context.memo('button.databasicSize50', function() {
+ return ui.button({
+ contents: '50%',
+ tooltip: lang.image.resizeHalf,
+ click: context.createInvokeHandler('editor.resize', '0.5')
+ }).render();
+ });
+ context.memo('button.databasicSize25', function() {
+ return ui.button({
+ contents: '25%',
+ tooltip: lang.image.resizeQuarter,
+ click: context.createInvokeHandler('editor.resize', '0.25')
+ }).render();
+ });
+
+ self.events = {
+ 'summernote.init': function(we, e) {
+ // update existing containers
+ $('data.ext-databasic', e.editable).each(function() { self.setContent($(this)); });
+ // TODO: make this an undo snapshot...
+ },
+ 'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function() {
+ self.update();
+ },
+ 'summernote.dialog.shown': function() {
+ self.hidePopover();
+ }
+ };
+
+ self.initialize = function() {
+ // create dialog markup
+ var $container = options.dialogsInBody ? $(document.body) : context.layoutInfo.editor;
+
+ var body = '
' +
+ '' +
+ '' +
+ '
';
+ var footer = '';
+
+ self.$dialog = ui.dialog({
+ title: lang.databasic.name,
+ fade: options.dialogsFade,
+ body: body,
+ footer: footer
+ }).render().appendTo($container);
+
+ // create popover
+ self.$popover = ui.popover({
+ className: 'ext-databasic-popover'
+ }).render().appendTo('body');
+ var $content = self.$popover.find('.popover-content');
+
+ context.invoke('buttons.build', $content, options.popover.databasic);
+ };
+
+ self.destroy = function() {
+ self.$popover.remove();
+ self.$popover = null;
+ self.$dialog.remove();
+ self.$dialog = null;
+ };
+
+ self.update = function() {
+ // Prevent focusing on editable when invoke('code') is executed
+ if (!context.invoke('editor.hasFocus')) {
+ self.hidePopover();
+ return;
+ }
+
+ var rng = context.invoke('editor.createRange');
+ var visible = false;
+
+ if (rng.isOnData()) {
+ var $data = $(rng.sc).closest('data.ext-databasic');
+
+ if ($data.length) {
+ var pos = dom.posFromPlaceholder($data[0]);
+
+ self.$popover.css({
+ display: 'block',
+ left: pos.left,
+ top: pos.top
+ });
+
+ // save editor target to let size buttons resize the container
+ context.invoke('editor.saveTarget', $data[0]);
+
+ visible = true;
+ }
+ }
+
+ // hide if not visible
+ if (!visible) {
+ self.hidePopover();
+ }
+ };
+
+ self.hidePopover = function() {
+ self.$popover.hide();
+ };
+
+ // define plugin dialog
+ self.getInfo = function() {
+ var rng = context.invoke('editor.createRange');
+
+ if (rng.isOnData()) {
+ var $data = $(rng.sc).closest('data.ext-databasic');
+
+ if ($data.length) {
+ // Get the first node on range(for edit).
+ return {
+ node: $data,
+ test: $data.attr('data-test')
+ };
+ }
+ }
+
+ return {};
+ };
+
+ self.setContent = function($node) {
+ $node.html('' + self.icon + ' ' + lang.databasic.name + ': ' +
+ $node.attr('data-test') + '
');
+ };
+
+ self.updateNode = function(info) {
+ self.setContent(info.node
+ .attr('data-test', info.test));
+ };
+
+ self.createNode = function(info) {
+ var $node = $('');
+
+ if ($node) {
+ // save node to info structure
+ info.node = $node;
+ // insert node into editor dom
+ context.invoke('editor.insertNode', $node[0]);
+ }
+
+ return $node;
+ };
+
+ self.showDialog = function() {
+ var info = self.getInfo();
+ var newNode = !info.node;
+ context.invoke('editor.saveRange');
+
+ self
+ .openDialog(info)
+ .then(function(dialogInfo) {
+ // [workaround] hide dialog before restore range for IE range focus
+ ui.hideDialog(self.$dialog);
+ context.invoke('editor.restoreRange');
+
+ // insert a new node
+ if (newNode) {
+ self.createNode(info);
+ }
+
+ // update info with dialog info
+ $.extend(info, dialogInfo);
+
+ self.updateNode(info);
+ })
+ .fail(function() {
+ context.invoke('editor.restoreRange');
+ });
+ };
+
+ self.openDialog = function(info) {
+ return $.Deferred(function(deferred) {
+ var $inpTest = self.$dialog.find('.ext-databasic-test');
+ var $saveBtn = self.$dialog.find('.ext-databasic-save');
+ var onKeyup = function(event) {
+ if (event.keyCode === 13) {
+ $saveBtn.trigger('click');
+ }
+ };
+
+ ui.onDialogShown(self.$dialog, function() {
+ context.triggerEvent('dialog.shown');
+
+ $inpTest.val(info.test).on('input', function() {
+ ui.toggleBtn($saveBtn, $inpTest.val());
+ }).trigger('focus').on('keyup', onKeyup);
+
+ $saveBtn
+ .text(info.node ? lang.databasic.edit : lang.databasic.insert)
+ .click(function(event) {
+ event.preventDefault();
+
+ deferred.resolve({ test: $inpTest.val() });
+ });
+
+ // init save button
+ ui.toggleBtn($saveBtn, $inpTest.val());
+ });
+
+ ui.onDialogHidden(self.$dialog, function() {
+ $inpTest.off('input keyup');
+ $saveBtn.off('click');
+
+ if (deferred.state() === 'pending') {
+ deferred.reject();
+ }
+ });
+
+ ui.showDialog(self.$dialog);
+ });
+ };
+ };
+
+ // Extends summernote
+ $.extend(true, $.summernote, {
+ plugins: {
+ databasic: DataBasicPlugin
+ },
+
+ options: {
+ popover: {
+ databasic: [
+ ['databasic', ['databasicDialog', 'databasicSize100', 'databasicSize50', 'databasicSize25']]
+ ]
+ }
+ },
+
+ // add localization texts
+ lang: {
+ 'en-US': {
+ databasic: {
+ name: 'Basic Data Container',
+ insert: 'insert basic data container',
+ edit: 'edit basic data container',
+ testLabel: 'test input'
+ }
+ }
+ }
+
+ });
+}));
diff --git a/e_lib/summernote/plugin/hello/summernote-ext-hello.js b/e_lib/summernote/plugin/hello/summernote-ext-hello.js
new file mode 100644
index 00000000..22e4f6ac
--- /dev/null
+++ b/e_lib/summernote/plugin/hello/summernote-ext-hello.js
@@ -0,0 +1,81 @@
+(function(factory) {
+ /* global define */
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // Node/CommonJS
+ module.exports = factory(require('jquery'));
+ } else {
+ // Browser globals
+ factory(window.jQuery);
+ }
+}(function($) {
+ // Extends plugins for adding hello.
+ // - plugin is external module for customizing.
+ $.extend($.summernote.plugins, {
+ /**
+ * @param {Object} context - context object has status of editor.
+ */
+ 'hello': function(context) {
+ var self = this;
+
+ // ui has renders to build ui elements.
+ // - you can create a button with `ui.button`
+ var ui = $.summernote.ui;
+
+ // add hello button
+ context.memo('button.hello', function() {
+ // create button
+ var button = ui.button({
+ contents: ' Hello',
+ tooltip: 'hello',
+ click: function() {
+ self.$panel.show();
+ self.$panel.hide(500);
+ // invoke insertText method with 'hello' on editor module.
+ context.invoke('editor.insertText', 'hello');
+ }
+ });
+
+ // create jQuery object from button instance.
+ var $hello = button.render();
+ return $hello;
+ });
+
+ // This events will be attached when editor is initialized.
+ this.events = {
+ // This will be called after modules are initialized.
+ 'summernote.init': function(we, e) {
+ console.log('summernote initialized', we, e);
+ },
+ // This will be called when user releases a key on editable.
+ 'summernote.keyup': function(we, e) {
+ console.log('summernote keyup', we, e);
+ }
+ };
+
+ // This method will be called when editor is initialized by $('..').summernote();
+ // You can create elements for plugin
+ this.initialize = function() {
+ this.$panel = $('').css({
+ position: 'absolute',
+ width: 100,
+ height: 100,
+ left: '50%',
+ top: '50%',
+ background: 'red'
+ }).hide();
+
+ this.$panel.appendTo('body');
+ };
+
+ // This methods will be called when editor is destroyed by $('..').summernote('destroy');
+ // You should remove elements on `initialize`.
+ this.destroy = function() {
+ this.$panel.remove();
+ this.$panel = null;
+ };
+ }
+ });
+}));
diff --git a/e_lib/summernote/plugin/specialchars/summernote-ext-specialchars.js b/e_lib/summernote/plugin/specialchars/summernote-ext-specialchars.js
new file mode 100644
index 00000000..2ee4e512
--- /dev/null
+++ b/e_lib/summernote/plugin/specialchars/summernote-ext-specialchars.js
@@ -0,0 +1,312 @@
+(function(factory) {
+ /* global define */
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // Node/CommonJS
+ module.exports = factory(require('jquery'));
+ } else {
+ // Browser globals
+ factory(window.jQuery);
+ }
+}(function($) {
+ $.extend($.summernote.plugins, {
+ 'specialchars': function(context) {
+ var self = this;
+ var ui = $.summernote.ui;
+
+ var $editor = context.layoutInfo.editor;
+ var options = context.options;
+ var lang = options.langInfo;
+
+ var KEY = {
+ UP: 38,
+ DOWN: 40,
+ LEFT: 37,
+ RIGHT: 39,
+ ENTER: 13
+ };
+ var COLUMN_LENGTH = 15;
+ var COLUMN_WIDTH = 35;
+
+ var currentColumn = 0;
+ var currentRow = 0;
+ var totalColumn = 0;
+ var totalRow = 0;
+
+ // special characters data set
+ var specialCharDataSet = [
+ '"', '&', '<', '>', '¡', '¢',
+ '£', '¤', '¥', '¦', '§',
+ '¨', '©', 'ª', '«', '¬',
+ '®', '¯', '°', '±', '²',
+ '³', '´', 'µ', '¶', '·',
+ '¸', '¹', 'º', '»', '¼',
+ '½', '¾', '¿', '×', '÷',
+ 'ƒ', 'ˆ', '˜', '–', '—',
+ '‘', '’', '‚', '“', '”',
+ '„', '†', '‡', '•', '…',
+ '‰', '′', '″', '‹', '›',
+ '‾', '⁄', '€', 'ℑ', '℘',
+ 'ℜ', '™', 'ℵ', '←', '↑',
+ '→', '↓', '↔', '↵', '⇐',
+ '⇑', '⇒', '⇓', '⇔', '∀',
+ '∂', '∃', '∅', '∇', '∈',
+ '∉', '∋', '∏', '∑', '−',
+ '∗', '√', '∝', '∞', '∠',
+ '∧', '∨', '∩', '∪', '∫',
+ '∴', '∼', '≅', '≈', '≠',
+ '≡', '≤', '≥', '⊂', '⊃',
+ '⊄', '⊆', '⊇', '⊕', '⊗',
+ '⊥', '⋅', '⌈', '⌉', '⌊',
+ '⌋', '◊', '♠', '♣', '♥',
+ '♦'
+ ];
+
+ context.memo('button.specialchars', function() {
+ return ui.button({
+ contents: '',
+ tooltip: lang.specialChar.specialChar,
+ click: function() {
+ self.show();
+ }
+ }).render();
+ });
+
+ /**
+ * Make Special Characters Table
+ *
+ * @member plugin.specialChar
+ * @private
+ * @return {jQuery}
+ */
+ this.makeSpecialCharSetTable = function() {
+ var $table = $('');
+ $.each(specialCharDataSet, function(idx, text) {
+ var $td = $(' | ').addClass('note-specialchar-node');
+ var $tr = (idx % COLUMN_LENGTH === 0) ? $('
') : $table.find('tr').last();
+
+ var $button = ui.button({
+ callback: function($node) {
+ $node.html(text);
+ $node.attr('title', text);
+ $node.attr('data-value', encodeURIComponent(text));
+ $node.css({
+ width: COLUMN_WIDTH,
+ 'margin-right': '2px',
+ 'margin-bottom': '2px'
+ });
+ }
+ }).render();
+
+ $td.append($button);
+
+ $tr.append($td);
+ if (idx % COLUMN_LENGTH === 0) {
+ $table.append($tr);
+ }
+ });
+
+ totalRow = $table.find('tr').length;
+ totalColumn = COLUMN_LENGTH;
+
+ return $table;
+ };
+
+ this.initialize = function() {
+ var $container = options.dialogsInBody ? $(document.body) : $editor;
+
+ var body = '' + this.makeSpecialCharSetTable()[0].outerHTML + '
';
+
+ this.$dialog = ui.dialog({
+ title: lang.specialChar.select,
+ body: body
+ }).render().appendTo($container);
+ };
+
+ this.show = function() {
+ var text = context.invoke('editor.getSelectedText');
+ context.invoke('editor.saveRange');
+ this.showSpecialCharDialog(text).then(function(selectChar) {
+ context.invoke('editor.restoreRange');
+
+ // build node
+ var $node = $('').html(selectChar)[0];
+
+ if ($node) {
+ // insert video node
+ context.invoke('editor.insertNode', $node);
+ }
+ }).fail(function() {
+ context.invoke('editor.restoreRange');
+ });
+ };
+
+ /**
+ * show image dialog
+ *
+ * @param {jQuery} $dialog
+ * @return {Promise}
+ */
+ this.showSpecialCharDialog = function(text) {
+ return $.Deferred(function(deferred) {
+ var $specialCharDialog = self.$dialog;
+ var $specialCharNode = $specialCharDialog.find('.note-specialchar-node');
+ var $selectedNode = null;
+ var ARROW_KEYS = [KEY.UP, KEY.DOWN, KEY.LEFT, KEY.RIGHT];
+ var ENTER_KEY = KEY.ENTER;
+
+ function addActiveClass($target) {
+ if (!$target) {
+ return;
+ }
+ $target.find('button').addClass('active');
+ $selectedNode = $target;
+ }
+
+ function removeActiveClass($target) {
+ $target.find('button').removeClass('active');
+ $selectedNode = null;
+ }
+
+ // find next node
+ function findNextNode(row, column) {
+ var findNode = null;
+ $.each($specialCharNode, function(idx, $node) {
+ var findRow = Math.ceil((idx + 1) / COLUMN_LENGTH);
+ var findColumn = ((idx + 1) % COLUMN_LENGTH === 0) ? COLUMN_LENGTH : (idx + 1) % COLUMN_LENGTH;
+ if (findRow === row && findColumn === column) {
+ findNode = $node;
+ return false;
+ }
+ });
+ return $(findNode);
+ }
+
+ function arrowKeyHandler(keyCode) {
+ // left, right, up, down key
+ var $nextNode;
+ var lastRowColumnLength = $specialCharNode.length % totalColumn;
+
+ if (KEY.LEFT === keyCode) {
+ if (currentColumn > 1) {
+ currentColumn = currentColumn - 1;
+ } else if (currentRow === 1 && currentColumn === 1) {
+ currentColumn = lastRowColumnLength;
+ currentRow = totalRow;
+ } else {
+ currentColumn = totalColumn;
+ currentRow = currentRow - 1;
+ }
+ } else if (KEY.RIGHT === keyCode) {
+ if (currentRow === totalRow && lastRowColumnLength === currentColumn) {
+ currentColumn = 1;
+ currentRow = 1;
+ } else if (currentColumn < totalColumn) {
+ currentColumn = currentColumn + 1;
+ } else {
+ currentColumn = 1;
+ currentRow = currentRow + 1;
+ }
+ } else if (KEY.UP === keyCode) {
+ if (currentRow === 1 && lastRowColumnLength < currentColumn) {
+ currentRow = totalRow - 1;
+ } else {
+ currentRow = currentRow - 1;
+ }
+ } else if (KEY.DOWN === keyCode) {
+ currentRow = currentRow + 1;
+ }
+
+ if (currentRow === totalRow && currentColumn > lastRowColumnLength) {
+ currentRow = 1;
+ } else if (currentRow > totalRow) {
+ currentRow = 1;
+ } else if (currentRow < 1) {
+ currentRow = totalRow;
+ }
+
+ $nextNode = findNextNode(currentRow, currentColumn);
+
+ if ($nextNode) {
+ removeActiveClass($selectedNode);
+ addActiveClass($nextNode);
+ }
+ }
+
+ function enterKeyHandler() {
+ if (!$selectedNode) {
+ return;
+ }
+
+ deferred.resolve(decodeURIComponent($selectedNode.find('button').attr('data-value')));
+ $specialCharDialog.modal('hide');
+ }
+
+ function keyDownEventHandler(event) {
+ event.preventDefault();
+ var keyCode = event.keyCode;
+ if (keyCode === undefined || keyCode === null) {
+ return;
+ }
+ // check arrowKeys match
+ if (ARROW_KEYS.indexOf(keyCode) > -1) {
+ if ($selectedNode === null) {
+ addActiveClass($specialCharNode.eq(0));
+ currentColumn = 1;
+ currentRow = 1;
+ return;
+ }
+ arrowKeyHandler(keyCode);
+ } else if (keyCode === ENTER_KEY) {
+ enterKeyHandler();
+ }
+ return false;
+ }
+
+ // remove class
+ removeActiveClass($specialCharNode);
+
+ // find selected node
+ if (text) {
+ for (var i = 0; i < $specialCharNode.length; i++) {
+ var $checkNode = $($specialCharNode[i]);
+ if ($checkNode.text() === text) {
+ addActiveClass($checkNode);
+ currentRow = Math.ceil((i + 1) / COLUMN_LENGTH);
+ currentColumn = (i + 1) % COLUMN_LENGTH;
+ }
+ }
+ }
+
+ ui.onDialogShown(self.$dialog, function() {
+ $(document).on('keydown', keyDownEventHandler);
+
+ self.$dialog.find('button').tooltip();
+
+ $specialCharNode.on('click', function(event) {
+ event.preventDefault();
+ deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').attr('data-value')));
+ ui.hideDialog(self.$dialog);
+ });
+ });
+
+ ui.onDialogHidden(self.$dialog, function() {
+ $specialCharNode.off('click');
+
+ self.$dialog.find('button').tooltip('destroy');
+
+ $(document).off('keydown', keyDownEventHandler);
+
+ if (deferred.state() === 'pending') {
+ deferred.reject();
+ }
+ });
+
+ ui.showDialog(self.$dialog);
+ });
+ };
+ }
+ });
+}));
diff --git a/e_lib/summernote/summernote-bs4.css b/e_lib/summernote/summernote-bs4.css
new file mode 100644
index 00000000..b0520764
--- /dev/null
+++ b/e_lib/summernote/summernote-bs4.css
@@ -0,0 +1 @@
+@font-face{font-family:"summernote";font-style:normal;font-weight:normal;src:url("./font/summernote.eot?dbafe969167589eda84514394d126413");src:url("./font/summernote.eot?#iefix") format("embedded-opentype"),url("./font/summernote.woff?dbafe969167589eda84514394d126413") format("woff"),url("./font/summernote.ttf?dbafe969167589eda84514394d126413") format("truetype")}[class^="note-icon-"]:before,[class*=" note-icon-"]:before{display:inline-block;font:normal normal normal 14px summernote;font-size:inherit;-webkit-font-smoothing:antialiased;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;speak:none;-moz-osx-font-smoothing:grayscale}.note-icon-align-center:before,.note-icon-align-indent:before,.note-icon-align-justify:before,.note-icon-align-left:before,.note-icon-align-outdent:before,.note-icon-align-right:before,.note-icon-align:before,.note-icon-arrow-circle-down:before,.note-icon-arrow-circle-left:before,.note-icon-arrow-circle-right:before,.note-icon-arrow-circle-up:before,.note-icon-arrows-alt:before,.note-icon-arrows-h:before,.note-icon-arrows-v:before,.note-icon-bold:before,.note-icon-caret:before,.note-icon-chain-broken:before,.note-icon-circle:before,.note-icon-close:before,.note-icon-code:before,.note-icon-col-after:before,.note-icon-col-before:before,.note-icon-col-remove:before,.note-icon-eraser:before,.note-icon-font:before,.note-icon-frame:before,.note-icon-italic:before,.note-icon-link:before,.note-icon-magic:before,.note-icon-menu-check:before,.note-icon-minus:before,.note-icon-orderedlist:before,.note-icon-pencil:before,.note-icon-picture:before,.note-icon-question:before,.note-icon-redo:before,.note-icon-row-above:before,.note-icon-row-below:before,.note-icon-row-remove:before,.note-icon-special-character:before,.note-icon-square:before,.note-icon-strikethrough:before,.note-icon-subscript:before,.note-icon-summernote:before,.note-icon-superscript:before,.note-icon-table:before,.note-icon-text-height:before,.note-icon-trash:before,.note-icon-underline:before,.note-icon-undo:before,.note-icon-unorderedlist:before,.note-icon-video:before{display:inline-block;font-family:"summernote";font-style:normal;font-weight:normal;text-decoration:inherit}.note-icon-align-center:before{content:"\f101"}.note-icon-align-indent:before{content:"\f102"}.note-icon-align-justify:before{content:"\f103"}.note-icon-align-left:before{content:"\f104"}.note-icon-align-outdent:before{content:"\f105"}.note-icon-align-right:before{content:"\f106"}.note-icon-align:before{content:"\f107"}.note-icon-arrow-circle-down:before{content:"\f108"}.note-icon-arrow-circle-left:before{content:"\f109"}.note-icon-arrow-circle-right:before{content:"\f10a"}.note-icon-arrow-circle-up:before{content:"\f10b"}.note-icon-arrows-alt:before{content:"\f10c"}.note-icon-arrows-h:before{content:"\f10d"}.note-icon-arrows-v:before{content:"\f10e"}.note-icon-bold:before{content:"\f10f"}.note-icon-caret:before{content:"\f110"}.note-icon-chain-broken:before{content:"\f111"}.note-icon-circle:before{content:"\f112"}.note-icon-close:before{content:"\f113"}.note-icon-code:before{content:"\f114"}.note-icon-col-after:before{content:"\f115"}.note-icon-col-before:before{content:"\f116"}.note-icon-col-remove:before{content:"\f117"}.note-icon-eraser:before{content:"\f118"}.note-icon-font:before{content:"\f119"}.note-icon-frame:before{content:"\f11a"}.note-icon-italic:before{content:"\f11b"}.note-icon-link:before{content:"\f11c"}.note-icon-magic:before{content:"\f11d"}.note-icon-menu-check:before{content:"\f11e"}.note-icon-minus:before{content:"\f11f"}.note-icon-orderedlist:before{content:"\f120"}.note-icon-pencil:before{content:"\f121"}.note-icon-picture:before{content:"\f122"}.note-icon-question:before{content:"\f123"}.note-icon-redo:before{content:"\f124"}.note-icon-row-above:before{content:"\f125"}.note-icon-row-below:before{content:"\f126"}.note-icon-row-remove:before{content:"\f127"}.note-icon-special-character:before{content:"\f128"}.note-icon-square:before{content:"\f129"}.note-icon-strikethrough:before{content:"\f12a"}.note-icon-subscript:before{content:"\f12b"}.note-icon-summernote:before{content:"\f12c"}.note-icon-superscript:before{content:"\f12d"}.note-icon-table:before{content:"\f12e"}.note-icon-text-height:before{content:"\f12f"}.note-icon-trash:before{content:"\f130"}.note-icon-underline:before{content:"\f131"}.note-icon-undo:before{content:"\f132"}.note-icon-unorderedlist:before{content:"\f133"}.note-icon-video:before{content:"\f134"}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:0}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area img.note-float-left{margin-right:10px}.note-editor .note-editing-area img.note-float-right{margin-left:10px}.note-editor.note-frame{border:1px solid #a9a9a9}.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable{padding:10px;overflow:auto;color:#000;word-wrap:break-word;background-color:#fff}.note-editor.note-frame .note-editing-area .note-editable[contenteditable="false"]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-editor.note-frame.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important}.note-editor.note-frame.fullscreen .note-editable{background-color:#fff}.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output{display:block;width:100%;height:20px;margin-bottom:0;font-size:14px;line-height:1.42857143;color:#000;border:0;border-top:1px solid #e2e2e2}.note-editor.note-frame .note-status-output:empty{height:0;border-top:0 solid transparent}.note-editor.note-frame .note-status-output .pull-right{float:right!important}.note-editor.note-frame .note-status-output .text-muted{color:#777}.note-editor.note-frame .note-status-output .text-primary{color:#286090}.note-editor.note-frame .note-status-output .text-success{color:#3c763d}.note-editor.note-frame .note-status-output .text-info{color:#31708f}.note-editor.note-frame .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-frame .note-status-output .text-danger{color:#a94442}.note-editor.note-frame .note-status-output .alert{padding:7px 10px 2px 10px;margin:-7px 0 0 0;color:#000;background-color:#f5f5f5;border-radius:0}.note-editor.note-frame .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-frame .note-status-output .alert-success{color:#3c763d!important;background-color:#dff0d8!important}.note-editor.note-frame .note-status-output .alert-info{color:#31708f!important;background-color:#d9edf7!important}.note-editor.note-frame .note-status-output .alert-warning{color:#8a6d3b!important;background-color:#fcf8e3!important}.note-editor.note-frame .note-status-output .alert-danger{color:#a94442!important;background-color:#f2dede!important}.note-editor.note-frame .note-statusbar{background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.note-editor.note-frame .note-statusbar .note-resizebar{width:100%;height:9px;padding-top:1px;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder{padding:10px}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px!important}.note-toolbar{position:relative;z-index:500}.note-popover .popover-content,.card-header.note-toolbar{padding:0 0 5px 5px;margin:0}.note-popover .popover-content>.btn-group,.card-header.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.card-header.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.card-header.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.card-header.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.card-header.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.card-header.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.card-header.note-toolbar .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.card-header.note-toolbar .note-style .dropdown-style pre{padding:5px 10px;margin:0}.note-popover .popover-content .note-style .dropdown-style h1,.card-header.note-toolbar .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.card-header.note-toolbar .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.card-header.note-toolbar .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.card-header.note-toolbar .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.card-header.note-toolbar .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.card-header.note-toolbar .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.card-header.note-toolbar .note-style .dropdown-style p{padding:0;margin:0}.note-popover .popover-content .note-color .dropdown-toggle,.card-header.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu,.card-header.note-toolbar .note-color .dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-menu .note-palette,.card-header.note-toolbar .note-color .dropdown-menu .note-palette{display:inline-block;width:160px;margin:0}.note-popover .popover-content .note-color .dropdown-menu .note-palette:first-child,.card-header.note-toolbar .note-color .dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-palette-title,.card-header.note-toolbar .note-color .dropdown-menu .note-palette .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset,.card-header.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-row,.card-header.note-toolbar .note-color .dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset:hover,.card-header.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-para .dropdown-menu,.card-header.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.card-header.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.card-header.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu.right,.card-header.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.card-header.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover-content .dropdown-menu.right::after,.card-header.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover-content .dropdown-menu.note-check a i,.card-header.note-toolbar .dropdown-menu.note-check a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check a.checked i,.card-header.note-toolbar .dropdown-menu.note-check a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.card-header.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.card-header.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.card-header.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #fff}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.card-header.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed lightgray}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid black}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:black;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:white;border:1px solid black}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:#000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0}
\ No newline at end of file
diff --git a/e_lib/summernote/summernote-bs4.js b/e_lib/summernote/summernote-bs4.js
new file mode 100644
index 00000000..22d0ef21
--- /dev/null
+++ b/e_lib/summernote/summernote-bs4.js
@@ -0,0 +1,7323 @@
+/**
+ * Super simple wysiwyg editor v0.8.10
+ * https://summernote.org
+ *
+ * Copyright 2013- Alan Hong. and other contributors
+ * summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2018-02-20T00:34Z
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :
+ typeof define === 'function' && define.amd ? define(['jquery'], factory) :
+ (factory(global.jQuery));
+}(this, (function ($$1) { 'use strict';
+
+$$1 = $$1 && $$1.hasOwnProperty('default') ? $$1['default'] : $$1;
+
+var Renderer = /** @class */ (function () {
+ function Renderer(markup, children, options, callback) {
+ this.markup = markup;
+ this.children = children;
+ this.options = options;
+ this.callback = callback;
+ }
+ Renderer.prototype.render = function ($parent) {
+ var $node = $$1(this.markup);
+ if (this.options && this.options.contents) {
+ $node.html(this.options.contents);
+ }
+ if (this.options && this.options.className) {
+ $node.addClass(this.options.className);
+ }
+ if (this.options && this.options.data) {
+ $$1.each(this.options.data, function (k, v) {
+ $node.attr('data-' + k, v);
+ });
+ }
+ if (this.options && this.options.click) {
+ $node.on('click', this.options.click);
+ }
+ if (this.children) {
+ var $container_1 = $node.find('.note-children-container');
+ this.children.forEach(function (child) {
+ child.render($container_1.length ? $container_1 : $node);
+ });
+ }
+ if (this.callback) {
+ this.callback($node, this.options);
+ }
+ if (this.options && this.options.callback) {
+ this.options.callback($node);
+ }
+ if ($parent) {
+ $parent.append($node);
+ }
+ return $node;
+ };
+ return Renderer;
+}());
+var renderer = {
+ create: function (markup, callback) {
+ return function () {
+ var options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];
+ var children = $$1.isArray(arguments[0]) ? arguments[0] : [];
+ if (options && options.children) {
+ children = options.children;
+ }
+ return new Renderer(markup, children, options, callback);
+ };
+ }
+};
+
+var editor = renderer.create('');
+var toolbar = renderer.create('');
+var editingArea = renderer.create('');
+var codable = renderer.create('');
+var editable = renderer.create('');
+var statusbar = renderer.create([
+ '',
+ '',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
'
+].join(''));
+var airEditor = renderer.create('');
+var airEditable = renderer.create([
+ '',
+ ''
+].join(''));
+var buttonGroup = renderer.create('');
+var dropdown = renderer.create('