'
+ },
+ by: {
+ preformatted: 'Прыклад кода '
+ },
+ da: {
+ preformatted: 'Præformateret '
+ },
+ et: {
+ preformatted: 'Eelvormindatud tekst '
+ },
+ fr: {
+ preformatted: 'Exemple de code '
+ },
+ hu: {
+ preformatted: 'Kód minta '
+ },
+ it: {
+ preformatted: 'Codice '
+ },
+ ja: {
+ preformatted: 'コードサンプル '
+ },
+ ko: {
+ preformatted: '코드 예제 '
+ },
+ pt_br: {
+ preformatted: 'Exemple de código '
+ },
+ ru: {
+ preformatted: 'Пример кода '
+ },
+ tr: {
+ preformatted: 'Kod örneği '
+ },
+ zh_cn: {
+ preformatted: '代码示例 '
+ },
+ zh_tw: {
+ preformatted: '代碼範例 '
+ },
+ },
+ // jshint camelcase:true
+
+ plugins: {
+ preformatted: {
+ init: function (trumbowyg) {
+ var btnDef = {
+ fn: function () {
+ trumbowyg.saveRange();
+ var text = trumbowyg.getRangeText();
+ if (text.replace(/\s/g, '') !== '') {
+ try {
+ var curtag = getSelectionParentElement().tagName.toLowerCase();
+ if (curtag === 'code' || curtag === 'pre') {
+ return unwrapCode();
+ }
+ else {
+ trumbowyg.execCmd('insertHTML', '' + strip(text) + '
');
+ }
+ } catch (e) {
+ }
+ }
+ },
+ tag: 'pre'
+ };
+
+ trumbowyg.addBtnDef('preformatted', btnDef);
+ }
+ }
+ }
+ });
+
+ /*
+ * GetSelectionParentElement
+ */
+ function getSelectionParentElement() {
+ var parentEl = null,
+ selection;
+
+ if (window.getSelection) {
+ selection = window.getSelection();
+ if (selection.rangeCount) {
+ parentEl = selection.getRangeAt(0).commonAncestorContainer;
+ if (parentEl.nodeType !== 1) {
+ parentEl = parentEl.parentNode;
+ }
+ }
+ } else if ((selection = document.selection) && selection.type !== 'Control') {
+ parentEl = selection.createRange().parentElement();
+ }
+
+ return parentEl;
+ }
+
+ /*
+ * Strip
+ * returns a text without HTML tags
+ */
+ function strip(html) {
+ var tmp = document.createElement('DIV');
+ tmp.innerHTML = html;
+ return tmp.textContent || tmp.innerText || '';
+ }
+
+ /*
+ * UnwrapCode
+ * ADD/FIX: to improve, works but can be better
+ * "paranoic" solution
+ */
+ function unwrapCode() {
+ var container = null;
+
+ if (document.selection) { //for IE
+ container = document.selection.createRange().parentElement();
+ } else {
+ var select = window.getSelection();
+ if (select.rangeCount > 0) {
+ container = select.getRangeAt(0).startContainer.parentNode;
+ }
+ }
+
+ //'paranoic' unwrap
+ var ispre = $(container).contents().closest('pre').length;
+ var iscode = $(container).contents().closest('code').length;
+
+ if (ispre && iscode) {
+ $(container).contents().unwrap('code').unwrap('pre');
+ } else if (ispre) {
+ $(container).contents().unwrap('pre');
+ } else if (iscode) {
+ $(container).contents().unwrap('code');
+ }
+ }
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js
new file mode 100644
index 0000000..8d47981
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js
@@ -0,0 +1,8 @@
+/* ===========================================================
+ * trumbowyg.preformatted.js v1.0
+ * Preformatted plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Casella Edoardo (Civile)
+ */
+!function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{preformatted:"Code sample "},by:{preformatted:"Прыклад кода "},da:{preformatted:"Præformateret "},et:{preformatted:"Eelvormindatud tekst "},fr:{preformatted:"Exemple de code "},hu:{preformatted:"Kód minta "},it:{preformatted:"Codice "},ja:{preformatted:"コードサンプル "},ko:{preformatted:"코드 예제 "},pt_br:{preformatted:"Exemple de código "},ru:{preformatted:"Пример кода "},tr:{preformatted:"Kod örneği "},zh_cn:{preformatted:"代码示例 "},zh_tw:{preformatted:"代碼範例 "}},plugins:{preformatted:{init:function(t){var r={fn:function(){t.saveRange();var r,n,o=t.getRangeText();if(""!==o.replace(/\s/g,""))try{var a=function(){var e,t=null;window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement());return t}().tagName.toLowerCase();if("code"===a||"pre"===a)return function(){var t=null;if(document.selection)t=document.selection.createRange().parentElement();else{var r=window.getSelection();r.rangeCount>0&&(t=r.getRangeAt(0).startContainer.parentNode)}var n=e(t).contents().closest("pre").length,o=e(t).contents().closest("code").length;n&&o?e(t).contents().unwrap("code").unwrap("pre"):n?e(t).contents().unwrap("pre"):o&&e(t).contents().unwrap("code")}();t.execCmd("insertHTML",""+(r=o,(n=document.createElement("DIV")).innerHTML=r,(n.textContent||n.innerText||"")+"
"))}catch(e){}},tag:"pre"};t.addBtnDef("preformatted",r)}}}})}(jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/resizimg/trumbowyg.resizimg.js b/vasl_templates/webapp/static/trumbowyg/plugins/resizimg/trumbowyg.resizimg.js
new file mode 100644
index 0000000..7870e9f
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/resizimg/trumbowyg.resizimg.js
@@ -0,0 +1,311 @@
+; (function ($) {
+ 'use strict';
+
+ var defaultOptions = {
+ minSize: 32,
+ step: 4
+ };
+
+ function preventDefault(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+
+ var ResizeWithCanvas = function (trumbowyg) {
+ // variable to create canvas and save img in resize mode
+ this.resizeCanvas = document.createElement('canvas');
+ // to allow canvas to get focus
+ this.resizeCanvas.setAttribute('tabindex', '0');
+ this.resizeCanvas.id = 'trumbowyg-resizimg-' + (+new Date());
+ this.ctx = null;
+ this.resizeImg = null;
+
+ this.pressEscape = function (obj) {
+ obj.reset();
+ };
+ this.pressBackspaceOrDelete = function (obj) {
+ $(obj.resizeCanvas).remove();
+ obj.resizeImg = null;
+ if (trumbowyg !== null){
+ trumbowyg.syncCode();
+ // notify changes
+ trumbowyg.$c.trigger('tbwchange');
+ }
+ };
+
+ // PRIVATE FUNCTION
+ var focusedNow = false;
+ var isCursorSeResize = false;
+
+ // calculate offset to change mouse over square in the canvas
+ var offsetX, offsetY;
+ var reOffset = function (canvas) {
+ var BB = canvas.getBoundingClientRect();
+ offsetX = BB.left;
+ offsetY = BB.top;
+ };
+
+ var updateCanvas = function (canvas, ctx, img, canvasWidth, canvasHeight) {
+ ctx.translate(0.5, 0.5);
+ ctx.lineWidth = 1;
+
+ // image
+ ctx.drawImage(img, 5, 5, canvasWidth - 10, canvasHeight - 10);
+
+ // border
+ ctx.beginPath();
+ ctx.rect(5, 5, canvasWidth - 10, canvasHeight - 10);
+ ctx.stroke();
+
+ // square in the angle
+ ctx.beginPath();
+ ctx.fillStyle = 'rgb(255, 255, 255)';
+ ctx.rect(canvasWidth - 10, canvasHeight - 10, 9, 9);
+ ctx.fill();
+ ctx.stroke();
+
+ // get the offset to change the mouse cursor
+ reOffset(canvas);
+
+ return ctx;
+ };
+
+ // PUBLIC FUNCTION
+ // necessary to correctly print cursor over square. Called once for instance. Useless with trumbowyg.
+ this.init = function () {
+ var _this = this;
+ $(window).on('scroll resize', function () {
+ _this.reCalcOffset();
+ });
+ };
+
+ this.reCalcOffset = function () {
+ reOffset(this.resizeCanvas);
+ };
+
+ this.canvasId = function () {
+ return this.resizeCanvas.id;
+ };
+
+ this.isActive = function () {
+ return this.resizeImg !== null;
+ };
+
+ this.isFocusedNow = function () {
+ return focusedNow;
+ };
+
+ this.blurNow = function () {
+ focusedNow = false;
+ };
+
+ // restore image in the HTML of the editor
+ this.reset = function () {
+ if (this.resizeImg === null) {
+ return;
+ }
+
+ // set style of image to avoid issue on resize because this attribute have priority over width and height attribute
+ this.resizeImg.setAttribute('style', 'width: 100%; max-width: ' + (this.resizeCanvas.clientWidth - 10) + 'px; height: auto; max-height: ' + (this.resizeCanvas.clientHeight - 10) + 'px;');
+
+ $(this.resizeCanvas).replaceWith($(this.resizeImg));
+
+ // reset canvas style
+ this.resizeCanvas.removeAttribute('style');
+ this.resizeImg = null;
+ };
+
+ // setup canvas with points and border to allow the resizing operation
+ this.setup = function (img, resizableOptions) {
+ this.resizeImg = img;
+
+ if (!this.resizeCanvas.getContext) {
+ return false;
+ }
+
+ focusedNow = true;
+
+ // draw canvas
+ this.resizeCanvas.width = $(this.resizeImg).width() + 10;
+ this.resizeCanvas.height = $(this.resizeImg).height() + 10;
+ this.resizeCanvas.style.margin = '-5px';
+ this.ctx = this.resizeCanvas.getContext('2d');
+
+ // replace image with canvas
+ $(this.resizeImg).replaceWith($(this.resizeCanvas));
+
+ updateCanvas(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height);
+
+ // enable resize
+ $(this.resizeCanvas).resizableSafe(resizableOptions)
+ .on('mousedown', preventDefault);
+
+ var _this = this;
+ $(this.resizeCanvas)
+ .on('mousemove', function (e) {
+ var mouseX = Math.round(e.clientX - offsetX);
+ var mouseY = Math.round(e.clientY - offsetY);
+
+ var wasCursorSeResize = isCursorSeResize;
+
+ _this.ctx.rect(_this.resizeCanvas.width - 10, _this.resizeCanvas.height - 10, 9, 9);
+ isCursorSeResize = _this.ctx.isPointInPath(mouseX, mouseY);
+ if (wasCursorSeResize !== isCursorSeResize) {
+ this.style.cursor = isCursorSeResize ? 'se-resize' : 'default';
+ }
+ })
+ .on('keydown', function (e) {
+ if (!_this.isActive()) {
+ return;
+ }
+
+ var x = e.keyCode;
+ if (x === 27) { // ESC
+ _this.pressEscape(_this);
+ } else if (x === 8 || x === 46) { // BACKSPACE or DELETE
+ _this.pressBackspaceOrDelete(_this);
+ }
+ })
+ .on('focus', preventDefault)
+ .on('blur', function () {
+ _this.reset();
+ // save changes
+ if (trumbowyg !== null){
+ trumbowyg.syncCode();
+ // notify changes
+ trumbowyg.$c.trigger('tbwchange');
+ }
+ });
+
+ this.resizeCanvas.focus();
+
+ return true;
+ };
+
+ // update the canvas after the resizing
+ this.refresh = function () {
+ if (!this.resizeCanvas.getContext) {
+ return;
+ }
+
+ this.resizeCanvas.width = this.resizeCanvas.clientWidth;
+ this.resizeCanvas.height = this.resizeCanvas.clientHeight;
+ updateCanvas(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height);
+ };
+ };
+
+ $.extend(true, $.trumbowyg, {
+ plugins: {
+ resizimg: {
+ destroyResizable: function () {},
+ init: function (trumbowyg) {
+ var destroyResizable = this.destroyResizable;
+
+ // object to interact with canvas
+ var resizeWithCanvas = new ResizeWithCanvas(trumbowyg);
+
+ this.destroyResizable = function () {
+ // clean html code
+ trumbowyg.$ed.find('canvas.resizable')
+ .resizableSafe('destroy')
+ .off('mousedown', preventDefault)
+ .removeClass('resizable');
+
+ resizeWithCanvas.reset();
+
+ trumbowyg.syncCode();
+ };
+
+ trumbowyg.o.plugins.resizimg = $.extend(true, {},
+ defaultOptions,
+ trumbowyg.o.plugins.resizimg || {},
+ {
+ resizable: {
+ resizeWidth: false,
+ onDragStart: function (ev, $el) {
+ var opt = trumbowyg.o.plugins.resizimg;
+ var x = ev.pageX - $el.offset().left;
+ var y = ev.pageY - $el.offset().top;
+ if (x < $el.width() - opt.minSize || y < $el.height() - opt.minSize) {
+ return false;
+ }
+ },
+ onDrag: function (ev, $el, newWidth, newHeight) {
+ var opt = trumbowyg.o.plugins.resizimg;
+ if (newHeight < opt.minSize) {
+ newHeight = opt.minSize;
+ }
+ newHeight -= newHeight % opt.step;
+ $el.height(newHeight);
+ return false;
+ },
+ onDragEnd: function () {
+ // resize update canvas information
+ resizeWithCanvas.refresh();
+ trumbowyg.syncCode();
+ }
+ }
+ }
+ );
+
+ function initResizable() {
+ trumbowyg.$ed.find('img')
+ .off('click')
+ .on('click', function (e) {
+ // if I'm already do a resize, reset it
+ if (resizeWithCanvas.isActive()) {
+ resizeWithCanvas.reset();
+ }
+ // initialize resize of image
+ resizeWithCanvas.setup(this, trumbowyg.o.plugins.resizimg.resizable);
+
+ preventDefault(e);
+ });
+ }
+
+ trumbowyg.$c.on('tbwinit', function () {
+ initResizable();
+
+ // disable resize when click on other items
+ trumbowyg.$ed.on('click', function (e) {
+ // check if I've clicked out of canvas or image to reset it
+ if ($(e.target).is('img') || e.target.id === resizeWithCanvas.canvasId()) {
+ return;
+ }
+
+ preventDefault(e);
+ resizeWithCanvas.reset();
+ //sync
+ trumbowyg.syncCode();
+ // notify changes
+ trumbowyg.$c.trigger('tbwchange');
+ });
+
+ trumbowyg.$ed.on('scroll', function () {
+ resizeWithCanvas.reCalcOffset();
+ });
+ });
+
+ trumbowyg.$c.on('tbwfocus tbwchange', initResizable);
+ trumbowyg.$c.on('tbwresize', function () {
+ resizeWithCanvas.reCalcOffset();
+ });
+
+ // Destroy
+ trumbowyg.$c.on('tbwblur', function () {
+ // when canvas is created the tbwblur is called
+ // this code avoid to destroy the canvas that allow the image resizing
+ if (resizeWithCanvas.isFocusedNow()) {
+ resizeWithCanvas.blurNow();
+ } else {
+ destroyResizable();
+ }
+ });
+ },
+ destroy: function () {
+ this.destroyResizable();
+ }
+ }
+ }
+ });
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/resizimg/trumbowyg.resizimg.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/resizimg/trumbowyg.resizimg.min.js
new file mode 100644
index 0000000..0345d21
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/resizimg/trumbowyg.resizimg.min.js
@@ -0,0 +1,3 @@
+!function(e){"use strict";var i={minSize:32,step:4};function t(e){e.stopPropagation(),e.preventDefault()}var s=function(i){this.resizeCanvas=document.createElement("canvas"),this.resizeCanvas.setAttribute("tabindex","0"),this.resizeCanvas.id="trumbowyg-resizimg-"+ +new Date,this.ctx=null,this.resizeImg=null,this.pressEscape=function(e){e.reset()},this.pressBackspaceOrDelete=function(t){e(t.resizeCanvas).remove(),t.resizeImg=null,null!==i&&(i.syncCode(),i.$c.trigger("tbwchange"))};var s,n,r=!1,a=!1,o=function(e){var i=e.getBoundingClientRect();s=i.left,n=i.top},h=function(e,i,t,s,n){return i.translate(.5,.5),i.lineWidth=1,i.drawImage(t,5,5,s-10,n-10),i.beginPath(),i.rect(5,5,s-10,n-10),i.stroke(),i.beginPath(),i.fillStyle="rgb(255, 255, 255)",i.rect(s-10,n-10,9,9),i.fill(),i.stroke(),o(e),i};
+// necessary to correctly print cursor over square. Called once for instance. Useless with trumbowyg.
+this.init=function(){var i=this;e(window).on("scroll resize",(function(){i.reCalcOffset()}))},this.reCalcOffset=function(){o(this.resizeCanvas)},this.canvasId=function(){return this.resizeCanvas.id},this.isActive=function(){return null!==this.resizeImg},this.isFocusedNow=function(){return r},this.blurNow=function(){r=!1},this.reset=function(){null!==this.resizeImg&&(this.resizeImg.setAttribute("style","width: 100%; max-width: "+(this.resizeCanvas.clientWidth-10)+"px; height: auto; max-height: "+(this.resizeCanvas.clientHeight-10)+"px;"),e(this.resizeCanvas).replaceWith(e(this.resizeImg)),this.resizeCanvas.removeAttribute("style"),this.resizeImg=null)},this.setup=function(o,c){if(this.resizeImg=o,!this.resizeCanvas.getContext)return!1;r=!0,this.resizeCanvas.width=e(this.resizeImg).width()+10,this.resizeCanvas.height=e(this.resizeImg).height()+10,this.resizeCanvas.style.margin="-5px",this.ctx=this.resizeCanvas.getContext("2d"),e(this.resizeImg).replaceWith(e(this.resizeCanvas)),h(this.resizeCanvas,this.ctx,this.resizeImg,this.resizeCanvas.width,this.resizeCanvas.height),e(this.resizeCanvas).resizableSafe(c).on("mousedown",t);var u=this;return e(this.resizeCanvas).on("mousemove",(function(e){var i=Math.round(e.clientX-s),t=Math.round(e.clientY-n),r=a;u.ctx.rect(u.resizeCanvas.width-10,u.resizeCanvas.height-10,9,9),r!==(a=u.ctx.isPointInPath(i,t))&&(this.style.cursor=a?"se-resize":"default")})).on("keydown",(function(e){if(u.isActive()){var i=e.keyCode;27===i?u.pressEscape(u):8!==i&&46!==i||u.pressBackspaceOrDelete(u)}})).on("focus",t).on("blur",(function(){u.reset(),null!==i&&(i.syncCode(),i.$c.trigger("tbwchange"))})),this.resizeCanvas.focus(),!0},this.refresh=function(){this.resizeCanvas.getContext&&(this.resizeCanvas.width=this.resizeCanvas.clientWidth,this.resizeCanvas.height=this.resizeCanvas.clientHeight,h(this.resizeCanvas,this.ctx,this.resizeImg,this.resizeCanvas.width,this.resizeCanvas.height))}};e.extend(!0,e.trumbowyg,{plugins:{resizimg:{destroyResizable:function(){},init:function(n){var r=this.destroyResizable,a=new s(n);function o(){n.$ed.find("img").off("click").on("click",(function(e){a.isActive()&&a.reset(),a.setup(this,n.o.plugins.resizimg.resizable),t(e)}))}this.destroyResizable=function(){n.$ed.find("canvas.resizable").resizableSafe("destroy").off("mousedown",t).removeClass("resizable"),a.reset(),n.syncCode()},n.o.plugins.resizimg=e.extend(!0,{},i,n.o.plugins.resizimg||{},{resizable:{resizeWidth:!1,onDragStart:function(e,i){var t=n.o.plugins.resizimg,s=e.pageX-i.offset().left,r=e.pageY-i.offset().top;if(s' + v.modal + '')[0];
+ trumbowyg.range.deleteContents();
+ trumbowyg.range.insertNode(node);
+ trumbowyg.syncCode();
+ trumbowyg.$c.trigger('tbwchange');
+ return true;
+ }
+ );
+ }
+ };
+ trumbowyg.addBtnDef('ruby', btnDef);
+ }
+ }
+ }
+ });
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/ruby/trumbowyg.ruby.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/ruby/trumbowyg.ruby.min.js
new file mode 100644
index 0000000..997e690
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/ruby/trumbowyg.ruby.min.js
@@ -0,0 +1,10 @@
+/* ===========================================================
+ * trumbowyg.ruby.js v1.0
+ * Ruby text plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Fathi Anshory (0x00000F5C)
+ * Twitter : @fscchannl
+ * Comment : Since I use trumbowyg in my project and required it to insert ruby text, so I thought I can contribute a little. :D
+ */
+!function(u){"use strict";u.extend(!0,u.trumbowyg,{langs:{en:{ruby:"Add ruby text",rubyModal:"Ruby modal",rubyText:"Ruby text"},by:{ruby:"Уставіць ruby тэкст",rubyModal:"Ruby анатацыя",rubyText:"Ruby тэкст"},da:{ruby:"Tilføj ruby tekst",rubyModal:"Ruby modal",rubyText:"Ruby tekst"},et:{ruby:"Lisa ruby tekst",rubyModal:"Ruby modaal",rubyText:"Ruby tekst"},fr:{ruby:"Ajouter du texte ruby",rubyModal:"Modale ruby",rubyText:"Texte ruby"},hu:{ruby:"Ruby szöveg hozzáadás",rubyModal:"Ruby modal",rubyText:"Ruby szöveg"},id:{ruby:"Sisipkan teks ruby",rubyModal:"Modal teks ruby",rubyText:"Teks ruby"},ko:{ruby:"루비 문자 넣기",rubyModal:"대상 문자",rubyText:"루비 문자"},pt_br:{ruby:"Adicionar texto ruby",rubyModal:"Modal ruby",rubyText:"Texto ruby"},ru:{ruby:"Вставить ruby текст",rubyModal:"Ruby аннотация",rubyText:"Ruby текст"},tr:{ruby:"Ruby metni ekle",rubyModal:"Ruby modal",rubyText:"Ruby metni"},zh_tw:{ruby:"加入 ruby 文字",rubyModal:"Ruby 彈跳視窗",rubyText:"Ruby 文字"}},plugins:{ruby:{init:function(r){var b={fn:function(){r.saveRange(),r.openModalInsert(r.lang.ruby,{rubyText:{label:r.lang.rubyText,required:!1},modal:{label:r.lang.rubyModal,value:r.getRangeText(),required:!0}},(function(b){var y=u(''+b.modal+"")[0];return r.range.deleteContents(),r.range.insertNode(y),r.syncCode(),r.$c.trigger("tbwchange"),!0}))}};r.addBtnDef("ruby",b)}}}})}(jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/trumbowyg.specialchars.js b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/trumbowyg.specialchars.js
new file mode 100644
index 0000000..b2af0d7
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/trumbowyg.specialchars.js
@@ -0,0 +1,94 @@
+/* ===========================================================
+ * trumbowyg.specialchars.js v0.99
+ * Unicode characters picker plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Renaud Hoyoux (geektortoise)
+*/
+
+(function ($) {
+ 'use strict';
+
+ var defaultOptions = {
+ symbolList: [
+ // currencies
+ '0024', '20AC', '00A3', '00A2', '00A5', '00A4', '2030', null,
+ // legal signs
+ '00A9', '00AE', '2122', null,
+ // textual sign
+ '00A7', '00B6', '00C6', '00E6', '0152', '0153', null,
+ '2022', '25CF', '2023', '25B6', '2B29', '25C6', null,
+ //maths
+ '00B1', '00D7', '00F7', '21D2', '21D4', '220F', '2211', '2243', '2264', '2265'
+ ]
+ };
+
+ $.extend(true, $.trumbowyg, {
+ langs: {
+ en: {
+ specialChars: 'Special characters'
+ },
+ by: {
+ specialChars: 'Спецыяльныя сімвалы'
+ },
+ et: {
+ specialChars: 'Erimärgid'
+ },
+ fr: {
+ specialChars: 'Caractères spéciaux'
+ },
+ hu: {
+ specialChars: 'Speciális karakterek'
+ },
+ ko: {
+ specialChars: '특수문자'
+ },
+ ru: {
+ specialChars: 'Специальные символы'
+ },
+ tr: {
+ specialChars: 'Özel karakterler'
+ },
+ },
+ plugins: {
+ specialchars: {
+ init: function (trumbowyg) {
+ trumbowyg.o.plugins.specialchars = trumbowyg.o.plugins.specialchars || defaultOptions;
+ var specialCharsBtnDef = {
+ dropdown: buildDropdown(trumbowyg)
+ };
+
+ trumbowyg.addBtnDef('specialChars', specialCharsBtnDef);
+ }
+ }
+ }
+ });
+
+ function buildDropdown(trumbowyg) {
+ var dropdown = [];
+ $.each(trumbowyg.o.plugins.specialchars.symbolList, function (i, symbol) {
+ if (symbol === null) {
+ symbol = ' ';
+ } else {
+ symbol = '' + symbol;
+ }
+
+ var btn = symbol.replace(/:/g, ''),
+ defaultSymbolBtnName = 'symbol-' + btn,
+ defaultSymbolBtnDef = {
+ text: symbol,
+ hasIcon: false,
+ fn: function () {
+ var encodedSymbol = String.fromCodePoint(parseInt(symbol.replace('', '0')));
+ trumbowyg.execCmd('insertText', encodedSymbol);
+ return true;
+ }
+ };
+
+ trumbowyg.addBtnDef(defaultSymbolBtnName, defaultSymbolBtnDef);
+ dropdown.push(defaultSymbolBtnName);
+ });
+
+ return dropdown;
+ }
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/trumbowyg.specialchars.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/trumbowyg.specialchars.min.js
new file mode 100644
index 0000000..0b637ff
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/trumbowyg.specialchars.min.js
@@ -0,0 +1,8 @@
+/* ===========================================================
+ * trumbowyg.specialchars.js v0.99
+ * Unicode characters picker plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Renaud Hoyoux (geektortoise)
+*/
+!function(a){"use strict";var s={symbolList:["0024","20AC","00A3","00A2","00A5","00A4","2030",null,"00A9","00AE","2122",null,"00A7","00B6","00C6","00E6","0152","0153",null,"2022","25CF","2023","25B6","2B29","25C6",null,"00B1","00D7","00F7","21D2","21D4","220F","2211","2243","2264","2265"]};function r(s){var r=[];return a.each(s.o.plugins.specialchars.symbolList,(function(a,e){var l="symbol-"+(e=null===e?" ":""+e).replace(/:/g,""),i={text:e,hasIcon:!1,fn:function(){var a=String.fromCodePoint(parseInt(e.replace("","0")));return s.execCmd("insertText",a),!0}};s.addBtnDef(l,i),r.push(l)})),r}a.extend(!0,a.trumbowyg,{langs:{en:{specialChars:"Special characters"},by:{specialChars:"Спецыяльныя сімвалы"},et:{specialChars:"Erimärgid"},fr:{specialChars:"Caractères spéciaux"},hu:{specialChars:"Speciális karakterek"},ko:{specialChars:"특수문자"},ru:{specialChars:"Специальные символы"},tr:{specialChars:"Özel karakterler"}},plugins:{specialchars:{init:function(a){a.o.plugins.specialchars=a.o.plugins.specialchars||s;var e={dropdown:r(a)};a.addBtnDef("specialChars",e)}}}})}(jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/sass/trumbowyg.specialchars.scss b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/sass/trumbowyg.specialchars.scss
new file mode 100644
index 0000000..6b2797b
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/sass/trumbowyg.specialchars.scss
@@ -0,0 +1,56 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Default stylesheet for Trumbowyg editor plugin
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+.trumbowyg-symbol-\ -dropdown-button {
+ display: none !important;
+}
+.trumbowyg-symbol-\ -dropdown-button + button {
+ clear: both;
+}
+
+.trumbowyg-dropdown-specialChars {
+ width: 248px;
+ padding: 5px 3px 3px;
+}
+
+.trumbowyg-dropdown-specialChars button {
+ display: block;
+ position: relative;
+ float: left;
+ height: 26px;
+ width: 26px;
+ padding: 0;
+ margin: 2px;
+ line-height: 24px;
+ text-align: center;
+
+ &:hover,
+ &:focus {
+ &::after {
+ display: block;
+ position: absolute;
+ top: -5px;
+ left: -5px;
+ height: 27px;
+ width: 27px;
+ background: inherit;
+ box-shadow: #000 0 0 2px;
+ z-index: 10;
+ background-color: transparent;
+ }
+ }
+}
+
+.trumbowyg .specialChars {
+ width: 22px;
+ height: 22px;
+ display: inline-block;
+}
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.css b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.css
new file mode 100644
index 0000000..22c5887
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.css
@@ -0,0 +1,48 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Trumbowyg plugin stylesheet
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+.trumbowyg-symbol-\ -dropdown-button {
+ display: none !important; }
+
+.trumbowyg-symbol-\ -dropdown-button + button {
+ clear: both; }
+
+.trumbowyg-dropdown-specialChars {
+ width: 248px;
+ padding: 5px 3px 3px; }
+
+.trumbowyg-dropdown-specialChars button {
+ display: block;
+ position: relative;
+ float: left;
+ height: 26px;
+ width: 26px;
+ padding: 0;
+ margin: 2px;
+ line-height: 24px;
+ text-align: center; }
+ .trumbowyg-dropdown-specialChars button:hover::after, .trumbowyg-dropdown-specialChars button:focus::after {
+ display: block;
+ position: absolute;
+ top: -5px;
+ left: -5px;
+ height: 27px;
+ width: 27px;
+ background: inherit;
+ -webkit-box-shadow: #000 0 0 2px;
+ box-shadow: #000 0 0 2px;
+ z-index: 10;
+ background-color: transparent; }
+
+.trumbowyg .specialChars {
+ width: 22px;
+ height: 22px;
+ display: inline-block; }
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.min.css b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.min.css
new file mode 100644
index 0000000..9a3a393
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.min.css
@@ -0,0 +1,2 @@
+/** Trumbowyg v2.25.2 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
+.trumbowyg-symbol-\ -dropdown-button{display:none!important}.trumbowyg-symbol-\ -dropdown-button+button{clear:both}.trumbowyg-dropdown-specialChars{width:248px;padding:5px 3px 3px}.trumbowyg-dropdown-specialChars button{display:block;position:relative;float:left;height:26px;width:26px;padding:0;margin:2px;line-height:24px;text-align:center}.trumbowyg-dropdown-specialChars button:focus::after,.trumbowyg-dropdown-specialChars button:hover::after{display:block;position:absolute;top:-5px;left:-5px;height:27px;width:27px;background:inherit;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10;background-color:transparent}.trumbowyg .specialChars{width:22px;height:22px;display:inline-block}
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/table/trumbowyg.table.js b/vasl_templates/webapp/static/trumbowyg/plugins/table/trumbowyg.table.js
new file mode 100644
index 0000000..4edc58a
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/table/trumbowyg.table.js
@@ -0,0 +1,454 @@
+/* ===========================================================
+ * trumbowyg.table.custom.js v2.0
+ * Table plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Sven Dunemann [dunemann@forelabs.eu]
+ */
+
+(function ($) {
+ 'use strict';
+
+ var defaultOptions = {
+ rows: 8,
+ columns: 8,
+ styler: 'table'
+ };
+
+ $.extend(true, $.trumbowyg, {
+ langs: {
+ // jshint camelcase:false
+ en: {
+ table: 'Insert table',
+ tableAddRow: 'Add row',
+ tableAddRowAbove: 'Add row above',
+ tableAddColumnLeft: 'Add column to the left',
+ tableAddColumn: 'Add column to the right',
+ tableDeleteRow: 'Delete row',
+ tableDeleteColumn: 'Delete column',
+ tableDestroy: 'Delete table',
+ error: 'Error'
+ },
+ cs: {
+ table: 'Vytvořit příkaz Table',
+ tableAddRow: 'Přidat řádek',
+ tableAddRowAbove: 'Přidat řádek',
+ tableAddColumnLeft: 'Přidat sloupec',
+ tableAddColumn: 'Přidat sloupec',
+ error: 'Chyba'
+ },
+ da: {
+ table: 'Indsæt tabel',
+ tableAddRow: 'Tilføj række',
+ tableAddRowAbove: 'Tilføj række',
+ tableAddColumnLeft: 'Tilføj kolonne',
+ tableAddColumn: 'Tilføj kolonne',
+ tableDeleteRow: 'Slet række',
+ tableDeleteColumn: 'Slet kolonne',
+ tableDestroy: 'Slet tabel',
+ error: 'Fejl'
+ },
+ de: {
+ table: 'Tabelle einfügen',
+ tableAddRow: 'Zeile hinzufügen',
+ tableAddRowAbove: 'Zeile hinzufügen',
+ tableAddColumnLeft: 'Spalte hinzufügen',
+ tableAddColumn: 'Spalte hinzufügen',
+ tableDeleteRow: 'Zeile löschen',
+ tableDeleteColumn: 'Spalte löschen',
+ tableDestroy: 'Tabelle löschen',
+ error: 'Error'
+ },
+ et: {
+ table: 'Sisesta tabel',
+ tableAddRow: 'Lisa rida',
+ tableAddRowAbove: 'Lisa rida üles',
+ tableAddColumnLeft: 'Lisa tulp vasakule',
+ tableAddColumn: 'Lisa tulp paremale',
+ tableDeleteRow: 'Kustuta rida',
+ tableDeleteColumn: 'Kustuta tulp',
+ tableDestroy: 'Kustuta tabel',
+ error: 'Viga'
+ },
+ fr: {
+ table: 'Insérer un tableau',
+ tableAddRow: 'Ajouter des lignes',
+ tableAddRowAbove: 'Ajouter des lignes',
+ tableAddColumnLeft: 'Ajouter des colonnes',
+ tableAddColumn: 'Ajouter des colonnes',
+ tableDeleteRow: 'Effacer la ligne',
+ tableDeleteColumn: 'Effacer la colonne',
+ tableDestroy: 'Effacer le tableau',
+ error: 'Erreur'
+ },
+ hu: {
+ table: 'Táblázat beszúrás',
+ tableAddRow: 'Sor hozzáadás',
+ tableAddRowAbove: 'Sor beszúrás fönt',
+ tableAddColumnLeft: 'Sor beszúrás balra',
+ tableAddColumn: 'Sor beszúrás jobbra',
+ tableDeleteRow: 'Sor törlés',
+ tableDeleteColumn: 'Oszlop törlés',
+ tableDestroy: 'Táblázat törlés',
+ error: 'Hiba'
+ },
+ id: {
+ table: 'Sisipkan tabel',
+ tableAddRow: 'Sisipkan baris',
+ tableAddRowAbove: 'Sisipkan baris',
+ tableAddColumnLeft: 'Sisipkan kolom',
+ tableAddColumn: 'Sisipkan kolom',
+ tableDeleteRow: 'Hapus baris',
+ tableDeleteColumn: 'Hapus kolom',
+ tableDestroy: 'Hapus tabel',
+ error: 'Galat'
+ },
+ ja: {
+ table: '表の挿入',
+ tableAddRow: '行の追加',
+ tableAddRowAbove: '行の追加',
+ tableAddColumnLeft: '列の追加',
+ tableAddColumn: '列の追加',
+ error: 'エラー'
+ },
+ ko: {
+ table: '표 넣기',
+ tableAddRow: '줄 추가',
+ tableAddRowAbove: '줄 추가',
+ tableAddColumnLeft: '칸 추가',
+ tableAddColumn: '칸 추가',
+ tableDeleteRow: '줄 삭제',
+ tableDeleteColumn: '칸 삭제',
+ tableDestroy: '표 지우기',
+ error: '에러'
+ },
+ pt_br: {
+ table: 'Inserir tabela',
+ tableAddRow: 'Adicionar linha',
+ tableAddRowAbove: 'Adicionar linha',
+ tableAddColumnLeft: 'Adicionar coluna',
+ tableAddColumn: 'Adicionar coluna',
+ tableDeleteRow: 'Deletar linha',
+ tableDeleteColumn: 'Deletar coluna',
+ tableDestroy: 'Deletar tabela',
+ error: 'Erro'
+ },
+ ru: {
+ table: 'Вставить таблицу',
+ tableAddRow: 'Добавить строку',
+ tableAddRowAbove: 'Добавить строку',
+ tableAddColumnLeft: 'Добавить столбец',
+ tableAddColumn: 'Добавить столбец',
+ tableDeleteRow: 'Удалить строку',
+ tableDeleteColumn: 'Удалить столбец',
+ tableDestroy: 'Удалить таблицу',
+ error: 'Ошибка'
+ },
+ sk: {
+ table: 'Vytvoriť tabuľky',
+ tableAddRow: 'Pridať riadok',
+ tableAddRowAbove: 'Pridať riadok',
+ tableAddColumnLeft: 'Pridať stĺpec',
+ tableAddColumn: 'Pridať stĺpec',
+ error: 'Chyba'
+ },
+ tr: {
+ table: 'Tablo ekle',
+ tableAddRow: 'Satır ekle',
+ tableAddRowAbove: 'Yukarıya satır ekle',
+ tableAddColumnLeft: 'Sola sütun ekle',
+ tableAddColumn: 'Sağa sütun ekle',
+ tableDeleteRow: 'Satırı sil',
+ tableDeleteColumn: 'Sütunu sil',
+ tableDestroy: 'Tabloyu sil',
+ error: 'Hata'
+ },
+ zh_tw: {
+ table: '插入表格',
+ tableAddRow: '加入行',
+ tableAddRowAbove: '加入行',
+ tableAddColumnLeft: '加入列',
+ tableAddColumn: '加入列',
+ tableDeleteRow: '刪除行',
+ tableDeleteColumn: '刪除列',
+ tableDestroy: '刪除表格',
+ error: '錯誤'
+ },
+ es: {
+ table: 'Insertar tabla',
+ tableAddRow: 'Agregar fila',
+ tableAddRowAbove: 'Agregar fila arriba',
+ tableAddColumnLeft: 'Agregar columna a la izquierda',
+ tableAddColumn: 'Agregar columna a la derecha',
+ tableDeleteRow: 'Borrar fila',
+ tableDeleteColumn: 'Borrar columna',
+ tableDestroy: 'Borrar tabla',
+ error: 'Error'
+ }// jshint camelcase:true
+ },
+
+ plugins: {
+ table: {
+ init: function (t) {
+ t.o.plugins.table = $.extend(true, {}, defaultOptions, t.o.plugins.table || {});
+
+ var buildButtonDef = {
+ fn: function () {
+ t.saveRange();
+
+ var btnName = 'table';
+
+ var dropdownPrefix = t.o.prefix + 'dropdown',
+ dropdownOptions = { // the dropdown
+ class: dropdownPrefix + '-' + btnName + ' ' + dropdownPrefix + ' ' + t.o.prefix + 'fixed-top'
+ };
+ dropdownOptions['data-' + dropdownPrefix] = btnName;
+ var $dropdown = $('', dropdownOptions);
+
+ if (t.$box.find('.' + dropdownPrefix + '-' + btnName).length === 0) {
+ t.$box.append($dropdown.hide());
+ } else {
+ $dropdown = t.$box.find('.' + dropdownPrefix + '-' + btnName);
+ }
+
+ // clear dropdown
+ $dropdown.html('');
+
+ // when active table show AddRow / AddColumn
+ if (t.$box.find('.' + t.o.prefix + 'table-button').hasClass(t.o.prefix + 'active-button')) {
+ $dropdown.append(t.buildSubBtn('tableAddRowAbove'));
+ $dropdown.append(t.buildSubBtn('tableAddRow'));
+ $dropdown.append(t.buildSubBtn('tableAddColumnLeft'));
+ $dropdown.append(t.buildSubBtn('tableAddColumn'));
+ $dropdown.append(t.buildSubBtn('tableDeleteRow'));
+ $dropdown.append(t.buildSubBtn('tableDeleteColumn'));
+ $dropdown.append(t.buildSubBtn('tableDestroy'));
+ } else {
+ var tableSelect = $('');
+ $('').appendTo(tableSelect);
+ for (var i = 0; i < t.o.plugins.table.rows; i += 1) {
+ var row = $('
').appendTo(tableSelect);
+ for (var j = 0; j < t.o.plugins.table.columns; j += 1) {
+ $(' | ').appendTo(row);
+ }
+ }
+ tableSelect.find('td').on('mouseover', tableAnimate);
+ tableSelect.find('td').on('mousedown', tableBuild);
+
+ $dropdown.append(tableSelect);
+ $dropdown.append($('1x1
'));
+ }
+
+ t.dropdown(btnName);
+ }
+ };
+
+ var tableAnimate = function(columnEvent) {
+ var column = $(columnEvent.target),
+ table = column.closest('table'),
+ colIndex = this.cellIndex,
+ rowIndex = this.parentNode.rowIndex;
+
+ // reset all columns
+ table.find('td').removeClass('active');
+
+ for (var i = 0; i <= rowIndex; i += 1) {
+ for (var j = 0; j <= colIndex; j += 1) {
+ table.find('tr:nth-of-type('+(i+1)+')').find('td:nth-of-type('+(j+1)+')').addClass('active');
+ }
+ }
+
+ // set label
+ table.next('.trumbowyg-table-size').html((colIndex+1) + 'x' + (rowIndex+1));
+ };
+
+ var tableBuild = function() {
+ t.saveRange();
+
+ var tabler = $('');
+ $('').appendTo(tabler);
+ if (t.o.plugins.table.styler) {
+ tabler.attr('class', t.o.plugins.table.styler);
+ }
+
+ var colIndex = this.cellIndex,
+ rowIndex = this.parentNode.rowIndex;
+
+ for (var i = 0; i <= rowIndex; i += 1) {
+ var row = $('
').appendTo(tabler);
+ for (var j = 0; j <= colIndex; j += 1) {
+ $(' | ').appendTo(row);
+ }
+ }
+
+ t.range.deleteContents();
+ t.range.insertNode(tabler[0]);
+ t.$c.trigger('tbwchange');
+ };
+
+ var addRow = {
+ title: t.lang.tableAddRow,
+ text: t.lang.tableAddRow,
+ ico: 'row-below',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode;
+ var focusedRow = $(node).closest('tr');
+ var table = $(node).closest('table');
+
+ if(table.length > 0) {
+ var row = $('
');
+ // add columns according to current columns count
+ for (var i = 0; i < table.find('tr')[0].childElementCount; i += 1) {
+ $(' | ').appendTo(row);
+ }
+ // add row to table
+ focusedRow.after(row);
+ }
+
+ t.syncCode();
+ }
+ };
+
+ var addRowAbove = {
+ title: t.lang.tableAddRowAbove,
+ text: t.lang.tableAddRowAbove,
+ ico: 'row-above',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode;
+ var focusedRow = $(node).closest('tr');
+ var table = $(node).closest('table');
+
+ if(table.length > 0) {
+ var row = $('
');
+ // add columns according to current columns count
+ for (var i = 0; i < table.find('tr')[0].childElementCount; i += 1) {
+ $(' | ').appendTo(row);
+ }
+ // add row to table
+ focusedRow.before(row);
+ }
+
+ t.syncCode();
+ }
+ };
+
+ var addColumn = {
+ title: t.lang.tableAddColumn,
+ text: t.lang.tableAddColumn,
+ ico: 'col-right',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode;
+ var focusedCol = $(node).closest('td');
+ var table = $(node).closest('table');
+ var focusedColIdx = focusedCol.index();
+
+ if(table.length > 0) {
+ $(table).find('tr').each(function() {
+ $($(this).children()[focusedColIdx]).after(' | ');
+ });
+ }
+
+ t.syncCode();
+ }
+ };
+
+ var addColumnLeft = {
+ title: t.lang.tableAddColumnLeft,
+ text: t.lang.tableAddColumnLeft,
+ ico: 'col-left',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode;
+ var focusedCol = $(node).closest('td');
+ var table = $(node).closest('table');
+ var focusedColIdx = focusedCol.index();
+
+ if(table.length > 0) {
+ $(table).find('tr').each(function() {
+ $($(this).children()[focusedColIdx]).before(' | ');
+ });
+ }
+
+ t.syncCode();
+ }
+ };
+
+ var destroy = {
+ title: t.lang.tableDestroy,
+ text: t.lang.tableDestroy,
+ ico: 'table-delete',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode,
+ table = $(node).closest('table');
+
+ table.remove();
+
+ t.syncCode();
+ }
+ };
+
+ var deleteRow = {
+ title: t.lang.tableDeleteRow,
+ text: t.lang.tableDeleteRow,
+ ico: 'row-delete',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode,
+ row = $(node).closest('tr');
+
+ row.remove();
+
+ t.syncCode();
+ }
+ };
+
+ var deleteColumn = {
+ title: t.lang.tableDeleteColumn,
+ text: t.lang.tableDeleteColumn,
+ ico: 'col-delete',
+
+ fn: function () {
+ t.saveRange();
+
+ var node = t.doc.getSelection().focusNode,
+ table = $(node).closest('table'),
+ td = $(node).closest('td'),
+ cellIndex = td.index();
+
+ $(table).find('tr').each(function() {
+ $(this).find('td:eq(' + cellIndex + ')').remove();
+ });
+
+ t.syncCode();
+ }
+ };
+
+ t.addBtnDef('table', buildButtonDef);
+ t.addBtnDef('tableAddRowAbove', addRowAbove);
+ t.addBtnDef('tableAddRow', addRow);
+ t.addBtnDef('tableAddColumnLeft', addColumnLeft);
+ t.addBtnDef('tableAddColumn', addColumn);
+ t.addBtnDef('tableDeleteRow', deleteRow);
+ t.addBtnDef('tableDeleteColumn', deleteColumn);
+ t.addBtnDef('tableDestroy', destroy);
+ }
+ }
+ }
+ });
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/table/trumbowyg.table.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/table/trumbowyg.table.min.js
new file mode 100644
index 0000000..4222d10
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/table/trumbowyg.table.min.js
@@ -0,0 +1,8 @@
+/* ===========================================================
+ * trumbowyg.table.custom.js v2.0
+ * Table plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Sven Dunemann [dunemann@forelabs.eu]
+ */
+!function(e){"use strict";var t={rows:8,columns:8,styler:"table"};e.extend(!0,e.trumbowyg,{langs:{en:{table:"Insert table",tableAddRow:"Add row",tableAddRowAbove:"Add row above",tableAddColumnLeft:"Add column to the left",tableAddColumn:"Add column to the right",tableDeleteRow:"Delete row",tableDeleteColumn:"Delete column",tableDestroy:"Delete table",error:"Error"},cs:{table:"Vytvořit příkaz Table",tableAddRow:"Přidat řádek",tableAddRowAbove:"Přidat řádek",tableAddColumnLeft:"Přidat sloupec",tableAddColumn:"Přidat sloupec",error:"Chyba"},da:{table:"Indsæt tabel",tableAddRow:"Tilføj række",tableAddRowAbove:"Tilføj række",tableAddColumnLeft:"Tilføj kolonne",tableAddColumn:"Tilføj kolonne",tableDeleteRow:"Slet række",tableDeleteColumn:"Slet kolonne",tableDestroy:"Slet tabel",error:"Fejl"},de:{table:"Tabelle einfügen",tableAddRow:"Zeile hinzufügen",tableAddRowAbove:"Zeile hinzufügen",tableAddColumnLeft:"Spalte hinzufügen",tableAddColumn:"Spalte hinzufügen",tableDeleteRow:"Zeile löschen",tableDeleteColumn:"Spalte löschen",tableDestroy:"Tabelle löschen",error:"Error"},et:{table:"Sisesta tabel",tableAddRow:"Lisa rida",tableAddRowAbove:"Lisa rida üles",tableAddColumnLeft:"Lisa tulp vasakule",tableAddColumn:"Lisa tulp paremale",tableDeleteRow:"Kustuta rida",tableDeleteColumn:"Kustuta tulp",tableDestroy:"Kustuta tabel",error:"Viga"},fr:{table:"Insérer un tableau",tableAddRow:"Ajouter des lignes",tableAddRowAbove:"Ajouter des lignes",tableAddColumnLeft:"Ajouter des colonnes",tableAddColumn:"Ajouter des colonnes",tableDeleteRow:"Effacer la ligne",tableDeleteColumn:"Effacer la colonne",tableDestroy:"Effacer le tableau",error:"Erreur"},hu:{table:"Táblázat beszúrás",tableAddRow:"Sor hozzáadás",tableAddRowAbove:"Sor beszúrás fönt",tableAddColumnLeft:"Sor beszúrás balra",tableAddColumn:"Sor beszúrás jobbra",tableDeleteRow:"Sor törlés",tableDeleteColumn:"Oszlop törlés",tableDestroy:"Táblázat törlés",error:"Hiba"},id:{table:"Sisipkan tabel",tableAddRow:"Sisipkan baris",tableAddRowAbove:"Sisipkan baris",tableAddColumnLeft:"Sisipkan kolom",tableAddColumn:"Sisipkan kolom",tableDeleteRow:"Hapus baris",tableDeleteColumn:"Hapus kolom",tableDestroy:"Hapus tabel",error:"Galat"},ja:{table:"表の挿入",tableAddRow:"行の追加",tableAddRowAbove:"行の追加",tableAddColumnLeft:"列の追加",tableAddColumn:"列の追加",error:"エラー"},ko:{table:"표 넣기",tableAddRow:"줄 추가",tableAddRowAbove:"줄 추가",tableAddColumnLeft:"칸 추가",tableAddColumn:"칸 추가",tableDeleteRow:"줄 삭제",tableDeleteColumn:"칸 삭제",tableDestroy:"표 지우기",error:"에러"},pt_br:{table:"Inserir tabela",tableAddRow:"Adicionar linha",tableAddRowAbove:"Adicionar linha",tableAddColumnLeft:"Adicionar coluna",tableAddColumn:"Adicionar coluna",tableDeleteRow:"Deletar linha",tableDeleteColumn:"Deletar coluna",tableDestroy:"Deletar tabela",error:"Erro"},ru:{table:"Вставить таблицу",tableAddRow:"Добавить строку",tableAddRowAbove:"Добавить строку",tableAddColumnLeft:"Добавить столбец",tableAddColumn:"Добавить столбец",tableDeleteRow:"Удалить строку",tableDeleteColumn:"Удалить столбец",tableDestroy:"Удалить таблицу",error:"Ошибка"},sk:{table:"Vytvoriť tabuľky",tableAddRow:"Pridať riadok",tableAddRowAbove:"Pridať riadok",tableAddColumnLeft:"Pridať stĺpec",tableAddColumn:"Pridať stĺpec",error:"Chyba"},tr:{table:"Tablo ekle",tableAddRow:"Satır ekle",tableAddRowAbove:"Yukarıya satır ekle",tableAddColumnLeft:"Sola sütun ekle",tableAddColumn:"Sağa sütun ekle",tableDeleteRow:"Satırı sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Tabloyu sil",error:"Hata"},zh_tw:{table:"插入表格",tableAddRow:"加入行",tableAddRowAbove:"加入行",tableAddColumnLeft:"加入列",tableAddColumn:"加入列",tableDeleteRow:"刪除行",tableDeleteColumn:"刪除列",tableDestroy:"刪除表格",error:"錯誤"},es:{table:"Insertar tabla",tableAddRow:"Agregar fila",tableAddRowAbove:"Agregar fila arriba",tableAddColumnLeft:"Agregar columna a la izquierda",tableAddColumn:"Agregar columna a la derecha",tableDeleteRow:"Borrar fila",tableDeleteColumn:"Borrar columna",tableDestroy:"Borrar tabla",error:"Error"}},plugins:{table:{init:function(l){l.o.plugins.table=e.extend(!0,{},t,l.o.plugins.table||{});var a={fn:function(){l.saveRange();var t="table",a=l.o.prefix+"dropdown",n={class:a+"-"+"table "+a+" "+l.o.prefix+"fixed-top"};n["data-"+a]=t;var b=e("",n);if(0===l.$box.find("."+a+"-"+t).length?l.$box.append(b.hide()):b=l.$box.find("."+a+"-"+t),b.html(""),l.$box.find("."+l.o.prefix+"table-button").hasClass(l.o.prefix+"active-button"))b.append(l.buildSubBtn("tableAddRowAbove")),b.append(l.buildSubBtn("tableAddRow")),b.append(l.buildSubBtn("tableAddColumnLeft")),b.append(l.buildSubBtn("tableAddColumn")),b.append(l.buildSubBtn("tableDeleteRow")),b.append(l.buildSubBtn("tableDeleteColumn")),b.append(l.buildSubBtn("tableDestroy"));else{var r=e("");e("").appendTo(r);for(var i=0;i").appendTo(r),u=0;u").appendTo(s);r.find("td").on("mouseover",o),r.find("td").on("mousedown",d),b.append(r),b.append(e('1x1
'))}l.dropdown(t)}},o=function(t){var l=e(t.target).closest("table"),a=this.cellIndex,o=this.parentNode.rowIndex;l.find("td").removeClass("active");for(var d=0;d<=o;d+=1)for(var n=0;n<=a;n+=1)l.find("tr:nth-of-type("+(d+1)+")").find("td:nth-of-type("+(n+1)+")").addClass("active");l.next(".trumbowyg-table-size").html(a+1+"x"+(o+1))},d=function(){l.saveRange();var t=e("");e("").appendTo(t),l.o.plugins.table.styler&&t.attr("class",l.o.plugins.table.styler);for(var a=this.cellIndex,o=this.parentNode.rowIndex,d=0;d<=o;d+=1)for(var n=e("
").appendTo(t),b=0;b<=a;b+=1)e(" | ").appendTo(n);l.range.deleteContents(),l.range.insertNode(t[0]),l.$c.trigger("tbwchange")},n={title:l.lang.tableAddRow,text:l.lang.tableAddRow,ico:"row-below",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode,a=e(t).closest("tr"),o=e(t).closest("table");if(o.length>0){for(var d=e("
"),n=0;n").appendTo(d);a.after(d)}l.syncCode()}},b={title:l.lang.tableAddRowAbove,text:l.lang.tableAddRowAbove,ico:"row-above",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode,a=e(t).closest("tr"),o=e(t).closest("table");if(o.length>0){for(var d=e("
"),n=0;n").appendTo(d);a.before(d)}l.syncCode()}},r={title:l.lang.tableAddColumn,text:l.lang.tableAddColumn,ico:"col-right",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode,a=e(t).closest("td"),o=e(t).closest("table"),d=a.index();o.length>0&&e(o).find("tr").each((function(){e(e(this).children()[d]).after(" | ")})),l.syncCode()}},i={title:l.lang.tableAddColumnLeft,text:l.lang.tableAddColumnLeft,ico:"col-left",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode,a=e(t).closest("td"),o=e(t).closest("table"),d=a.index();o.length>0&&e(o).find("tr").each((function(){e(e(this).children()[d]).before(" | ")})),l.syncCode()}},s={title:l.lang.tableDestroy,text:l.lang.tableDestroy,ico:"table-delete",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode;e(t).closest("table").remove(),l.syncCode()}},u={title:l.lang.tableDeleteRow,text:l.lang.tableDeleteRow,ico:"row-delete",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode;e(t).closest("tr").remove(),l.syncCode()}},f={title:l.lang.tableDeleteColumn,text:l.lang.tableDeleteColumn,ico:"col-delete",fn:function(){l.saveRange();var t=l.doc.getSelection().focusNode,a=e(t).closest("table"),o=e(t).closest("td").index();e(a).find("tr").each((function(){e(this).find("td:eq("+o+")").remove()})),l.syncCode()}};l.addBtnDef("table",a),l.addBtnDef("tableAddRowAbove",b),l.addBtnDef("tableAddRow",n),l.addBtnDef("tableAddColumnLeft",i),l.addBtnDef("tableAddColumn",r),l.addBtnDef("tableDeleteRow",u),l.addBtnDef("tableDeleteColumn",f),l.addBtnDef("tableDestroy",s)}}}})}(jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/sass/trumbowyg.table.scss b/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/sass/trumbowyg.table.scss
new file mode 100644
index 0000000..a7e300c
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/sass/trumbowyg.table.scss
@@ -0,0 +1,46 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Default stylesheet for Trumbowyg editor plugin
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+.trumbowyg-editor table {
+ width: 100%;
+
+ td {
+ border: 1px dotted #e7eaec;
+ padding: 8px;
+ }
+}
+
+.trumbowyg-dropdown-table {
+ table {
+ margin: 10px;
+ display: inline-block;
+ }
+
+ table td {
+ display: inline-block;
+ height: 20px;
+ width: 20px;
+ margin: 1px;
+ padding: 0;
+ background-color: #fff;
+ box-shadow: 0 0 0 1px #cecece inset;
+
+ &.active {
+ background-color: #00b393;
+ box-shadow: none;
+ cursor: pointer;
+ }
+ }
+
+ .trumbowyg-table-size {
+ text-align: center;
+ }
+}
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/trumbowyg.table.css b/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/trumbowyg.table.css
new file mode 100644
index 0000000..e9648c2
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/trumbowyg.table.css
@@ -0,0 +1,38 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Trumbowyg plugin stylesheet
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+.trumbowyg-editor table {
+ width: 100%; }
+ .trumbowyg-editor table td {
+ border: 1px dotted #e7eaec;
+ padding: 8px; }
+
+.trumbowyg-dropdown-table table {
+ margin: 10px;
+ display: inline-block; }
+
+.trumbowyg-dropdown-table table td {
+ display: inline-block;
+ height: 20px;
+ width: 20px;
+ margin: 1px;
+ padding: 0;
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 0 1px #cecece inset;
+ box-shadow: 0 0 0 1px #cecece inset; }
+ .trumbowyg-dropdown-table table td.active {
+ background-color: #00b393;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ cursor: pointer; }
+
+.trumbowyg-dropdown-table .trumbowyg-table-size {
+ text-align: center; }
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/trumbowyg.table.min.css b/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/trumbowyg.table.min.css
new file mode 100644
index 0000000..bcca88b
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/table/ui/trumbowyg.table.min.css
@@ -0,0 +1,2 @@
+/** Trumbowyg v2.25.2 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
+.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/template/trumbowyg.template.js b/vasl_templates/webapp/static/trumbowyg/plugins/template/trumbowyg.template.js
new file mode 100644
index 0000000..a4dc845
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/template/trumbowyg.template.js
@@ -0,0 +1,90 @@
+(function ($) {
+ 'use strict';
+
+ // Adds the language variables
+ $.extend(true, $.trumbowyg, {
+ langs: {
+ // jshint camelcase:false
+ en: {
+ template: 'Template'
+ },
+ by: {
+ template: 'Шаблон'
+ },
+ da: {
+ template: 'Skabelon'
+ },
+ de: {
+ template: 'Vorlage'
+ },
+ et: {
+ template: 'Mall'
+ },
+ fr: {
+ template: 'Patron'
+ },
+ hu: {
+ template: 'Sablon'
+ },
+ ja: {
+ template: 'テンプレート'
+ },
+ ko: {
+ template: '서식'
+ },
+ nl: {
+ template: 'Sjabloon'
+ },
+ pt_br: {
+ template: 'Modelo'
+ },
+ ru: {
+ template: 'Шаблон'
+ },
+ tr: {
+ template: 'Şablon'
+ },
+ zh_tw: {
+ template: '模板',
+ },
+ // jshint camelcase:true
+ }
+ });
+
+ // Adds the extra button definition
+ $.extend(true, $.trumbowyg, {
+ plugins: {
+ template: {
+ shouldInit: function (trumbowyg) {
+ return trumbowyg.o.plugins.hasOwnProperty('templates');
+ },
+ init: function (trumbowyg) {
+ trumbowyg.addBtnDef('template', {
+ dropdown: templateSelector(trumbowyg),
+ hasIcon: false,
+ text: trumbowyg.lang.template
+ });
+ }
+ }
+ }
+ });
+
+ // Creates the template-selector dropdown.
+ function templateSelector(trumbowyg) {
+ var available = trumbowyg.o.plugins.templates;
+ var templates = [];
+
+ $.each(available, function (index, template) {
+ trumbowyg.addBtnDef('template_' + index, {
+ fn: function () {
+ trumbowyg.html(template.html);
+ },
+ hasIcon: false,
+ title: template.name
+ });
+ templates.push('template_' + index);
+ });
+
+ return templates;
+ }
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/template/trumbowyg.template.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/template/trumbowyg.template.min.js
new file mode 100644
index 0000000..eba1833
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/template/trumbowyg.template.min.js
@@ -0,0 +1 @@
+!function(t){"use strict";function e(e){var a=e.o.plugins.templates,l=[];return t.each(a,(function(t,a){e.addBtnDef("template_"+t,{fn:function(){e.html(a.html)},hasIcon:!1,title:a.name}),l.push("template_"+t)})),l}t.extend(!0,t.trumbowyg,{langs:{en:{template:"Template"},by:{template:"Шаблон"},da:{template:"Skabelon"},de:{template:"Vorlage"},et:{template:"Mall"},fr:{template:"Patron"},hu:{template:"Sablon"},ja:{template:"テンプレート"},ko:{template:"서식"},nl:{template:"Sjabloon"},pt_br:{template:"Modelo"},ru:{template:"Шаблон"},tr:{template:"Şablon"},zh_tw:{template:"模板"}}}),t.extend(!0,t.trumbowyg,{plugins:{template:{shouldInit:function(t){return t.o.plugins.hasOwnProperty("templates")},init:function(t){t.addBtnDef("template",{dropdown:e(t),hasIcon:!1,text:t.lang.template})}}}})}(jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/upload/trumbowyg.upload.js b/vasl_templates/webapp/static/trumbowyg/plugins/upload/trumbowyg.upload.js
new file mode 100644
index 0000000..276e90c
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/upload/trumbowyg.upload.js
@@ -0,0 +1,304 @@
+/* ===========================================================
+ * trumbowyg.upload.js v1.2
+ * Upload plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ * Mod by : Aleksandr-ru
+ * Twitter : @Aleksandr_ru
+ * Website : aleksandr.ru
+ */
+
+(function ($) {
+ 'use strict';
+
+ var defaultOptions = {
+ serverPath: '',
+ fileFieldName: 'fileToUpload',
+ data: [], // Additional data for ajax [{name: 'key', value: 'value'}]
+ headers: {}, // Additional headers
+ xhrFields: {}, // Additional fields
+ urlPropertyName: 'file', // How to get url from the json response (for instance 'url' for {url: ....})
+ statusPropertyName: 'success', // How to get status from the json response
+ success: undefined, // Success callback: function (data, trumbowyg, $modal, values) {}
+ error: undefined, // Error callback: function () {}
+ imageWidthModalEdit: false // Add ability to edit image width
+ };
+
+ function getDeep(object, propertyParts) {
+ var mainProperty = propertyParts.shift(),
+ otherProperties = propertyParts;
+
+ if (object !== null) {
+ if (otherProperties.length === 0) {
+ return object[mainProperty];
+ }
+
+ if (typeof object === 'object') {
+ return getDeep(object[mainProperty], otherProperties);
+ }
+ }
+ return object;
+ }
+
+ addXhrProgressEvent();
+
+ $.extend(true, $.trumbowyg, {
+ langs: {
+ // jshint camelcase:false
+ en: {
+ upload: 'Upload',
+ file: 'File',
+ uploadError: 'Error'
+ },
+ by: {
+ upload: 'Загрузка',
+ file: 'Файл',
+ uploadError: 'Памылка'
+ },
+ cs: {
+ upload: 'Nahrát obrázek',
+ file: 'Soubor',
+ uploadError: 'Chyba'
+ },
+ da: {
+ upload: 'Upload',
+ file: 'Fil',
+ uploadError: 'Fejl'
+ },
+ de: {
+ upload: 'Hochladen',
+ file: 'Datei',
+ uploadError: 'Fehler'
+ },
+ et: {
+ upload: 'Lae üles',
+ file: 'Fail',
+ uploadError: 'Viga'
+ },
+ fr: {
+ upload: 'Envoi',
+ file: 'Fichier',
+ uploadError: 'Erreur'
+ },
+ hu: {
+ upload: 'Feltöltés',
+ file: 'Fájl',
+ uploadError: 'Hiba'
+ },
+ ja: {
+ upload: 'アップロード',
+ file: 'ファイル',
+ uploadError: 'エラー'
+ },
+ ko: {
+ upload: '그림 올리기',
+ file: '파일',
+ uploadError: '에러'
+ },
+ pt_br: {
+ upload: 'Enviar do local',
+ file: 'Arquivo',
+ uploadError: 'Erro'
+ },
+ ru: {
+ upload: 'Загрузка',
+ file: 'Файл',
+ uploadError: 'Ошибка'
+ },
+ sk: {
+ upload: 'Nahrať',
+ file: 'Súbor',
+ uploadError: 'Chyba'
+ },
+ tr: {
+ upload: 'Yükle',
+ file: 'Dosya',
+ uploadError: 'Hata'
+ },
+ zh_cn: {
+ upload: '上传',
+ file: '文件',
+ uploadError: '错误'
+ },
+ zh_tw: {
+ upload: '上傳',
+ file: '文件',
+ uploadError: '錯誤'
+ },
+ },
+ // jshint camelcase:true
+
+ plugins: {
+ upload: {
+ init: function (trumbowyg) {
+ trumbowyg.o.plugins.upload = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.upload || {});
+ var btnDef = {
+ fn: function () {
+ trumbowyg.saveRange();
+
+ var file,
+ prefix = trumbowyg.o.prefix;
+
+ var fields = {
+ file: {
+ type: 'file',
+ required: true,
+ attributes: {
+ accept: 'image/*'
+ }
+ },
+ alt: {
+ label: 'description',
+ value: trumbowyg.getRangeText()
+ }
+ };
+
+ if (trumbowyg.o.plugins.upload.imageWidthModalEdit) {
+ fields.width = {
+ value: ''
+ };
+ }
+
+ // Prevent multiple submissions while uploading
+ var isUploading = false;
+
+ var $modal = trumbowyg.openModalInsert(
+ // Title
+ trumbowyg.lang.upload,
+
+ // Fields
+ fields,
+
+ // Callback
+ function (values) {
+ if (isUploading) {
+ return;
+ }
+ isUploading = true;
+
+ var data = new FormData();
+ data.append(trumbowyg.o.plugins.upload.fileFieldName, file);
+
+ trumbowyg.o.plugins.upload.data.map(function (cur) {
+ data.append(cur.name, cur.value);
+ });
+
+ $.map(values, function (curr, key) {
+ if (key !== 'file') {
+ data.append(key, curr);
+ }
+ });
+
+ if ($('.' + prefix + 'progress', $modal).length === 0) {
+ $('.' + prefix + 'modal-title', $modal)
+ .after(
+ $('', {
+ 'class': prefix + 'progress'
+ }).append(
+ $('', {
+ 'class': prefix + 'progress-bar'
+ })
+ )
+ );
+ }
+
+ $.ajax({
+ url: trumbowyg.o.plugins.upload.serverPath,
+ headers: trumbowyg.o.plugins.upload.headers,
+ xhrFields: trumbowyg.o.plugins.upload.xhrFields,
+ type: 'POST',
+ data: data,
+ cache: false,
+ dataType: 'json',
+ processData: false,
+ contentType: false,
+
+ progressUpload: function (e) {
+ $('.' + prefix + 'progress-bar').css('width', Math.round(e.loaded * 100 / e.total) + '%');
+ },
+
+ success: function (data) {
+ if (trumbowyg.o.plugins.upload.success) {
+ trumbowyg.o.plugins.upload.success(data, trumbowyg, $modal, values);
+ } else {
+ if (!!getDeep(data, trumbowyg.o.plugins.upload.statusPropertyName.split('.'))) {
+ var url = getDeep(data, trumbowyg.o.plugins.upload.urlPropertyName.split('.'));
+ trumbowyg.execCmd('insertImage', url, false, true);
+ var $img = $('img[src="' + url + '"]:not([alt])', trumbowyg.$box);
+ $img.attr('alt', values.alt);
+ if (trumbowyg.o.plugins.upload.imageWidthModalEdit && parseInt(values.width) > 0) {
+ $img.attr({
+ width: values.width
+ });
+ }
+ setTimeout(function () {
+ trumbowyg.closeModal();
+ }, 250);
+ trumbowyg.$c.trigger('tbwuploadsuccess', [trumbowyg, data, url]);
+ } else {
+ trumbowyg.addErrorOnModalField(
+ $('input[type=file]', $modal),
+ trumbowyg.lang[data.message]
+ );
+ trumbowyg.$c.trigger('tbwuploaderror', [trumbowyg, data]);
+ }
+ }
+
+ isUploading = false;
+ },
+
+ error: trumbowyg.o.plugins.upload.error || function () {
+ trumbowyg.addErrorOnModalField(
+ $('input[type=file]', $modal),
+ trumbowyg.lang.uploadError
+ );
+ trumbowyg.$c.trigger('tbwuploaderror', [trumbowyg]);
+
+ isUploading = false;
+ }
+ });
+ }
+ );
+
+ $('input[type=file]').on('change', function (e) {
+ try {
+ // If multiple files allowed, we just get the first.
+ file = e.target.files[0];
+ } catch (err) {
+ // In IE8, multiple files not allowed
+ file = e.target.value;
+ }
+ });
+ }
+ };
+
+ trumbowyg.addBtnDef('upload', btnDef);
+ }
+ }
+ }
+ });
+
+ function addXhrProgressEvent() {
+ if (!$.trumbowyg.addedXhrProgressEvent) { // Avoid adding progress event multiple times
+ var originalXhr = $.ajaxSettings.xhr;
+ $.ajaxSetup({
+ xhr: function () {
+ var that = this,
+ req = originalXhr();
+
+ if (req && typeof req.upload === 'object' && that.progressUpload !== undefined) {
+ req.upload.addEventListener('progress', function (e) {
+ that.progressUpload(e);
+ }, false);
+ }
+
+ return req;
+ }
+ });
+ $.trumbowyg.addedXhrProgressEvent = true;
+ }
+ }
+})(jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/plugins/upload/trumbowyg.upload.min.js b/vasl_templates/webapp/static/trumbowyg/plugins/upload/trumbowyg.upload.min.js
new file mode 100644
index 0000000..83bbef6
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/plugins/upload/trumbowyg.upload.min.js
@@ -0,0 +1,13 @@
+/* ===========================================================
+ * trumbowyg.upload.js v1.2
+ * Upload plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ * Mod by : Aleksandr-ru
+ * Twitter : @Aleksandr_ru
+ * Website : aleksandr.ru
+ */
+!function(r){"use strict";var a={serverPath:"",fileFieldName:"fileToUpload",data:[],headers:{},xhrFields:{},urlPropertyName:"file",statusPropertyName:"success",success:void 0,error:void 0,imageWidthModalEdit:!1};function e(r,a){var o=a.shift(),l=a;if(null!==r){if(0===l.length)return r[o];if("object"==typeof r)return e(r[o],l)}return r}!function(){if(!r.trumbowyg.addedXhrProgressEvent){var a=r.ajaxSettings.xhr;r.ajaxSetup({xhr:function(){var r=this,e=a();return e&&"object"==typeof e.upload&&void 0!==r.progressUpload&&e.upload.addEventListener("progress",(function(a){r.progressUpload(a)}),!1),e}}),r.trumbowyg.addedXhrProgressEvent=!0}}(),r.extend(!0,r.trumbowyg,{langs:{en:{upload:"Upload",file:"File",uploadError:"Error"},by:{upload:"Загрузка",file:"Файл",uploadError:"Памылка"},cs:{upload:"Nahrát obrázek",file:"Soubor",uploadError:"Chyba"},da:{upload:"Upload",file:"Fil",uploadError:"Fejl"},de:{upload:"Hochladen",file:"Datei",uploadError:"Fehler"},et:{upload:"Lae üles",file:"Fail",uploadError:"Viga"},fr:{upload:"Envoi",file:"Fichier",uploadError:"Erreur"},hu:{upload:"Feltöltés",file:"Fájl",uploadError:"Hiba"},ja:{upload:"アップロード",file:"ファイル",uploadError:"エラー"},ko:{upload:"그림 올리기",file:"파일",uploadError:"에러"},pt_br:{upload:"Enviar do local",file:"Arquivo",uploadError:"Erro"},ru:{upload:"Загрузка",file:"Файл",uploadError:"Ошибка"},sk:{upload:"Nahrať",file:"Súbor",uploadError:"Chyba"},tr:{upload:"Yükle",file:"Dosya",uploadError:"Hata"},zh_cn:{upload:"上传",file:"文件",uploadError:"错误"},zh_tw:{upload:"上傳",file:"文件",uploadError:"錯誤"}},plugins:{upload:{init:function(o){o.o.plugins.upload=r.extend(!0,{},a,o.o.plugins.upload||{});var l={fn:function(){o.saveRange();var a,l=o.o.prefix,t={file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:o.getRangeText()}};o.o.plugins.upload.imageWidthModalEdit&&(t.width={value:""});var d=!1,i=o.openModalInsert(o.lang.upload,t,(function(t){if(!d){d=!0;var u=new FormData;u.append(o.o.plugins.upload.fileFieldName,a),o.o.plugins.upload.data.map((function(r){u.append(r.name,r.value)})),r.map(t,(function(r,a){"file"!==a&&u.append(a,r)})),0===r("."+l+"progress",i).length&&r("."+l+"modal-title",i).after(r("",{class:l+"progress"}).append(r("",{class:l+"progress-bar"}))),r.ajax({url:o.o.plugins.upload.serverPath,headers:o.o.plugins.upload.headers,xhrFields:o.o.plugins.upload.xhrFields,type:"POST",data:u,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(a){r("."+l+"progress-bar").css("width",Math.round(100*a.loaded/a.total)+"%")},success:function(a){if(o.o.plugins.upload.success)o.o.plugins.upload.success(a,o,i,t);else if(e(a,o.o.plugins.upload.statusPropertyName.split("."))){var l=e(a,o.o.plugins.upload.urlPropertyName.split("."));o.execCmd("insertImage",l,!1,!0);var u=r('img[src="'+l+'"]:not([alt])',o.$box);u.attr("alt",t.alt),o.o.plugins.upload.imageWidthModalEdit&&parseInt(t.width)>0&&u.attr({width:t.width}),setTimeout((function(){o.closeModal()}),250),o.$c.trigger("tbwuploadsuccess",[o,a,l])}else o.addErrorOnModalField(r("input[type=file]",i),o.lang[a.message]),o.$c.trigger("tbwuploaderror",[o,a]);d=!1},error:o.o.plugins.upload.error||function(){o.addErrorOnModalField(r("input[type=file]",i),o.lang.uploadError),o.$c.trigger("tbwuploaderror",[o]),d=!1}})}}));r("input[type=file]").on("change",(function(r){try{a=r.target.files[0]}catch(e){a=r.target.value}}))}};o.addBtnDef("upload",l)}}}})}(jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/trumbowyg.js b/vasl_templates/webapp/static/trumbowyg/trumbowyg.js
new file mode 100644
index 0000000..775f7ae
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/trumbowyg.js
@@ -0,0 +1,2012 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Trumbowyg core file
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+jQuery.trumbowyg = {
+ langs: {
+ en: {
+ viewHTML: 'View HTML',
+
+ undo: 'Undo',
+ redo: 'Redo',
+
+ formatting: 'Formatting',
+ p: 'Paragraph',
+ blockquote: 'Quote',
+ code: 'Code',
+ header: 'Header',
+
+ bold: 'Bold',
+ italic: 'Italic',
+ strikethrough: 'Strikethrough',
+ underline: 'Underline',
+
+ strong: 'Strong',
+ em: 'Emphasis',
+ del: 'Deleted',
+
+ superscript: 'Superscript',
+ subscript: 'Subscript',
+
+ unorderedList: 'Unordered list',
+ orderedList: 'Ordered list',
+
+ insertImage: 'Insert Image',
+ link: 'Link',
+ createLink: 'Insert link',
+ unlink: 'Remove link',
+
+ justifyLeft: 'Align Left',
+ justifyCenter: 'Align Center',
+ justifyRight: 'Align Right',
+ justifyFull: 'Align Justify',
+
+ horizontalRule: 'Insert horizontal rule',
+ removeformat: 'Remove format',
+
+ fullscreen: 'Fullscreen',
+
+ close: 'Close',
+
+ submit: 'Confirm',
+ reset: 'Cancel',
+
+ required: 'Required',
+ description: 'Description',
+ title: 'Title',
+ text: 'Text',
+ target: 'Target',
+ width: 'Width'
+ }
+ },
+
+ // Plugins
+ plugins: {},
+
+ // SVG Path globally
+ svgPath: null,
+ svgAbsoluteUseHref: false,
+
+ hideButtonTexts: null
+};
+
+// Makes default options read-only
+Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
+ value: {
+ lang: 'en',
+
+ fixedBtnPane: false,
+ fixedFullWidth: false,
+ autogrow: false,
+ autogrowOnEnter: false,
+ imageWidthModalEdit: false,
+ hideButtonTexts: null,
+
+ prefix: 'trumbowyg-',
+ tagClasses: {},
+ semantic: true,
+ semanticKeepAttributes: false,
+ resetCss: false,
+ removeformatPasted: false,
+ tabToIndent: false,
+ tagsToRemove: [],
+ tagsToKeep: ['hr', 'img', 'embed', 'iframe', 'input'],
+ btns: [
+ ['viewHTML'],
+ ['undo', 'redo'], // Only supported in Blink browsers
+ ['formatting'],
+ ['strong', 'em', 'del'],
+ ['superscript', 'subscript'],
+ ['link'],
+ ['insertImage'],
+ ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'],
+ ['unorderedList', 'orderedList'],
+ ['horizontalRule'],
+ ['removeformat'],
+ ['fullscreen']
+ ],
+ // For custom button definitions
+ btnsDef: {},
+ changeActiveDropdownIcon: false,
+
+ inlineElementsSelector: 'a,abbr,acronym,b,caption,cite,code,col,dfn,dir,dt,dd,em,font,hr,i,kbd,li,q,span,strikeout,strong,sub,sup,u',
+
+ pasteHandlers: [],
+
+ // imgDblClickHandler: default is defined in constructor
+
+ plugins: {},
+
+ urlProtocol: false,
+ minimalLinks: false,
+ defaultLinkTarget: undefined,
+
+ svgPath: null
+ },
+ writable: false,
+ enumerable: true,
+ configurable: false
+});
+
+(function (navigator, window, document, $) {
+ 'use strict';
+
+ var CONFIRM_EVENT = 'tbwconfirm',
+ CANCEL_EVENT = 'tbwcancel';
+
+ $.fn.trumbowyg = function (options, params) {
+ var trumbowygDataName = 'trumbowyg';
+ if (options === Object(options) || !options) {
+ return this.each(function () {
+ if (!$(this).data(trumbowygDataName)) {
+ $(this).data(trumbowygDataName, new Trumbowyg(this, options));
+ }
+ });
+ }
+ if (this.length === 1) {
+ try {
+ var t = $(this).data(trumbowygDataName);
+ switch (options) {
+ // Exec command
+ case 'execCmd':
+ return t.execCmd(params.cmd, params.param, params.forceCss, params.skipTrumbowyg);
+
+ // Modal box
+ case 'openModal':
+ return t.openModal(params.title, params.content);
+ case 'closeModal':
+ return t.closeModal();
+ case 'openModalInsert':
+ return t.openModalInsert(params.title, params.fields, params.callback);
+
+ // Range
+ case 'saveRange':
+ return t.saveRange();
+ case 'getRange':
+ return t.range;
+ case 'getRangeText':
+ return t.getRangeText();
+ case 'restoreRange':
+ return t.restoreRange();
+
+ // Enable/disable
+ case 'enable':
+ return t.setDisabled(false);
+ case 'disable':
+ return t.setDisabled(true);
+
+ // Toggle
+ case 'toggle':
+ return t.toggle();
+
+ // Destroy
+ case 'destroy':
+ return t.destroy();
+
+ // Empty
+ case 'empty':
+ return t.empty();
+
+ // HTML
+ case 'html':
+ return t.html(params);
+ }
+ } catch (c) {
+ }
+ }
+
+ return false;
+ };
+
+ // @param: editorElem is the DOM element
+ var Trumbowyg = function (editorElem, options) {
+ var t = this,
+ trumbowygIconsId = 'trumbowyg-icons',
+ $trumbowyg = $.trumbowyg;
+
+ // Get the document of the element. It use to makes the plugin
+ // compatible on iframes.
+ t.doc = editorElem.ownerDocument || document;
+
+ // jQuery object of the editor
+ t.$ta = $(editorElem); // $ta : Textarea
+ t.$c = $(editorElem); // $c : creator
+
+ options = options || {};
+
+ // Localization management
+ if (options.lang != null || $trumbowyg.langs[options.lang] != null) {
+ t.lang = $.extend(true, {}, $trumbowyg.langs.en, $trumbowyg.langs[options.lang]);
+ } else {
+ t.lang = $trumbowyg.langs.en;
+ }
+
+ t.hideButtonTexts = $trumbowyg.hideButtonTexts != null ? $trumbowyg.hideButtonTexts : options.hideButtonTexts;
+
+ // SVG path
+ var svgPathOption = $trumbowyg.svgPath != null ? $trumbowyg.svgPath : options.svgPath;
+ t.hasSvg = svgPathOption !== false;
+
+ if (svgPathOption !== false && ($trumbowyg.svgAbsoluteUseHref || $('#' + trumbowygIconsId, t.doc).length === 0)) {
+ if (svgPathOption == null) {
+ // Hack to get svgPathOption based on trumbowyg.js path
+ var $scriptElements = $('script[src]');
+ $scriptElements.each(function (i, scriptElement) {
+ var source = scriptElement.src;
+ var matches = source.match('trumbowyg(\.min)?\.js');
+ if (matches != null) {
+ svgPathOption = source.substring(0, source.indexOf(matches[0])) + 'ui/icons.svg';
+ }
+ });
+ }
+
+ // Do not merge with previous if block: svgPathOption can be redefined in it.
+ // Here we are checking that we find a match
+ if (svgPathOption == null) {
+ console.warn('You must define svgPath: https://goo.gl/CfTY9U'); // jshint ignore:line
+ } else if (!$trumbowyg.svgAbsoluteUseHref) {
+ var div = t.doc.createElement('div');
+ div.id = trumbowygIconsId;
+ t.doc.body.insertBefore(div, t.doc.body.childNodes[0]);
+ $.ajax({
+ async: true,
+ type: 'GET',
+ contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
+ dataType: 'xml',
+ crossDomain: true,
+ url: svgPathOption,
+ data: null,
+ beforeSend: null,
+ complete: null,
+ success: function (data) {
+ div.innerHTML = new XMLSerializer().serializeToString(data.documentElement);
+ }
+ });
+ }
+ }
+
+ var baseHref = !!t.doc.querySelector('base') ? window.location.href.split(/[?#]/)[0] : '';
+ t.svgPath = $trumbowyg.svgAbsoluteUseHref ? svgPathOption : baseHref;
+
+
+ /**
+ * When the button is associated to a empty object
+ * fn and title attributes are defined from the button key value
+ *
+ * For example
+ * foo: {}
+ * is equivalent to :
+ * foo: {
+ * fn: 'foo',
+ * title: this.lang.foo
+ * }
+ */
+ var h = t.lang.header, // Header translation
+ isBlinkFunction = function () {
+ return (window.chrome || (window.Intl && Intl.v8BreakIterator)) && 'CSS' in window;
+ };
+ t.btnsDef = {
+ viewHTML: {
+ fn: 'toggle',
+ class: 'trumbowyg-not-disable',
+ },
+
+ undo: {
+ isSupported: isBlinkFunction,
+ key: 'Z'
+ },
+ redo: {
+ isSupported: isBlinkFunction,
+ key: 'Y'
+ },
+
+ p: {
+ fn: 'formatBlock'
+ },
+ blockquote: {
+ fn: 'formatBlock'
+ },
+ h1: {
+ fn: 'formatBlock',
+ title: h + ' 1'
+ },
+ h2: {
+ fn: 'formatBlock',
+ title: h + ' 2'
+ },
+ h3: {
+ fn: 'formatBlock',
+ title: h + ' 3'
+ },
+ h4: {
+ fn: 'formatBlock',
+ title: h + ' 4'
+ },
+ h5: {
+ fn: 'formatBlock',
+ title: h + ' 5'
+ },
+ h6: {
+ fn: 'formatBlock',
+ title: h + ' 6'
+ },
+ subscript: {
+ tag: 'sub'
+ },
+ superscript: {
+ tag: 'sup'
+ },
+
+ bold: {
+ key: 'B',
+ tag: 'b'
+ },
+ italic: {
+ key: 'I',
+ tag: 'i'
+ },
+ underline: {
+ tag: 'u'
+ },
+ strikethrough: {
+ tag: 'strike'
+ },
+
+ strong: {
+ fn: 'bold',
+ key: 'B'
+ },
+ em: {
+ fn: 'italic',
+ key: 'I'
+ },
+ del: {
+ fn: 'strikethrough'
+ },
+
+ createLink: {
+ key: 'K',
+ tag: 'a'
+ },
+ unlink: {},
+
+ insertImage: {},
+
+ justifyLeft: {
+ tag: 'left',
+ forceCss: true
+ },
+ justifyCenter: {
+ tag: 'center',
+ forceCss: true
+ },
+ justifyRight: {
+ tag: 'right',
+ forceCss: true
+ },
+ justifyFull: {
+ tag: 'justify',
+ forceCss: true
+ },
+
+ unorderedList: {
+ fn: 'insertUnorderedList',
+ tag: 'ul'
+ },
+ orderedList: {
+ fn: 'insertOrderedList',
+ tag: 'ol'
+ },
+
+ horizontalRule: {
+ fn: 'insertHorizontalRule'
+ },
+
+ removeformat: {},
+
+ fullscreen: {
+ class: 'trumbowyg-not-disable'
+ },
+ close: {
+ fn: 'destroy',
+ class: 'trumbowyg-not-disable'
+ },
+
+ // Dropdowns
+ formatting: {
+ dropdown: ['p', 'blockquote', 'h1', 'h2', 'h3', 'h4'],
+ ico: 'p'
+ },
+ link: {
+ dropdown: ['createLink', 'unlink']
+ }
+ };
+
+ // Default Options
+ t.o = $.extend(true, {}, $trumbowyg.defaultOptions, options);
+ if (!t.o.hasOwnProperty('imgDblClickHandler')) {
+ t.o.imgDblClickHandler = t.getDefaultImgDblClickHandler();
+ }
+
+ t.urlPrefix = t.setupUrlPrefix();
+
+ t.disabled = t.o.disabled || (editorElem.nodeName === 'TEXTAREA' && editorElem.disabled);
+
+ if (options.btns) {
+ t.o.btns = options.btns;
+ } else if (!t.o.semantic) {
+ t.o.btns[3] = ['bold', 'italic', 'underline', 'strikethrough'];
+ }
+
+ $.each(t.o.btnsDef, function (btnName, btnDef) {
+ t.addBtnDef(btnName, btnDef);
+ });
+
+ // put this here in the event it would be merged in with options
+ t.eventNamespace = 'trumbowyg-event';
+
+ // Keyboard shortcuts are load in this array
+ t.keys = [];
+
+ // Tag to button dynamically hydrated
+ t.tagToButton = {};
+ t.tagHandlers = [];
+
+ // Admit multiple paste handlers
+ t.pasteHandlers = [].concat(t.o.pasteHandlers);
+
+ // Check if browser is IE
+ t.isIE = navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') !== -1;
+
+ // Check if we are on macOs
+ t.isMac = navigator.platform.toUpperCase().indexOf('MAC') !== -1;
+
+ t.init();
+ };
+
+ Trumbowyg.prototype = {
+ DEFAULT_SEMANTIC_MAP: {
+ 'b': 'strong',
+ 'i': 'em',
+ 's': 'del',
+ 'strike': 'del',
+ 'div': 'p'
+ },
+
+ init: function () {
+ var t = this;
+ t.height = t.$ta.height();
+
+ t.initPlugins();
+
+ try {
+ // Disable image resize, try-catch for old IE
+ t.doc.execCommand('enableObjectResizing', false, false);
+ t.doc.execCommand('defaultParagraphSeparator', false, 'p');
+ } catch (e) {
+ }
+
+ t.buildEditor();
+ t.buildBtnPane();
+
+ t.fixedBtnPaneEvents();
+
+ t.buildOverlay();
+
+ setTimeout(function () {
+ if (t.disabled) {
+ t.setDisabled(true);
+ }
+ t.$c.trigger('tbwinit');
+ });
+ },
+
+ addBtnDef: function (btnName, btnDef) {
+ this.btnsDef[btnName] = $.extend(btnDef, this.btnsDef[btnName] || {});
+ },
+
+ setupUrlPrefix: function () {
+ var protocol = this.o.urlProtocol;
+ if (!protocol) {
+ return;
+ }
+
+ if (typeof (protocol) !== 'string') {
+ return 'https://';
+ }
+ return protocol.replace('://', '') + '://';
+ },
+
+ buildEditor: function () {
+ var t = this,
+ prefix = t.o.prefix,
+ html = '';
+
+ t.$box = $('', {
+ class: prefix + 'box ' + prefix + 'editor-visible ' + prefix + t.o.lang + ' trumbowyg'
+ });
+
+ // $ta = Textarea
+ // $ed = Editor
+ t.isTextarea = t.$ta.is('textarea');
+ if (t.isTextarea) {
+ html = t.$ta.val();
+ t.$ed = $('');
+ t.$box
+ .insertAfter(t.$ta)
+ .append(t.$ed, t.$ta);
+ } else {
+ t.$ed = t.$ta;
+ html = t.$ed.html();
+
+ t.$ta = $('', {
+ name: t.$ta.attr('id'),
+ height: t.height
+ }).val(html);
+
+ t.$box
+ .insertAfter(t.$ed)
+ .append(t.$ta, t.$ed);
+ t.syncCode();
+ }
+
+ t.$ta
+ .addClass(prefix + 'textarea')
+ .attr('tabindex', -1)
+ ;
+
+ t.$ed
+ .addClass(prefix + 'editor')
+ .attr({
+ contenteditable: true,
+ dir: t.lang._dir || 'ltr'
+ })
+ .html(html)
+ ;
+
+ if (t.o.tabindex) {
+ t.$ed.attr('tabindex', t.o.tabindex);
+ }
+
+ if (t.$c.is('[placeholder]')) {
+ t.$ed.attr('placeholder', t.$c.attr('placeholder'));
+ }
+
+ if (t.$c.is('[spellcheck]')) {
+ t.$ed.attr('spellcheck', t.$c.attr('spellcheck'));
+ }
+
+ if (t.o.resetCss) {
+ t.$ed.addClass(prefix + 'reset-css');
+ }
+
+ if (!t.o.autogrow) {
+ t.$ta.add(t.$ed).css({
+ height: t.height
+ });
+ }
+
+ t.semanticCode();
+
+ if (t.o.autogrowOnEnter) {
+ t.$ed.addClass(prefix + 'autogrow-on-enter');
+ }
+
+ var ctrl = false,
+ composition = false,
+ debounceButtonPaneStatus;
+
+ t.$ed
+ .on('dblclick', 'img', t.o.imgDblClickHandler)
+ .on('keydown', function (e) {
+ // append flags to differentiate Chrome spans
+ var keyCode = e.which;
+ if (keyCode === 8 || keyCode === 13 || keyCode === 46) {
+ t.toggleSpan(true);
+ }
+ if ((e.ctrlKey || e.metaKey) && !e.altKey) {
+ ctrl = true;
+ var key = t.keys[String.fromCharCode(e.which).toUpperCase()];
+
+ try {
+ t.execCmd(key.fn, key.param);
+ return false;
+ } catch (c) {
+ }
+ } else {
+ if (t.o.tabToIndent && e.key === 'Tab') {
+ try {
+ if (e.shiftKey) {
+ t.execCmd('outdent', true, null);
+ } else {
+ t.execCmd('indent', true, null);
+ }
+ return false;
+ } catch (c) {
+ }
+ }
+ }
+ })
+ .on('compositionstart compositionupdate', function () {
+ composition = true;
+ })
+ .on('keyup compositionend', function (e) {
+ if (e.type === 'compositionend') {
+ composition = false;
+ } else if (composition) {
+ return;
+ }
+
+ var keyCode = e.which;
+
+ if (keyCode >= 37 && keyCode <= 40) {
+ return;
+ }
+
+ // remove Chrome generated span tags
+ if (keyCode === 8 || keyCode === 13 || keyCode === 46) {
+ t.toggleSpan();
+ }
+
+ if ((e.ctrlKey || e.metaKey) && (keyCode === 89 || keyCode === 90)) {
+ t.semanticCode(false, true);
+ t.$c.trigger('tbwchange');
+ } else if (!ctrl && keyCode !== 17) {
+ var compositionEndIE = t.isIE ? e.type === 'compositionend' : true;
+ t.semanticCode(false, compositionEndIE && keyCode === 13);
+ t.$c.trigger('tbwchange');
+ } else if (typeof e.which === 'undefined') {
+ t.semanticCode(false, false, true);
+ }
+
+ setTimeout(function () {
+ ctrl = false;
+ }, 50);
+ })
+ .on('mouseup keydown keyup', function (e) {
+ if ((!e.ctrlKey && !e.metaKey) || e.altKey) {
+ setTimeout(function () { // "hold on" to the ctrl key for 50ms
+ ctrl = false;
+ }, 50);
+ }
+ clearTimeout(debounceButtonPaneStatus);
+ debounceButtonPaneStatus = setTimeout(function () {
+ t.updateButtonPaneStatus();
+ }, 50);
+ })
+ .on('focus blur', function (e) {
+ if (e.type === 'blur') {
+ t.clearButtonPaneStatus();
+ }
+ t.$c.trigger('tbw' + e.type);
+ if (t.o.autogrowOnEnter) {
+ if (t.autogrowOnEnterDontClose) {
+ return;
+ }
+ if (e.type === 'focus') {
+ t.autogrowOnEnterWasFocused = true;
+ t.autogrowEditorOnEnter();
+ } else if (!t.o.autogrow) {
+ t.$ed.css({height: t.$ed.css('min-height')});
+ t.$c.trigger('tbwresize');
+ }
+ }
+ })
+ .on('keyup focus', function () {
+ if (!t.$ta.val().match(/<.*>/) && !t.$ed.html().match(/<.*>/)) {
+ setTimeout(function () {
+ var block = t.isIE ? '' : 'p';
+ t.doc.execCommand('formatBlock', false, block);
+ t.syncCode();
+ }, 0);
+ }
+ })
+ .on('cut drop', function () {
+ setTimeout(function () {
+ t.semanticCode(false, true);
+ t.$c.trigger('tbwchange');
+ }, 0);
+ })
+ .on('paste', function (e) {
+ if (t.o.removeformatPasted) {
+ e.preventDefault();
+
+ if (window.getSelection && window.getSelection().deleteFromDocument) {
+ window.getSelection().deleteFromDocument();
+ }
+
+ try {
+ // IE
+ var text = window.clipboardData.getData('Text');
+
+ try {
+ // <= IE10
+ t.doc.selection.createRange().pasteHTML(text);
+ } catch (c) {
+ // IE 11
+ t.doc.getSelection().getRangeAt(0).insertNode(t.doc.createTextNode(text));
+ }
+ t.$c.trigger('tbwchange', e);
+ } catch (d) {
+ // Not IE
+ t.execCmd('insertText', (e.originalEvent || e).clipboardData.getData('text/plain'));
+ }
+ }
+
+ // Call pasteHandlers
+ $.each(t.pasteHandlers, function (i, pasteHandler) {
+ pasteHandler(e);
+ });
+
+ setTimeout(function () {
+ t.semanticCode(false, true);
+ t.$c.trigger('tbwpaste', e);
+ t.$c.trigger('tbwchange');
+ }, 0);
+ });
+
+ t.$ta
+ .on('keyup', function () {
+ t.$c.trigger('tbwchange');
+ })
+ .on('paste', function () {
+ setTimeout(function () {
+ t.$c.trigger('tbwchange');
+ }, 0);
+ });
+
+ $(t.doc.body).on('keydown.' + t.eventNamespace, function (e) {
+ if (e.which === 27 && $('.' + prefix + 'modal-box').length >= 1) {
+ t.closeModal();
+ return false;
+ }
+ });
+ },
+
+ //autogrow when entering logic
+ autogrowEditorOnEnter: function () {
+ var t = this;
+ t.$ed.removeClass('autogrow-on-enter');
+ var oldHeight = t.$ed[0].clientHeight;
+ t.$ed.height('auto');
+ var totalHeight = t.$ed[0].scrollHeight;
+ t.$ed.addClass('autogrow-on-enter');
+ if (oldHeight !== totalHeight) {
+ t.$ed.height(oldHeight);
+ setTimeout(function () {
+ t.$ed.css({height: totalHeight});
+ t.$c.trigger('tbwresize');
+ }, 0);
+ }
+ },
+
+
+ // Build button pane, use o.btns option
+ buildBtnPane: function () {
+ var t = this,
+ prefix = t.o.prefix;
+
+ var $btnPane = t.$btnPane = $('
', {
+ class: prefix + 'button-pane'
+ });
+
+ $.each(t.o.btns, function (i, btnGrp) {
+ if (!$.isArray(btnGrp)) {
+ btnGrp = [btnGrp];
+ }
+
+ var $btnGroup = $('', {
+ class: prefix + 'button-group ' + ((btnGrp.indexOf('fullscreen') >= 0) ? prefix + 'right' : '')
+ });
+ $.each(btnGrp, function (i, btn) {
+ try { // Prevent buildBtn error
+ if (t.isSupportedBtn(btn)) { // It's a supported button
+ $btnGroup.append(t.buildBtn(btn));
+ }
+ } catch (c) {
+ }
+ });
+
+ if ($btnGroup.html().trim().length > 0) {
+ $btnPane.append($btnGroup);
+ }
+ });
+
+ t.$box.prepend($btnPane);
+ },
+
+
+ // Build a button and his action
+ buildBtn: function (btnName) { // btnName is name of the button
+ var t = this,
+ prefix = t.o.prefix,
+ btn = t.btnsDef[btnName],
+ isDropdown = btn.dropdown,
+ hasIcon = btn.hasIcon != null ? btn.hasIcon : true,
+ textDef = t.lang[btnName] || btnName,
+
+ $btn = $('', {
+ type: 'button',
+ class: prefix + btnName + '-button ' + (btn.class || '') + (!hasIcon ? ' ' + prefix + 'textual-button' : ''),
+ html: t.hasSvg && hasIcon ?
+ '' :
+ t.hideButtonTexts ? '' : (btn.text || btn.title || t.lang[btnName] || btnName),
+ title: (btn.title || btn.text || textDef) + (btn.key ? ' (' + (t.isMac ? 'Cmd' : 'Ctrl') + ' + ' + btn.key + ')' : ''),
+ tabindex: -1,
+ mousedown: function () {
+ if (!isDropdown || $('.' + btnName + '-' + prefix + 'dropdown', t.$box).is(':hidden')) {
+ $('body', t.doc).trigger('mousedown');
+ }
+
+ if ((t.$btnPane.hasClass(prefix + 'disable') || t.$box.hasClass(prefix + 'disabled')) &&
+ !$(this).hasClass(prefix + 'active') &&
+ !$(this).hasClass(prefix + 'not-disable')) {
+ return false;
+ }
+
+ t.execCmd((isDropdown ? 'dropdown' : false) || btn.fn || btnName, btn.param || btnName, btn.forceCss);
+
+ return false;
+ }
+ });
+
+ if (isDropdown) {
+ $btn.addClass(prefix + 'open-dropdown');
+ var dropdownPrefix = prefix + 'dropdown',
+ dropdownOptions = { // the dropdown
+ class: dropdownPrefix + '-' + btnName + ' ' + dropdownPrefix + ' ' + prefix + 'fixed-top ' + (btn.dropdownClass || '')
+ };
+ dropdownOptions['data-' + dropdownPrefix] = btnName;
+ var $dropdown = $('', dropdownOptions);
+ $.each(isDropdown, function (i, def) {
+ if (t.btnsDef[def] && t.isSupportedBtn(def)) {
+ $dropdown.append(t.buildSubBtn(def));
+ }
+ });
+ t.$box.append($dropdown.hide());
+ } else if (btn.key) {
+ t.keys[btn.key] = {
+ fn: btn.fn || btnName,
+ param: btn.param || btnName
+ };
+ }
+
+ if (!isDropdown) {
+ t.tagToButton[(btn.tag || btnName).toLowerCase()] = btnName;
+ }
+
+ return $btn;
+ },
+ // Build a button for dropdown menu
+ // @param n : name of the subbutton
+ buildSubBtn: function (btnName) {
+ var t = this,
+ prefix = t.o.prefix,
+ btn = t.btnsDef[btnName],
+ hasIcon = btn.hasIcon != null ? btn.hasIcon : true;
+
+ if (btn.key) {
+ t.keys[btn.key] = {
+ fn: btn.fn || btnName,
+ param: btn.param || btnName
+ };
+ }
+
+ t.tagToButton[(btn.tag || btnName).toLowerCase()] = btnName;
+
+ return $('', {
+ type: 'button',
+ class: prefix + btnName + '-dropdown-button ' + (btn.class || '') + (btn.ico ? ' ' + prefix + btn.ico + '-button' : ''),
+ html: t.hasSvg && hasIcon ?
+ '' + (btn.text || btn.title || t.lang[btnName] || btnName) :
+ (btn.text || btn.title || t.lang[btnName] || btnName),
+ title: (btn.key ? '(' + (t.isMac ? 'Cmd' : 'Ctrl') + ' + ' + btn.key + ')' : null),
+ style: btn.style || null,
+ mousedown: function () {
+ $('body', t.doc).trigger('mousedown');
+
+ t.execCmd(btn.fn || btnName, btn.param || btnName, btn.forceCss);
+
+ return false;
+ }
+ });
+ },
+ // Check if button is supported
+ isSupportedBtn: function (btnName) {
+ try {
+ return this.btnsDef[btnName].isSupported();
+ } catch (e) {
+ }
+ return true;
+ },
+
+ // Build overlay for modal box
+ buildOverlay: function () {
+ var t = this;
+ t.$overlay = $('', {
+ class: t.o.prefix + 'overlay'
+ }).appendTo(t.$box);
+ return t.$overlay;
+ },
+ showOverlay: function () {
+ var t = this;
+ $(window).trigger('scroll');
+ t.$overlay.fadeIn(200);
+ t.$box.addClass(t.o.prefix + 'box-blur');
+ },
+ hideOverlay: function () {
+ var t = this;
+ t.$overlay.fadeOut(50);
+ t.$box.removeClass(t.o.prefix + 'box-blur');
+ },
+
+ // Management of fixed button pane
+ fixedBtnPaneEvents: function () {
+ var t = this,
+ fixedFullWidth = t.o.fixedFullWidth,
+ $box = t.$box;
+
+ if (!t.o.fixedBtnPane) {
+ return;
+ }
+
+ t.isFixed = false;
+
+ $(window)
+ .on('scroll.' + t.eventNamespace + ' resize.' + t.eventNamespace, function () {
+ if (!$box) {
+ return;
+ }
+
+ t.syncCode();
+
+ var scrollTop = $(window).scrollTop(),
+ offset = $box.offset().top + 1,
+ $buttonPane = t.$btnPane,
+ buttonPaneOuterHeight = $buttonPane.outerHeight() - 2;
+
+ if ((scrollTop - offset > 0) && ((scrollTop - offset - t.height) < 0)) {
+ if (!t.isFixed) {
+ t.isFixed = true;
+ $buttonPane.css({
+ position: 'fixed',
+ top: 0,
+ left: fixedFullWidth ? 0 : 'auto',
+ zIndex: 7
+ });
+ t.$box.css({paddingTop: $buttonPane.height()});
+ }
+ $buttonPane.css({
+ width: fixedFullWidth ? '100%' : (($box.width() - 1))
+ });
+
+ $('.' + t.o.prefix + 'fixed-top', $box).css({
+ position: fixedFullWidth ? 'fixed' : 'absolute',
+ top: fixedFullWidth ? buttonPaneOuterHeight : buttonPaneOuterHeight + (scrollTop - offset),
+ zIndex: 15
+ });
+ } else if (t.isFixed) {
+ t.isFixed = false;
+ $buttonPane.removeAttr('style');
+ t.$box.css({paddingTop: 0});
+ $('.' + t.o.prefix + 'fixed-top', $box).css({
+ position: 'absolute',
+ top: buttonPaneOuterHeight
+ });
+ }
+ });
+ },
+
+ // Disable editor
+ setDisabled: function (disable) {
+ var t = this,
+ prefix = t.o.prefix;
+
+ t.disabled = disable;
+
+ if (disable) {
+ t.$ta.attr('disabled', true);
+ } else {
+ t.$ta.removeAttr('disabled');
+ }
+ t.$box.toggleClass(prefix + 'disabled', disable);
+ t.$ed.attr('contenteditable', !disable);
+ },
+
+ // Destroy the editor
+ destroy: function () {
+ var t = this,
+ prefix = t.o.prefix;
+
+ if (t.isTextarea) {
+ t.$box.after(
+ t.$ta
+ .css({height: ''})
+ .val(t.html())
+ .removeClass(prefix + 'textarea')
+ .show()
+ );
+ } else {
+ t.$box.after(
+ t.$ed
+ .css({height: ''})
+ .removeClass(prefix + 'editor')
+ .removeAttr('contenteditable')
+ .removeAttr('dir')
+ .html(t.html())
+ .show()
+ );
+ }
+
+ t.$ed.off('dblclick', 'img');
+
+ t.destroyPlugins();
+
+ t.$box.remove();
+ t.$c.removeData('trumbowyg');
+ $('body').removeClass(prefix + 'body-fullscreen');
+ t.$c.trigger('tbwclose');
+ $(window).off('scroll.' + t.eventNamespace + ' resize.' + t.eventNamespace);
+ $(t.doc.body).off('keydown.' + t.eventNamespace);
+ },
+
+
+ // Empty the editor
+ empty: function () {
+ this.$ta.val('');
+ this.syncCode(true);
+ },
+
+
+ // Function call when click on viewHTML button
+ toggle: function () {
+ var t = this,
+ prefix = t.o.prefix;
+
+ if (t.o.autogrowOnEnter) {
+ t.autogrowOnEnterDontClose = !t.$box.hasClass(prefix + 'editor-hidden');
+ }
+
+ t.semanticCode(false, true);
+ t.$c.trigger('tbwchange');
+
+ setTimeout(function () {
+ t.doc.activeElement.blur();
+ t.$box.toggleClass(prefix + 'editor-hidden ' + prefix + 'editor-visible');
+ t.$btnPane.toggleClass(prefix + 'disable');
+ $('.' + prefix + 'viewHTML-button', t.$btnPane).toggleClass(prefix + 'active');
+ if (t.$box.hasClass(prefix + 'editor-visible')) {
+ t.$ta.attr('tabindex', -1);
+ } else {
+ t.$ta.removeAttr('tabindex');
+ }
+
+ if (t.o.autogrowOnEnter && !t.autogrowOnEnterDontClose) {
+ t.autogrowEditorOnEnter();
+ }
+ }, 0);
+ },
+
+ // Remove or add flags to span tags to remove Chrome generated spans
+ toggleSpan: function (addFlag) {
+ var t = this;
+ t.$ed.find('span').each(function () {
+ if (addFlag === true) {
+ $(this).attr('data-tbw-flag', true);
+ } else {
+ if ($(this).attr('data-tbw-flag')) {
+ $(this).removeAttr('data-tbw-flag');
+ } else {
+ $(this).contents().unwrap();
+ }
+ }
+ });
+ },
+
+ // Open dropdown when click on a button which open that
+ dropdown: function (name) {
+ var t = this,
+ $body = $('body', t.doc),
+ prefix = t.o.prefix,
+ $dropdown = $('[data-' + prefix + 'dropdown=' + name + ']', t.$box),
+ $btn = $('.' + prefix + name + '-button', t.$btnPane),
+ show = $dropdown.is(':hidden');
+
+ $body.trigger('mousedown');
+
+ if (show) {
+ var btnOffsetLeft = $btn.offset().left;
+ $btn.addClass(prefix + 'active');
+
+ $dropdown.css({
+ position: 'absolute',
+ top: $btn.offset().top - t.$btnPane.offset().top + $btn.outerHeight(),
+ left: (t.o.fixedFullWidth && t.isFixed) ? btnOffsetLeft : (btnOffsetLeft - t.$btnPane.offset().left)
+ }).show();
+
+ $(window).trigger('scroll');
+
+ $body.on('mousedown.' + t.eventNamespace, function (e) {
+ if (!$dropdown.is(e.target)) {
+ $('.' + prefix + 'dropdown', t.$box).hide();
+ $('.' + prefix + 'active', t.$btnPane).removeClass(prefix + 'active');
+ $body.off('mousedown.' + t.eventNamespace);
+ }
+ });
+ }
+ },
+
+
+ // HTML Code management
+ html: function (html) {
+ var t = this;
+
+ if (html != null) {
+ t.$ta.val(html);
+ t.syncCode(true);
+ t.$c.trigger('tbwchange');
+ return t;
+ }
+
+ return t.$ta.val();
+ },
+ syncTextarea: function () {
+ var t = this;
+ t.$ta.val(t.$ed.text().trim().length > 0 || t.$ed.find(t.o.tagsToKeep.join(',')).length > 0 ? t.$ed.html() : '');
+ },
+ syncCode: function (force) {
+ var t = this;
+ if (!force && t.$ed.is(':visible')) {
+ t.syncTextarea();
+ } else {
+ // wrap the content in a div it's easier to get the inner html
+ var html = $('').html(t.$ta.val());
+ // scrub the html before loading into the doc
+ var safe = $('
').append(html);
+ $(t.o.tagsToRemove.join(','), safe).remove();
+ t.$ed.html(safe.contents().html());
+ }
+
+ if (t.o.autogrow) {
+ t.height = t.$ed.height();
+ if (t.height !== t.$ta.css('height')) {
+ t.$ta.css({height: t.height});
+ t.$c.trigger('tbwresize');
+ }
+ }
+ if (t.o.autogrowOnEnter) {
+ t.$ed.height('auto');
+ var totalHeight = t.autogrowOnEnterWasFocused ? t.$ed[0].scrollHeight : t.$ed.css('min-height');
+ if (totalHeight !== t.$ta.css('height')) {
+ t.$ed.css({height: totalHeight});
+ t.$c.trigger('tbwresize');
+ }
+ }
+ },
+
+ // Analyse and update to semantic code
+ // @param force : force to sync code from textarea
+ // @param full : wrap text nodes in
+ // @param keepRange : leave selection range as it is
+ semanticCode: function (force, full, keepRange) {
+ var t = this;
+ t.saveRange();
+ t.syncCode(force);
+
+ var restoreRange = true;
+ if (t.range && t.range.collapsed) {
+ restoreRange = false;
+ }
+
+ if (t.o.semantic) {
+ t.semanticTag('b', t.o.semanticKeepAttributes);
+ t.semanticTag('i', t.o.semanticKeepAttributes);
+ t.semanticTag('s', t.o.semanticKeepAttributes);
+ t.semanticTag('strike', t.o.semanticKeepAttributes);
+
+ if (full) {
+ var inlineElementsSelector = t.o.inlineElementsSelector,
+ blockElementsSelector = ':not(' + inlineElementsSelector + ')';
+
+ // Wrap text nodes in span for easier processing
+ t.$ed.contents().filter(function () {
+ return this.nodeType === 3 && this.nodeValue.trim().length > 0;
+ }).wrap('');
+
+ // Wrap groups of inline elements in paragraphs (recursive)
+ var wrapInlinesInParagraphsFrom = function ($from) {
+ if ($from.length !== 0) {
+ var $finalParagraph = $from.nextUntil(blockElementsSelector).addBack().wrapAll('
').parent(),
+ $nextElement = $finalParagraph.nextAll(inlineElementsSelector).first();
+ $finalParagraph.next('br').remove();
+ wrapInlinesInParagraphsFrom($nextElement);
+ }
+ };
+ wrapInlinesInParagraphsFrom(t.$ed.children(inlineElementsSelector).first());
+
+ t.semanticTag('div', true);
+
+ // Get rid of temporary span's
+ $('[data-tbw]', t.$ed).contents().unwrap();
+
+ // Remove empty
+ t.$ed.find('p:empty').remove();
+ }
+
+ if (!keepRange && restoreRange) {
+ t.restoreRange();
+ }
+
+ t.syncTextarea();
+ }
+ },
+
+ semanticTag: function (oldTag, copyAttributes, revert) {
+ var newTag, t = this;
+ var tmpTag = oldTag;
+
+ if (this.o.semantic != null && typeof this.o.semantic === 'object' && this.o.semantic.hasOwnProperty(oldTag)) {
+ newTag = this.o.semantic[oldTag];
+ } else if (this.o.semantic === true && this.DEFAULT_SEMANTIC_MAP.hasOwnProperty(oldTag)) {
+ newTag = this.DEFAULT_SEMANTIC_MAP[oldTag];
+ } else {
+ return;
+ }
+
+ if(revert) {
+ oldTag = newTag;
+ newTag = tmpTag;
+ }
+
+ $(oldTag, this.$ed).each(function () {
+ var resetRange = false;
+ var $oldTag = $(this);
+ if ($oldTag.contents().length === 0) {
+ return false;
+ }
+
+ if (t.range && t.range.startContainer.parentNode === this) {
+ resetRange = true;
+ }
+ var $newTag = $('<' + newTag + '/>');
+ $newTag.insertBefore($oldTag);
+ if (copyAttributes) {
+ $.each($oldTag.prop('attributes'), function () {
+ $newTag.attr(this.name, this.value);
+ });
+ }
+ $newTag.html($oldTag.html());
+ $oldTag.remove();
+ if(resetRange === true) {
+ t.range.selectNodeContents($newTag.get(0));
+ t.range.collapse(false);
+ }
+ });
+ },
+
+ // Function call when user click on "Insert Link"
+ createLink: function () {
+ var t = this,
+ documentSelection = t.doc.getSelection(),
+ selectedRange = documentSelection.getRangeAt(0),
+ node = documentSelection.focusNode,
+ text = new XMLSerializer().serializeToString(selectedRange.cloneContents()) || selectedRange + '',
+ url,
+ title,
+ target;
+
+ while (['A', 'DIV'].indexOf(node.nodeName) < 0) {
+ node = node.parentNode;
+ }
+
+ if (node && node.nodeName === 'A') {
+ var $a = $(node);
+ text = $a.text();
+ url = $a.attr('href');
+ if (!t.o.minimalLinks) {
+ title = $a.attr('title');
+ target = $a.attr('target') || t.o.defaultLinkTarget;
+ }
+ var range = t.doc.createRange();
+ range.selectNode(node);
+ documentSelection.removeAllRanges();
+ documentSelection.addRange(range);
+ }
+
+ t.saveRange();
+
+ var options = {
+ url: {
+ label: t.lang.linkUrl || 'URL',
+ required: true,
+ value: url
+ },
+ text: {
+ label: t.lang.text,
+ value: text
+ }
+ };
+ if (!t.o.minimalLinks) {
+ $.extend(options, {
+ title: {
+ label: t.lang.title,
+ value: title
+ },
+ target: {
+ label: t.lang.target,
+ value: target
+ }
+ });
+ }
+
+ t.openModalInsert(t.lang.createLink, options, function (v) { // v is value
+ var url = t.prependUrlPrefix(v.url);
+ if (!url.length) {
+ return false;
+ }
+
+ var link = $(['', v.text || v.url, ''].join(''));
+
+ if (v.title) {
+ link.attr('title', v.title);
+ }
+ if (v.target || t.o.defaultLinkTarget) {
+ link.attr('target', v.target || t.o.defaultLinkTarget);
+ }
+ t.range.deleteContents();
+ t.range.insertNode(link[0]);
+ t.syncCode();
+ t.$c.trigger('tbwchange');
+ return true;
+ });
+ },
+ prependUrlPrefix: function (url) {
+ var t = this;
+ if (!t.urlPrefix) {
+ return url;
+ }
+
+ var VALID_LINK_PREFIX = /^([a-z][-+.a-z0-9]*:|\/|#)/i;
+ if (VALID_LINK_PREFIX.test(url)) {
+ return url;
+ }
+
+ var SIMPLE_EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ if (SIMPLE_EMAIL_REGEX.test(url)) {
+ return 'mailto:' + url;
+ }
+
+ return t.urlPrefix + url;
+ },
+ unlink: function () {
+ var t = this,
+ documentSelection = t.doc.getSelection(),
+ node = documentSelection.focusNode;
+
+ if (documentSelection.isCollapsed) {
+ while (['A', 'DIV'].indexOf(node.nodeName) < 0) {
+ node = node.parentNode;
+ }
+
+ if (node && node.nodeName === 'A') {
+ var range = t.doc.createRange();
+ range.selectNode(node);
+ documentSelection.removeAllRanges();
+ documentSelection.addRange(range);
+ }
+ }
+ t.execCmd('unlink', undefined, undefined, true);
+ },
+ insertImage: function () {
+ var t = this;
+ t.saveRange();
+
+ var options = {
+ url: {
+ label: 'URL',
+ required: true
+ },
+ alt: {
+ label: t.lang.description,
+ value: t.getRangeText()
+ }
+ };
+
+ if (t.o.imageWidthModalEdit) {
+ options.width = {};
+ }
+
+ t.openModalInsert(t.lang.insertImage, options, function (v) { // v are values
+ t.execCmd('insertImage', v.url, false, true);
+ var $img = $('img[src="' + v.url + '"]:not([alt])', t.$box);
+ $img.attr('alt', v.alt);
+
+ if (t.o.imageWidthModalEdit) {
+ $img.attr({
+ width: v.width
+ });
+ }
+
+ t.syncCode();
+ t.$c.trigger('tbwchange');
+
+ return true;
+ });
+ },
+ fullscreen: function () {
+ var t = this,
+ prefix = t.o.prefix,
+ fullscreenCssClass = prefix + 'fullscreen',
+ fullscreenPlaceholderClass = fullscreenCssClass + '-placeholder',
+ isFullscreen,
+ editorHeight = t.$box.outerHeight();
+
+ t.$box.toggleClass(fullscreenCssClass);
+ isFullscreen = t.$box.hasClass(fullscreenCssClass);
+
+ if (isFullscreen) {
+ t.$box.before(
+ $('
', {
+ class: fullscreenPlaceholderClass
+ }).css({
+ height: editorHeight
+ })
+ );
+ } else {
+ $('.' + fullscreenPlaceholderClass).remove();
+ }
+
+ $('body').toggleClass(prefix + 'body-fullscreen', isFullscreen);
+ $(window).trigger('scroll');
+ t.$c.trigger('tbw' + (isFullscreen ? 'open' : 'close') + 'fullscreen');
+ },
+
+
+ /*
+ * Call method of trumbowyg if exist
+ * else try to call anonymous function
+ * and finally native execCommand
+ */
+ execCmd: function (cmd, param, forceCss, skipTrumbowyg) {
+ var t = this;
+ skipTrumbowyg = !!skipTrumbowyg || '';
+
+ if (cmd !== 'dropdown') {
+ t.$ed.focus();
+ }
+
+ if(cmd === 'strikethrough' && t.o.semantic) {
+ t.semanticTag('strike', t.o.semanticKeepAttributes, true); // browsers cannot undo e.g.
as they expect
+ }
+
+ try {
+ t.doc.execCommand('styleWithCSS', false, forceCss || false);
+ } catch (c) {
+ }
+
+ try {
+ t[cmd + skipTrumbowyg](param);
+ } catch (c) {
+ try {
+ cmd(param);
+ } catch (e2) {
+ if (cmd === 'insertHorizontalRule') {
+ param = undefined;
+ } else if (cmd === 'formatBlock' && t.isIE) {
+ param = '<' + param + '>';
+ }
+
+ t.doc.execCommand(cmd, false, param);
+
+ t.syncCode();
+ t.semanticCode(false, true);
+ try {
+ var listId = window.getSelection().focusNode;
+ if(!$(window.getSelection().focusNode.parentNode).hasClass('trumbowyg-editor')){
+ listId = window.getSelection().focusNode.parentNode;
+ }
+ var classes = t.o.tagClasses[param];
+ if (classes) {
+ $(listId).addClass(classes);
+ }
+ } catch (e) {
+
+ }
+
+ }
+
+ if (cmd !== 'dropdown') {
+ t.updateButtonPaneStatus();
+ t.$c.trigger('tbwchange');
+ }
+ }
+ },
+
+
+ // Open a modal box
+ openModal: function (title, content, buildForm) {
+ var t = this,
+ prefix = t.o.prefix;
+
+ buildForm = buildForm !== false;
+
+ // No open a modal box when exist other modal box
+ if ($('.' + prefix + 'modal-box', t.$box).length > 0) {
+ return false;
+ }
+ if (t.o.autogrowOnEnter) {
+ t.autogrowOnEnterDontClose = true;
+ }
+
+ t.saveRange();
+ t.showOverlay();
+
+ // Disable all btnPane btns
+ t.$btnPane.addClass(prefix + 'disable');
+
+ // Build out of ModalBox, it's the mask for animations
+ var $modal = $('', {
+ class: prefix + 'modal ' + prefix + 'fixed-top'
+ }).css({
+ top: t.$box.offset().top + t.$btnPane.height(),
+ zIndex: 99999
+ }).appendTo($(t.doc.body));
+
+ // Click on overlay close modal by cancelling them
+ t.$overlay.one('click', function () {
+ $modal.trigger(CANCEL_EVENT);
+ return false;
+ });
+
+ // Build the form
+ var formOrContent;
+ if (buildForm) {
+ formOrContent = $('', {
+ action: '',
+ html: content
+ })
+ .on('submit', function () {
+ $modal.trigger(CONFIRM_EVENT);
+ return false;
+ })
+ .on('reset', function () {
+ $modal.trigger(CANCEL_EVENT);
+ return false;
+ })
+ .on('submit reset', function () {
+ if (t.o.autogrowOnEnter) {
+ t.autogrowOnEnterDontClose = false;
+ }
+ });
+ } else {
+ formOrContent = content;
+ }
+
+
+ // Build ModalBox and animate to show them
+ var $box = $('', {
+ class: prefix + 'modal-box',
+ html: formOrContent
+ })
+ .css({
+ top: '-' + t.$btnPane.outerHeight(),
+ opacity: 0,
+ paddingBottom: buildForm ? null : '5%',
+ })
+ .appendTo($modal)
+ .animate({
+ top: 0,
+ opacity: 1
+ }, 100);
+
+
+ // Append title
+ if (title) {
+ $('', {
+ text: title,
+ class: prefix + 'modal-title'
+ }).prependTo($box);
+ }
+
+ if (buildForm) {
+ // Focus in modal box
+ $(':input:first', $box).focus();
+
+ // Append Confirm and Cancel buttons
+ t.buildModalBtn('submit', $box);
+ t.buildModalBtn('reset', $box);
+
+ $modal.height($box.outerHeight() + 10);
+ }
+
+ $(window).trigger('scroll');
+ t.$c.trigger('tbwmodalopen');
+
+ return $modal;
+ },
+ // @param n is name of modal
+ buildModalBtn: function (n, $modal) {
+ var t = this,
+ prefix = t.o.prefix;
+
+ return $('', {
+ class: prefix + 'modal-button ' + prefix + 'modal-' + n,
+ type: n,
+ text: t.lang[n] || n
+ }).appendTo($('form', $modal));
+ },
+ // close current modal box
+ closeModal: function () {
+ var t = this,
+ prefix = t.o.prefix;
+
+ t.$btnPane.removeClass(prefix + 'disable');
+ t.$overlay.off();
+
+ // Find the modal box
+ var $modalBox = $('.' + prefix + 'modal-box', $(t.doc.body));
+
+ $modalBox.animate({
+ top: '-' + $modalBox.height()
+ }, 100, function () {
+ $modalBox.parent().remove();
+ t.hideOverlay();
+ t.$c.trigger('tbwmodalclose');
+ });
+
+ t.restoreRange();
+ },
+ // Pre-formatted build and management modal
+ openModalInsert: function (title, fields, cmd) {
+ var t = this,
+ prefix = t.o.prefix,
+ lg = t.lang,
+ html = '',
+ idPrefix = prefix + 'form-' + Date.now() + '-';
+
+ $.each(fields, function (fieldName, field) {
+ var l = field.label || fieldName,
+ n = field.name || fieldName,
+ a = field.attributes || {},
+ fieldId = idPrefix + fieldName;
+
+ var attr = Object.keys(a).map(function (prop) {
+ return prop + '="' + a[prop] + '"';
+ }).join(' ');
+
+ if (typeof field.type === 'function') {
+ if (!field.name) {
+ field.name = n;
+ }
+ html += field.type(field, fieldId, prefix, lg);
+ } else {
+ html += '';
+ }
+ });
+
+ return t.openModal(title, html)
+ .on(CONFIRM_EVENT, function () {
+ var $form = $('form', $(this)),
+ valid = true,
+ values = {};
+
+ $.each(fields, function (fieldName, field) {
+ var n = field.name || fieldName;
+
+ var $field = $(':input[name="' + n + '"]', $form),
+ inputType = $field[0].type;
+
+ switch (inputType.toLowerCase()) {
+ case 'checkbox':
+ values[n] = $field.is(':checked');
+ break;
+ case 'radio':
+ values[n] = $field.filter(':checked').val();
+ break;
+ default:
+ values[n] = $.trim($field.val());
+ break;
+ }
+ // Validate value
+ if (field.required && values[n] === '') {
+ valid = false;
+ t.addErrorOnModalField($field, t.lang.required);
+ } else if (field.pattern && !field.pattern.test(values[n])) {
+ valid = false;
+ t.addErrorOnModalField($field, field.patternError);
+ }
+ });
+
+ if (valid) {
+ t.restoreRange();
+
+ if (cmd(values, fields)) {
+ t.syncCode();
+ t.$c.trigger('tbwchange');
+ t.closeModal();
+ $(this).off(CONFIRM_EVENT);
+ }
+ }
+ })
+ .one(CANCEL_EVENT, function () {
+ $(this).off(CONFIRM_EVENT);
+ t.closeModal();
+ });
+ },
+ addErrorOnModalField: function ($field, err) {
+ var prefix = this.o.prefix,
+ spanErrorClass = prefix + 'msg-error',
+ $row = $field.closest('.' + prefix + 'input-row');
+
+ $field
+ .on('change keyup', function () {
+ $row.removeClass(prefix + 'input-error');
+ setTimeout(function () {
+ $row.find('.' + spanErrorClass).remove();
+ }, 150);
+ });
+
+ $row
+ .addClass(prefix + 'input-error')
+ .find('.' + prefix + 'input-infos label')
+ .append(
+ $('', {
+ class: spanErrorClass,
+ text: err
+ })
+ );
+ },
+
+ getDefaultImgDblClickHandler: function () {
+ var t = this;
+
+ return function () {
+ var $img = $(this),
+ src = $img.attr('src'),
+ base64 = '(Base64)';
+
+ if (src.indexOf('data:image') === 0) {
+ src = base64;
+ }
+
+ var options = {
+ url: {
+ label: 'URL',
+ value: src,
+ required: true
+ },
+ alt: {
+ label: t.lang.description,
+ value: $img.attr('alt')
+ }
+ };
+
+ if (t.o.imageWidthModalEdit) {
+ options.width = {
+ value: $img.attr('width') ? $img.attr('width') : ''
+ };
+ }
+
+ t.openModalInsert(t.lang.insertImage, options, function (v) {
+ if (v.url !== base64) {
+ $img.attr({
+ src: v.url
+ });
+ }
+ $img.attr({
+ alt: v.alt
+ });
+
+ if (t.o.imageWidthModalEdit) {
+ if (parseInt(v.width) > 0) {
+ $img.attr({
+ width: v.width
+ });
+ } else {
+ $img.removeAttr('width');
+ }
+ }
+
+ return true;
+ });
+ return false;
+ };
+ },
+
+ // Range management
+ saveRange: function () {
+ var t = this,
+ documentSelection = t.doc.getSelection();
+
+ t.range = null;
+
+ if (!documentSelection || !documentSelection.rangeCount) {
+ return;
+ }
+
+ var savedRange = t.range = documentSelection.getRangeAt(0),
+ range = t.doc.createRange(),
+ rangeStart;
+ range.selectNodeContents(t.$ed[0]);
+ range.setEnd(savedRange.startContainer, savedRange.startOffset);
+ rangeStart = (range + '').length;
+ t.metaRange = {
+ start: rangeStart,
+ end: rangeStart + (savedRange + '').length
+ };
+ },
+ restoreRange: function () {
+ var t = this,
+ metaRange = t.metaRange,
+ savedRange = t.range,
+ documentSelection = t.doc.getSelection(),
+ range;
+
+ if (!savedRange) {
+ return;
+ }
+
+ if (metaRange && metaRange.start !== metaRange.end) { // Algorithm from http://jsfiddle.net/WeWy7/3/
+ var charIndex = 0,
+ nodeStack = [t.$ed[0]],
+ node,
+ foundStart = false,
+ stop = false;
+
+ range = t.doc.createRange();
+
+ while (!stop && (node = nodeStack.pop())) {
+ if (node.nodeType === 3) {
+ var nextCharIndex = charIndex + node.length;
+ if (!foundStart && metaRange.start >= charIndex && metaRange.start <= nextCharIndex) {
+ range.setStart(node, metaRange.start - charIndex);
+ foundStart = true;
+ }
+ if (foundStart && metaRange.end >= charIndex && metaRange.end <= nextCharIndex) {
+ range.setEnd(node, metaRange.end - charIndex);
+ stop = true;
+ }
+ charIndex = nextCharIndex;
+ } else {
+ var cn = node.childNodes,
+ i = cn.length;
+
+ while (i > 0) {
+ i -= 1;
+ nodeStack.push(cn[i]);
+ }
+ }
+ }
+ }
+
+ // Fix IE11 Error 'Could not complete the operation due to error 800a025e'.
+ // https://stackoverflow.com/questions/16160996/could-not-complete-the-operation-due-to-error-800a025e
+ try {
+ documentSelection.removeAllRanges();
+ } catch (e) {
+ }
+
+ documentSelection.addRange(range || savedRange);
+ },
+ getRangeText: function () {
+ return this.range + '';
+ },
+
+ clearButtonPaneStatus: function () {
+ var t = this,
+ prefix = t.o.prefix,
+ activeClasses = prefix + 'active-button ' + prefix + 'active',
+ originalIconClass = prefix + 'original-icon';
+
+ // Reset all buttons and dropdown state
+ $('.' + prefix + 'active-button', t.$btnPane).removeClass(activeClasses);
+ $('.' + originalIconClass, t.$btnPane).each(function () {
+ $(this).find('svg use').attr('xlink:href', $(this).data(originalIconClass));
+ });
+ },
+ updateButtonPaneStatus: function () {
+ var t = this,
+ prefix = t.o.prefix,
+ activeClasses = prefix + 'active-button ' + prefix + 'active',
+ originalIconClass = prefix + 'original-icon',
+ tags = t.getTagsRecursive(t.doc.getSelection().focusNode);
+
+ t.clearButtonPaneStatus();
+
+ $.each(tags, function (i, tag) {
+ var btnName = t.tagToButton[tag.toLowerCase()],
+ $btn = $('.' + prefix + btnName + '-button', t.$btnPane);
+
+ if ($btn.length > 0) {
+ $btn.addClass(activeClasses);
+ } else {
+ try {
+ $btn = $('.' + prefix + 'dropdown .' + prefix + btnName + '-dropdown-button', t.$box);
+ var $btnSvgUse = $btn.find('svg use'),
+ dropdownBtnName = $btn.parent().data(prefix + 'dropdown'),
+ $dropdownBtn = $('.' + prefix + dropdownBtnName + '-button', t.$box),
+ $dropdownBtnSvgUse = $dropdownBtn.find('svg use');
+
+ // Highlight the dropdown button
+ $dropdownBtn.addClass(activeClasses);
+
+ // Switch dropdown icon to the active sub-icon one
+ if (t.o.changeActiveDropdownIcon && $btnSvgUse.length > 0) {
+ // Save original icon
+ $dropdownBtn
+ .addClass(originalIconClass)
+ .data(originalIconClass, $dropdownBtnSvgUse.attr('xlink:href'));
+
+ // Put the active sub-button's icon
+ $dropdownBtnSvgUse
+ .attr('xlink:href', $btnSvgUse.attr('xlink:href'));
+ }
+ } catch (e) {
+ }
+ }
+ });
+ },
+ getTagsRecursive: function (element, tags) {
+ var t = this;
+ tags = tags || (element && element.tagName ? [element.tagName] : []);
+
+ if (element && element.parentNode) {
+ element = element.parentNode;
+ } else {
+ return tags;
+ }
+
+ var tag = element.tagName;
+ if (tag === 'DIV') {
+ return tags;
+ }
+ if (tag === 'P' && element.style.textAlign !== '') {
+ tags.push(element.style.textAlign);
+ }
+
+ $.each(t.tagHandlers, function (i, tagHandler) {
+ tags = tags.concat(tagHandler(element, t));
+ });
+
+ tags.push(tag);
+
+ return t.getTagsRecursive(element, tags).filter(function (tag) {
+ return tag != null;
+ });
+ },
+
+ // Plugins
+ initPlugins: function () {
+ var t = this;
+ t.loadedPlugins = [];
+ $.each($.trumbowyg.plugins, function (name, plugin) {
+ if (!plugin.shouldInit || plugin.shouldInit(t)) {
+ plugin.init(t);
+ if (plugin.tagHandler) {
+ t.tagHandlers.push(plugin.tagHandler);
+ }
+ t.loadedPlugins.push(plugin);
+ }
+ });
+ },
+ destroyPlugins: function () {
+ var t = this;
+ $.each(this.loadedPlugins, function (i, plugin) {
+ if (plugin.destroy) {
+ plugin.destroy(t);
+ }
+ });
+ }
+ };
+})(navigator, window, document, jQuery);
diff --git a/vasl_templates/webapp/static/trumbowyg/trumbowyg.min.js b/vasl_templates/webapp/static/trumbowyg/trumbowyg.min.js
new file mode 100644
index 0000000..6452037
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/trumbowyg.min.js
@@ -0,0 +1,2 @@
+/** Trumbowyg v2.25.2 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
+jQuery.trumbowyg={langs:{en:{viewHTML:"View HTML",undo:"Undo",redo:"Redo",formatting:"Formatting",p:"Paragraph",blockquote:"Quote",code:"Code",header:"Header",bold:"Bold",italic:"Italic",strikethrough:"Strikethrough",underline:"Underline",strong:"Strong",em:"Emphasis",del:"Deleted",superscript:"Superscript",subscript:"Subscript",unorderedList:"Unordered list",orderedList:"Ordered list",insertImage:"Insert Image",link:"Link",createLink:"Insert link",unlink:"Remove link",justifyLeft:"Align Left",justifyCenter:"Align Center",justifyRight:"Align Right",justifyFull:"Align Justify",horizontalRule:"Insert horizontal rule",removeformat:"Remove format",fullscreen:"Fullscreen",close:"Close",submit:"Confirm",reset:"Cancel",required:"Required",description:"Description",title:"Title",text:"Text",target:"Target",width:"Width"}},plugins:{},svgPath:null,svgAbsoluteUseHref:!1,hideButtonTexts:null},Object.defineProperty(jQuery.trumbowyg,"defaultOptions",{value:{lang:"en",fixedBtnPane:!1,fixedFullWidth:!1,autogrow:!1,autogrowOnEnter:!1,imageWidthModalEdit:!1,hideButtonTexts:null,prefix:"trumbowyg-",tagClasses:{},semantic:!0,semanticKeepAttributes:!1,resetCss:!1,removeformatPasted:!1,tabToIndent:!1,tagsToRemove:[],tagsToKeep:["hr","img","embed","iframe","input"],btns:[["viewHTML"],["undo","redo"],["formatting"],["strong","em","del"],["superscript","subscript"],["link"],["insertImage"],["justifyLeft","justifyCenter","justifyRight","justifyFull"],["unorderedList","orderedList"],["horizontalRule"],["removeformat"],["fullscreen"]],btnsDef:{},changeActiveDropdownIcon:!1,inlineElementsSelector:"a,abbr,acronym,b,caption,cite,code,col,dfn,dir,dt,dd,em,font,hr,i,kbd,li,q,span,strikeout,strong,sub,sup,u",pasteHandlers:[],plugins:{},urlProtocol:!1,minimalLinks:!1,defaultLinkTarget:void 0,svgPath:null},writable:!1,enumerable:!0,configurable:!1}),function(e,t,n,a){"use strict";var o="tbwconfirm",r="tbwcancel";a.fn.trumbowyg=function(e,t){var n="trumbowyg";if(e===Object(e)||!e)return this.each((function(){a(this).data(n)||a(this).data(n,new i(this,e))}));if(1===this.length)try{var o=a(this).data(n);switch(e){case"execCmd":return o.execCmd(t.cmd,t.param,t.forceCss,t.skipTrumbowyg);case"openModal":return o.openModal(t.title,t.content);case"closeModal":return o.closeModal();case"openModalInsert":return o.openModalInsert(t.title,t.fields,t.callback);case"saveRange":return o.saveRange();case"getRange":return o.range;case"getRangeText":return o.getRangeText();case"restoreRange":return o.restoreRange();case"enable":return o.setDisabled(!1);case"disable":return o.setDisabled(!0);case"toggle":return o.toggle();case"destroy":return o.destroy();case"empty":return o.empty();case"html":return o.html(t)}}catch(e){}return!1};var i=function(o,r){var i=this,s="trumbowyg-icons",l=a.trumbowyg;i.doc=o.ownerDocument||n,i.$ta=a(o),i.$c=a(o),null!=(r=r||{}).lang||null!=l.langs[r.lang]?i.lang=a.extend(!0,{},l.langs.en,l.langs[r.lang]):i.lang=l.langs.en,i.hideButtonTexts=null!=l.hideButtonTexts?l.hideButtonTexts:r.hideButtonTexts;var d=null!=l.svgPath?l.svgPath:r.svgPath;if(i.hasSvg=!1!==d,!1!==d&&(l.svgAbsoluteUseHref||0===a("#trumbowyg-icons",i.doc).length)){if(null==d)a("script[src]").each((function(e,t){var n=t.src,a=n.match("trumbowyg(.min)?.js");null!=a&&(d=n.substring(0,n.indexOf(a[0]))+"ui/icons.svg")}));if(null==d)console.warn("You must define svgPath: https://goo.gl/CfTY9U");else if(!l.svgAbsoluteUseHref){var c=i.doc.createElement("div");c.id=s,i.doc.body.insertBefore(c,i.doc.body.childNodes[0]),a.ajax({async:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",dataType:"xml",crossDomain:!0,url:d,data:null,beforeSend:null,complete:null,success:function(e){c.innerHTML=(new XMLSerializer).serializeToString(e.documentElement)}})}}var u=i.doc.querySelector("base")?t.location.href.split(/[?#]/)[0]:"";i.svgPath=l.svgAbsoluteUseHref?d:u;var g=i.lang.header,f=function(){return(t.chrome||t.Intl&&Intl.v8BreakIterator)&&"CSS"in t};i.btnsDef={viewHTML:{fn:"toggle",class:"trumbowyg-not-disable"},undo:{isSupported:f,key:"Z"},redo:{isSupported:f,key:"Y"},p:{fn:"formatBlock"},blockquote:{fn:"formatBlock"},h1:{fn:"formatBlock",title:g+" 1"},h2:{fn:"formatBlock",title:g+" 2"},h3:{fn:"formatBlock",title:g+" 3"},h4:{fn:"formatBlock",title:g+" 4"},h5:{fn:"formatBlock",title:g+" 5"},h6:{fn:"formatBlock",title:g+" 6"},subscript:{tag:"sub"},superscript:{tag:"sup"},bold:{key:"B",tag:"b"},italic:{key:"I",tag:"i"},underline:{tag:"u"},strikethrough:{tag:"strike"},strong:{fn:"bold",key:"B"},em:{fn:"italic",key:"I"},del:{fn:"strikethrough"},createLink:{key:"K",tag:"a"},unlink:{},insertImage:{},justifyLeft:{tag:"left",forceCss:!0},justifyCenter:{tag:"center",forceCss:!0},justifyRight:{tag:"right",forceCss:!0},justifyFull:{tag:"justify",forceCss:!0},unorderedList:{fn:"insertUnorderedList",tag:"ul"},orderedList:{fn:"insertOrderedList",tag:"ol"},horizontalRule:{fn:"insertHorizontalRule"},removeformat:{},fullscreen:{class:"trumbowyg-not-disable"},close:{fn:"destroy",class:"trumbowyg-not-disable"},formatting:{dropdown:["p","blockquote","h1","h2","h3","h4"],ico:"p"},link:{dropdown:["createLink","unlink"]}},i.o=a.extend(!0,{},l.defaultOptions,r),i.o.hasOwnProperty("imgDblClickHandler")||(i.o.imgDblClickHandler=i.getDefaultImgDblClickHandler()),i.urlPrefix=i.setupUrlPrefix(),i.disabled=i.o.disabled||"TEXTAREA"===o.nodeName&&o.disabled,r.btns?i.o.btns=r.btns:i.o.semantic||(i.o.btns[3]=["bold","italic","underline","strikethrough"]),a.each(i.o.btnsDef,(function(e,t){i.addBtnDef(e,t)})),i.eventNamespace="trumbowyg-event",i.keys=[],i.tagToButton={},i.tagHandlers=[],i.pasteHandlers=[].concat(i.o.pasteHandlers),i.isIE=-1!==e.userAgent.indexOf("MSIE")||-1!==e.appVersion.indexOf("Trident/"),i.isMac=-1!==e.platform.toUpperCase().indexOf("MAC"),i.init()};i.prototype={DEFAULT_SEMANTIC_MAP:{b:"strong",i:"em",s:"del",strike:"del",div:"p"},init:function(){var e=this;e.height=e.$ta.height(),e.initPlugins();try{e.doc.execCommand("enableObjectResizing",!1,!1),e.doc.execCommand("defaultParagraphSeparator",!1,"p")}catch(e){}e.buildEditor(),e.buildBtnPane(),e.fixedBtnPaneEvents(),e.buildOverlay(),setTimeout((function(){e.disabled&&e.setDisabled(!0),e.$c.trigger("tbwinit")}))},addBtnDef:function(e,t){this.btnsDef[e]=a.extend(t,this.btnsDef[e]||{})},setupUrlPrefix:function(){var e=this.o.urlProtocol;if(e)return"string"!=typeof e?"https://":e.replace("://","")+"://"},buildEditor:function(){var e=this,n=e.o.prefix,o="";e.$box=a("",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=a(""),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=a("",{name:e.$ta.attr("id"),height:e.height}).val(o),e.$box.insertAfter(e.$ed).append(e.$ta,e.$ed),e.syncCode()),e.$ta.addClass(n+"textarea").attr("tabindex",-1),e.$ed.addClass(n+"editor").attr({contenteditable:!0,dir:e.lang._dir||"ltr"}).html(o),e.o.tabindex&&e.$ed.attr("tabindex",e.o.tabindex),e.$c.is("[placeholder]")&&e.$ed.attr("placeholder",e.$c.attr("placeholder")),e.$c.is("[spellcheck]")&&e.$ed.attr("spellcheck",e.$c.attr("spellcheck")),e.o.resetCss&&e.$ed.addClass(n+"reset-css"),e.o.autogrow||e.$ta.add(e.$ed).css({height:e.height}),e.semanticCode(),e.o.autogrowOnEnter&&e.$ed.addClass(n+"autogrow-on-enter");var r,i=!1,s=!1;e.$ed.on("dblclick","img",e.o.imgDblClickHandler).on("keydown",(function(t){var n=t.which;if(8!==n&&13!==n&&46!==n||e.toggleSpan(!0),!t.ctrlKey&&!t.metaKey||t.altKey){if(e.o.tabToIndent&&"Tab"===t.key)try{return t.shiftKey?e.execCmd("outdent",!0,null):e.execCmd("indent",!0,null),!1}catch(e){}}else{i=!0;var a=e.keys[String.fromCharCode(t.which).toUpperCase()];try{return e.execCmd(a.fn,a.param),!1}catch(e){}}})).on("compositionstart compositionupdate",(function(){s=!0})).on("keyup compositionend",(function(t){if("compositionend"===t.type)s=!1;else if(s)return;var n=t.which;if(!(n>=37&&n<=40)){if(8!==n&&13!==n&&46!==n||e.toggleSpan(),!t.ctrlKey&&!t.metaKey||89!==n&&90!==n)if(i||17===n)void 0===t.which&&e.semanticCode(!1,!1,!0);else{var a=!e.isIE||"compositionend"===t.type;e.semanticCode(!1,a&&13===n),e.$c.trigger("tbwchange")}else e.semanticCode(!1,!0),e.$c.trigger("tbwchange");setTimeout((function(){i=!1}),50)}})).on("mouseup keydown keyup",(function(t){(!t.ctrlKey&&!t.metaKey||t.altKey)&&setTimeout((function(){i=!1}),50),clearTimeout(r),r=setTimeout((function(){e.updateButtonPaneStatus()}),50)})).on("focus blur",(function(t){if("blur"===t.type&&e.clearButtonPaneStatus(),e.$c.trigger("tbw"+t.type),e.o.autogrowOnEnter){if(e.autogrowOnEnterDontClose)return;"focus"===t.type?(e.autogrowOnEnterWasFocused=!0,e.autogrowEditorOnEnter()):e.o.autogrow||(e.$ed.css({height:e.$ed.css("min-height")}),e.$c.trigger("tbwresize"))}})).on("keyup focus",(function(){e.$ta.val().match(/<.*>/)||e.$ed.html().match(/<.*>/)||setTimeout((function(){var t=e.isIE?"":"p";e.doc.execCommand("formatBlock",!1,t),e.syncCode()}),0)})).on("cut drop",(function(){setTimeout((function(){e.semanticCode(!1,!0),e.$c.trigger("tbwchange")}),0)})).on("paste",(function(n){if(e.o.removeformatPasted){n.preventDefault(),t.getSelection&&t.getSelection().deleteFromDocument&&t.getSelection().deleteFromDocument();try{var o=t.clipboardData.getData("Text");try{e.doc.selection.createRange().pasteHTML(o)}catch(t){e.doc.getSelection().getRangeAt(0).insertNode(e.doc.createTextNode(o))}e.$c.trigger("tbwchange",n)}catch(t){e.execCmd("insertText",(n.originalEvent||n).clipboardData.getData("text/plain"))}}a.each(e.pasteHandlers,(function(e,t){t(n)})),setTimeout((function(){e.semanticCode(!1,!0),e.$c.trigger("tbwpaste",n),e.$c.trigger("tbwchange")}),0)})),e.$ta.on("keyup",(function(){e.$c.trigger("tbwchange")})).on("paste",(function(){setTimeout((function(){e.$c.trigger("tbwchange")}),0)})),a(e.doc.body).on("keydown."+e.eventNamespace,(function(t){if(27===t.which&&a("."+n+"modal-box").length>=1)return e.closeModal(),!1}))},autogrowEditorOnEnter:function(){var e=this;e.$ed.removeClass("autogrow-on-enter");var t=e.$ed[0].clientHeight;e.$ed.height("auto");var n=e.$ed[0].scrollHeight;e.$ed.addClass("autogrow-on-enter"),t!==n&&(e.$ed.height(t),setTimeout((function(){e.$ed.css({height:n}),e.$c.trigger("tbwresize")}),0))},buildBtnPane:function(){var e=this,t=e.o.prefix,n=e.$btnPane=a("
",{class:t+"button-pane"});a.each(e.o.btns,(function(o,r){a.isArray(r)||(r=[r]);var i=a("",{class:t+"button-group "+(r.indexOf("fullscreen")>=0?t+"right":"")});a.each(r,(function(t,n){try{e.isSupportedBtn(n)&&i.append(e.buildBtn(n))}catch(e){}})),i.html().trim().length>0&&n.append(i)})),e.$box.prepend(n)},buildBtn:function(e){var t=this,n=t.o.prefix,o=t.btnsDef[e],r=o.dropdown,i=null==o.hasIcon||o.hasIcon,s=t.lang[e]||e,l=a("",{type:"button",class:n+e+"-button "+(o.class||"")+(i?"":" "+n+"textual-button"),html:t.hasSvg&&i?'':t.hideButtonTexts?"":o.text||o.title||t.lang[e]||e,title:(o.title||o.text||s)+(o.key?" ("+(t.isMac?"Cmd":"Ctrl")+" + "+o.key+")":""),tabindex:-1,mousedown:function(){return r&&!a("."+e+"-"+n+"dropdown",t.$box).is(":hidden")||a("body",t.doc).trigger("mousedown"),!((t.$btnPane.hasClass(n+"disable")||t.$box.hasClass(n+"disabled"))&&!a(this).hasClass(n+"active")&&!a(this).hasClass(n+"not-disable"))&&(t.execCmd((!r?o.fn:"dropdown")||e,o.param||e,o.forceCss),!1)}});if(r){l.addClass(n+"open-dropdown");var d=n+"dropdown",c={class:d+"-"+e+" "+d+" "+n+"fixed-top "+(o.dropdownClass||"")};c["data-"+d]=e;var u=a("",c);a.each(r,(function(e,n){t.btnsDef[n]&&t.isSupportedBtn(n)&&u.append(t.buildSubBtn(n))})),t.$box.append(u.hide())}else o.key&&(t.keys[o.key]={fn:o.fn||e,param:o.param||e});return r||(t.tagToButton[(o.tag||e).toLowerCase()]=e),l},buildSubBtn:function(e){var t=this,n=t.o.prefix,o=t.btnsDef[e],r=null==o.hasIcon||o.hasIcon;return o.key&&(t.keys[o.key]={fn:o.fn||e,param:o.param||e}),t.tagToButton[(o.tag||e).toLowerCase()]=e,a("",{type:"button",class:n+e+"-dropdown-button "+(o.class||"")+(o.ico?" "+n+o.ico+"-button":""),html:t.hasSvg&&r?''+(o.text||o.title||t.lang[e]||e):o.text||o.title||t.lang[e]||e,title:o.key?"("+(t.isMac?"Cmd":"Ctrl")+" + "+o.key+")":null,style:o.style||null,mousedown:function(){return a("body",t.doc).trigger("mousedown"),t.execCmd(o.fn||e,o.param||e,o.forceCss),!1}})},isSupportedBtn:function(e){try{return this.btnsDef[e].isSupported()}catch(e){}return!0},buildOverlay:function(){var e=this;return e.$overlay=a("",{class:e.o.prefix+"overlay"}).appendTo(e.$box),e.$overlay},showOverlay:function(){var e=this;a(t).trigger("scroll"),e.$overlay.fadeIn(200),e.$box.addClass(e.o.prefix+"box-blur")},hideOverlay:function(){var e=this;e.$overlay.fadeOut(50),e.$box.removeClass(e.o.prefix+"box-blur")},fixedBtnPaneEvents:function(){var e=this,n=e.o.fixedFullWidth,o=e.$box;e.o.fixedBtnPane&&(e.isFixed=!1,a(t).on("scroll."+e.eventNamespace+" resize."+e.eventNamespace,(function(){if(o){e.syncCode();var r=a(t).scrollTop(),i=o.offset().top+1,s=e.$btnPane,l=s.outerHeight()-2;r-i>0&&r-i-e.height<0?(e.isFixed||(e.isFixed=!0,s.css({position:"fixed",top:0,left:n?0:"auto",zIndex:7}),e.$box.css({paddingTop:s.height()})),s.css({width:n?"100%":o.width()-1}),a("."+e.o.prefix+"fixed-top",o).css({position:n?"fixed":"absolute",top:n?l:l+(r-i),zIndex:15})):e.isFixed&&(e.isFixed=!1,s.removeAttr("style"),e.$box.css({paddingTop:0}),a("."+e.o.prefix+"fixed-top",o).css({position:"absolute",top:l}))}})))},setDisabled:function(e){var t=this,n=t.o.prefix;t.disabled=e,e?t.$ta.attr("disabled",!0):t.$ta.removeAttr("disabled"),t.$box.toggleClass(n+"disabled",e),t.$ed.attr("contenteditable",!e)},destroy:function(){var e=this,n=e.o.prefix;e.isTextarea?e.$box.after(e.$ta.css({height:""}).val(e.html()).removeClass(n+"textarea").show()):e.$box.after(e.$ed.css({height:""}).removeClass(n+"editor").removeAttr("contenteditable").removeAttr("dir").html(e.html()).show()),e.$ed.off("dblclick","img"),e.destroyPlugins(),e.$box.remove(),e.$c.removeData("trumbowyg"),a("body").removeClass(n+"body-fullscreen"),e.$c.trigger("tbwclose"),a(t).off("scroll."+e.eventNamespace+" resize."+e.eventNamespace),a(e.doc.body).off("keydown."+e.eventNamespace)},empty:function(){this.$ta.val(""),this.syncCode(!0)},toggle:function(){var e=this,t=e.o.prefix;e.o.autogrowOnEnter&&(e.autogrowOnEnterDontClose=!e.$box.hasClass(t+"editor-hidden")),e.semanticCode(!1,!0),e.$c.trigger("tbwchange"),setTimeout((function(){e.doc.activeElement.blur(),e.$box.toggleClass(t+"editor-hidden "+t+"editor-visible"),e.$btnPane.toggleClass(t+"disable"),a("."+t+"viewHTML-button",e.$btnPane).toggleClass(t+"active"),e.$box.hasClass(t+"editor-visible")?e.$ta.attr("tabindex",-1):e.$ta.removeAttr("tabindex"),e.o.autogrowOnEnter&&!e.autogrowOnEnterDontClose&&e.autogrowEditorOnEnter()}),0)},toggleSpan:function(e){this.$ed.find("span").each((function(){!0===e?a(this).attr("data-tbw-flag",!0):a(this).attr("data-tbw-flag")?a(this).removeAttr("data-tbw-flag"):a(this).contents().unwrap()}))},dropdown:function(e){var n=this,o=a("body",n.doc),r=n.o.prefix,i=a("[data-"+r+"dropdown="+e+"]",n.$box),s=a("."+r+e+"-button",n.$btnPane),l=i.is(":hidden");if(o.trigger("mousedown"),l){var d=s.offset().left;s.addClass(r+"active"),i.css({position:"absolute",top:s.offset().top-n.$btnPane.offset().top+s.outerHeight(),left:n.o.fixedFullWidth&&n.isFixed?d:d-n.$btnPane.offset().left}).show(),a(t).trigger("scroll"),o.on("mousedown."+n.eventNamespace,(function(e){i.is(e.target)||(a("."+r+"dropdown",n.$box).hide(),a("."+r+"active",n.$btnPane).removeClass(r+"active"),o.off("mousedown."+n.eventNamespace))}))}},html:function(e){var t=this;return null!=e?(t.$ta.val(e),t.syncCode(!0),t.$c.trigger("tbwchange"),t):t.$ta.val()},syncTextarea:function(){var e=this;e.$ta.val(e.$ed.text().trim().length>0||e.$ed.find(e.o.tagsToKeep.join(",")).length>0?e.$ed.html():"")},syncCode:function(e){var t=this;if(!e&&t.$ed.is(":visible"))t.syncTextarea();else{var n=a("").html(t.$ta.val()),o=a("
").append(n);a(t.o.tagsToRemove.join(","),o).remove(),t.$ed.html(o.contents().html())}if(t.o.autogrow&&(t.height=t.$ed.height(),t.height!==t.$ta.css("height")&&(t.$ta.css({height:t.height}),t.$c.trigger("tbwresize"))),t.o.autogrowOnEnter){t.$ed.height("auto");var r=t.autogrowOnEnterWasFocused?t.$ed[0].scrollHeight:t.$ed.css("min-height");r!==t.$ta.css("height")&&(t.$ed.css({height:r}),t.$c.trigger("tbwresize"))}},semanticCode:function(e,t,n){var o=this;o.saveRange(),o.syncCode(e);var r=!0;if(o.range&&o.range.collapsed&&(r=!1),o.o.semantic){if(o.semanticTag("b",o.o.semanticKeepAttributes),o.semanticTag("i",o.o.semanticKeepAttributes),o.semanticTag("s",o.o.semanticKeepAttributes),o.semanticTag("strike",o.o.semanticKeepAttributes),t){var i=o.o.inlineElementsSelector,s=":not("+i+")";o.$ed.contents().filter((function(){return 3===this.nodeType&&this.nodeValue.trim().length>0})).wrap("
");var l=function(e){if(0!==e.length){var t=e.nextUntil(s).addBack().wrapAll("
").parent(),n=t.nextAll(i).first();t.next("br").remove(),l(n)}};l(o.$ed.children(i).first()),o.semanticTag("div",!0),a("[data-tbw]",o.$ed).contents().unwrap(),o.$ed.find("p:empty").remove()}!n&&r&&o.restoreRange(),o.syncTextarea()}},semanticTag:function(e,t,n){var o,r=this,i=e;if(null!=this.o.semantic&&"object"==typeof this.o.semantic&&this.o.semantic.hasOwnProperty(e))o=this.o.semantic[e];else{if(!0!==this.o.semantic||!this.DEFAULT_SEMANTIC_MAP.hasOwnProperty(e))return;o=this.DEFAULT_SEMANTIC_MAP[e]}n&&(e=o,o=i),a(e,this.$ed).each((function(){var e=!1,n=a(this);if(0===n.contents().length)return!1;r.range&&r.range.startContainer.parentNode===this&&(e=!0);var i=a("<"+o+"/>");i.insertBefore(n),t&&a.each(n.prop("attributes"),(function(){i.attr(this.name,this.value)})),i.html(n.html()),n.remove(),!0===e&&(r.range.selectNodeContents(i.get(0)),r.range.collapse(!1))}))},createLink:function(){for(var e,t,n,o=this,r=o.doc.getSelection(),i=r.getRangeAt(0),s=r.focusNode,l=(new XMLSerializer).serializeToString(i.cloneContents())||i+"";["A","DIV"].indexOf(s.nodeName)<0;)s=s.parentNode;if(s&&"A"===s.nodeName){var d=a(s);l=d.text(),e=d.attr("href"),o.o.minimalLinks||(t=d.attr("title"),n=d.attr("target")||o.o.defaultLinkTarget);var c=o.doc.createRange();c.selectNode(s),r.removeAllRanges(),r.addRange(c)}o.saveRange();var u={url:{label:o.lang.linkUrl||"URL",required:!0,value:e},text:{label:o.lang.text,value:l}};o.o.minimalLinks||a.extend(u,{title:{label:o.lang.title,value:t},target:{label:o.lang.target,value:n}}),o.openModalInsert(o.lang.createLink,u,(function(e){var t=o.prependUrlPrefix(e.url);if(!t.length)return!1;var n=a(['
',e.text||e.url,""].join(""));return e.title&&n.attr("title",e.title),(e.target||o.o.defaultLinkTarget)&&n.attr("target",e.target||o.o.defaultLinkTarget),o.range.deleteContents(),o.range.insertNode(n[0]),o.syncCode(),o.$c.trigger("tbwchange"),!0}))},prependUrlPrefix:function(e){if(!this.urlPrefix)return e;if(/^([a-z][-+.a-z0-9]*:|\/|#)/i.test(e))return e;return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)?"mailto:"+e:this.urlPrefix+e},unlink:function(){var e=this,t=e.doc.getSelection(),n=t.focusNode;if(t.isCollapsed){for(;["A","DIV"].indexOf(n.nodeName)<0;)n=n.parentNode;if(n&&"A"===n.nodeName){var a=e.doc.createRange();a.selectNode(n),t.removeAllRanges(),t.addRange(a)}}e.execCmd("unlink",void 0,void 0,!0)},insertImage:function(){var e=this;e.saveRange();var t={url:{label:"URL",required:!0},alt:{label:e.lang.description,value:e.getRangeText()}};e.o.imageWidthModalEdit&&(t.width={}),e.openModalInsert(e.lang.insertImage,t,(function(t){e.execCmd("insertImage",t.url,!1,!0);var n=a('img[src="'+t.url+'"]:not([alt])',e.$box);return n.attr("alt",t.alt),e.o.imageWidthModalEdit&&n.attr({width:t.width}),e.syncCode(),e.$c.trigger("tbwchange"),!0}))},fullscreen:function(){var e,n=this,o=n.o.prefix,r=o+"fullscreen",i=r+"-placeholder",s=n.$box.outerHeight();n.$box.toggleClass(r),(e=n.$box.hasClass(r))?n.$box.before(a("
",{class:i}).css({height:s})):a("."+i).remove(),a("body").toggleClass(o+"body-fullscreen",e),a(t).trigger("scroll"),n.$c.trigger("tbw"+(e?"open":"close")+"fullscreen")},execCmd:function(e,n,o,r){var i=this;r=!!r||"","dropdown"!==e&&i.$ed.focus(),"strikethrough"===e&&i.o.semantic&&i.semanticTag("strike",i.o.semanticKeepAttributes,!0);try{i.doc.execCommand("styleWithCSS",!1,o||!1)}catch(e){}try{i[e+r](n)}catch(o){try{e(n)}catch(o){"insertHorizontalRule"===e?n=void 0:"formatBlock"===e&&i.isIE&&(n="<"+n+">"),i.doc.execCommand(e,!1,n),i.syncCode(),i.semanticCode(!1,!0);try{var s=t.getSelection().focusNode;a(t.getSelection().focusNode.parentNode).hasClass("trumbowyg-editor")||(s=t.getSelection().focusNode.parentNode);var l=i.o.tagClasses[n];l&&a(s).addClass(l)}catch(e){}}"dropdown"!==e&&(i.updateButtonPaneStatus(),i.$c.trigger("tbwchange"))}},openModal:function(e,n,i){var s=this,l=s.o.prefix;if(i=!1!==i,a("."+l+"modal-box",s.$box).length>0)return!1;s.o.autogrowOnEnter&&(s.autogrowOnEnterDontClose=!0),s.saveRange(),s.showOverlay(),s.$btnPane.addClass(l+"disable");var d,c=a("
",{class:l+"modal "+l+"fixed-top"}).css({top:s.$box.offset().top+s.$btnPane.height(),zIndex:99999}).appendTo(a(s.doc.body));s.$overlay.one("click",(function(){return c.trigger(r),!1})),d=i?a("
",{action:"",html:n}).on("submit",(function(){return c.trigger(o),!1})).on("reset",(function(){return c.trigger(r),!1})).on("submit reset",(function(){s.o.autogrowOnEnter&&(s.autogrowOnEnterDontClose=!1)})):n;var u=a("
",{class:l+"modal-box",html:d}).css({top:"-"+s.$btnPane.outerHeight(),opacity:0,paddingBottom:i?null:"5%"}).appendTo(c).animate({top:0,opacity:1},100);return e&&a("
",{text:e,class:l+"modal-title"}).prependTo(u),i&&(a(":input:first",u).focus(),s.buildModalBtn("submit",u),s.buildModalBtn("reset",u),c.height(u.outerHeight()+10)),a(t).trigger("scroll"),s.$c.trigger("tbwmodalopen"),c},buildModalBtn:function(e,t){var n=this.o.prefix;return a("
",{class:n+"modal-button "+n+"modal-"+e,type:e,text:this.lang[e]||e}).appendTo(a("form",t))},closeModal:function(){var e=this,t=e.o.prefix;e.$btnPane.removeClass(t+"disable"),e.$overlay.off();var n=a("."+t+"modal-box",a(e.doc.body));n.animate({top:"-"+n.height()},100,(function(){n.parent().remove(),e.hideOverlay(),e.$c.trigger("tbwmodalclose")})),e.restoreRange()},openModalInsert:function(e,t,n){var i=this,s=i.o.prefix,l=i.lang,d="",c=s+"form-"+Date.now()+"-";return a.each(t,(function(e,t){var n=t.label||e,a=t.name||e,o=t.attributes||{},r=c+e,i=Object.keys(o).map((function(e){return e+'="'+o[e]+'"'})).join(" ");"function"==typeof t.type?(t.name||(t.name=a),d+=t.type(t,r,s,l)):(d+='
")})),i.openModal(e,d).on(o,(function(){var e=a("form",a(this)),r=!0,s={};a.each(t,(function(t,n){var o=n.name||t,l=a(':input[name="'+o+'"]',e);switch(l[0].type.toLowerCase()){case"checkbox":s[o]=l.is(":checked");break;case"radio":s[o]=l.filter(":checked").val();break;default:s[o]=a.trim(l.val())}n.required&&""===s[o]?(r=!1,i.addErrorOnModalField(l,i.lang.required)):n.pattern&&!n.pattern.test(s[o])&&(r=!1,i.addErrorOnModalField(l,n.patternError))})),r&&(i.restoreRange(),n(s,t)&&(i.syncCode(),i.$c.trigger("tbwchange"),i.closeModal(),a(this).off(o)))})).one(r,(function(){a(this).off(o),i.closeModal()}))},addErrorOnModalField:function(e,t){var n=this.o.prefix,o=n+"msg-error",r=e.closest("."+n+"input-row");e.on("change keyup",(function(){r.removeClass(n+"input-error"),setTimeout((function(){r.find("."+o).remove()}),150)})),r.addClass(n+"input-error").find("."+n+"input-infos label").append(a("
",{class:o,text:t}))},getDefaultImgDblClickHandler:function(){var e=this;return function(){var t=a(this),n=t.attr("src"),o="(Base64)";0===n.indexOf("data:image")&&(n=o);var r={url:{label:"URL",value:n,required:!0},alt:{label:e.lang.description,value:t.attr("alt")}};return e.o.imageWidthModalEdit&&(r.width={value:t.attr("width")?t.attr("width"):""}),e.openModalInsert(e.lang.insertImage,r,(function(n){return n.url!==o&&t.attr({src:n.url}),t.attr({alt:n.alt}),e.o.imageWidthModalEdit&&(parseInt(n.width)>0?t.attr({width:n.width}):t.removeAttr("width")),!0})),!1}},saveRange:function(){var e=this,t=e.doc.getSelection();if(e.range=null,t&&t.rangeCount){var n,a=e.range=t.getRangeAt(0),o=e.doc.createRange();o.selectNodeContents(e.$ed[0]),o.setEnd(a.startContainer,a.startOffset),n=(o+"").length,e.metaRange={start:n,end:n+(a+"").length}}},restoreRange:function(){var e,t=this,n=t.metaRange,a=t.range,o=t.doc.getSelection();if(a){if(n&&n.start!==n.end){var r,i=0,s=[t.$ed[0]],l=!1,d=!1;for(e=t.doc.createRange();!d&&(r=s.pop());)if(3===r.nodeType){var c=i+r.length;!l&&n.start>=i&&n.start<=c&&(e.setStart(r,n.start-i),l=!0),l&&n.end>=i&&n.end<=c&&(e.setEnd(r,n.end-i),d=!0),i=c}else for(var u=r.childNodes,g=u.length;g>0;)g-=1,s.push(u[g])}try{o.removeAllRanges()}catch(e){}o.addRange(e||a)}},getRangeText:function(){return this.range+""},clearButtonPaneStatus:function(){var e=this,t=e.o.prefix,n=t+"active-button "+t+"active",o=t+"original-icon";a("."+t+"active-button",e.$btnPane).removeClass(n),a("."+o,e.$btnPane).each((function(){a(this).find("svg use").attr("xlink:href",a(this).data(o))}))},updateButtonPaneStatus:function(){var e=this,t=e.o.prefix,n=t+"active-button "+t+"active",o=t+"original-icon",r=e.getTagsRecursive(e.doc.getSelection().focusNode);e.clearButtonPaneStatus(),a.each(r,(function(r,i){var s=e.tagToButton[i.toLowerCase()],l=a("."+t+s+"-button",e.$btnPane);if(l.length>0)l.addClass(n);else try{var d=(l=a("."+t+"dropdown ."+t+s+"-dropdown-button",e.$box)).find("svg use"),c=l.parent().data(t+"dropdown"),u=a("."+t+c+"-button",e.$box),g=u.find("svg use");u.addClass(n),e.o.changeActiveDropdownIcon&&d.length>0&&(u.addClass(o).data(o,g.attr("xlink:href")),g.attr("xlink:href",d.attr("xlink:href")))}catch(e){}}))},getTagsRecursive:function(e,t){var n=this;if(t=t||(e&&e.tagName?[e.tagName]:[]),!e||!e.parentNode)return t;var o=(e=e.parentNode).tagName;return"DIV"===o?t:("P"===o&&""!==e.style.textAlign&&t.push(e.style.textAlign),a.each(n.tagHandlers,(function(a,o){t=t.concat(o(e,n))})),t.push(o),n.getTagsRecursive(e,t).filter((function(e){return null!=e})))},initPlugins:function(){var e=this;e.loadedPlugins=[],a.each(a.trumbowyg.plugins,(function(t,n){n.shouldInit&&!n.shouldInit(e)||(n.init(e),n.tagHandler&&e.tagHandlers.push(n.tagHandler),e.loadedPlugins.push(n))}))},destroyPlugins:function(){var e=this;a.each(this.loadedPlugins,(function(t,n){n.destroy&&n.destroy(e)}))}}}(navigator,window,document,jQuery);
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/ui/icons.svg b/vasl_templates/webapp/static/trumbowyg/ui/icons.svg
new file mode 100644
index 0000000..81c475c
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/ui/icons.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/trumbowyg/ui/sass/trumbowyg.scss b/vasl_templates/webapp/static/trumbowyg/ui/sass/trumbowyg.scss
new file mode 100644
index 0000000..c10068c
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/ui/sass/trumbowyg.scss
@@ -0,0 +1,836 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Default stylesheet for Trumbowyg editor
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+$light-color: #ecf0f1 !default;
+$dark-color: #222 !default;
+
+$modal-submit-color: #2ecc71 !default;
+$modal-reset-color: #EEE !default;
+
+$transition-duration: 150ms !default;
+$slow-transition-duration: 300ms !default;
+
+$modal-label-width: 150px;
+
+#trumbowyg-icons {
+ overflow: hidden;
+ visibility: hidden;
+ height: 0;
+ width: 0;
+
+ svg {
+ height: 0;
+ width: 0;
+ }
+}
+
+.trumbowyg-box,
+.trumbowyg-modal {
+ *,
+ *::before,
+ *::after {
+ box-sizing: border-box;
+ }
+
+ svg {
+ width: 17px;
+ height: 100%;
+ fill: $dark-color;
+ }
+}
+
+.trumbowyg-box,
+.trumbowyg-editor {
+ display: block;
+ position: relative;
+ border: 1px solid #DDD;
+ width: 100%;
+ min-height: 300px;
+}
+
+.trumbowyg-box .trumbowyg-editor {
+ margin: 0 auto;
+}
+
+.trumbowyg-box.trumbowyg-fullscreen {
+ background: #FEFEFE;
+ border: none !important;
+}
+
+.trumbowyg-editor,
+.trumbowyg-textarea {
+ position: relative;
+ box-sizing: border-box;
+ padding: 20px;
+ min-height: 300px;
+ width: 100%;
+ border-style: none;
+ resize: none;
+ outline: none;
+ overflow: auto;
+ user-select: text; // Avoid issues on iOS
+
+ &.trumbowyg-autogrow-on-enter {
+ transition: height $slow-transition-duration ease-out;
+ }
+}
+
+.trumbowyg-box-blur .trumbowyg-editor {
+ *,
+ &::before {
+ color: transparent !important;
+ text-shadow: 0 0 7px #333;
+
+ @media screen and (min-width: 0 \0) {
+ color: rgba(200, 200, 200, 0.6) !important;
+ }
+ @supports (-ms-accelerator:true) {
+ color: rgba(200, 200, 200, 0.6) !important;
+ }
+ }
+ img,
+ hr {
+ opacity: 0.2;
+ }
+}
+
+.trumbowyg-textarea {
+ position: relative;
+ display: block;
+ overflow: auto;
+ border: none;
+ font-size: 14px;
+ font-family: "Inconsolata", "Consolas", "Courier", "Courier New", sans-serif;
+ line-height: 18px;
+}
+
+.trumbowyg-box.trumbowyg-editor-visible {
+ .trumbowyg-textarea {
+ height: 1px !important;
+ width: 25%;
+ min-height: 0 !important;
+ padding: 0 !important;
+ background: none;
+ opacity: 0 !important;
+ }
+}
+
+.trumbowyg-box.trumbowyg-editor-hidden {
+ .trumbowyg-textarea {
+ display: block;
+ margin-bottom: 1px;
+ }
+ .trumbowyg-editor {
+ display: none;
+ }
+}
+
+.trumbowyg-box.trumbowyg-disabled {
+ .trumbowyg-textarea {
+ opacity: 0.8;
+ background: none;
+ }
+}
+
+.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before {
+ content: attr(placeholder);
+ color: #999;
+ pointer-events: none;
+ white-space: break-spaces;
+}
+
+.trumbowyg-button-pane {
+ width: 100%;
+ min-height: 36px;
+ background: $light-color;
+ border-bottom: 1px solid darken($light-color, 7%);
+ margin: 0;
+ padding: 0 5px;
+ position: relative;
+ list-style-type: none;
+ line-height: 10px;
+ backface-visibility: hidden;
+ z-index: 11;
+
+ &::after {
+ content: " ";
+ display: block;
+ position: absolute;
+ top: 36px;
+ left: 0;
+ right: 0;
+ width: 100%;
+ height: 1px;
+ background: darken($light-color, 7%);
+ }
+
+ .trumbowyg-button-group {
+ display: inline-block;
+
+ .trumbowyg-fullscreen-button svg {
+ color: transparent;
+ }
+
+ &::after {
+ content: " ";
+ display: inline-block;
+ width: 1px;
+ background: darken($light-color, 7%);
+ margin: 0 5px;
+ height: 35px;
+ vertical-align: top;
+ }
+
+ &:last-child::after {
+ content: none;
+ }
+ }
+
+ button {
+ display: inline-block;
+ position: relative;
+ width: 35px;
+ height: 35px;
+ padding: 1px 6px !important;
+ margin-bottom: 1px;
+ overflow: hidden;
+ border: none;
+ cursor: pointer;
+ background: none;
+ vertical-align: middle;
+ transition: background-color $transition-duration, opacity $transition-duration;
+
+ &.trumbowyg-textual-button {
+ width: auto;
+ line-height: 35px;
+ user-select: none;
+ }
+ }
+
+ &.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),
+ button.trumbowyg-disable,
+ .trumbowyg-disabled & button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button) {
+ opacity: 0.2;
+ cursor: default;
+ pointer-events: none;
+ }
+ &.trumbowyg-disable,
+ .trumbowyg-disabled & {
+ .trumbowyg-button-group::before {
+ background: darken($light-color, 3%);
+ }
+ }
+
+ button:not(.trumbowyg-disable):hover,
+ button:not(.trumbowyg-disable):focus,
+ button.trumbowyg-active {
+ background-color: #FFF;
+ outline: none;
+ }
+
+ .trumbowyg-open-dropdown {
+ &::after {
+ display: block;
+ content: " ";
+ position: absolute;
+ top: 25px;
+ right: 3px;
+ height: 0;
+ width: 0;
+ border: 3px solid transparent;
+ border-top-color: #555;
+ }
+
+ &.trumbowyg-textual-button {
+ padding-left: 10px !important;
+ padding-right: 18px !important;
+
+ &::after {
+ top: 17px;
+ right: 7px;
+ }
+ }
+ }
+
+ .trumbowyg-right {
+ float: right;
+ }
+}
+
+.trumbowyg-dropdown {
+ max-width: 300px;
+ max-height: 250px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ white-space: nowrap;
+ border: 1px solid $light-color;
+ padding: 5px 0;
+ border-top: none;
+ background: #FFF;
+ margin-left: -1px;
+ box-shadow: rgba(0, 0, 0, .1) 0 2px 3px;
+ z-index: 12;
+
+ button {
+ display: block;
+ width: 100%;
+ height: 35px;
+ line-height: 35px;
+ text-decoration: none;
+ background: #FFF;
+ padding: 0 20px 0 10px;
+ color: #333 !important;
+ border: none;
+ cursor: pointer;
+ text-align: left;
+ font-size: 15px;
+ transition: all $transition-duration;
+
+ &:hover,
+ &:focus {
+ background: $light-color;
+ }
+
+ svg {
+ float: left;
+ margin-right: 14px;
+ }
+ }
+}
+
+/* Modal box */
+.trumbowyg-modal {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ max-width: 520px;
+ width: 100%;
+ height: 350px;
+ z-index: 12;
+ overflow: hidden;
+ backface-visibility: hidden;
+}
+
+.trumbowyg-modal-box {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ max-width: 500px;
+ width: calc(100% - 20px);
+ padding-bottom: 45px;
+ z-index: 1;
+ background-color: #FFF;
+ text-align: center;
+ font-size: 14px;
+ box-shadow: rgba(0, 0, 0, .2) 0 2px 3px;
+ backface-visibility: hidden;
+
+ .trumbowyg-modal-title {
+ font-size: 24px;
+ font-weight: bold;
+ margin: 0 0 20px;
+ padding: 15px 0 13px;
+ display: block;
+ border-bottom: 1px solid #EEE;
+ color: #333;
+ background: lighten($light-color, 5%);
+ }
+
+ .trumbowyg-progress {
+ width: 100%;
+ height: 3px;
+ position: absolute;
+ top: 58px;
+
+ .trumbowyg-progress-bar {
+ background: #2BC06A;
+ width: 0;
+ height: 100%;
+ transition: width $transition-duration linear;
+ }
+ }
+
+ .trumbowyg-input {
+ &-row {
+ position: relative;
+ margin: 15px 12px;
+ border: 1px solid #DEDEDE;
+ overflow: hidden;
+ }
+
+ &-infos {
+ text-align: left;
+ transition: all 150ms;
+ width: $modal-label-width;
+ border-right: 1px solid #DEDEDE;
+ padding: 0 7px;
+ background-color: lighten($light-color, 5%);
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+
+ label {
+ color: darken($light-color, 45%);
+ overflow: hidden;
+ height: 27px;
+ line-height: 27px;
+
+ &, span {
+ display: block;
+ height: 27px;
+ line-height: 27px;
+ transition: all $transition-duration;
+ }
+ }
+
+ .trumbowyg-msg-error {
+ color: #e74c3c;
+ }
+ }
+
+ &-html {
+ padding: 1px 1px 1px $modal-label-width + 2px;
+
+ &, input, textarea, select {
+ font-size: 14px;
+ }
+
+ input, textarea, select {
+ transition: all $transition-duration;
+ height: 27px;
+ line-height: 27px;
+ border:0;
+ width: 100%;
+ padding: 0 7px;
+
+ &:hover,
+ &:focus {
+ outline: 1px solid #95a5a6;
+ }
+ &:focus {
+ background: lighten($light-color, 5%);
+ }
+ }
+
+ input[type="checkbox"] {
+ width: 16px;
+ height: 16px;
+ padding: 0;
+ }
+
+ &-with-checkbox {
+ text-align: left;
+ padding: 3px 1px 1px 3px;
+ }
+ }
+
+ &-error {
+ input, select, textarea {
+ outline: 1px solid #e74c3c;
+ }
+
+ .trumbowyg-input-infos label span:first-child {
+ margin-top: -27px;
+ }
+ }
+ }
+
+ .error {
+ margin-top: 25px;
+ display: block;
+ color: red;
+ }
+
+ .trumbowyg-modal-button {
+ position: absolute;
+ bottom: 10px;
+ right: 0;
+ text-decoration: none;
+ color: #FFF;
+ display: block;
+ width: 100px;
+ height: 35px;
+ line-height: 33px;
+ margin: 0 10px;
+ background-color: #333;
+ border: none;
+ cursor: pointer;
+ font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif;
+ font-size: 16px;
+ transition: all $transition-duration;
+
+ &.trumbowyg-modal-submit {
+ right: 110px;
+ background: darken($modal-submit-color, 3%);
+
+ &:hover,
+ &:focus {
+ background: lighten($modal-submit-color, 5%);
+ outline: none;
+ }
+ &:active {
+ background: darken($modal-submit-color, 10%);
+ }
+ }
+
+ &.trumbowyg-modal-reset {
+ color: #555;
+ background: darken($modal-reset-color, 3%);
+
+ &:hover,
+ &:focus {
+ background: lighten($modal-reset-color, 5%);
+ outline: none;
+ }
+ &:active {
+ background: darken($modal-reset-color, 10%);
+ }
+ }
+ }
+}
+
+.trumbowyg-overlay {
+ position: absolute;
+ background-color: rgba(255, 255, 255, 0.5);
+ height: 100%;
+ width: 100%;
+ left: 0;
+ display: none;
+ top: 0;
+ z-index: 10;
+}
+
+/**
+ * Fullscreen
+ */
+body.trumbowyg-body-fullscreen {
+ overflow: hidden;
+}
+
+.trumbowyg-fullscreen {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ z-index: 99999;
+
+ &.trumbowyg-box,
+ .trumbowyg-editor {
+ border: none;
+ }
+ .trumbowyg-editor,
+ .trumbowyg-textarea {
+ height: calc(100% - 37px) !important;
+ overflow: auto;
+ }
+ .trumbowyg-overlay {
+ height: 100% !important;
+ }
+ .trumbowyg-button-group .trumbowyg-fullscreen-button svg {
+ color: $dark-color;
+ fill: transparent;
+ }
+}
+
+.trumbowyg-editor {
+ object,
+ embed,
+ video,
+ img {
+ max-width: 100%;
+ }
+ video,
+ img {
+ height: auto;
+ }
+ img {
+ cursor: move;
+ }
+ canvas:focus {
+ outline: none;
+ }
+
+ /*
+ * lset for resetCss option
+ */
+ &.trumbowyg-reset-css {
+ background: #FEFEFE !important;
+ font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif !important;
+ font-size: 14px !important;
+ line-height: 1.45em !important;
+ color: #333;
+
+ a {
+ color: #15c !important;
+ text-decoration: underline !important;
+ }
+
+ div,
+ p,
+ ul,
+ ol,
+ blockquote {
+ box-shadow: none !important;
+ background: none !important;
+ margin: 0 !important;
+ margin-bottom: 15px !important;
+ line-height: 1.4em !important;
+ font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif !important;
+ font-size: 14px !important;
+ border: none;
+ }
+ iframe,
+ object,
+ hr {
+ margin-bottom: 15px !important;
+ }
+ blockquote {
+ margin-left: 32px !important;
+ font-style: italic !important;
+ color: #555;
+ }
+ ul {
+ list-style: disc;
+ }
+ ol {
+ list-style: decimal;
+ }
+ ul,
+ ol {
+ padding-left: 20px !important;
+ }
+ ul ul,
+ ol ol,
+ ul ol,
+ ol ul {
+ border: none;
+ margin: 2px !important;
+ padding: 0 !important;
+ padding-left: 24px !important;
+ }
+ hr {
+ display: block;
+ height: 1px;
+ border: none;
+ border-top: 1px solid #CCC;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4 {
+ color: #111;
+ background: none;
+ margin: 0 !important;
+ padding: 0 !important;
+ font-weight: bold;
+ }
+
+ h1 {
+ font-size: 32px !important;
+ line-height: 38px !important;
+ margin-bottom: 20px !important;
+ }
+ h2 {
+ font-size: 26px !important;
+ line-height: 34px !important;
+ margin-bottom: 15px !important;
+ }
+ h3 {
+ font-size: 22px !important;
+ line-height: 28px !important;
+ margin-bottom: 7px !important;
+ }
+ h4 {
+ font-size: 16px !important;
+ line-height: 22px !important;
+ margin-bottom: 7px !important;
+ }
+ }
+}
+
+/*
+ * Dark theme
+ */
+.trumbowyg-dark {
+ .trumbowyg-textarea {
+ background: #111;
+ color: #ddd;
+ }
+ .trumbowyg-box {
+ border: 1px solid lighten($dark-color, 7%);
+
+ &.trumbowyg-fullscreen {
+ background: #111;
+ }
+ &.trumbowyg-box-blur .trumbowyg-editor {
+ *,
+ &::before {
+ text-shadow: 0 0 7px #ccc;
+
+ @media screen and (min-width: 0 \0
+ ) {
+ color: rgba(20, 20, 20, 0.6) !important;
+ }
+ @supports (-ms-accelerator:true) {
+ color: rgba(20, 20, 20, 0.6) !important;
+ }
+ }
+ }
+
+ svg {
+ fill: $light-color;
+ color: $light-color;
+ }
+ }
+ .trumbowyg-button-pane {
+ background-color: $dark-color;
+ border-bottom-color: lighten($dark-color, 7%);
+
+ &::after {
+ background: lighten($dark-color, 7%);
+ }
+
+ .trumbowyg-button-group:not(:empty) {
+ &::after {
+ background-color: lighten($dark-color, 7%);
+ }
+ .trumbowyg-fullscreen-button svg {
+ color: transparent;
+ }
+ }
+
+ &.trumbowyg-disable {
+ .trumbowyg-button-group::after {
+ background-color: lighten($dark-color, 3%);
+ }
+ }
+
+ button:not(.trumbowyg-disable):hover,
+ button:not(.trumbowyg-disable):focus,
+ button.trumbowyg-active {
+ background-color: #333;
+ }
+
+ .trumbowyg-open-dropdown::after {
+ border-top-color: #fff;
+ }
+ }
+ .trumbowyg-fullscreen {
+ .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg {
+ color: $light-color;
+ fill: transparent;
+ }
+ }
+
+ .trumbowyg-dropdown {
+ border-color: $dark-color;
+ background: #333;
+ box-shadow: rgba(0, 0, 0, .3) 0 2px 3px;
+
+ button {
+ background: #333;
+ color: #fff !important;
+
+ &:hover,
+ &:focus {
+ background: $dark-color;
+ }
+ }
+ }
+
+ // Modal box
+ .trumbowyg-modal-box {
+ background-color: $dark-color;
+
+ .trumbowyg-modal-title {
+ border-bottom: 1px solid #555;
+ color: #fff;
+ background: lighten($dark-color, 10%);
+ }
+
+ label {
+ display: block;
+ position: relative;
+ margin: 15px 12px;
+ height: 27px;
+ line-height: 27px;
+ overflow: hidden;
+
+ .trumbowyg-input-infos {
+ span {
+ color: #eee;
+ background-color: lighten($dark-color, 5%);
+ border-color: $dark-color;
+ }
+ span.trumbowyg-msg-error {
+ color: #e74c3c;
+ }
+ }
+
+ &.trumbowyg-input-error {
+ input,
+ textarea {
+ border-color: #e74c3c;
+ }
+ }
+
+ input {
+ border-color: $dark-color;
+ color: #eee;
+ background: #333;
+
+ &:hover,
+ &:focus {
+ border-color: lighten($dark-color, 25%);
+ }
+ &:focus {
+ background-color: lighten($dark-color, 5%);
+ }
+ }
+ }
+
+ .trumbowyg-modal-button {
+ &.trumbowyg-modal-submit {
+ background: darken($modal-submit-color, 20%);
+
+ &:hover,
+ &:focus {
+ background: darken($modal-submit-color, 10%);
+ }
+ &:active {
+ background: darken($modal-submit-color, 25%);
+ }
+ }
+ &.trumbowyg-modal-reset {
+ background: #333;
+ color: #ccc;
+
+ &:hover,
+ &:focus {
+ background: #444;
+ }
+ &:active {
+ background: #111;
+ }
+ }
+ }
+ }
+ .trumbowyg-overlay {
+ background-color: rgba(15, 15, 15, 0.6);
+ }
+}
diff --git a/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.css b/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.css
new file mode 100644
index 0000000..9818922
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.css
@@ -0,0 +1,640 @@
+/**
+ * Trumbowyg v2.25.2 - A lightweight WYSIWYG editor
+ * Default stylesheet for Trumbowyg editor
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+#trumbowyg-icons {
+ overflow: hidden;
+ visibility: hidden;
+ height: 0;
+ width: 0; }
+ #trumbowyg-icons svg {
+ height: 0;
+ width: 0; }
+
+.trumbowyg-box *,
+.trumbowyg-box *::before,
+.trumbowyg-box *::after,
+.trumbowyg-modal *,
+.trumbowyg-modal *::before,
+.trumbowyg-modal *::after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box; }
+
+.trumbowyg-box svg,
+.trumbowyg-modal svg {
+ width: 17px;
+ height: 100%;
+ fill: #222; }
+
+.trumbowyg-box,
+.trumbowyg-editor {
+ display: block;
+ position: relative;
+ border: 1px solid #DDD;
+ width: 100%;
+ min-height: 300px; }
+
+.trumbowyg-box .trumbowyg-editor {
+ margin: 0 auto; }
+
+.trumbowyg-box.trumbowyg-fullscreen {
+ background: #FEFEFE;
+ border: none !important; }
+
+.trumbowyg-editor,
+.trumbowyg-textarea {
+ position: relative;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 20px;
+ min-height: 300px;
+ width: 100%;
+ border-style: none;
+ resize: none;
+ outline: none;
+ overflow: auto;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text; }
+ .trumbowyg-editor.trumbowyg-autogrow-on-enter,
+ .trumbowyg-textarea.trumbowyg-autogrow-on-enter {
+ -webkit-transition: height 300ms ease-out;
+ -o-transition: height 300ms ease-out;
+ transition: height 300ms ease-out; }
+
+.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before {
+ color: transparent !important;
+ text-shadow: 0 0 7px #333; }
+ @media screen and (min-width: 0 \0) {
+ .trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before {
+ color: rgba(200, 200, 200, 0.6) !important; } }
+ @supports (-ms-accelerator: true) {
+ .trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before {
+ color: rgba(200, 200, 200, 0.6) !important; } }
+
+.trumbowyg-box-blur .trumbowyg-editor img,
+.trumbowyg-box-blur .trumbowyg-editor hr {
+ opacity: 0.2; }
+
+.trumbowyg-textarea {
+ position: relative;
+ display: block;
+ overflow: auto;
+ border: none;
+ font-size: 14px;
+ font-family: "Inconsolata", "Consolas", "Courier", "Courier New", sans-serif;
+ line-height: 18px; }
+
+.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea {
+ height: 1px !important;
+ width: 25%;
+ min-height: 0 !important;
+ padding: 0 !important;
+ background: none;
+ opacity: 0 !important; }
+
+.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea {
+ display: block;
+ margin-bottom: 1px; }
+
+.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor {
+ display: none; }
+
+.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea {
+ opacity: 0.8;
+ background: none; }
+
+.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before {
+ content: attr(placeholder);
+ color: #999;
+ pointer-events: none;
+ white-space: break-spaces; }
+
+.trumbowyg-button-pane {
+ width: 100%;
+ min-height: 36px;
+ background: #ecf0f1;
+ border-bottom: 1px solid #d7e0e2;
+ margin: 0;
+ padding: 0 5px;
+ position: relative;
+ list-style-type: none;
+ line-height: 10px;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ z-index: 11; }
+ .trumbowyg-button-pane::after {
+ content: " ";
+ display: block;
+ position: absolute;
+ top: 36px;
+ left: 0;
+ right: 0;
+ width: 100%;
+ height: 1px;
+ background: #d7e0e2; }
+ .trumbowyg-button-pane .trumbowyg-button-group {
+ display: inline-block; }
+ .trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg {
+ color: transparent; }
+ .trumbowyg-button-pane .trumbowyg-button-group::after {
+ content: " ";
+ display: inline-block;
+ width: 1px;
+ background: #d7e0e2;
+ margin: 0 5px;
+ height: 35px;
+ vertical-align: top; }
+ .trumbowyg-button-pane .trumbowyg-button-group:last-child::after {
+ content: none; }
+ .trumbowyg-button-pane button {
+ display: inline-block;
+ position: relative;
+ width: 35px;
+ height: 35px;
+ padding: 1px 6px !important;
+ margin-bottom: 1px;
+ overflow: hidden;
+ border: none;
+ cursor: pointer;
+ background: none;
+ vertical-align: middle;
+ -webkit-transition: background-color 150ms, opacity 150ms;
+ -o-transition: background-color 150ms, opacity 150ms;
+ transition: background-color 150ms, opacity 150ms; }
+ .trumbowyg-button-pane button.trumbowyg-textual-button {
+ width: auto;
+ line-height: 35px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+ .trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),
+ .trumbowyg-button-pane button.trumbowyg-disable,
+ .trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button) {
+ opacity: 0.2;
+ cursor: default;
+ pointer-events: none; }
+ .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,
+ .trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before {
+ background: #e3e9eb; }
+ .trumbowyg-button-pane button:not(.trumbowyg-disable):hover,
+ .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,
+ .trumbowyg-button-pane button.trumbowyg-active {
+ background-color: #FFF;
+ outline: none; }
+ .trumbowyg-button-pane .trumbowyg-open-dropdown::after {
+ display: block;
+ content: " ";
+ position: absolute;
+ top: 25px;
+ right: 3px;
+ height: 0;
+ width: 0;
+ border: 3px solid transparent;
+ border-top-color: #555; }
+ .trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button {
+ padding-left: 10px !important;
+ padding-right: 18px !important; }
+ .trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after {
+ top: 17px;
+ right: 7px; }
+ .trumbowyg-button-pane .trumbowyg-right {
+ float: right; }
+
+.trumbowyg-dropdown {
+ max-width: 300px;
+ max-height: 250px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ white-space: nowrap;
+ border: 1px solid #ecf0f1;
+ padding: 5px 0;
+ border-top: none;
+ background: #FFF;
+ margin-left: -1px;
+ -webkit-box-shadow: rgba(0, 0, 0, 0.1) 0 2px 3px;
+ box-shadow: rgba(0, 0, 0, 0.1) 0 2px 3px;
+ z-index: 12; }
+ .trumbowyg-dropdown button {
+ display: block;
+ width: 100%;
+ height: 35px;
+ line-height: 35px;
+ text-decoration: none;
+ background: #FFF;
+ padding: 0 20px 0 10px;
+ color: #333 !important;
+ border: none;
+ cursor: pointer;
+ text-align: left;
+ font-size: 15px;
+ -webkit-transition: all 150ms;
+ -o-transition: all 150ms;
+ transition: all 150ms; }
+ .trumbowyg-dropdown button:hover, .trumbowyg-dropdown button:focus {
+ background: #ecf0f1; }
+ .trumbowyg-dropdown button svg {
+ float: left;
+ margin-right: 14px; }
+
+/* Modal box */
+.trumbowyg-modal {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ -ms-transform: translateX(-50%);
+ -o-transform: translateX(-50%);
+ transform: translateX(-50%);
+ max-width: 520px;
+ width: 100%;
+ height: 350px;
+ z-index: 12;
+ overflow: hidden;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden; }
+
+.trumbowyg-modal-box {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ -ms-transform: translateX(-50%);
+ -o-transform: translateX(-50%);
+ transform: translateX(-50%);
+ max-width: 500px;
+ width: calc(100% - 20px);
+ padding-bottom: 45px;
+ z-index: 1;
+ background-color: #FFF;
+ text-align: center;
+ font-size: 14px;
+ -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 2px 3px;
+ box-shadow: rgba(0, 0, 0, 0.2) 0 2px 3px;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden; }
+ .trumbowyg-modal-box .trumbowyg-modal-title {
+ font-size: 24px;
+ font-weight: bold;
+ margin: 0 0 20px;
+ padding: 15px 0 13px;
+ display: block;
+ border-bottom: 1px solid #EEE;
+ color: #333;
+ background: #fbfcfc; }
+ .trumbowyg-modal-box .trumbowyg-progress {
+ width: 100%;
+ height: 3px;
+ position: absolute;
+ top: 58px; }
+ .trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar {
+ background: #2BC06A;
+ width: 0;
+ height: 100%;
+ -webkit-transition: width 150ms linear;
+ -o-transition: width 150ms linear;
+ transition: width 150ms linear; }
+ .trumbowyg-modal-box .trumbowyg-input-row {
+ position: relative;
+ margin: 15px 12px;
+ border: 1px solid #DEDEDE;
+ overflow: hidden; }
+ .trumbowyg-modal-box .trumbowyg-input-infos {
+ text-align: left;
+ -webkit-transition: all 150ms;
+ -o-transition: all 150ms;
+ transition: all 150ms;
+ width: 150px;
+ border-right: 1px solid #DEDEDE;
+ padding: 0 7px;
+ background-color: #fbfcfc;
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0; }
+ .trumbowyg-modal-box .trumbowyg-input-infos label {
+ color: #69878f;
+ overflow: hidden;
+ height: 27px;
+ line-height: 27px; }
+ .trumbowyg-modal-box .trumbowyg-input-infos label, .trumbowyg-modal-box .trumbowyg-input-infos label span {
+ display: block;
+ height: 27px;
+ line-height: 27px;
+ -webkit-transition: all 150ms;
+ -o-transition: all 150ms;
+ transition: all 150ms; }
+ .trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error {
+ color: #e74c3c; }
+ .trumbowyg-modal-box .trumbowyg-input-html {
+ padding: 1px 1px 1px 152px; }
+ .trumbowyg-modal-box .trumbowyg-input-html, .trumbowyg-modal-box .trumbowyg-input-html input, .trumbowyg-modal-box .trumbowyg-input-html textarea, .trumbowyg-modal-box .trumbowyg-input-html select {
+ font-size: 14px; }
+ .trumbowyg-modal-box .trumbowyg-input-html input, .trumbowyg-modal-box .trumbowyg-input-html textarea, .trumbowyg-modal-box .trumbowyg-input-html select {
+ -webkit-transition: all 150ms;
+ -o-transition: all 150ms;
+ transition: all 150ms;
+ height: 27px;
+ line-height: 27px;
+ border: 0;
+ width: 100%;
+ padding: 0 7px; }
+ .trumbowyg-modal-box .trumbowyg-input-html input:hover, .trumbowyg-modal-box .trumbowyg-input-html input:focus, .trumbowyg-modal-box .trumbowyg-input-html textarea:hover, .trumbowyg-modal-box .trumbowyg-input-html textarea:focus, .trumbowyg-modal-box .trumbowyg-input-html select:hover, .trumbowyg-modal-box .trumbowyg-input-html select:focus {
+ outline: 1px solid #95a5a6; }
+ .trumbowyg-modal-box .trumbowyg-input-html input:focus, .trumbowyg-modal-box .trumbowyg-input-html textarea:focus, .trumbowyg-modal-box .trumbowyg-input-html select:focus {
+ background: #fbfcfc; }
+ .trumbowyg-modal-box .trumbowyg-input-html input[type="checkbox"] {
+ width: 16px;
+ height: 16px;
+ padding: 0; }
+ .trumbowyg-modal-box .trumbowyg-input-html-with-checkbox {
+ text-align: left;
+ padding: 3px 1px 1px 3px; }
+ .trumbowyg-modal-box .trumbowyg-input-error input, .trumbowyg-modal-box .trumbowyg-input-error select, .trumbowyg-modal-box .trumbowyg-input-error textarea {
+ outline: 1px solid #e74c3c; }
+ .trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child {
+ margin-top: -27px; }
+ .trumbowyg-modal-box .error {
+ margin-top: 25px;
+ display: block;
+ color: red; }
+ .trumbowyg-modal-box .trumbowyg-modal-button {
+ position: absolute;
+ bottom: 10px;
+ right: 0;
+ text-decoration: none;
+ color: #FFF;
+ display: block;
+ width: 100px;
+ height: 35px;
+ line-height: 33px;
+ margin: 0 10px;
+ background-color: #333;
+ border: none;
+ cursor: pointer;
+ font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif;
+ font-size: 16px;
+ -webkit-transition: all 150ms;
+ -o-transition: all 150ms;
+ transition: all 150ms; }
+ .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit {
+ right: 110px;
+ background: #2bc06a; }
+ .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover, .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus {
+ background: #40d47e;
+ outline: none; }
+ .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active {
+ background: #25a25a; }
+ .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset {
+ color: #555;
+ background: #e6e6e6; }
+ .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover, .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus {
+ background: #fbfbfb;
+ outline: none; }
+ .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active {
+ background: #d5d5d5; }
+
+.trumbowyg-overlay {
+ position: absolute;
+ background-color: rgba(255, 255, 255, 0.5);
+ height: 100%;
+ width: 100%;
+ left: 0;
+ display: none;
+ top: 0;
+ z-index: 10; }
+
+/**
+ * Fullscreen
+ */
+body.trumbowyg-body-fullscreen {
+ overflow: hidden; }
+
+.trumbowyg-fullscreen {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ z-index: 99999; }
+ .trumbowyg-fullscreen.trumbowyg-box,
+ .trumbowyg-fullscreen .trumbowyg-editor {
+ border: none; }
+ .trumbowyg-fullscreen .trumbowyg-editor,
+ .trumbowyg-fullscreen .trumbowyg-textarea {
+ height: calc(100% - 37px) !important;
+ overflow: auto; }
+ .trumbowyg-fullscreen .trumbowyg-overlay {
+ height: 100% !important; }
+ .trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg {
+ color: #222;
+ fill: transparent; }
+
+.trumbowyg-editor {
+ /*
+ * lset for resetCss option
+ */ }
+ .trumbowyg-editor object,
+ .trumbowyg-editor embed,
+ .trumbowyg-editor video,
+ .trumbowyg-editor img {
+ max-width: 100%; }
+ .trumbowyg-editor video,
+ .trumbowyg-editor img {
+ height: auto; }
+ .trumbowyg-editor img {
+ cursor: move; }
+ .trumbowyg-editor canvas:focus {
+ outline: none; }
+ .trumbowyg-editor.trumbowyg-reset-css {
+ background: #FEFEFE !important;
+ font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif !important;
+ font-size: 14px !important;
+ line-height: 1.45em !important;
+ color: #333; }
+ .trumbowyg-editor.trumbowyg-reset-css a {
+ color: #15c !important;
+ text-decoration: underline !important; }
+ .trumbowyg-editor.trumbowyg-reset-css div,
+ .trumbowyg-editor.trumbowyg-reset-css p,
+ .trumbowyg-editor.trumbowyg-reset-css ul,
+ .trumbowyg-editor.trumbowyg-reset-css ol,
+ .trumbowyg-editor.trumbowyg-reset-css blockquote {
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+ background: none !important;
+ margin: 0 !important;
+ margin-bottom: 15px !important;
+ line-height: 1.4em !important;
+ font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif !important;
+ font-size: 14px !important;
+ border: none; }
+ .trumbowyg-editor.trumbowyg-reset-css iframe,
+ .trumbowyg-editor.trumbowyg-reset-css object,
+ .trumbowyg-editor.trumbowyg-reset-css hr {
+ margin-bottom: 15px !important; }
+ .trumbowyg-editor.trumbowyg-reset-css blockquote {
+ margin-left: 32px !important;
+ font-style: italic !important;
+ color: #555; }
+ .trumbowyg-editor.trumbowyg-reset-css ul {
+ list-style: disc; }
+ .trumbowyg-editor.trumbowyg-reset-css ol {
+ list-style: decimal; }
+ .trumbowyg-editor.trumbowyg-reset-css ul,
+ .trumbowyg-editor.trumbowyg-reset-css ol {
+ padding-left: 20px !important; }
+ .trumbowyg-editor.trumbowyg-reset-css ul ul,
+ .trumbowyg-editor.trumbowyg-reset-css ol ol,
+ .trumbowyg-editor.trumbowyg-reset-css ul ol,
+ .trumbowyg-editor.trumbowyg-reset-css ol ul {
+ border: none;
+ margin: 2px !important;
+ padding: 0 !important;
+ padding-left: 24px !important; }
+ .trumbowyg-editor.trumbowyg-reset-css hr {
+ display: block;
+ height: 1px;
+ border: none;
+ border-top: 1px solid #CCC; }
+ .trumbowyg-editor.trumbowyg-reset-css h1,
+ .trumbowyg-editor.trumbowyg-reset-css h2,
+ .trumbowyg-editor.trumbowyg-reset-css h3,
+ .trumbowyg-editor.trumbowyg-reset-css h4 {
+ color: #111;
+ background: none;
+ margin: 0 !important;
+ padding: 0 !important;
+ font-weight: bold; }
+ .trumbowyg-editor.trumbowyg-reset-css h1 {
+ font-size: 32px !important;
+ line-height: 38px !important;
+ margin-bottom: 20px !important; }
+ .trumbowyg-editor.trumbowyg-reset-css h2 {
+ font-size: 26px !important;
+ line-height: 34px !important;
+ margin-bottom: 15px !important; }
+ .trumbowyg-editor.trumbowyg-reset-css h3 {
+ font-size: 22px !important;
+ line-height: 28px !important;
+ margin-bottom: 7px !important; }
+ .trumbowyg-editor.trumbowyg-reset-css h4 {
+ font-size: 16px !important;
+ line-height: 22px !important;
+ margin-bottom: 7px !important; }
+
+/*
+ * Dark theme
+ */
+.trumbowyg-dark .trumbowyg-textarea {
+ background: #111;
+ color: #ddd; }
+
+.trumbowyg-dark .trumbowyg-box {
+ border: 1px solid #343434; }
+ .trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen {
+ background: #111; }
+ .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before {
+ text-shadow: 0 0 7px #ccc; }
+ @media screen and (min-width: 0 \0 ) {
+ .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before {
+ color: rgba(20, 20, 20, 0.6) !important; } }
+ @supports (-ms-accelerator: true) {
+ .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before {
+ color: rgba(20, 20, 20, 0.6) !important; } }
+ .trumbowyg-dark .trumbowyg-box svg {
+ fill: #ecf0f1;
+ color: #ecf0f1; }
+
+.trumbowyg-dark .trumbowyg-button-pane {
+ background-color: #222;
+ border-bottom-color: #343434; }
+ .trumbowyg-dark .trumbowyg-button-pane::after {
+ background: #343434; }
+ .trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after {
+ background-color: #343434; }
+ .trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg {
+ color: transparent; }
+ .trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after {
+ background-color: #2a2a2a; }
+ .trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover,
+ .trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,
+ .trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active {
+ background-color: #333; }
+ .trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after {
+ border-top-color: #fff; }
+
+.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg {
+ color: #ecf0f1;
+ fill: transparent; }
+
+.trumbowyg-dark .trumbowyg-dropdown {
+ border-color: #222;
+ background: #333;
+ -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 2px 3px;
+ box-shadow: rgba(0, 0, 0, 0.3) 0 2px 3px; }
+ .trumbowyg-dark .trumbowyg-dropdown button {
+ background: #333;
+ color: #fff !important; }
+ .trumbowyg-dark .trumbowyg-dropdown button:hover, .trumbowyg-dark .trumbowyg-dropdown button:focus {
+ background: #222; }
+
+.trumbowyg-dark .trumbowyg-modal-box {
+ background-color: #222; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title {
+ border-bottom: 1px solid #555;
+ color: #fff;
+ background: #3c3c3c; }
+ .trumbowyg-dark .trumbowyg-modal-box label {
+ display: block;
+ position: relative;
+ margin: 15px 12px;
+ height: 27px;
+ line-height: 27px;
+ overflow: hidden; }
+ .trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span {
+ color: #eee;
+ background-color: #2f2f2f;
+ border-color: #222; }
+ .trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error {
+ color: #e74c3c; }
+ .trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,
+ .trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea {
+ border-color: #e74c3c; }
+ .trumbowyg-dark .trumbowyg-modal-box label input {
+ border-color: #222;
+ color: #eee;
+ background: #333; }
+ .trumbowyg-dark .trumbowyg-modal-box label input:hover, .trumbowyg-dark .trumbowyg-modal-box label input:focus {
+ border-color: #626262; }
+ .trumbowyg-dark .trumbowyg-modal-box label input:focus {
+ background-color: #2f2f2f; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit {
+ background: #1b7943; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover, .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus {
+ background: #25a25a; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active {
+ background: #176437; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset {
+ background: #333;
+ color: #ccc; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover, .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus {
+ background: #444; }
+ .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active {
+ background: #111; }
+
+.trumbowyg-dark .trumbowyg-overlay {
+ background-color: rgba(15, 15, 15, 0.6); }
diff --git a/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.min.css b/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.min.css
new file mode 100644
index 0000000..2b1fbd1
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.min.css
@@ -0,0 +1,3 @@
+/** Trumbowyg v2.25.2 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
+#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}#trumbowyg-icons{overflow:hidden;visibility:hidden}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before,.trumbowyg-modal *,.trumbowyg-modal ::after,.trumbowyg-modal ::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.trumbowyg-box svg,.trumbowyg-modal svg{width:17px;height:100%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:20px;min-height:300px;width:100%;border-style:none;resize:none;outline:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.trumbowyg-editor.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{-webkit-transition:height .3s ease-out;-o-transition:height .3s ease-out;transition:height .3s ease-out}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;font-size:14px;font-family:Inconsolata,Consolas,Courier,"Courier New",sans-serif;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:11}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;vertical-align:middle;-webkit-transition:background-color 150ms,opacity 150ms;-o-transition:background-color 150ms,opacity 150ms;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane button.trumbowyg-disable,.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default;pointer-events:none}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#FFF;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:25px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{float:right}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;margin-left:-1px;-webkit-box-shadow:rgba(0,0,0,.1) 0 2px 3px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:12}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#FFF;padding:0 20px 0 10px;color:#333!important;border:none;cursor:pointer;text-align:left;font-size:15px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;z-index:12;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#FFF;text-align:center;font-size:14px;-webkit-box-shadow:rgba(0,0,0,.2) 0 2px 3px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #EEE;color:#333;background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2BC06A;width:0;height:100%;-webkit-transition:width 150ms linear;-o-transition:width 150ms linear;transition:width 150ms linear}.trumbowyg-modal-box .trumbowyg-input-row{position:relative;margin:15px 12px;border:1px solid #DEDEDE;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos{text-align:left;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;width:150px;border-right:1px solid #DEDEDE;padding:0 7px;background-color:#fbfcfc;position:absolute;left:0;top:0;bottom:0}.trumbowyg-modal-box .trumbowyg-input-infos label{color:#69878f;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos label,.trumbowyg-modal-box .trumbowyg-input-infos label span{display:block;height:27px;line-height:27px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box .trumbowyg-input-html{padding:1px 1px 1px 152px}.trumbowyg-modal-box .trumbowyg-input-html,.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{font-size:14px}.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;height:27px;line-height:27px;border:0;width:100%;padding:0 7px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html input:hover,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html select:hover,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:hover{outline:#95a5a6 solid 1px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus{background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox]{width:16px;height:16px;padding:0}.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox{text-align:left;padding:3px 1px 1px 3px}.trumbowyg-modal-box .trumbowyg-input-error input,.trumbowyg-modal-box .trumbowyg-input-error select,.trumbowyg-modal-box .trumbowyg-input-error textarea{outline:#e74c3c solid 1px}.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child{margin-top:-27px}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#FFF;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video{max-width:100%}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor img{cursor:move}.trumbowyg-editor canvas:focus{outline:0}.trumbowyg-editor.trumbowyg-reset-css{background:#FEFEFE!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;color:#333}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;margin:0 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111;background:0 0;margin:0!important;padding:0!important;font-weight:700}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#111;color:#ddd}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#222;background:#333;-webkit-box-shadow:rgba(0,0,0,.3) 0 2px 3px;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)}
+/*# sourceMappingURL=trumbowyg.min.css.map */
diff --git a/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.min.css.map b/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.min.css.map
new file mode 100644
index 0000000..58857a7
--- /dev/null
+++ b/vasl_templates/webapp/static/trumbowyg/ui/trumbowyg.min.css.map
@@ -0,0 +1,2 @@
+/** Trumbowyg v2.25.2 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
+{"version":3,"sources":["trumbowyg.css","trumbowyg.min.css"],"names":[],"mappings":"AAAA,iBAKE,qBACE,OAAA,EACA,MAAA,EAPJ,iBACE,SAAA,OACA,WAAA,OAOF,iBCaA,uBADA,wBAEA,mBAEA,yBADA,0BDTE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WAEF,mBCcA,qBDZE,MAAA,KACA,OAAA,KACA,KAAA,KAEF,eCcA,kBDZE,QAAA,MACA,SAAA,SACA,OAAA,IAAA,MAAA,KACA,MAAA,KACA,WAAA,MAEF,iCACE,OAAA,EAAA,KAEF,oCACE,WAAA,QACA,sBAEF,kBCcA,oBDZE,SAAA,SACA,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,KACA,WAAA,MACA,MAAA,KACA,aAAA,KACA,OAAA,KACA,QAAA,EACA,SAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,8CCmBA,gDDjBE,mBAAA,OAAA,IAAA,SAAA,cAAA,OAAA,IAAA,SAAA,WAAA,OAAA,IAAA,SAEJ,wCAAA,8CACE,MAAA,sBACA,YAAA,EAAA,EAAA,IAAA,KACA,mCACE,wCAAA,8CACE,MAAA,gCACJ,iCACE,wCAAA,8CACE,MAAA,gCCuBN,yCDrBA,0CAEE,QAAA,GAEF,oBACE,SAAA,SACA,QAAA,MACA,SAAA,KACA,YACA,UAAA,KACA,YAAA,YAAA,SAAA,QAAA,cAAA,WACA,YAAA,KAEF,4DACE,OAAA,cACA,MAAA,IACA,WAAA,YACA,QAAA,YACA,eACA,QAAA,YAEF,2DACE,QAAA,MACA,cAAA,IAEF,yDACE,QAAA,KAEF,sDACE,QAAA,GACA,eAEF,kEACE,QAAA,kBACA,MAAA,KACA,eAAA,KACA,YAAA,aAEF,uBACE,MAAA,KACA,WAAA,KACA,WAAA,QACA,cAAA,IAAA,MAAA,QACA,OAAA,EACA,QAAA,EAAA,IACA,SAAA,SACA,gBAAA,KACA,YAAA,KACA,4BAAA,OAAA,oBAAA,OACA,QAAA,GACA,8BACE,QAAA,IACA,QAAA,MACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,MAAA,EACA,MAAA,KACA,OAAA,IACA,WAAA,QACF,+CACE,QAAA,aACA,gFACE,MAAA,YACF,sDACE,QAAA,IACA,QAAA,aACA,MAAA,IACA,WAAA,QACA,OAAA,EAAA,IACA,OAAA,KACA,eAAA,IACF,iEACE,QAAA,KACJ,8BACE,QAAA,aACA,SAAA,SACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,cACA,cAAA,IACA,SAAA,OACA,YACA,OAAA,QACA,eACA,eAAA,OACA,mBAAA,iBAAA,MAAA,QAAA,MAAA,cAAA,iBAAA,MAAA,QAAA,MAAA,WAAA,iBAAA,MAAA,QAAA,MACA,uDACE,MAAA,KACA,YAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KC4BJ,gDD3BA,mGC4BA,8GDzBE,QAAA,GACA,OAAA,QACA,eAAA,KACF,yEC2BA,2EDzBE,WAAA,QC6BF,+CADA,4DD3BA,4DAGE,iBAAA,KACA,QAAA,EACF,uDACE,QAAA,MACA,QAAA,IACA,SAAA,SACA,IAAA,KACA,MAAA,IACA,OAAA,EACA,MAAA,EACA,OAAA,IAAA,MAAA,YACA,iBAAA,KACF,yEACE,aAAA,eACA,cAAA,eACA,gFACE,IAAA,KACA,MAAA,IACJ,wCACE,MAAA,MAEJ,oBACE,UAAA,MACA,WAAA,MACA,WAAA,KACA,WAAA,OACA,YAAA,OACA,OAAA,IAAA,MAAA,QACA,QAAA,IAAA,EACA,WAAA,KACA,WAAA,KACA,YAAA,KACA,mBAAA,eAAA,EAAA,IAAA,IAAA,WAAA,eAAA,EAAA,IAAA,IACA,QAAA,GACA,2BACE,QAAA,MACA,MAAA,KACA,OAAA,KACA,YAAA,KACA,gBAAA,KACA,WAAA,KACA,QAAA,EAAA,KAAA,EAAA,KACA,MAAA,eACA,YACA,OAAA,QACA,WAAA,KACA,UAAA,KACA,mBAAA,IAAA,MAAA,cAAA,IAAA,MAAA,WAAA,IAAA,MACA,iCAAA,iCACE,WAAA,QACF,+BACE,MAAA,KACA,aAAA,KAGN,iBACE,SAAA,SACA,IAAA,EACA,KAAA,IACA,kBAAA,iBAAA,cAAA,iBAAA,aAAA,iBAAA,UAAA,iBACA,UAAA,MACA,MAAA,KACA,OAAA,MACA,QAAA,GACA,SAAA,OACA,4BAAA,OAAA,oBAAA,OAEF,qBACE,SAAA,SACA,IAAA,EACA,KAAA,IACA,kBAAA,iBAAA,cAAA,iBAAA,aAAA,iBAAA,UAAA,iBACA,UAAA,MACA,MAAA,kBACA,eAAA,KACA,QAAA,EACA,iBAAA,KACA,WAAA,OACA,UAAA,KACA,mBAAA,eAAA,EAAA,IAAA,IAAA,WAAA,eAAA,EAAA,IAAA,IACA,4BAAA,OAAA,oBAAA,OACA,4CACE,UAAA,KACA,YAAA,IACA,OAAA,EAAA,EAAA,KACA,QAAA,KAAA,EAAA,KACA,QAAA,MACA,cAAA,IAAA,MAAA,KACA,MAAA,KACA,WAAA,QACF,yCACE,MAAA,KACA,OAAA,IACA,SAAA,SACA,IAAA,KACA,iEACE,WAAA,QACA,MAAA,EACA,OAAA,KACA,mBAAA,MAAA,MAAA,OAAA,cAAA,MAAA,MAAA,OAAA,WAAA,MAAA,MAAA,OACJ,0CACE,SAAA,SACA,OAAA,KAAA,KACA,OAAA,IAAA,MAAA,QACA,SAAA,OACF,4CACE,WAAA,KACA,mBAAA,IAAA,MAAA,cAAA,IAAA,MAAA,WAAA,IAAA,MACA,MAAA,MACA,aAAA,IAAA,MAAA,QACA,QAAA,EAAA,IACA,iBAAA,QACA,SAAA,SACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,kDACE,MAAA,QACA,SAAA,OAGA,kDAAA,uDACE,QAAA,MACA,OAAA,KACA,YAAA,KACA,mBAAA,IAAA,MAAA,cAAA,IAAA,MAAA,WAAA,IAAA,MACJ,iEACE,MAAA,QACJ,2CACE,QAAA,IAAA,IAAA,IAAA,MACA,2CAAA,iDAAA,kDAAA,oDACE,UAAA,KACF,iDAAA,kDAAA,oDACE,mBAAA,IAAA,MAAA,cAAA,IAAA,MAAA,WAAA,IAAA,MACA,OAAA,KACA,YAAA,KACA,OAAA,EACA,MAAA,KACA,QAAA,EAAA,IACA,uDAAA,uDAAA,wDAAA,wDAAA,0DAAA,0DACE,QAAA,QAAA,MAAA,IACF,uDAAA,wDAAA,0DACE,WAAA,QACJ,gEACE,MAAA,KACA,OAAA,KACA,QAAA,EACF,yDACE,WAAA,KACA,QAAA,IAAA,IAAA,IAAA,IACJ,kDAAA,mDAAA,qDACE,QAAA,QAAA,MAAA,IACF,0FACE,WAAA,MACF,4BACE,WAAA,KACA,QAAA,MACA,MAAA,IACF,6CACE,SAAA,SACA,OAAA,KACA,MAAA,EACA,gBAAA,KACA,MAAA,KACA,QAAA,MACA,MAAA,MACA,OAAA,KACA,YAAA,KACA,OAAA,EAAA,KACA,iBAAA,KACA,YACA,OAAA,QACA,YAAA,eAAA,UAAA,QAAA,WACA,UAAA,KACA,mBAAA,IAAA,MAAA,cAAA,IAAA,MAAA,WAAA,IAAA,MACA,oEACE,MAAA,MACA,WAAA,QACA,0EAAA,0EACE,WAAA,QACA,QAAA,EACF,2EACE,WAAA,QACJ,mEACE,MAAA,KACA,WAAA,QACA,yEAAA,yEACE,WAAA,QACA,QAAA,EACF,0EACE,WAAA,QAER,mBACE,SAAA,SACA,iBAAA,qBACA,OAAA,KACA,MAAA,KACA,KAAA,EACA,QAAA,KACA,IAAA,EACA,QAAA,GAKF,+BACE,SAAA,OAEF,sBACE,SAAA,MACA,IAAA,EACA,KAAA,EACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,QAAA,EACA,QAAA,MCkDA,wCDjDA,oCAEE,YACF,wCCiDA,0CD/CE,OAAA,4BACA,SAAA,KACF,yCACE,OAAA,eACF,+EACE,MAAA,KACA,KAAA,YCuDF,wBAEA,sBDnDA,yBCkDA,wBD9CE,UAAA,KCkDF,sBDjDA,wBAEE,OAAA,KACF,sBACE,OAAA,KACF,+BACE,QAAA,EACF,sCACE,WAAA,kBACA,YAAA,eAAA,UAAA,QAAA,qBACA,UAAA,eACA,YAAA,iBACA,MAAA,KACA,wCACE,MAAA,eACA,gBAAA,oBCqDF,iDDpDA,0CCmDA,yCAFA,wCACA,yCD7CE,mBAAA,eAAA,WAAA,eACA,yBACA,OAAA,EAAA,EACA,eACA,YAAA,gBACA,YAAA,eAAA,UAAA,QAAA,qBACA,UAAA,eACA,YCoDF,yCDnDA,6CCkDA,6CD/CE,cAAA,eACF,iDACE,YAAA,eACA,WAAA,iBACA,MAAA,KACF,yCACE,WAAA,KACF,yCACE,WAAA,QCmDF,yCDlDA,yCAEE,aAAA,eCmDF,4CAEA,4CADA,4CDnDA,4CAIE,YACA,OAAA,cACA,QAAA,EAAA,EAAA,EACA,eACF,yCACE,QAAA,MACA,OAAA,IACA,YACA,WAAA,IAAA,MAAA,KACF,yCCkDA,yCACA,yCACA,yCDhDE,MAAA,KACA,eACA,OAAA,YACA,QAAA,YACA,YAAA,IACF,yCACE,UAAA,eACA,YAAA,eACA,cAAA,eACF,yCACE,UAAA,eACA,YAAA,eACA,cAAA,eACF,yCACE,UAAA,eACA,YAAA,eACA,cAAA,cACF,yCACE,UAAA,eACA,YAAA,eACA,cAAA,cAKN,oCACE,WAAA,KACA,MAAA,KAEF,+BACE,OAAA,IAAA,MAAA,QACA,oDACE,WAAA,KACF,sEAAA,4EACE,YAAA,EAAA,EAAA,IAAA,KACA,mCACE,sEAAA,4EACE,MAAA,6BACJ,iCACE,sEAAA,4EACE,MAAA,6BACN,mCACE,KAAA,QACA,MAAA,QAEJ,uCACE,iBAAA,KACA,oBAAA,QACA,8CACE,WAAA,QACF,kFACE,iBAAA,QACF,4GACE,MAAA,YACF,wFACE,iBAAA,QCoDF,+DADA,4EDlDA,4EAGE,iBAAA,KACF,uEACE,iBAAA,KAEJ,kIACE,MAAA,QACA,KAAA,YAEF,oCACE,aAAA,KACA,WAAA,KACA,mBAAA,eAAA,EAAA,IAAA,IAAA,WAAA,eAAA,EAAA,IAAA,IACA,2CACE,WAAA,KACA,MAAA,eACA,iDAAA,iDACE,WAAA,KAEN,qCACE,iBAAA,KACA,4DACE,cAAA,IAAA,MAAA,KACA,MAAA,KACA,WAAA,QACF,2CACE,QAAA,MACA,SAAA,SACA,OAAA,KAAA,KACA,OAAA,KACA,YAAA,KACA,SAAA,OACA,uEACE,MAAA,KACA,iBAAA,QACA,aAAA,KACF,2FACE,MAAA,QACF,uECmDA,0EDjDE,aAAA,QACF,iDACE,aAAA,KACA,MAAA,KACA,WAAA,KACA,uDAAA,uDACE,aAAA,QACF,uDACE,iBAAA,QACN,oFACE,WAAA,QACA,0FAAA,0FACE,WAAA,QACF,2FACE,WAAA,QACJ,mFACE,WAAA,KACA,MAAA,KACA,yFAAA,yFACE,WAAA,KACF,0FACE,WAAA,KAEN,mCACE,iBAAA","file":"trumbowyg.min.css","sourcesContent":["#trumbowyg-icons {\n overflow: hidden;\n visibility: hidden;\n height: 0;\n width: 0; }\n #trumbowyg-icons svg {\n height: 0;\n width: 0; }\n\n.trumbowyg-box *,\n.trumbowyg-box *::before,\n.trumbowyg-box *::after,\n.trumbowyg-modal *,\n.trumbowyg-modal *::before,\n.trumbowyg-modal *::after {\n box-sizing: border-box; }\n\n.trumbowyg-box svg,\n.trumbowyg-modal svg {\n width: 17px;\n height: 100%;\n fill: #222; }\n\n.trumbowyg-box,\n.trumbowyg-editor {\n display: block;\n position: relative;\n border: 1px solid #DDD;\n width: 100%;\n min-height: 300px; }\n\n.trumbowyg-box .trumbowyg-editor {\n margin: 0 auto; }\n\n.trumbowyg-box.trumbowyg-fullscreen {\n background: #FEFEFE;\n border: none !important; }\n\n.trumbowyg-editor,\n.trumbowyg-textarea {\n position: relative;\n box-sizing: border-box;\n padding: 20px;\n min-height: 300px;\n width: 100%;\n border-style: none;\n resize: none;\n outline: none;\n overflow: auto;\n user-select: text; }\n .trumbowyg-editor.trumbowyg-autogrow-on-enter,\n .trumbowyg-textarea.trumbowyg-autogrow-on-enter {\n transition: height 300ms ease-out; }\n\n.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before {\n color: transparent !important;\n text-shadow: 0 0 7px #333; }\n @media screen and (min-width: 0 \\0) {\n .trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before {\n color: rgba(200, 200, 200, 0.6) !important; } }\n @supports (-ms-accelerator: true) {\n .trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before {\n color: rgba(200, 200, 200, 0.6) !important; } }\n\n.trumbowyg-box-blur .trumbowyg-editor img,\n.trumbowyg-box-blur .trumbowyg-editor hr {\n opacity: 0.2; }\n\n.trumbowyg-textarea {\n position: relative;\n display: block;\n overflow: auto;\n border: none;\n font-size: 14px;\n font-family: \"Inconsolata\", \"Consolas\", \"Courier\", \"Courier New\", sans-serif;\n line-height: 18px; }\n\n.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea {\n height: 1px !important;\n width: 25%;\n min-height: 0 !important;\n padding: 0 !important;\n background: none;\n opacity: 0 !important; }\n\n.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea {\n display: block;\n margin-bottom: 1px; }\n\n.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor {\n display: none; }\n\n.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea {\n opacity: 0.8;\n background: none; }\n\n.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before {\n content: attr(placeholder);\n color: #999;\n pointer-events: none;\n white-space: break-spaces; }\n\n.trumbowyg-button-pane {\n width: 100%;\n min-height: 36px;\n background: #ecf0f1;\n border-bottom: 1px solid #d7e0e2;\n margin: 0;\n padding: 0 5px;\n position: relative;\n list-style-type: none;\n line-height: 10px;\n backface-visibility: hidden;\n z-index: 11; }\n .trumbowyg-button-pane::after {\n content: \" \";\n display: block;\n position: absolute;\n top: 36px;\n left: 0;\n right: 0;\n width: 100%;\n height: 1px;\n background: #d7e0e2; }\n .trumbowyg-button-pane .trumbowyg-button-group {\n display: inline-block; }\n .trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg {\n color: transparent; }\n .trumbowyg-button-pane .trumbowyg-button-group::after {\n content: \" \";\n display: inline-block;\n width: 1px;\n background: #d7e0e2;\n margin: 0 5px;\n height: 35px;\n vertical-align: top; }\n .trumbowyg-button-pane .trumbowyg-button-group:last-child::after {\n content: none; }\n .trumbowyg-button-pane button {\n display: inline-block;\n position: relative;\n width: 35px;\n height: 35px;\n padding: 1px 6px !important;\n margin-bottom: 1px;\n overflow: hidden;\n border: none;\n cursor: pointer;\n background: none;\n vertical-align: middle;\n transition: background-color 150ms, opacity 150ms; }\n .trumbowyg-button-pane button.trumbowyg-textual-button {\n width: auto;\n line-height: 35px;\n user-select: none; }\n .trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),\n .trumbowyg-button-pane button.trumbowyg-disable,\n .trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button) {\n opacity: 0.2;\n cursor: default;\n pointer-events: none; }\n .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,\n .trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before {\n background: #e3e9eb; }\n .trumbowyg-button-pane button:not(.trumbowyg-disable):hover,\n .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,\n .trumbowyg-button-pane button.trumbowyg-active {\n background-color: #FFF;\n outline: none; }\n .trumbowyg-button-pane .trumbowyg-open-dropdown::after {\n display: block;\n content: \" \";\n position: absolute;\n top: 25px;\n right: 3px;\n height: 0;\n width: 0;\n border: 3px solid transparent;\n border-top-color: #555; }\n .trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button {\n padding-left: 10px !important;\n padding-right: 18px !important; }\n .trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after {\n top: 17px;\n right: 7px; }\n .trumbowyg-button-pane .trumbowyg-right {\n float: right; }\n\n.trumbowyg-dropdown {\n max-width: 300px;\n max-height: 250px;\n overflow-y: auto;\n overflow-x: hidden;\n white-space: nowrap;\n border: 1px solid #ecf0f1;\n padding: 5px 0;\n border-top: none;\n background: #FFF;\n margin-left: -1px;\n box-shadow: rgba(0, 0, 0, 0.1) 0 2px 3px;\n z-index: 12; }\n .trumbowyg-dropdown button {\n display: block;\n width: 100%;\n height: 35px;\n line-height: 35px;\n text-decoration: none;\n background: #FFF;\n padding: 0 20px 0 10px;\n color: #333 !important;\n border: none;\n cursor: pointer;\n text-align: left;\n font-size: 15px;\n transition: all 150ms; }\n .trumbowyg-dropdown button:hover, .trumbowyg-dropdown button:focus {\n background: #ecf0f1; }\n .trumbowyg-dropdown button svg {\n float: left;\n margin-right: 14px; }\n\n/* Modal box */\n.trumbowyg-modal {\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n max-width: 520px;\n width: 100%;\n height: 350px;\n z-index: 12;\n overflow: hidden;\n backface-visibility: hidden; }\n\n.trumbowyg-modal-box {\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n max-width: 500px;\n width: calc(100% - 20px);\n padding-bottom: 45px;\n z-index: 1;\n background-color: #FFF;\n text-align: center;\n font-size: 14px;\n box-shadow: rgba(0, 0, 0, 0.2) 0 2px 3px;\n backface-visibility: hidden; }\n .trumbowyg-modal-box .trumbowyg-modal-title {\n font-size: 24px;\n font-weight: bold;\n margin: 0 0 20px;\n padding: 15px 0 13px;\n display: block;\n border-bottom: 1px solid #EEE;\n color: #333;\n background: #fbfcfc; }\n .trumbowyg-modal-box .trumbowyg-progress {\n width: 100%;\n height: 3px;\n position: absolute;\n top: 58px; }\n .trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar {\n background: #2BC06A;\n width: 0;\n height: 100%;\n transition: width 150ms linear; }\n .trumbowyg-modal-box .trumbowyg-input-row {\n position: relative;\n margin: 15px 12px;\n border: 1px solid #DEDEDE;\n overflow: hidden; }\n .trumbowyg-modal-box .trumbowyg-input-infos {\n text-align: left;\n transition: all 150ms;\n width: 150px;\n border-right: 1px solid #DEDEDE;\n padding: 0 7px;\n background-color: #fbfcfc;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0; }\n .trumbowyg-modal-box .trumbowyg-input-infos label {\n color: #69878f;\n overflow: hidden;\n height: 27px;\n line-height: 27px; }\n .trumbowyg-modal-box .trumbowyg-input-infos label, .trumbowyg-modal-box .trumbowyg-input-infos label span {\n display: block;\n height: 27px;\n line-height: 27px;\n transition: all 150ms; }\n .trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error {\n color: #e74c3c; }\n .trumbowyg-modal-box .trumbowyg-input-html {\n padding: 1px 1px 1px 152px; }\n .trumbowyg-modal-box .trumbowyg-input-html, .trumbowyg-modal-box .trumbowyg-input-html input, .trumbowyg-modal-box .trumbowyg-input-html textarea, .trumbowyg-modal-box .trumbowyg-input-html select {\n font-size: 14px; }\n .trumbowyg-modal-box .trumbowyg-input-html input, .trumbowyg-modal-box .trumbowyg-input-html textarea, .trumbowyg-modal-box .trumbowyg-input-html select {\n transition: all 150ms;\n height: 27px;\n line-height: 27px;\n border: 0;\n width: 100%;\n padding: 0 7px; }\n .trumbowyg-modal-box .trumbowyg-input-html input:hover, .trumbowyg-modal-box .trumbowyg-input-html input:focus, .trumbowyg-modal-box .trumbowyg-input-html textarea:hover, .trumbowyg-modal-box .trumbowyg-input-html textarea:focus, .trumbowyg-modal-box .trumbowyg-input-html select:hover, .trumbowyg-modal-box .trumbowyg-input-html select:focus {\n outline: 1px solid #95a5a6; }\n .trumbowyg-modal-box .trumbowyg-input-html input:focus, .trumbowyg-modal-box .trumbowyg-input-html textarea:focus, .trumbowyg-modal-box .trumbowyg-input-html select:focus {\n background: #fbfcfc; }\n .trumbowyg-modal-box .trumbowyg-input-html input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n padding: 0; }\n .trumbowyg-modal-box .trumbowyg-input-html-with-checkbox {\n text-align: left;\n padding: 3px 1px 1px 3px; }\n .trumbowyg-modal-box .trumbowyg-input-error input, .trumbowyg-modal-box .trumbowyg-input-error select, .trumbowyg-modal-box .trumbowyg-input-error textarea {\n outline: 1px solid #e74c3c; }\n .trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child {\n margin-top: -27px; }\n .trumbowyg-modal-box .error {\n margin-top: 25px;\n display: block;\n color: red; }\n .trumbowyg-modal-box .trumbowyg-modal-button {\n position: absolute;\n bottom: 10px;\n right: 0;\n text-decoration: none;\n color: #FFF;\n display: block;\n width: 100px;\n height: 35px;\n line-height: 33px;\n margin: 0 10px;\n background-color: #333;\n border: none;\n cursor: pointer;\n font-family: \"Trebuchet MS\", Helvetica, Verdana, sans-serif;\n font-size: 16px;\n transition: all 150ms; }\n .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit {\n right: 110px;\n background: #2bc06a; }\n .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover, .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus {\n background: #40d47e;\n outline: none; }\n .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active {\n background: #25a25a; }\n .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset {\n color: #555;\n background: #e6e6e6; }\n .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover, .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus {\n background: #fbfbfb;\n outline: none; }\n .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active {\n background: #d5d5d5; }\n\n.trumbowyg-overlay {\n position: absolute;\n background-color: rgba(255, 255, 255, 0.5);\n height: 100%;\n width: 100%;\n left: 0;\n display: none;\n top: 0;\n z-index: 10; }\n\n/**\n * Fullscreen\n */\nbody.trumbowyg-body-fullscreen {\n overflow: hidden; }\n\n.trumbowyg-fullscreen {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n z-index: 99999; }\n .trumbowyg-fullscreen.trumbowyg-box,\n .trumbowyg-fullscreen .trumbowyg-editor {\n border: none; }\n .trumbowyg-fullscreen .trumbowyg-editor,\n .trumbowyg-fullscreen .trumbowyg-textarea {\n height: calc(100% - 37px) !important;\n overflow: auto; }\n .trumbowyg-fullscreen .trumbowyg-overlay {\n height: 100% !important; }\n .trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg {\n color: #222;\n fill: transparent; }\n\n.trumbowyg-editor {\n /*\n * lset for resetCss option\n */ }\n .trumbowyg-editor object,\n .trumbowyg-editor embed,\n .trumbowyg-editor video,\n .trumbowyg-editor img {\n max-width: 100%; }\n .trumbowyg-editor video,\n .trumbowyg-editor img {\n height: auto; }\n .trumbowyg-editor img {\n cursor: move; }\n .trumbowyg-editor canvas:focus {\n outline: none; }\n .trumbowyg-editor.trumbowyg-reset-css {\n background: #FEFEFE !important;\n font-family: \"Trebuchet MS\", Helvetica, Verdana, sans-serif !important;\n font-size: 14px !important;\n line-height: 1.45em !important;\n color: #333; }\n .trumbowyg-editor.trumbowyg-reset-css a {\n color: #15c !important;\n text-decoration: underline !important; }\n .trumbowyg-editor.trumbowyg-reset-css div,\n .trumbowyg-editor.trumbowyg-reset-css p,\n .trumbowyg-editor.trumbowyg-reset-css ul,\n .trumbowyg-editor.trumbowyg-reset-css ol,\n .trumbowyg-editor.trumbowyg-reset-css blockquote {\n box-shadow: none !important;\n background: none !important;\n margin: 0 !important;\n margin-bottom: 15px !important;\n line-height: 1.4em !important;\n font-family: \"Trebuchet MS\", Helvetica, Verdana, sans-serif !important;\n font-size: 14px !important;\n border: none; }\n .trumbowyg-editor.trumbowyg-reset-css iframe,\n .trumbowyg-editor.trumbowyg-reset-css object,\n .trumbowyg-editor.trumbowyg-reset-css hr {\n margin-bottom: 15px !important; }\n .trumbowyg-editor.trumbowyg-reset-css blockquote {\n margin-left: 32px !important;\n font-style: italic !important;\n color: #555; }\n .trumbowyg-editor.trumbowyg-reset-css ul {\n list-style: disc; }\n .trumbowyg-editor.trumbowyg-reset-css ol {\n list-style: decimal; }\n .trumbowyg-editor.trumbowyg-reset-css ul,\n .trumbowyg-editor.trumbowyg-reset-css ol {\n padding-left: 20px !important; }\n .trumbowyg-editor.trumbowyg-reset-css ul ul,\n .trumbowyg-editor.trumbowyg-reset-css ol ol,\n .trumbowyg-editor.trumbowyg-reset-css ul ol,\n .trumbowyg-editor.trumbowyg-reset-css ol ul {\n border: none;\n margin: 2px !important;\n padding: 0 !important;\n padding-left: 24px !important; }\n .trumbowyg-editor.trumbowyg-reset-css hr {\n display: block;\n height: 1px;\n border: none;\n border-top: 1px solid #CCC; }\n .trumbowyg-editor.trumbowyg-reset-css h1,\n .trumbowyg-editor.trumbowyg-reset-css h2,\n .trumbowyg-editor.trumbowyg-reset-css h3,\n .trumbowyg-editor.trumbowyg-reset-css h4 {\n color: #111;\n background: none;\n margin: 0 !important;\n padding: 0 !important;\n font-weight: bold; }\n .trumbowyg-editor.trumbowyg-reset-css h1 {\n font-size: 32px !important;\n line-height: 38px !important;\n margin-bottom: 20px !important; }\n .trumbowyg-editor.trumbowyg-reset-css h2 {\n font-size: 26px !important;\n line-height: 34px !important;\n margin-bottom: 15px !important; }\n .trumbowyg-editor.trumbowyg-reset-css h3 {\n font-size: 22px !important;\n line-height: 28px !important;\n margin-bottom: 7px !important; }\n .trumbowyg-editor.trumbowyg-reset-css h4 {\n font-size: 16px !important;\n line-height: 22px !important;\n margin-bottom: 7px !important; }\n\n/*\n * Dark theme\n */\n.trumbowyg-dark .trumbowyg-textarea {\n background: #111;\n color: #ddd; }\n\n.trumbowyg-dark .trumbowyg-box {\n border: 1px solid #343434; }\n .trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen {\n background: #111; }\n .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before {\n text-shadow: 0 0 7px #ccc; }\n @media screen and (min-width: 0 \\0 ) {\n .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before {\n color: rgba(20, 20, 20, 0.6) !important; } }\n @supports (-ms-accelerator: true) {\n .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before {\n color: rgba(20, 20, 20, 0.6) !important; } }\n .trumbowyg-dark .trumbowyg-box svg {\n fill: #ecf0f1;\n color: #ecf0f1; }\n\n.trumbowyg-dark .trumbowyg-button-pane {\n background-color: #222;\n border-bottom-color: #343434; }\n .trumbowyg-dark .trumbowyg-button-pane::after {\n background: #343434; }\n .trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after {\n background-color: #343434; }\n .trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg {\n color: transparent; }\n .trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after {\n background-color: #2a2a2a; }\n .trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover,\n .trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,\n .trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active {\n background-color: #333; }\n .trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after {\n border-top-color: #fff; }\n\n.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg {\n color: #ecf0f1;\n fill: transparent; }\n\n.trumbowyg-dark .trumbowyg-dropdown {\n border-color: #222;\n background: #333;\n box-shadow: rgba(0, 0, 0, 0.3) 0 2px 3px; }\n .trumbowyg-dark .trumbowyg-dropdown button {\n background: #333;\n color: #fff !important; }\n .trumbowyg-dark .trumbowyg-dropdown button:hover, .trumbowyg-dark .trumbowyg-dropdown button:focus {\n background: #222; }\n\n.trumbowyg-dark .trumbowyg-modal-box {\n background-color: #222; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title {\n border-bottom: 1px solid #555;\n color: #fff;\n background: #3c3c3c; }\n .trumbowyg-dark .trumbowyg-modal-box label {\n display: block;\n position: relative;\n margin: 15px 12px;\n height: 27px;\n line-height: 27px;\n overflow: hidden; }\n .trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span {\n color: #eee;\n background-color: #2f2f2f;\n border-color: #222; }\n .trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error {\n color: #e74c3c; }\n .trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,\n .trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea {\n border-color: #e74c3c; }\n .trumbowyg-dark .trumbowyg-modal-box label input {\n border-color: #222;\n color: #eee;\n background: #333; }\n .trumbowyg-dark .trumbowyg-modal-box label input:hover, .trumbowyg-dark .trumbowyg-modal-box label input:focus {\n border-color: #626262; }\n .trumbowyg-dark .trumbowyg-modal-box label input:focus {\n background-color: #2f2f2f; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit {\n background: #1b7943; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover, .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus {\n background: #25a25a; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active {\n background: #176437; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset {\n background: #333;\n color: #ccc; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover, .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus {\n background: #444; }\n .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active {\n background: #111; }\n\n.trumbowyg-dark .trumbowyg-overlay {\n background-color: rgba(15, 15, 15, 0.6); }\n",null]}
\ No newline at end of file
diff --git a/vasl_templates/webapp/static/vassal.js b/vasl_templates/webapp/static/vassal.js
index 45c78de..c3e397a 100644
--- a/vasl_templates/webapp/static/vassal.js
+++ b/vasl_templates/webapp/static/vassal.js
@@ -200,7 +200,9 @@ function _get_raw_content( snippet_id, $btn, params )
var raw_content = [] ;
function get_values( names ) {
for ( var i=0 ; i < names.length ; ++i ) {
- var val = $( ".param[name='" + names[i] + "']" ).val().trim() ;
+ var $elem = $( ".param[name='" + names[i] + "']" ) ;
+ var val = $elem.hasClass("trumbowyg-editor") ? unloadTrumbowyg($elem,false) : $elem.val() ;
+ val = val.trim() ;
if ( val )
raw_content.push( val ) ;
}
diff --git a/vasl_templates/webapp/templates/edit-simple-note-dialog.html b/vasl_templates/webapp/templates/edit-simple-note-dialog.html
index 0cd0401..57ec15b 100644
--- a/vasl_templates/webapp/templates/edit-simple-note-dialog.html
+++ b/vasl_templates/webapp/templates/edit-simple-note-dialog.html
@@ -1,3 +1,5 @@
diff --git a/vasl_templates/webapp/templates/index.html b/vasl_templates/webapp/templates/index.html
index 918e432..53c520d 100644
--- a/vasl_templates/webapp/templates/index.html
+++ b/vasl_templates/webapp/templates/index.html
@@ -14,6 +14,12 @@
+
+
+
+
+
+
@@ -36,6 +42,7 @@
+
@@ -120,6 +127,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vasl_templates/webapp/templates/lfa.html b/vasl_templates/webapp/templates/lfa.html
index 1aca861..3016c32 100644
--- a/vasl_templates/webapp/templates/lfa.html
+++ b/vasl_templates/webapp/templates/lfa.html
@@ -55,7 +55,7 @@
No animations