Вход Регистрация
Файл: Main Website Files/assets/js/froala_editor/js/froala_unmini.js
Строк: 7569
<?php
/*!
 * froala_editor v1.2.6 (http://editor.froala.com)
 * License http://editor.froala.com/license
 * Copyright 2014-2015 Froala Labs
 */
if ("undefined" == typeof jQuery) throw new Error("Froala requires jQuery");
! function(
a) {
    
"use strict";
    var 
= function(cd) {
        return 
this.options a.extend({}, b.DEFAULTSa(c).data(), "object" == typeof d && d), this.options.unsupportedAgents.test(navigator.userAgent) ? !: (this.valid_nodes a.merge([], b.VALID_NODES), this.valid_nodes a.merge(this.valid_nodesa.map(Object.keys(this.options.blockTags), function(a) {
            return 
a.toUpperCase()
        })), 
this.browser b.browser(), this.disabledList = [], this._id = ++b.countthis._events = {}, this.blurred = !0this.$original_element a(c), this.document c.ownerDocumentthis.window "defaultView" in this.document this.document.defaultView this.document.parentWindowthis.$document a(this.document), this.$window a(this.window), this.br this.browser.msie && a.Editable.getIEversion() <= 10 "" "<br/>"this.init(c), void a(c).on("editable.focus"a.proxy(function() {
            for (var 
1<= a.Editable.countb++) != this._id && this.$window.trigger("blur." b)
        }, 
this)))
    };
    
b.initializers = [], b.count 0b.VALID_NODES = ["P""DIV""LI""TD""TH"], b.LANGS = [], b.INVISIBLE_SPACE "&#x200b;"b.DEFAULTS = {
        
allowComments: !0,
        
allowScript: !1,
        
allowStyle: !1,
        
allowedAttrs: ["accept""accept-charset""accesskey""action""align""alt""async""autocomplete""autofocus""autoplay""autosave""background""bgcolor""border""charset""cellpadding""cellspacing""checked""cite""class""color""cols""colspan""content""contenteditable""contextmenu""controls""coords""data""data-.*""datetime""default""defer""dir""dirname""disabled""download""draggable""dropzone""enctype""for""form""formaction""headers""height""hidden""high""href""hreflang""http-equiv""icon""id""ismap""itemprop""keytype""kind""label""lang""language""list""loop""low""max""maxlength""media""method""min""multiple""name""novalidate""open""optimum""pattern""ping""placeholder""poster""preload""pubdate""radiogroup""readonly""rel""required""reversed""rows""rowspan""sandbox""scope""scoped""scrolling""seamless""selected""shape""size""sizes""span""src""srcdoc""srclang""srcset""start""step""summary""spellcheck""style""tabindex""target""title""type""translate""usemap""value""valign""width""wrap"],
        
allowedTags: ["a""abbr""address""area""article""aside""audio""b""base""bdi""bdo""blockquote""br""button""canvas""caption""cite""code""col""colgroup""datalist""dd""del""details""dfn""dialog""div""dl""dt""em""embed""fieldset""figcaption""figure""footer""form""h1""h2""h3""h4""h5""h6""header""hgroup""hr""i""iframe""img""input""ins""kbd""keygen""label""legend""li""link""main""map""mark""menu""menuitem""meter""nav""noscript""object""ol""optgroup""option""output""p""param""pre""progress""queue""rp""rt""ruby""s""samp""script""section""select""small""source""span""strike""strong""sub""summary""sup""table""tbody""td""textarea""tfoot""th""thead""time""title""tr""track""u""ul""var""video""wbr"],
        
alwaysBlank: !1,
        
alwaysVisible: !1,
        
autosave: !1,
        
autosaveInterval1e4,
        
beautifyCode: !0,
        
blockTags: {
            
n"Normal",
            
blockquote"Quote",
            
pre"Code",
            
h1"Heading 1",
            
h2"Heading 2",
            
h3"Heading 3",
            
h4"Heading 4",
            
h5"Heading 5",
            
h6"Heading 6"
        
},
        
buttons: ["bold""italic""underline""strikeThrough""fontSize""fontFamily""color""sep""formatBlock""blockStyle""align""insertOrderedList""insertUnorderedList""outdent""indent""sep""createLink""insertImage""insertVideo""insertHorizontalRule""undo""redo""html"],
        
crossDomain: !0,
        
convertMailAddresses: !0,
        
customButtons: {},
        
customDropdowns: {},
        
customText: !1,
        
defaultTag"P",
        
direction"ltr",
        
disableRightClick: !1,
        
editInPopup: !1,
        
editorClass"",
        
formatTags: ["p""pre""blockquote""h1""h2""h3""h4""h5""h6""div""ul""ol""li""table""tbody""thead""tfoot""tr""th""td""body""head""html""title""meta""link""base""script""style"],
        
headers: {},
        
height"auto",
        
icons: {},
        
inlineMode: !0,
        
initOnClick: !1,
        
fullPage: !1,
        
language"en_us",
        
linkList: [],
        
linkText: !1,
        
linkClasses: {},
        
linkAutoPrefix"",
        
maxHeight"auto",
        
minHeight"auto",
        
multiLine: !0,
        
noFollow: !0,
        
paragraphy: !0,
        
placeholder"Type something",
        
plainPaste: !1,
        
preloaderSrc"",
        
saveURLnull,
        
saveParams: {},
        
saveRequestType"POST",
        
scrollableContainer"body",
        
simpleAmpersand: !1,
        
shortcuts: !0,
        
shortcutsAvailable: ["show""bold""italic""underline""createLink""insertImage""indent""outdent""html""formatBlock n""formatBlock h1""formatBlock h2""formatBlock h3""formatBlock h4""formatBlock h5""formatBlock h6""formatBlock blockquote""formatBlock pre""strikeThrough"],
        
showNextToCursor: !1,
        
spellcheck: !1,
        
themenull,
        
toolbarFixed: !0,
        
trackScroll: !1,
        
unlinkButton: !0,
        
useClasses: !0,
        
tabSpaces: !0,
        
typingTimer500,
        
pastedImagesUploadRequestType"POST",
        
pastedImagesUploadURL"https://i.froala.com/upload_base64",
        
unsupportedAgents: /Opera Mini/i,
        
useFrTag: !1,
        
width"auto",
        
withCredentials: !1,
        
zIndex2e3
    
}, b.prototype.destroy = function() {
        
this.sync(), this.options.useFrTag && this.addFrTag(), this.hide(), this.isHTML && this.html(), this.$bttn_wrapper && this.$bttn_wrapper.html("").removeData().remove(), this.$editor && this.$editor.html("").removeData().remove(), this.raiseEvent("destroy"), this.$popup_editor && this.$popup_editor.html("").removeData().remove(), this.$placeholder && this.$placeholder.html("").removeData().remove(), clearTimeout(this.ajaxInterval), clearTimeout(this.typingTimer), this.$element.off("mousedown mouseup click keydown keyup cut copy paste focus keypress touchstart touchend touch drop"), this.$element.off("mousedown mouseup click keydown keyup cut copy paste focus keypress touchstart touchend touch drop""**"), this.$window.off("mouseup." this._id), this.$window.off("keydown." this._id), this.$window.off("keyup." this._id), this.$window.off("blur." this._id), this.$window.off("hide." this._id), this.$window.off("scroll." this._id), this.$window.off("resize." this._id), this.$window.off("orientationchange." this._id), this.$document.off("selectionchange." this._id), this.$original_element.off("editable"), void 0 !== this.$upload_frame && this.$upload_frame.remove(), this.$textarea && (this.$box.remove(), this.$textarea.removeData("fa.editable"), this.$textarea.show());
        for (var 
a in this._eventsdelete this._events[a];
        
this.$placeholder && this.$placeholder.remove(), this.isLink this.$element.removeData("fa.editable") : (this.$wrapper this.$wrapper.replaceWith(this.getHTML(!1, !1)) : this.$element.replaceWith(this.getHTML(!1, !1)), this.$box && !this.editableDisabled && (this.$box.removeClass("froala-box f-rtl"), this.$box.find(".html-switch").remove(), this.$box.removeData("fa.editable"), clearTimeout(this.typingTimer))), this.$lb && this.$lb.remove()
    }, 
b.prototype.triggerEvent = function(bcde) {
        
void 0 === && (= !0), void 0 === && (= !1), === !&& (this.isResizing() || this.editableDisabled || this.imageMode || !|| this.cleanify(), this.sync());
        var 
= !0;
        return 
|| (= []), this.$original_element.triggerHandler("editable." ba.merge([this], c)), void 0 === ? !f
    
}, b.prototype.syncStyle = function() {
        if (
this.options.fullPage) {
            var 
this.$element.html().match(/[style[^]]*].*[/style]/gi);
            if (
this.$document.find("head style[data-id]").remove(), a)
                for (var 
0a.lengthb++) this.$document.find("head").append(a[b].replace(/[/gi"<").replace(/]/gi">"))
        }
    }, 
b.prototype.sync = function() {
        if (!
this.isHTML) {
            
this.raiseEvent("sync"), this.disableImageResize(), this.isLink || this.isImage || this.checkPlaceholder();
            var 
this.getHTML(!1, !1);
            
this.trackHTML !== && null != this.trackHTML ? (this.refreshImageList(), this.refreshButtons(), this.trackHTML athis.$textarea && this.$textarea.val(a), this.doingRedo || this.saveUndoStep(), this.triggerEvent("contentChanged", [], !1)) : null == this.trackHTML && (this.trackHTML a), this.syncStyle()
        }
    }, 
b.prototype.emptyElement = function(b) {
        if (
"IMG" == b.tagName || a(b).find("img").length 0) return !1;
        if (
a(b).find("input, iframe").length 0) return !1;
        for (var 
a(b).text(), 0c.lengthd++)
            if (
"n" !== c[d] && "r" !== c[d] && "    " !== c[d] && 8203 != c[d].charCodeAt(0)) return !1;
        return !
0
    
}, b.prototype.initEvents = function() {
        
this.mobile() ? (this.mousedown "touchstart"this.mouseup "touchend"this.move "touchmove") : (this.mousedown "mousedown"this.mouseup "mouseup"this.move "")
    }, 
b.prototype.initDisable = function() {
        
this.$element.on("keypress keydown keyup"a.proxy(function(a) {
            return 
this.isDisabled ? (a.stopPropagation(), a.preventDefault(), !1) : void 0
        
}, this))
    }, 
b.prototype.continueInit = function() {
        
this.initDisable(), this.initEvents(), this.browserFixes(), this.handleEnter(), this.editableDisabled || (this.initUndoRedo(), this.enableTyping(), this.initShortcuts()), this.initTabs(), this.initEditor();
        for (var 
0a.Editable.initializers.lengthb++) a.Editable.initializers[b].call(this);
        
this.initOptions(), this.initEditorSelection(), this.initAjaxSaver(), this.setLanguage(), this.setCustomText(), this.editableDisabled || this.registerPaste(), this.refreshDisabledState(), this.refreshUndo(), this.refreshRedo(), this.initPopupSubmit(), this.initialized = !0this.triggerEvent("initialized", [], !1, !1)
    }, 
b.prototype.initPopupSubmit = function() {
        
this.$popup_editor.find(".froala-popup input").keydown(function(b) {
            var 
b.which;
            
13 == && (b.preventDefault(), b.stopPropagation(), a(this).blur(), a(this).parents(".froala-popup").find("button.f-submit").click())
        })
    }, 
b.prototype.lateInit = function() {
        
this.saveSelectionByMarkers(), this.continueInit(), this.restoreSelectionByMarkers(), this.$element.focus(), this.hideOtherEditors()
    }, 
b.prototype.init = function(b) {
        
this.options.paragraphy || (this.options.defaultTag "DIV"), this.initElement(b), this.initElementStyle(), (!this.isLink || this.isImage) && (this.initImageEvents(), this.buildImageMove()), this.options.initOnClick ? (this.editableDisabled || (this.$element.attr("contenteditable", !0), this.$element.attr("spellcheck", !1)), this.$element.bind("mousedown.element focus.element"a.proxy(function(a) {
            return 
this.isLink || a.stopPropagation(), this.isDisabled ? !: (this.$element.unbind("mousedown.element focus.element"), void this.lateInit())
        }, 
this))) : this.continueInit()
    }, 
b.prototype.phone = function() {
        var 
= !1;
        return function(
b) {
            (/(
android|bbd+|meego).+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palmos)?|phone|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(b) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m||)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hpi|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lgg|/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(|nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(b.substr(04))) && (= !0)
        }(
navigator.userAgent || navigator.vendor || window.opera), a
    
}, b.prototype.mobile = function() {
        return 
this.phone() || this.android() || this.iOS() || this.blackberry()
    }, 
b.prototype.iOS = function() {
        return /(
iPad|iPhone|iPod)/g.test(navigator.userAgent)
    }, 
b.prototype.iOSVersion = function() {
        if (/
iP(hone|od|ad)/.test(navigator.platform)) {
            var 
navigator.appVersion.match(/OS (d+)_(d+)_?(d+)?/),
                
= [parseInt(a[1], 10), parseInt(a[2], 10), parseInt(a[3] || 010)];
            if (
&& b[0]) return b[0]
        }
        return 
0
    
}, b.prototype.iPad = function() {
        return /(
iPad)/g.test(navigator.userAgent)
    }, 
b.prototype.iPhone = function() {
        return /(
iPhone)/g.test(navigator.userAgent)
    }, 
b.prototype.iPod = function() {
        return /(
iPod)/g.test(navigator.userAgent)
    }, 
b.prototype.android = function() {
        return /(
Android)/g.test(navigator.userAgent)
    }, 
b.prototype.blackberry = function() {
        return /(
Blackberry)/g.test(navigator.userAgent)
    }, 
b.prototype.initOnTextarea = function(b) {
        
this.$textarea a(b), void 0 !== this.$textarea.attr("placeholder") && "Type something" == this.options.placeholder && (this.options.placeholder this.$textarea.attr("placeholder")), this.$element a("<div>").html(this.$textarea.val()), this.$textarea.before(this.$element).hide(), this.$textarea.parents("form").bind("submit"a.proxy(function() {
            
this.isHTML this.html() : this.sync()
        }, 
this)), this.addListener("destroy"a.proxy(function() {
            
this.$textarea.parents("form").unbind("submit")
        }, 
this))
    }, 
b.prototype.initOnLink = function(b) {
        
this.isLink = !0this.options.linkText = !0this.selectionDisabled = !0this.editableDisabled = !0this.options.buttons = [], this.$element a(b), this.options.paragraphy = !1this.options.countCharacters = !1this.$box this.$element
    
}, b.prototype.initOnImage = function(b) {
        var 
a(b).css("float");
        
"A" == a(b).parent().get(0).tagName && (a(b).parent()), this.isImage = !0this.editableDisabled = !0this.imageList = [], this.options.buttons = [], this.options.paragraphy = !1this.options.imageMargin "auto"a(b).wrap("<div>"), this.$element a(b).parent(), this.$element.css("display""inline-block"), this.$element.css("max-width""100%"), this.$element.css("margin-left""auto"), this.$element.css("margin-right""auto"), this.$element.css("float"c), this.$element.addClass("f-image"), this.$box a(b)
    }, 
b.prototype.initForPopup = function(b) {
        
this.$element a(b), this.$box this.$elementthis.editableDisabled = !0this.options.countCharacters = !1this.options.buttons = [], this.$element.on("click"a.proxy(function(a) {
            
a.preventDefault()
        }, 
this))
    }, 
b.prototype.initOnDefault = function(b) {
        
"DIV" != b.tagName && this.options.buttons.indexOf("formatBlock") >= && this.disabledList.push("formatBlock"), this.$element a(b)
    }, 
b.prototype.initElement = function(b) {
        if (
"TEXTAREA" == b.tagName this.initOnTextarea(b) : "A" == b.tagName this.initOnLink(b) : "IMG" == b.tagName this.initOnImage(b) : this.options.editInPopup this.initForPopup(b) : this.initOnDefault(b), !this.editableDisabled) {
            
this.$box this.$element.addClass("froala-box"), this.$wrapper a('<div class="froala-wrapper">'), this.$element a("<div>");
            var 
this.$box.html();
            
this.$box.html(this.$wrapper.html(this.$element)), this.$element.on("keyup"a.proxy(function() {
                
this.$element.find("ul, ol").length && this.cleanupLists()
            }, 
this)), this.setHTML(c, !0)
        }
        
this.$element.on("drop"a.proxy(function() {
            
setTimeout(a.proxy(function() {
                
a("html").click(), this.$element.find(".f-img-wrap").each(function(bc) {
                    
=== a(c).find("img").length && a(c).remove()
                }), 
this.$element.find(this.options.defaultTag ":empty").remove()
            }, 
this), 1)
        }, 
this))
    }, 
b.prototype.trim = function(a) {
        return 
String(a).replace(/^s+|s+$/g""), a.replace(/u200B/gi"")
    }, 
b.prototype.unwrapText = function() {
        
this.options.paragraphy || this.$element.find(this.options.defaultTag).each(a.proxy(function(bc) {
            if (
=== c.attributes.length) {
                var 
a(c).find("br:last");
                
a(c).replaceWith(d.length && this.isLastSibling(d.get(0)) ? a(c).html() : a(c).html() + "<br/>")
            }
        }, 
this))
    }, 
b.prototype.wrapTextInElement = function(bc) {
        
void 0 === && (= !1);
        var 
= [],
            
= ["SPAN""A""B""I""EM""U""S""STRONG""STRIKE""FONT""IMG""SUB""SUP"],
            
this;
        
this.no_verify = !0;
        var 
= function() {
            if (
=== d.length) return !1;
            var 
a("<" f.options.defaultTag ">"),
                
a(d[0]);
            if (
== d.length && "f-marker" == c.attr("class")) return void(= []);
            for (var 
0d.lengthe++) {
                var 
a(d[e]);
                
b.append(g.clone()), == d.length g.replaceWith(b) : g.remove()
            }
            
= []
        }, 
= !1,
            
= !1,
            
= !1;
        
b.contents().filter(function() {
            var 
a(this);
            if (
b.hasClass("f-marker") || b.find(".f-marker").length) {
                var 
b;
                if (
== b.find(".f-marker").length || b.hasClass("f-marker")) {
                    
b.find(".f-marker").length a(b.find(".f-marker")[0]) : b;
                    var 
k.prev();
                    
"true" === k.attr("data-type") ? l.length && a(l[0]).hasClass("f-marker") ? = !: (= !0= !1) : = !0
                
} else = !0
            
}
            
this.nodeType == Node.TEXT_NODE && b.text().length || e.indexOf(this.tagName) >= d.push(this) : this.nodeType == Node.TEXT_NODE && === b.text().length && f.options.beautifyCode b.remove() : || || ? ("BR" === this.tagName && (d.length b.remove() : d.push(this)), g(), && (= !1), = !1) : = []
        }), (
|| || j) && g(), b.find("> " this.options.defaultTag).each(function(bc) {
            
=== a(c).text().trim().length && === a(c).find("img").length && === a(c).find("br").length && a(c).append(this.br)
        }), 
b.find("div:empty:not([class])").remove(), b.is(":empty") && b.append(f.options.paragraphy === !"<" this.options.defaultTag ">" this.br "</" this.options.defaultTag ">" this.br), this.no_verify = !1
    
}, b.prototype.wrapText = function(b) {
        if (
this.isImage || this.isLink) return !1;
        
this.allow_div = !0this.removeBlankSpans();
        for (var 
this.getSelectionElements(), 0c.lengthd++) {
            var 
a(c[d]);
            [
"LI""TH""TD"].indexOf(e.get(0).tagName) >= this.wrapTextInElement(e, !0) : this.parents(e"li").length this.wrapTextInElement(a(this.parents(e"li")[0]), b) : this.wrapTextInElement(this.$elementb)
        }
        
this.allow_div = !1
    
}, b.prototype.setHTML = function(bc) {
        
this.no_verify = !0this.allow_div = !0void 0 === && (= !0), this.clean(b, !0, !1), b.replace(/>s+</g"><"), this.$element.html(b), this.$element.find("pre").each(function(bc) {
            var 
a(c),
                
a(c).html();
            
e.indexOf("n") >= && d.html(e.replace(/n/g"<br>"))
        }), 
this.imageList = [], this.refreshImageList(), this.options.paragraphy && this.wrapText(!0), this.$element.find("li:empty").append(a.Editable.INVISIBLE_SPACE), this.cleanupLists(), this.cleanify(!1, !0, !1), && (this.restoreSelectionByMarkers(), this.sync()), this.$element.find("span").attr("data-fr-verified", !0), this.initialized && (this.hide(), this.closeImageMode(), this.imageMode = !1), this.no_verify = !1this.allow_div = !1
    
}, b.prototype.beforePaste = function() {
        
this.saveSelectionByMarkers(), this.clipboardHTML nullthis.scrollPosition this.$window.scrollTop(), this.$pasteDiv a('<div contenteditable="true" style="position: fixed; top: 0; left: -9999px; height: 100%; width: 0; z-index: 99999; line-height: 140%;"></div>').appendTo("body"), this.$pasteDiv.focus(), this.window.setTimeout(a.proxy(this.processPastethis), 1)
    }, 
b.prototype.processPaste = function() {
        var 
this.clipboardHTML;
        
null === this.clipboardHTML && (this.$pasteDiv.html(), this.restoreSelectionByMarkers(), this.$window.scrollTop(this.scrollPosition));
        var 
dthis.triggerEvent("onPaste", [c], !1);
        
"string" == typeof e && (e), c.replace(/<img /gi'<img data-fr-image-pasted="true" '), c.match(/(class="?Mso|style="[^"]*bmso-|w:WordDocument)/gi) ? (d = this.wordClean(c), d = this.clean(a("<div>").append(d).html(), !1, !0), d = this.removeEmptyTags(d)) : (d = this.clean(c, !1, !0), d = this.removeEmptyTags(d), b.copiedText && a("<div>").html(d).text().replace(/u00A0/gi, " ") == b.copiedText.replace(/(u00A0|r|n)/gi, " ") && (d = b.copiedHTML)), this.options.plainPaste && (d = this.plainPasteClean(d)), "" !== d && (this.insertHTML(d, !0, !0), this.saveSelectionByMarkers(), this.removeBlankSpans(), this.$element.find(this.valid_nodes.join(":empty, ") + ":empty").remove(), this.restoreSelectionByMarkers(), this.$element.find("li[data-indent]").each(a.proxy(function(b, c) {
            this.indentLi ? (a(c).removeAttr("
data-indent"), this.indentLi(a(c))) : a(c).removeAttr("data-indent")
        }, this)), this.
$element.find("li").each(a.proxy(function(b, c) {
            this.wrapTextInElement(a(c), !0)
        }, this)), this.options.paragraphy && this.wrapText(!0), this.cleanupLists()), this.afterPaste()
    }, b.prototype.afterPaste = function() {
        this.uploadPastedImages(), this.checkPlaceholder(), this.pasting = !1, this.triggerEvent("
afterPaste", [], !0, !1)
    }, b.prototype.getSelectedHTML = function() {
        function b(b, d) {
            for (; 3 == d.nodeType || c.valid_nodes.indexOf(d.tagName) < 0;) 3 != d.nodeType && a(b).wrapInner("
<" + d.tagName + c.attrs(d) + "></" + d.tagName + ">"), d = d.parentNode
        }
        var c = this,
            d = "";
        if ("
undefined" != typeof window.getSelection)
            for (var e = this.getRanges(), f = 0; f < e.length; f++) {
                var g = document.createElement("
div");
                g.appendChild(e[f].cloneContents()), b(g, this.getSelectionParent()), d += g.innerHTML
            } else "
undefined" != typeof document.selection && "Text" == document.selection.type && (d = document.selection.createRange().htmlText);
        return d
    }, b.prototype.registerPaste = function() {
        this.
$element.on("copy cut", a.proxy(function() {
            this.isHTML || (b.copiedHTML = this.getSelectedHTML(), b.copiedText = a("
<div>").html(b.copiedHTML).text())
        }, this)), this.
$element.on("paste", a.proxy(function(b) {
            if (!this.isHTML) {
                if (b.originalEvent && (b = b.originalEvent), !this.triggerEvent("
beforePaste", [], !1)) return !1;
                if (this.clipboardPaste(b)) return !1;
                this.clipboardHTML = "", this.pasting = !0, this.scrollPosition = this.
$window.scrollTop();
                var c = !1;
                if (b && b.clipboardData && b.clipboardData.getData) {
                    var d = "",
                        e = b.clipboardData.types;
                    if (a.Editable.isArray(e))
                        for (var f = 0; f < e.length; f++) d += e[f] + "
;";
                    else d = e; if (/text/html/.test(d) ? this.clipboardHTML = b.clipboardData.getData("
text/html") : /text/rtf/.test(d) && this.browser.safari ? this.clipboardHTML = b.clipboardData.getData("text/rtf") : /text/plain/.test(d) && !this.browser.mozilla && (this.clipboardHTML = b.clipboardData.getData("text/plain").replace(/n/g, "<br/>")), "" !== this.clipboardHTML ? c = !0 : this.clipboardHTML = null, c) return this.processPaste(), b.preventDefault && (b.stopPropagation(), b.preventDefault()), !1
                }
                this.beforePaste()
            }
        }, this))
    }, b.prototype.clipboardPaste = function(b) {
        if (b && b.clipboardData && b.clipboardData.items && b.clipboardData.items[0]) {
            var c = b.clipboardData.items[0].getAsFile();
            if (c) {
                var d = new FileReader;
                return d.onload = a.proxy(function(a) {
                    var b = a.target.result;
                    this.insertHTML('<img data-fr-image-pasted="
true" src="' + b + '" />'), this.afterPaste()
                }, this), d.readAsDataURL(c), !0
            }
        }
        return !1
    }, b.prototype.uploadPastedImages = function() {
        this.
$element.find("img[data-fr-image-pasted]").each(a.proxy(function(b, c) {
            this.options.pasteImage ? (0 === c.src.indexOf("
data:") ? (this.options.defaultImageWidth && a(c).attr("width", this.options.defaultImageWidth), this.options.pastedImagesUploadURL && (setTimeout(a.proxy(function() {
                this.showImageLoader(), this.
$progress_bar.find("span").css("width", "100%").text("Please wait!"), this.showByCoordinates(a(c).offset().left + a(c).width() / 2, a(c).offset().top + a(c).height() + 10), this.isDisabled = !0
            }, this), 10), a.ajax({
                type: this.options.pastedImagesUploadRequestType,
                url: this.options.pastedImagesUploadURL,
                data: a.extend({
                    image: decodeURIComponent(c.src)
                }, this.options.imageUploadParams),
                crossDomain: this.options.crossDomain,
                xhrFields: {
                    withCredentials: this.options.withCredentials
                },
                headers: this.options.headers,
                dataType: "
json"
            }).done(a.proxy(function(b) {
                try {
                    if (b.link) {
                        var d = new Image;
                        d.onerror = a.proxy(function() {
                            a(c).remove(), this.hide(), this.throwImageError(1)
                        }, this), d.onload = a.proxy(function() {
                            c.src = b.link, this.hideImageLoader(), this.hide(), this.enable(), setTimeout(function() {
                                a(c).trigger("
touchend")
                            }, 50), this.triggerEvent("
afterUploadPastedImage", [a(c)])
                        }, this), d.src = b.link
                    } else b.error ? (a(c).remove(), this.hide(), this.throwImageErrorWithMessage(b.error)) : (a(c).remove(), this.hide(), this.throwImageError(2))
                } catch (e) {
                    a(c).remove(), this.hide(), this.throwImageError(4)
                }
            }, this)).fail(a.proxy(function() {
                a(c).remove(), this.hide(), this.throwImageError(3)
            }, this)))) : 0 !== c.src.indexOf("
http") && a(c).remove(), a(c).removeAttr("data-fr-image-pasted")) : a(c).remove()
        }, this))
    }, b.prototype.disable = function() {
        this.isDisabled = !0, this.
$element.blur(), this.$box.addClass("fr-disabled"), this.$element.attr("contenteditable", !1)
    }, b.prototype.enable = function() {
        this.isDisabled = !1, this.
$box.removeClass("fr-disabled"), this.$element.attr("contenteditable", !0)
    }, b.prototype.wordClean = function(a) {
        a.indexOf("
<body") >= 0 && (a = a.replace(/[.sSwW<>]*<body[^>]*>([.sSwW<>]*)</body>[.sSwW<>]*/g, "$1")), a = a.replace(/<p(.*?)class="?'?MsoListParagraph"?'? ([sS]*?)>([sS]*?)</p>/gi"<ul><li>$3</li></ul>"), a.replace(/<p(.*?)class="?'?NumberedText"?'? ([sS]*?)>([sS]*?)</p>/gi, "<ol><li>$3</li></ol>"), a = a.replace(/<p(.*?)class="?'?MsoListParagraphCxSpFirst"?'?([sS]*?)(leveld)([sS]*?)>([sS]*?)</p>/gi, "<ul><li$3>$5</li>"), a = a.replace(/<p(.*?)class="?'?NumberedTextCxSpFirst"?'?([sS]*?)(leveld)([sS]*?)>([sS]*?)</p>/gi"<ol><li$3>$5</li>"), a.replace(/<p(.*?)class="?'?MsoListParagraphCxSpMiddle"?'?([sS]*?)(leveld)([sS]*?)>([sS]*?)</p>/gi, "<li$3>$5</li>"), a = a.replace(/<p(.*?)class="?'?NumberedTextCxSpMiddle"?'?([sS]*?)(leveld)([sS]*?)>([sS]*?)</p>/gi, "<li$3>$5</li>"), a = a.replace(/<p(.*?)class="?'?MsoListParagraphCxSpLast"?'?([sS]*?)(leveld)([sS]*?)>([sS]*?)</p>/gi"<li$3>$5</li></ul>"), a.replace(/<p(.*?)class="?'?NumberedTextCxSpLast"?'?([sS]*?)(leveld)([sS]*?)>([sS]*?)</p>/gi, "<li$3>$5</li></ol>"), a = a.replace(/<span([^<]*?)style="?'?mso-list:Ignore"?'?([sS]*?)>([sS]*?)<span/gi, "<span><span"), a = a.replace(/<!--[if !supportLists]-->([sS]*?)<!--[endif]-->/gi, ""), a = a.replace(/<![if !supportLists]>([sS]*?)<![endif]>/gi, ""), a = a.replace(/(n|r| class=(")?Mso[a-zA-Z0-9]+(")?)/gi, " "), a = a.replace(/<!--[sS]*?-->/gi, ""), a = a.replace(/<(/)*(meta|link|span|\?xml:|st1:|o:|font)(.*?)>/gi, "");
        for (var b = ["
style", "script", "applet", "embed", "noframes", "noscript"], c = 0; c < b.length; c++) {
            var d = new RegExp("
<" + b[c] + ".*?" + b[c] + "(.*?)>", "gi");
            a = a.replace(d, "")
        }
        a = a.replace(/([w-]*)=("
[^<>"]*"|'[^<>']*'|w+)/gi, ""), a = a.replace(/&nbsp;/gi, " ");
        var e;
        do e = a, a = a.replace(/<[^/>][^>]*></[^>]+>/gi, ""); while (a != e);
        return a = a.replace(/<lilevel([^1])([^>]*)>/gi, '
<li data-indent="true"$2>'), a = a.replace(/<lilevel1([^>]*)>/gi, "<li$1>"), a = this.clean(a), a = a.replace(/<a>(.[^<]+)</a>/gi, "$1")
    }, b.prototype.tabs = function(a) {
        for (var b = "", c = 0; a > c; c++) b += "  ";
        return b
    }, b.prototype.cleanTags = function(a, b) {
        void 0 === b && (b = !1);
        var c, d, e, f, g = [],
            h = [],
            i = !1,
            j = !1,
            k = this.options.formatTags;
        for (d = 0; d < a.length; d++)
            if (c = a.charAt(d), "<" == c) {
                var l = a.indexOf(">", d + 1);
                if (-1 !== l) {
                    var m = a.substring(d, l + 1),
                        n = this.tagName(m);
                    if ("head" == n && this.options.fullPage && (j = !0), j) {
                        h.push(m), d = l, "head" == n && this.isClosingTag(m) && (j = !1);
                        continue
                    }
                    if (this.options.allowedTags.indexOf(n) < 0 && (!this.options.fullPage || ["html", "head", "body", "!doctype"].indexOf(n) < 0)) {
                        d = l;
                        continue
                    }
                    if (0 === n.indexOf("!")) {
                        h.push(m), d = l;
                        continue
                    }
                    var o = this.isClosingTag(m);
                    if ("pre" === n && (i = o ? !1 : !0), this.isSelfClosingTag(m)) h.push("br" === n && i ? "n" : m);
                    else if (o)
                        for (e = !1, f = !0; e === !1 && void 0 !== f;) f = g.pop(), void 0 !== f && f.tag_name !== n ? h.splice(f.i, 1) : (e = !0, void 0 !== f && h.push(m));
                    else h.push(m), g.push({
                        tag_name: n,
                        i: h.length - 1
                    });
                    d = l
                }
            } else "n" === c && this.options.beautifyCode ? b && i ? h.push("<br/>") : i ? h.push(c) : g.length > 0 && h.push(" ") : 9 != c.charCodeAt(0) && h.push(c);
        for (; g.length > 0;) f = g.pop(), h.splice(f.i, 1);
        var p = "n";
        this.options.beautifyCode || (p = ""), a = "", g = 0;
        var q = !0;
        for (d = 0; d < h.length; d++) 1 == h[d].length ? q && " " === h[d] || (a += h[d], q = !1) : k.indexOf(this.tagName(h[d]).toLowerCase()) < 0 ? (a += h[d], "br" == this.tagName(h[d]) && (a += p)) : this.isSelfClosingTag(h[d]) ? k.indexOf(this.tagName(h[d]).toLowerCase()) >= 0 ? (a += this.tabs(g) + h[d] + p, q = !1) : a += h[d] : this.isClosingTag(h[d]) ? (g -= 1, 0 === g && (q = !0), a.length > 0 && a[a.length - 1] == p && (a += this.tabs(g)), a += h[d] + p) : (a += p + this.tabs(g) + h[d], g += 1, q = !1);
        return a[0] == p && (a = a.substring(1, a.length)), a[a.length - 1] == p && (a = a.substring(0, a.length - 1)), a
    }, b.prototype.cleanupLists = function() {
        this.$element.find("ul, ol").each(function(b, c) {
            var d = a(c);
            if (d.find(".close-ul, .open-ul, .close-ol, .open-ol, .open-li, .close-li").length > 0) {
                var e = "<" + c.tagName.toLowerCase() + ">" + d.html() + "</" + c.tagName.toLowerCase() + ">";
                e = e.replace(new RegExp('
<span class="close-ul" data-fr-verified="true"></span>', "g"), "</ul>"), e = e.replace(new RegExp('<span class="open-ul" data-fr-verified="true"></span>', "g"), "<ul>"), e = e.replace(new RegExp('<span class="close-ol" data-fr-verified="true"></span>', "g"), "</ol>"), e = e.replace(new RegExp('<span class="open-ol" data-fr-verified="true"></span>', "g"), "<ol>"), e = e.replace(new RegExp('<span class="close-li" data-fr-verified="true"></span>', "g"), "</li>"), e = e.replace(new RegExp('<span class="open-li" data-fr-verified="true"></span>', "g"), "<li>"), d.replaceWith(e)
            }
        }), this.$element.find("li > td").remove(), this.$element.find("li td:empty").append(a.Editable.INVISIBLE_SPACE), this.$element.find("ul, ol").each(a.proxy(function(b, c) {
            var d = a(c);
            0 === d.find(this.valid_nodes.join(",")).length && d.remove()
        }, this)), this.$element.find("li > ul, li > ol").each(a.proxy(function(b, c) {
            this.isFirstSibling(c) && a(c).before("<br/>")
        }, this)), this.$element.find("li:empty").remove();
        for (var b = this.$element.find("ol + ol, ul + ul"), c = 0; c < b.length; c++) {
            var d = a(b[c]);
            d.prev().append(d.html()), d.remove()
        }
        this.$element.find("li > td").remove(), this.$element.find("li td:empty").append(a.Editable.INVISIBLE_SPACE), this.$element.find("li > " + this.options.defaultTag).each(function(b, c) {
            0 === c.attributes.length && a(c).replaceWith(a(c).html())
        })
    }, b.prototype.clean = function(c, d, e, f, g) {
        g || (g = a.merge([], this.options.allowedAttrs)), f || (f = a.merge([], this.options.allowedTags)), d || g.indexOf("id") > -1 && g.splice(g.indexOf("id"), 1), this.options.fullPage && (c = c.replace(/<!DOCTYPE([^>]*?)>/i, "<!-- DOCTYPE$1 -->"), c = c.replace(/<html([^>]*?)>/i, "<!-- html$1 -->"), c = c.replace(/</html([^>]*?)>/i, "<!-- /html$1 -->"), c = c.replace(/<body([^>]*?)>/i, "<!-- body$1 -->"), c = c.replace(/</body([^>]*?)>/i, "<!-- /body$1 -->"), c = c.replace(/<head>([wW]*)</head>/i, function(a, b) {
            var c = 1;
            return b = b.replace(/(<style)/gi, function(a, b) {
                return b + " data-id=" + c++
            }), "<!-- head " + b.replace(/(>)([s|t]*)(<)/gi, "$1$3").replace(/</gi, "[").replace(/>/gi, "]") + " -->"
        })), this.options.allowComments ? (this.options.allowedTags.push("!--"), this.options.allowedTags.push("!")) : c = c.replace(/<!--.*?-->/gi, ""), this.options.allowScript ? f.push("script") : c = c.replace(/<scriptb[^<]*(?:(?!</script>)<[^<]*)*</script>/gi, ""), this.options.allowStyle ? f.push("style") : c = c.replace(/<styleb[^<]*(?:(?!</style>)<[^<]*)*</style>/gi, "");
        var h = new RegExp("<\/?((?!(?:" + f.join(" |") + " |" + f.join(">|") + ">|" + f.join("/>|") + "/>))\w+)[^>]*?>", "gi");
        c = c.replace(h, "");
        var i = new RegExp("( (?!(?:" + g.join("|") + "))[a-zA-Z0-9-_]+)=((?:.(?!\s+(?:\S+)=|[>]|(\/>)))+.)", "gi");
        if (c = c.replace(/</?[^>]*?>/gi, function(a) {
            return a.replace(i, "")
        }), this.pasting && b.copiedText === a("<div>").html(c).text() && (e = !1, d = !0), e) {
            var j = new RegExp("style=("[a-zA-Z0-9:;\.\s\(\)\-\,!\/'
%]*"|'[a-zA-Z0-9:;\.\s\(\)\-\,!\/"%]*')", "gi");
            c = c.replace(j, ""), c = c.replace(/<styleb[^<]*(?:(?!</style>)<[^<]*)*</style>/gi, "")
        }
        c = this.cleanTags(c, !0), c = c.replace(/(r|n)/gi, "");
        var k = new RegExp("<([^>]*)( src| href)=('
[^']*'|"[^"]*"|[^\s>]+)([^>]*)>""gi");
        if (
c.replace(ka.proxy(function(abcde) {
            return 
"<" '="' this.sanitizeURL(d.replace(/^["'](.*)["']/?$/gi, "$1")) + '"' + e + ">"
        }, this)), !d) {
            var l = a("
<div>").append(c);
            l.find('[class]:not([class^="
fr-"])').each(function(b, c) {
                a(c).removeAttr("
class")
            }), c = l.html()
        }
        return c
    }, b.prototype.removeBlankSpans = function() {
        this.no_verify = !0, this.
$element.find("span").removeAttr("data-fr-verified"), this.$element.find("span").each(a.proxy(function(b, c) {
            0 === this.attrs(c).length && a(c).replaceWith(a(c).html())
        }, this)), this.
$element.find("span").attr("data-fr-verified", !0), this.no_verify = !1
    }, b.prototype.plainPasteClean = function(b) {
        var c = a("
<div>").html(b);
        c.find("
h1h2h3h4h5h6preblockquoteli").each(a.proxy(function(b, c) {
            a(c).replaceWith("
<" + this.options.defaultTag + ">" + a(c).html() + "</" + this.options.defaultTag + ">")
        }, this));
        for (var d = function(b, c) {
            a(c).replaceWith(a(c).html())
        }; c.find("
strongemstrikebuisupsubspana").length;) c.find("strongemstrikebuisupsubspana").each(d);
        return c.html()
    }, b.prototype.removeEmptyTags = function(b) {
        for (var c, d = a("
<div>").html(b), e = d.find("*:empty:not(brimgtdth)"); e.length;) {
            for (c = 0; c < e.length; c++) a(e[c]).remove();
            e = d.find("
*:empty:not(brimgtdth)")
        }
        d.find("
div").each(function(b, c) {
            a(c).replaceWith(a(c).html() + "
<br/>")
        });
        for (var f = d.find("
div"); f.length;) {
            for (c = 0; c < f.length; c++) {
                var g = a(f[c]),
                    h = g.html().replace(/u0009/gi, "").trim();
                g.replaceWith(h)
            }
            f = d.find("
div")
        }
        return d.html()
    }, b.prototype.initElementStyle = function() {
        this.editableDisabled || this.
$element.attr("contenteditable", !0);
        var a = "
froala-view froala-element " + this.options.editorClass;
        this.browser.msie && b.getIEversion() < 9 && (a += " 
ie8"), this.$element.css("outline", 0), this.browser.msie || (a += " not-msie"), this.$element.addClass(a)
    }, b.prototype.CJKclean = function(a) {
        var b = /[u3041-u3096u30A0-u30FFu4E00-u9FFFu3130-u318FuAC00-uD7AF]/gi;
        return a.replace(b, "")
    }, b.prototype.enableTyping = function() {
        this.typingTimer = null, this.
$element.on("keydown", "textareainput", function(a) {
            a.stopPropagation()
        }), this.
$element.on("keydown cut", a.proxy(function(b) {
            if (!this.isHTML) {
                if (!this.options.multiLine && 13 == b.which) return b.preventDefault(), b.stopPropagation(), !1;
                if ("
keydown" === b.type && !this.triggerEvent("keydown", [b], !1)) return !1;
                clearTimeout(this.typingTimer), this.ajaxSave = !1, this.oldHTML = this.getHTML(!0, !1), this.typingTimer = setTimeout(a.proxy(function() {
                    var a = this.getHTML(!0, !1);
                    this.ime || this.CJKclean(a) === this.CJKclean(this.oldHTML) || this.CJKclean(a) !== a || this.sync()
                }, this), Math.max(this.options.typingTimer, 500))
            }
        }, this))
    }, b.prototype.removeMarkersByRegex = function(a) {
        return a.replace(/<span[^>]*? classs*=s*["']?f-marker["'
]?[^>]+>([Ss][^/])*</span>/gi"")
    }, 
b.prototype.getImageHTML = function() {
        return 
JSON.stringify({
            
srcthis.$element.find("img").attr("src"),
            
stylethis.$element.find("img").attr("style"),
            
altthis.$element.find("img").attr("alt"),
            
widththis.$element.find("img").attr("width"),
            
linkthis.$element.find("a").attr("href"),
            
link_titlethis.$element.find("a").attr("title"),
            
link_targetthis.$element.find("a").attr("target")
        })
    }, 
b.prototype.getLinkHTML = function() {
        return 
JSON.stringify({
            
bodythis.$element.html(),
            
hrefthis.$element.attr("href"),
            
titlethis.$element.attr("title"),
            
popoutthis.$element.hasClass("popout"),
            
nofollow"nofollow" == this.$element.attr("ref"),
            
blank"_blank" == this.$element.attr("target"),
            
clsthis.$element.attr("class") ? this.$element.attr("class").replace(/froala-element ?|not-msie ?|froala-view ?/gi"").trim() : ""
        
})
    }, 
b.prototype.addFrTag = function() {
        
this.$element.find(this.valid_nodes.join(",") + ", table, ul, ol, img").addClass("fr-tag")
    }, 
b.prototype.removeFrTag = function() {
        
this.$element.find(this.valid_nodes.join(",") + ", table, ul, ol, img").removeClass("fr-tag")
    }, 
b.prototype.getHTML = function(bcd) {
        if (
void 0 === && (= !1), void 0 === && (this.options.useFrTag), void 0 === && (= !0), this.$element.hasClass("f-placeholder") && !b) return "";
        if (
this.isHTML) return this.$html_area.val();
        if (
this.isImage) return this.getImageHTML();
        if (
this.isLink) return this.getLinkHTML();
        
this.$element.find("a").data("fr-link", !0), && this.addFrTag(), this.$element.find(".f-img-editor > img").each(a.proxy(function(bc) {
            
a(c).removeClass("fr-fin fr-fil fr-fir fr-dib fr-dii").addClass(this.getImageClass(a(c).parent().attr("class")))
        }, 
this)), this.options.useClasses || this.$element.find("img").each(a.proxy(function(bc) {
            var 
a(c);
            
d.attr("data-style"this.getImageStyle(d))
        }, 
this)), this.$element.find("pre").each(a.proxy(function(bc) {
            var 
a(c),
                
d.html(),
                
e.replace(/&nbsp;/gi" ");
            
!= && (this.saveSelectionByMarkers(), d.html(f), this.restoreSelectionByMarkers())
        }, 
this)), this.$element.find("pre br").addClass("fr-br"), this.$element.find('[class=""]').removeAttr("class");
        var 
this.$element.html();
        if (
this.removeFrTag(), this.$element.find("pre br").removeAttr("class"), e.replace(/<a[^>]*?></a>/g, ""), b || (e = this.removeMarkersByRegex(e)), e = e.replace(/<span[^>]*? classs*=s*["']?f-img-handle[^>]+></span>/gi, ""), e = e.replace(/^([Ss]*)<span[^>]*? classs*=s*["']?f-img-editor[^>]+>([Ss]*)</span>([Ss]*)$/gi, "$1$2$3"), e = e.replace(/^([Ss]*)<span[^>]*? classs*=s*["']?f-img-wrap[^>]+>([Ss]*)</span>([Ss]*)$/gi, "$1$2$3"), this.options.useClasses || (e = e.replace(/data-style/gi, "style"), e = e.replace(/(<img[^>]*)( classs*=['"]?[a-zA-Z0-9- ]+['"]?)([^>]*/?>)/gi, "$1$3")), this.options.simpleAmpersand && (e = e.replace(/&amp;/gi, "&")), d && (e = e.replace(/ data-fr-verified="true"/gi, "")), this.options.beautifyCode && (e = e.replace(/n/gi, "")), e = e.replace(/<br class="fr-br">/gi, "n"), e = e.replace(/u200B/gi, ""), this.options.fullPage && (e = e.replace(/<!-- DOCTYPE([^>]*?) -->/i, "<!DOCTYPE$1>"), e = e.replace(/<!-- html([^>]*?) -->/i, "<html$1>"), e = e.replace(/<!-- /html([^>]*?) -->/i, "</html$1>"), e = e.replace(/<!-- body([^>]*?) -->/i, "<body$1>"), e = e.replace(/<!-- /body([^>]*?) -->/i, "</body$1>"), e = e.replace(/<!-- head ([wW]*?) -->/i, function(a, b) {
            return "<head>" + b.replace(/[/gi, "<").replace(/]/gi, ">") + "</head>"
        })), c) {
            var f = this.triggerEvent("getHTML", [e], !1);
            if ("string" == typeof f) return f
        }
        return e
    }, b.prototype.getText = function() {
        return this.$element.text()
    }, b.prototype.setDirty = function(a) {
        this.dirty = a, a || (clearTimeout(this.ajaxInterval), this.ajaxHTML = this.getHTML(!1, !1))
    }, b.prototype.initAjaxSaver = function() {
        this.ajaxHTML = this.getHTML(!1, !1), this.ajaxSave = !0, this.ajaxInterval = setInterval(a.proxy(function() {
            var a = this.getHTML(!1, !1);
            (this.ajaxHTML != a || this.dirty) && this.ajaxSave && (this.options.autosave && this.save(), this.dirty = !1, this.ajaxHTML = a), this.ajaxSave = !0
        }, this), Math.max(this.options.autosaveInterval, 100))
    }, b.prototype.disableBrowserUndo = function() {
        this.$element.keydown(a.proxy(function(a) {
            var b = a.which,
                c = (a.ctrlKey || a.metaKey) && !a.altKey;
            if (!this.isHTML && c) {
                if (90 == b && a.shiftKey) return a.preventDefault(), !1;
                if (90 == b) return a.preventDefault(), !1
            }
        }, this))
    }, b.prototype.shortcutEnabled = function(a) {
        return this.options.shortcutsAvailable.indexOf(a) >= 0
    }, b.prototype.shortcuts_map = {
        69: {
            cmd: "show",
            params: [null],
            id: "show"
        },
        66: {
            cmd: "exec",
            params: ["bold"],
            id: "bold"
        },
        73: {
            cmd: "exec",
            params: ["italic"],
            id: "italic"
        },
        85: {
            cmd: "exec",
            params: ["underline"],
            id: "underline"
        },
        83: {
            cmd: "exec",
            params: ["strikeThrough"],
            id: "strikeThrough"
        },
        75: {
            cmd: "exec",
            params: ["createLink"],
            id: "createLink"
        },
        80: {
            cmd: "exec",
            params: ["insertImage"],
            id: "insertImage"
        },
        221: {
            cmd: "exec",
            params: ["indent"],
            id: "indent"
        },
        219: {
            cmd: "exec",
            params: ["outdent"],
            id: "outdent"
        },
        72: {
            cmd: "exec",
            params: ["html"],
            id: "html"
        },
        48: {
            cmd: "exec",
            params: ["formatBlock", "n"],
            id: "formatBlock n"
        },
        49: {
            cmd: "exec",
            params: ["formatBlock", "h1"],
            id: "formatBlock h1"
        },
        50: {
            cmd: "exec",
            params: ["formatBlock", "h2"],
            id: "formatBlock h2"
        },
        51: {
            cmd: "exec",
            params: ["formatBlock", "h3"],
            id: "formatBlock h3"
        },
        52: {
            cmd: "exec",
            params: ["formatBlock", "h4"],
            id: "formatBlock h4"
        },
        53: {
            cmd: "exec",
            params: ["formatBlock", "h5"],
            id: "formatBlock h5"
        },
        54: {
            cmd: "exec",
            params: ["formatBlock", "h6"],
            id: "formatBlock h6"
        },
        222: {
            cmd: "exec",
            params: ["formatBlock", "blockquote"],
            id: "formatBlock blockquote"
        },
        220: {
            cmd: "exec",
            params: ["formatBlock", "pre"],
            id: "formatBlock pre"
        }
    }, b.prototype.ctrlKey = function(a) {
        if (-1 != navigator.userAgent.indexOf("Mac OS X")) {
            if (a.metaKey && !a.altKey) return !0
        } else if (a.ctrlKey && !a.altKey) return !0;
        return !1
    }, b.prototype.initShortcuts = function() {
        this.options.shortcuts && this.$element.on("keydown", a.proxy(function(a) {
            var b = a.which,
                c = this.ctrlKey(a);
            if (!this.isHTML && c) {
                if (this.shortcuts_map[b] && this.shortcutEnabled(this.shortcuts_map[b].id)) return this.execDefaultShortcut(this.shortcuts_map[b].cmd, this.shortcuts_map[b].params);
                if (90 == b && a.shiftKey) return a.preventDefault(), a.stopPropagation(), this.redo(), !1;
                if (90 == b) return a.preventDefault(), a.stopPropagation(), this.undo(), !1
            }
        }, this))
    }, b.prototype.initTabs = function() {
        this.$element.on("keydown", a.proxy(function(a) {
            var b = a.which;
            if (9 != b || a.shiftKey) 9 == b && a.shiftKey && (this.raiseEvent("shift+tab") ? this.options.tabSpaces ? a.preventDefault() : this.blur() : a.preventDefault());
            else if (this.raiseEvent("tab"))
                if (this.options.tabSpaces) {
                    a.preventDefault();
                    var c = "&nbsp;&nbsp;&nbsp;&nbsp;",
                        d = this.getSelectionElements()[0];
                    "PRE" === d.tagName && (c = "    "), this.insertHTML(c, !1)
                } else this.blur();
                else a.preventDefault()
        }, this))
    }, b.prototype.textEmpty = function(b) {
        var c = a(b).text().replace(/(rn|n|r|t)/gm, "");
        return ("" === c || b === this.$element.get(0)) && 0 === a(b).find("br").length
    }, b.prototype.inEditor = function(a) {
        for (; a && "BODY" !== a.tagName;) {
            if (a === this.$element.get(0)) return !0;
            a = a.parentNode
        }
        return !1
    }, b.prototype.focus = function(b) {
        if (this.isDisabled) return !1;
        if (void 0 === b && (b = !0), "" !== this.text() && !this.$element.is(":focus")) return void(this.browser.msie || this.$element.focus());
        if (!this.isHTML) {
            if (b && !this.pasting && this.$element.focus(), this.pasting && !this.$element.is(":focus") && this.$element.focus(), this.$element.hasClass("f-placeholder")) return void this.setSelection(this.$element.find(this.options.defaultTag).length > 0 ? this.$element.find(this.options.defaultTag)[0] : this.$element.get(0));
            var c = this.getRange();
            if ("" === this.text() && c && (0 === c.startOffset || c.startContainer === this.$element.get(0) || !this.inEditor(c.startContainer))) {
                var d, e, f = this.getSelectionElements();
                if (a.merge(["IMG", "BR"], this.valid_nodes).indexOf(this.getSelectionElement().tagName) < 0) return !1;
                if (c.startOffset > 0 && this.valid_nodes.indexOf(this.getSelectionElement().tagName) >= 0 && "BODY" != c.startContainer.tagName || c.startContainer && 3 === c.startContainer.nodeType) return;
                if (!this.options.paragraphy && f.length >= 1 && f[0] === this.$element.get(0)) {
                    var g = function(b) {
                        if (!b) return null;
                        if (3 == b.nodeType && b.textContent.length > 0) return b;
                        if (1 == b.nodeType && "BR" == b.tagName) return b;
                        for (var c = a(b).contents(), d = 0; d < c.length; d++) {
                            var e = g(c[d]);
                            if (null != e) return e
                        }
                        return null
                    };
                    if (0 === c.startOffset && this.$element.contents().length > 0 && 3 != this.$element.contents()[0].nodeType) {
                        var h = g(this.$element.get(0));
                        null != h && ("BR" == h.tagName ? this.$element.is(":focus") && (a(h).before(this.markers_html), this.restoreSelectionByMarkers()) : this.setSelection(h))
                    }
                    return !1
                }
                if (f.length >= 1 && f[0] !== this.$element.get(0))
                    for (d = 0; d < f.length; d++) {
                        if (e = f[d], !this.textEmpty(e) || this.browser.msie) return void this.setSelection(e);
                        if (this.textEmpty(e) && ["LI", "TD"].indexOf(e.tagName) >= 0) return
                    }
                if (c.startContainer === this.$element.get(0) && c.startOffset > 0 && !this.options.paragraphy) return void this.setSelection(this.$element.get(0), c.startOffset);
                for (f = this.$element.find(this.valid_nodes.join(",")), d = 0; d < f.length; d++)
                    if (e = f[d], !this.textEmpty(e) && 0 === a(e).find(this.valid_nodes.join(",")).length) return void this.setSelection(e);
                this.setSelection(this.$element.get(0))
            }
        }
    }, b.prototype.addMarkersAtEnd = function(b) {
        var c = b.find(this.valid_nodes.join(", "));
        0 === c.length && c.push(b.get(0));
        var d = c[c.length - 1];
        a(d).append(this.markers_html)
    }, b.prototype.setFocusAtEnd = function(a) {
        void 0 === a && (a = this.$element), this.addMarkersAtEnd(a), this.restoreSelectionByMarkers()
    }, b.prototype.breakHTML = function(b) {
        this.removeMarkers(), 0 === this.$element.find("break").length && this.insertSimpleHTML("<break></break>");
        var c = this.parents(this.$element.find("break"), a.merge(["UL", "OL"], this.valid_nodes).join(","))[0];
        if (this.parents(a(c), "ul, ol").length && (c = this.parents(a(c), "ul, ol")[0]), void 0 === c && (c = this.$element.get(0)), ["UL", "OL"].indexOf(c.tagName) >= 0) {
            var d = a("<div>").html(b);
            d.find("> li").wrap("<" + c.tagName + ">"), b = d.html()
        }
        if (c == this.$element.get(0)) {
            if (this.$element.find("break").next().length) {
                this.insertSimpleHTML('<div id="inserted-div">' + b + "</div>");
                var e = this.$element.find("div#inserted-div");
                this.setFocusAtEnd(e), this.saveSelectionByMarkers(), e.replaceWith(e.contents()), this.restoreSelectionByMarkers()
            } else this.insertSimpleHTML(b), this.setFocusAtEnd();
            return this.$element.find("break").remove(), this.checkPlaceholder(), !0
        }
        if ("TD" === c.tagName) return this.$element.find("break").remove(), this.insertSimpleHTML(b), !0;
        var f = a("<div>").html(b);
        if (this.addMarkersAtEnd(f), b = f.html(), this.emptyElement(a(c))) return a(c).replaceWith(b), this.restoreSelectionByMarkers(), this.checkPlaceholder(), !0;
        this.$element.find("li").each(a.proxy(function(b, c) {
            this.emptyElement(c) && a(c).addClass("empty-li")
        }, this));
        for (var g, h, i = a("<div></div>").append(a(c).clone()).html(), j = [], k = {}, l = [], m = 0, n = 0; n < i.length; n++)
            if (h = i.charAt(n), "<" == h) {
                var o = i.indexOf(">", n + 1);
                if (-1 !== o) {
                    g = i.substring(n, o + 1);
                    var p = this.tagName(g);
                    if (n = o, "break" == p) {
                        if (!this.isClosingTag(g)) {
                            for (var q = j.length - 1; q >= 0; q--) {
                                var r = this.tagName(j[q]);
                                l.push("</" + r + ">")
                            }
                            l.push(b);
                            for (var s = 0; s < j.length; s++) l.push(j[s])
                        }
                    } else if (l.push(g), !this.isSelfClosingTag(g))
                        if (this.isClosingTag(g)) {
                            var t = k[p].pop();
                            j.splice(t, 1)
                        } else j.push(g), void 0 === k[p] && (k[p] = []), k[p].push(j.length - 1)
                }
            } else m++, l.push(h);
        a(c).replaceWith(l.join("")), this.$element.find("li").each(a.proxy(function(b, c) {
            var d = a(c);
            d.hasClass("empty-li") ? d.removeClass("empty-li") : this.emptyElement(c) && d.remove()
        }, this)), this.cleanupLists(), this.restoreSelectionByMarkers()
    }, b.prototype.insertSimpleHTML = function(a) {
        var b, c;
        if (this.no_verify = !0, this.window.getSelection) {
            if (b = this.window.getSelection(), b.getRangeAt && b.rangeCount) {
                c = b.getRangeAt(0), c.deleteContents();
                var d = this.document.createElement("div");
                d.innerHTML = a;
                for (var e, f, g = this.document.createDocumentFragment(); e = d.firstChild;) f = g.appendChild(e);
                c.insertNode(g), f && (c = c.cloneRange(), c.setStartAfter(f), c.collapse(!0), b.removeAllRanges(), b.addRange(c))
            }
        } else if ((b = this.document.selection) && "Control" != b.type) {
            var h = b.createRange();
            h.collapse(!0), b.createRange().pasteHTML(a)
        }
        this.no_verify = !1
    }, b.prototype.insertHTML = function(b, c, d) {
        if (void 0 === c && (c = !0), void 0 === d && (d = !1), !this.isHTML && c && this.focus(), this.removeMarkers(), this.insertSimpleHTML("<break></break>"), this.checkPlaceholder(!0), this.$element.hasClass("f-placeholder")) return this.$element.html(b), this.options.paragraphy && this.wrapText(!0), this.$element.find("break").remove(), this.setFocusAtEnd(), this.checkPlaceholder(), !1;
        for (var e = a("<div>").append(b).find("*"), f = 0; f < e.length; f++)
            if (this.valid_nodes.indexOf(e[f].tagName) >= 0) return this.breakHTML(b), this.$element.find("break").remove(), !1;
        this.$element.find("break").remove(), this.insertSimpleHTML(b)
    }, b.prototype.execDefaultShortcut = function(a, b) {
        return this[a].apply(this, b), !1
    }, b.prototype.initEditor = function() {
        var c = "froala-editor";
        this.mobile() && (c += " touch"), this.browser.msie && b.getIEversion() < 9 && (c += " ie8"), this.$editor = a('<div class="' + c + '" style="display: none;">');
        var d = this.$document.find(this.options.scrollableContainer);
        d.append(this.$editor), this.options.inlineMode ? this.initInlineEditor() : this.initBasicEditor()
    }, b.prototype.refreshToolbarPosition = function() {
        this.$window.scrollTop() > this.$box.offset().top && this.$window.scrollTop() < this.$box.offset().top + this.$box.outerHeight() - this.$editor.outerHeight() ? (this.$element.css("padding-top", this.$editor.outerHeight() + this.$element.data("padding-top")), this.$placeholder.css("margin-top", this.$editor.outerHeight() + this.$element.data("padding-top")), this.$editor.addClass("f-scroll").removeClass("f-scroll-abs").css("bottom", "").css("left", this.$box.offset().left + parseFloat(this.$box.css("padding-left"), 10) - this.$window.scrollLeft()).width(this.$box.width() - parseFloat(this.$editor.css("border-left-width"), 10) - parseFloat(this.$editor.css("border-right-width"), 10)), this.iOS() && (this.$element.is(":focus") ? this.$editor.css("top", this.$window.scrollTop()) : this.$editor.css("top", ""))) : this.$window.scrollTop() < this.$box.offset().top ? this.iOS() && this.$element.is(":focus") ? (this.$element.css("padding-top", this.$editor.outerHeight() + this.$element.data("padding-top")), this.$placeholder.css("margin-top", this.$editor.outerHeight() + this.$element.data("padding-top")), this.$editor.addClass("f-scroll").removeClass("f-scroll-abs").css("bottom", "").css("left", this.$box.offset().left + parseFloat(this.$box.css("padding-left"), 10) - this.$window.scrollLeft()).width(this.$box.width() - parseFloat(this.$editor.css("border-left-width"), 10) - parseFloat(this.$editor.css("border-right-width"), 10)), this.$editor.css("top", this.$box.offset().top)) : (this.$editor.removeClass("f-scroll f-scroll-abs").css("bottom", "").css("top", "").width(""), this.$element.css("padding-top", ""), this.$placeholder.css("margin-top", "")) : this.$window.scrollTop() > this.$box.offset().top + this.$box.outerHeight() - this.$editor.outerHeight() && !this.$editor.hasClass("f-scroll-abs") && (this.$element.css("padding-top", this.$editor.outerHeight() + this.$element.data("padding-top")), this.$placeholder.css("margin-top", this.$editor.outerHeight() + this.$element.data("padding-top")), this.$editor.removeClass("f-scroll").addClass("f-scroll-abs"), this.$editor.css("bottom", 0).css("top", "").css("left", ""))
    }, b.prototype.toolbarTop = function() {
        this.options.toolbarFixed || this.options.inlineMode || (this.$element.data("padding-top", parseInt(this.$element.css("padding-top"), 10)), this.$window.on("scroll resize load", a.proxy(function() {
            this.refreshToolbarPosition()
        }, this)), this.iOS() && this.$element.on("focus blur", a.proxy(function() {
            this.refreshToolbarPosition()
        }, this)))
    }, b.prototype.initBasicEditor = function() {
        this.$element.addClass("f-basic"), this.$wrapper.addClass("f-basic"), this.$popup_editor = this.$editor.clone();
        var a = this.$document.find(this.options.scrollableContainer);
        this.$popup_editor.appendTo(a).addClass("f-inline"), this.$editor.addClass("f-basic").show(), this.$editor.insertBefore(this.$wrapper), this.toolbarTop()
    }, b.prototype.initInlineEditor = function() {
        this.$editor.addClass("f-inline"), this.$element.addClass("f-inline"), this.$popup_editor = this.$editor
    }, b.prototype.initDrag = function() {
        this.drag_support = {
            filereader: "undefined" != typeof FileReader,
            formdata: !! this.window.FormData,
            progress: "upload" in new XMLHttpRequest
        }
    }, b.prototype.initOptions = function() {
        this.setDimensions(), this.setSpellcheck(), this.setImageUploadURL(), this.setButtons(), this.setDirection(), this.setZIndex(), this.setTheme(), this.options.editInPopup && this.buildEditPopup(), this.editableDisabled || (this.setPlaceholder(), this.setPlaceholderEvents())
    }, b.prototype.isTouch = function() {
        return WYSIWYGModernizr.touch && void 0 !== this.window.Touch
    }, b.prototype.initEditorSelection = function() {
        this.$element.on("keyup", a.proxy(function(a) {
            return this.triggerEvent("keyup", [a], !1)
        }, this)), this.$element.on("focus", a.proxy(function() {
            this.blurred && (this.blurred = !1, this.pasting || "" !== this.text() || this.focus(!1), this.triggerEvent("focus", [], !1))
        }, this)), this.$element.on("mousedown touchstart", a.proxy(function() {
            return this.isDisabled ? !1 : void(this.isResizing() || (this.closeImageMode(), this.hide()))
        }, this)), this.options.disableRightClick && this.$element.contextmenu(a.proxy(function(a) {
            return a.preventDefault(), this.options.inlineMode && this.$element.focus(), !1
        }, this)), this.$element.on(this.mouseup, a.proxy(function(b) {
            if (this.isDisabled) return !1;
            if (!this.isResizing()) {
                var c = this.text();
                b.stopPropagation(), this.imageMode = !1, !("" !== c || this.options.alwaysVisible || this.options.editInPopup || (3 == b.which || 2 == b.button) && this.options.inlineMode && !this.isImage && this.options.disableRightClick) || this.link || this.imageMode ? this.options.inlineMode || this.refreshButtons() : setTimeout(a.proxy(function() {
                    c = this.text(), !("" !== c || this.options.alwaysVisible || this.options.editInPopup || (3 == b.which || 2 == b.button) && this.options.inlineMode && !this.isImage && this.options.disableRightClick) || this.link || this.imageMode || (this.show(b), this.options.editInPopup && this.showEditPopup())
                }, this), 0)
            }
            this.hideDropdowns(), this.hideOtherEditors()
        }, this)), this.$editor.on(this.mouseup, a.proxy(function(a) {
            return this.isDisabled ? !1 : void(this.isResizing() || (a.stopPropagation(), this.options.inlineMode === !1 && this.hide()))
        }, this)), this.$editor.on("mousedown", ".fr-dropdown-menu", a.proxy(function(a) {
            return this.isDisabled ? !1 : (a.stopPropagation(), void(this.noHide = !0))
        }, this)), this.$popup_editor.on("mousedown", ".fr-dropdown-menu", a.proxy(function(a) {
            return this.isDisabled ? !1 : (a.stopPropagation(), void(this.noHide = !0))
        }, this)), this.$popup_editor.on("mouseup", a.proxy(function(a) {
            return this.isDisabled ? !1 : void(this.isResizing() || a.stopPropagation())
        }, this)), this.$edit_popup_wrapper && this.$edit_popup_wrapper.on("mouseup", a.proxy(function(a) {
            return this.isDisabled ? !1 : void(this.isResizing() || a.stopPropagation())
        }, this)), this.setDocumentSelectionChangeEvent(), this.setWindowMouseUpEvent(), this.setWindowKeyDownEvent(), this.setWindowKeyUpEvent(), this.setWindowOrientationChangeEvent(), this.setWindowHideEvent(), this.setWindowBlurEvent(), this.options.trackScroll && this.setWindowScrollEvent(), this.setWindowResize()
    }, b.prototype.setWindowResize = function() {
        this.$window.on("resize." + this._id, a.proxy(function() {
            this.hide(), this.closeImageMode(), this.imageMode = !1
        }, this))
    }, b.prototype.blur = function(b) {
        this.blurred || this.pasting || (this.selectionDisabled = !0, this.triggerEvent("blur", []), b && 0 === a("*:focus").length && this.clearSelection(), this.isLink || this.isImage || (this.selectionDisabled = !1), this.blurred = !0)
    }, b.prototype.setWindowBlurEvent = function() {
        this.$window.on("blur." + this._id, a.proxy(function(a, b) {
            this.blur(b)
        }, this))
    }, b.prototype.setWindowHideEvent = function() {
        this.$window.on("hide." + this._id, a.proxy(function() {
            this.isResizing() ? this.$element.find(".f-img-handle").trigger("moveend") : this.hide(!1)
        }, this))
    }, b.prototype.setWindowOrientationChangeEvent = function() {
        this.$window.on("orientationchange." + this._id, a.proxy(function() {
            setTimeout(a.proxy(function() {
                this.hide()
            }, this), 10)
        }, this))
    }, b.prototype.setDocumentSelectionChangeEvent = function() {
        this.$document.on("selectionchange." + this._id, a.proxy(function(b) {
            return this.isDisabled ? !1 : void(this.isResizing() || this.isScrolling || (clearTimeout(this.selectionChangedTimeout), this.selectionChangedTimeout = setTimeout(a.proxy(function() {
                if (this.options.inlineMode && this.selectionInEditor() && this.link !== !0 && this.isTouch()) {
                    var a = this.text();
                    "" !== a ? (this.iPod() ? this.options.alwaysVisible && this.hide() : this.show(null), b.stopPropagation()) : this.options.alwaysVisible ? this.show(null) : (this.hide(), this.closeImageMode(), this.imageMode = !1)
                }
            }, this), 75)))
        }, this))
    }, b.prototype.setWindowMouseUpEvent = function() {
        this.$window.on(this.mouseup + "." + this._id, a.proxy(function() {
            this.isResizing() || this.isScrolling || this.isDisabled || (this.$bttn_wrapper.find("button.fr-trigger").removeClass("active"), this.selectionInEditor() && "" !== this.text() && !this.isTouch() ? this.show(null) : this.$popup_editor.is(":visible") && (this.hide(), this.closeImageMode(), this.imageMode = !1), this.blur(!0)), a("[data-down]").removeAttr("data-down")
        }, this))
    }, b.prototype.setWindowKeyDownEvent = function() {
        this.$window.on("keydown." + this._id, a.proxy(function(b) {
            var c = b.which;
            if (27 == c && (this.focus(), this.restoreSelection(), this.hide(), this.closeImageMode(), this.imageMode = !1), this.imageMode) {
                if (13 == c) return this.$element.find(".f-img-editor").parents(".f-img-wrap").before("<br/>"), this.sync(), this.$element.find(".f-img-editor img").click(), !1;
                if (46 == c || 8 == c) return b.stopPropagation(), b.preventDefault(), setTimeout(a.proxy(function() {
                    this.removeImage(this.$element.find(".f-img-editor img"))
                }, this), 0), !1
            } else if (this.selectionInEditor()) {
                if (this.isDisabled) return !0;
                var d = (b.ctrlKey || b.metaKey) && !b.altKey;
                !d && this.$popup_editor.is(":visible") && this.$bttn_wrapper.is(":visible") && this.options.inlineMode && (this.hide(), this.closeImageMode(), this.imageMode = !1)
            }
        }, this))
    }, b.prototype.setWindowKeyUpEvent = function() {
        this.$window.on("keyup." + this._id, a.proxy(function() {
            return this.isDisabled ? !1 : void(this.selectionInEditor() && "" !== this.text() && !this.$popup_editor.is(":visible") && this.repositionEditor())
        }, this))
    }, b.prototype.setWindowScrollEvent = function() {
        a.merge(this.$window, a(this.options.scrollableContainer)).on("scroll." + this._id, a.proxy(function() {
            return this.isDisabled ? !1 : (clearTimeout(this.scrollTimer), this.isScrolling = !0, void(this.scrollTimer = setTimeout(a.proxy(function() {
                this.isScrolling = !1
            }, this), 2500)))
        }, this))
    }, b.prototype.setPlaceholder = function(b) {
        b && (this.options.placeholder = b), this.$textarea && this.$textarea.attr("placeholder", this.options.placeholder), this.$placeholder || (this.$placeholder = a('<span class="fr-placeholder" unselectable="on"></span>').bind("click", a.proxy(function() {
            this.focus()
        }, this)), this.$element.after(this.$placeholder)), this.$placeholder.text(this.options.placeholder)
    }, b.prototype.isEmpty = function() {
        var b = this.$element.text().replace(/(rn|n|r|t|u200B|u0020)/gm, "");
        return "" === b && 0 === this.$element.find("img, table, iframe, input, textarea, hr, li").length && 0 === this.$element.find(this.options.defaultTag + " > br, br").length && 0 === this.$element.find(a.map(this.valid_nodes, a.proxy(function(a) {
            return this.options.defaultTag == a ? null : a
        }, this)).join(", ")).length
    }, b.prototype.checkPlaceholder = function(c) {
        if (this.isDisabled && !c) return !1;
        if (this.pasting && !c) return !1;
        if (this.$element.find("td:empty, th:empty").append(a.Editable.INVISIBLE_SPACE), this.$element.find(this.valid_nodes.join(":empty, ") + ":empty").append(this.br), !this.isHTML)
            if (this.isEmpty() && !this.fakeEmpty()) {
                var d, e = this.selectionInEditor() || this.$element.is(":focus");
                this.options.paragraphy ? (d = a("<" + this.options.defaultTag + ">" + this.br + "</" + this.options.defaultTag + ">"), this.$element.html(d), e && this.setSelection(d.get(0)), this.$element.addClass("f-placeholder")) : (0 !== this.$element.find("br").length || this.browser.msie && b.getIEversion() <= 10 || (this.$element.append(this.br), e && this.browser.msie && this.focus()), this.$element.addClass("f-placeholder"))
            } else !this.$element.find(this.options.defaultTag + ", li").length && this.options.paragraphy ? (this.wrapText(!0), this.$element.find(this.options.defaultTag).length && "" === this.text() ? this.setSelection(this.$element.find(this.options.defaultTag)[0], this.$element.find(this.options.defaultTag).text().length, null, this.$element.find(this.options.defaultTag).text().length) : this.$element.removeClass("f-placeholder")) : this.fakeEmpty() === !1 && (!this.options.paragraphy || this.$element.find(this.valid_nodes.join(",")).length >= 1) ? this.$element.removeClass("f-placeholder") : !this.options.paragraphy && this.$element.find(this.valid_nodes.join(",")).length >= 1 ? this.$element.removeClass("f-placeholder") : this.$element.addClass("f-placeholder");
        return !0
    }, b.prototype.fakeEmpty = function(a) {
        void 0 === a && (a = this.$element);
        var b = !0;
        this.options.paragraphy && (b = 1 == a.find(this.options.defaultTag).length ? !0 : !1);
        var c = a.text().replace(/(rn|n|r|t|u200B)/gm, "");
        return "" === c && b && 1 == a.find("br, li").length && 0 === a.find("img, table, iframe, input, textarea, hr, li").length
    }, b.prototype.setPlaceholderEvents = function() {
        this.browser.msie && b.getIEversion() < 9 || (this.$element.on("focus click", a.proxy(function(a) {
            return this.isDisabled ? !1 : void("" !== this.$element.text() || this.pasting || (this.$element.data("focused") || "click" !== a.type ? "focus" == a.type && this.focus(!1) : this.$element.focus(), this.$element.data("focused", !0)))
        }, this)), this.$element.on("keyup keydown input focus placeholderCheck", a.proxy(function() {
            return this.checkPlaceholder()
        }, this)), this.$element.trigger("placeholderCheck"))
    }, b.prototype.setDimensions = function(a, b, c, d) {
        a && (this.options.height = a), b && (this.options.width = b), c && (this.options.minHeight = c), d && (this.options.maxHeight = d), "auto" != this.options.height && (this.$wrapper.css("height", this.options.height), this.$element.css("minHeight", this.options.height - parseInt(this.$element.css("padding-top"), 10) - parseInt(this.$element.css("padding-bottom"), 10))), "auto" != this.options.minHeight && (this.$wrapper.css("minHeight", this.options.minHeight), this.$element.css("minHeight", this.options.minHeight)), "auto" != this.options.maxHeight && this.$wrapper.css("maxHeight", this.options.maxHeight), "auto" != this.options.width && this.$box.css("width", this.options.width)
    }, b.prototype.setDirection = function(a) {
        a && (this.options.direction = a), "ltr" != this.options.direction && "rtl" != this.options.direction && (this.options.direction = "ltr"), "rtl" == this.options.direction ? (this.$box.addClass("f-rtl"), this.$element.addClass("f-rtl"), this.$editor.addClass("f-rtl"), this.$popup_editor.addClass("f-rtl"), this.$image_modal && this.$image_modal.addClass("f-rtl")) : (this.$box.removeClass("f-rtl"), this.$element.removeClass("f-rtl"), this.$editor.removeClass("f-rtl"), this.$popup_editor.removeClass("f-rtl"), this.$image_modal && this.$image_modal.removeClass("f-rtl"))
    }, b.prototype.setZIndex = function(a) {
        a && (this.options.zIndex = a), this.$editor.css("z-index", this.options.zIndex), this.$popup_editor.css("z-index", this.options.zIndex + 1), this.$overlay && this.$overlay.css("z-index", this.options.zIndex + 2), this.$image_modal && this.$image_modal.css("z-index", this.options.zIndex + 3)
    }, b.prototype.setTheme = function(a) {
        a && (this.options.theme = a), null != this.options.theme && (this.$editor.addClass(this.options.theme + "-theme"), this.$popup_editor.addClass(this.options.theme + "-theme"), this.$box && this.$box.addClass(this.options.theme + "-theme"), this.$image_modal && this.$image_modal.addClass(this.options.theme + "-theme"))
    }, b.prototype.setSpellcheck = function(a) {
        void 0 !== a && (this.options.spellcheck = a), this.$element.attr("spellcheck", this.options.spellcheck)
    }, b.prototype.customizeText = function(b) {
        if (b) {
            var c = this.$editor.find("[title]").add(this.$popup_editor.find("[title]"));
            this.$image_modal && (c = c.add(this.$image_modal.find("[title]"))), c.each(a.proxy(function(c, d) {
                for (var e in b) a(d).attr("title").toLowerCase() == e.toLowerCase() && a(d).attr("title", b[e])
            }, this)), c = this.$editor.find('[data-text="true"]').add(this.$popup_editor.find('[data-text="true"]')), this.$image_modal && (c = c.add(this.$image_modal.find('[data-text="true"]'))), c.each(a.proxy(function(c, d) {
                for (var e in b) a(d).text().toLowerCase() == e.toLowerCase() && a(d).text(b[e])
            }, this))
        }
    }, b.prototype.setLanguage = function(b) {
        void 0 !== b && (this.options.language = b), a.Editable.LANGS[this.options.language] && (this.customizeText(a.Editable.LANGS[this.options.language].translation), a.Editable.LANGS[this.options.language].direction && a.Editable.LANGS[this.options.language].direction != a.Editable.DEFAULTS.direction && this.setDirection(a.Editable.LANGS[this.options.language].direction), a.Editable.LANGS[this.options.language].translation[this.options.placeholder] && this.setPlaceholder(a.Editable.LANGS[this.options.language].translation[this.options.placeholder]))
    }, b.prototype.setCustomText = function(a) {
        a && (this.options.customText = a), this.options.customText && this.customizeText(this.options.customText)
    }, b.prototype.execHTML = function() {
        this.html()
    }, b.prototype.initHTMLArea = function() {
        this.$html_area = a('<textarea wrap="hard">').keydown(function(b) {
            var c = b.keyCode || b.which;
            if (9 == c) {
                b.preventDefault();
                var d = a(this).get(0).selectionStart,
                    e = a(this).get(0).selectionEnd;
                a(this).val(a(this).val().substring(0, d) + "    " + a(this).val().substring(e)), a(this).get(0).selectionStart = a(this).get(0).selectionEnd = d + 1
            }
        }).focus(a.proxy(function() {
            this.blurred && (this.blurred = !1, this.triggerEvent("focus", [], !1))
        }, this)).mouseup(a.proxy(function() {
            this.blurred && (this.blurred = !1, this.triggerEvent("focus", [], !1))
        }, this))
    }, b.prototype.command_dispatcher = {
        align: function(a) {
            var b = this.buildDropdownAlign(a),
                c = this.buildDropdownButton(a, b);
            return c
        },
        formatBlock: function(a) {
            var b = this.buildDropdownFormatBlock(a),
                c = this.buildDropdownButton(a, b);
            return c
        },
        html: function(b) {
            var c = this.buildDefaultButton(b);
            return this.options.inlineMode && this.$box.append(a(c).clone(!0).addClass("html-switch").attr("title", "Hide HTML").click(a.proxy(this.execHTML, this))), this.initHTMLArea(), c
        }
    }, b.prototype.setButtons = function(a) {
        a && (this.options.buttons = a), this.$editor.append('<div class="bttn-wrapper" id="bttn-wrapper-' + this._id + '">'), this.$bttn_wrapper = this.$editor.find("#bttn-wrapper-" + this._id), this.mobile() && this.$bttn_wrapper.addClass("touch");
        for (var c, d, e = "", f = 0; f < this.options.buttons.length; f++) {
            var g = this.options.buttons[f];
            if ("sep" != g) {
                var h = b.commands[g];
                if (void 0 !== h) {
                    h.cmd = g;
                    var i = this.command_dispatcher[h.cmd];
                    i ? e += i.apply(this, [h]) : h.seed ? (c = this.buildDefaultDropdown(h), d = this.buildDropdownButton(h, c), e += d) : (d = this.buildDefaultButton(h), e += d, this.bindRefreshListener(h))
                } else {
                    if (h = this.options.customButtons[g], void 0 === h) {
                        if (h = this.options.customDropdowns[g], void 0 === h) continue;
                        d = this.buildCustomDropdown(h, g), e += d, this.bindRefreshListener(h);
                        continue
                    }
                    d = this.buildCustomButton(h, g), e += d, this.bindRefreshListener(h)
                }
            } else e += this.options.inlineMode ? '<div class="f-clear"></div><hr/>' : '<span class="f-sep"></span>'
        }
        this.$bttn_wrapper.html(e), this.$bttn_wrapper.find('button[data-cmd="undo"], button[data-cmd="redo"]').prop("disabled", !0), this.bindButtonEvents()
    }, b.prototype.bindRefreshListener = function(b) {
        b.refresh && this.addListener("refresh", a.proxy(function() {
            b.refresh.apply(this, [b.cmd])
        }, this))
    }, b.prototype.buildDefaultButton = function(a) {
        var b = '<button tabIndex="-1" type="button" class="fr-bttn" title="' + a.title + '" data-cmd="' + a.cmd + '">';
        return b += void 0 === this.options.icons[a.cmd] ? this.addButtonIcon(a) : this.prepareIcon(this.options.icons[a.cmd], a.title), b += "</button>"
    }, b.prototype.prepareIcon = function(a, b) {
        switch (a.type) {
            case "font":
                return this.addButtonIcon({
                    icon: a.value
                });
            case "img":
                return this.addButtonIcon({
                    icon_img: a.value,
                    title: b
                });
            case "txt":
                return this.addButtonIcon({
                    icon_txt: a.value
                })
        }
    }, b.prototype.addButtonIcon = function(a) {
        return a.icon ? '<i class="' + a.icon + '"></i>' : a.icon_alt ? '<i class="for-text">' + a.icon_alt + "</i>" : a.icon_img ? '<img src="' + a.icon_img + '" alt="' + a.title + '"/>' : a.icon_txt ? "<i>" + a.icon_txt + "</i>" : a.title
    }, b.prototype.buildCustomButton = function(a, b) {
        this["call_" + b] = a.callback;
        var c = '<button tabIndex="-1" type="button" class="fr-bttn" data-callback="call_' + b + '" data-cmd="button_name" data-name="' + b + '" title="' + a.title + '">' + this.prepareIcon(a.icon, a.title) + "</button>";
        return c
    }, b.prototype.callDropdown = function(b, c) {
        this.$bttn_wrapper.on("click touch", '[data-name="' + b + '"]', a.proxy(function(a) {
            a.preventDefault(), a.stopPropagation(), c.apply(this)
        }, this))
    }, b.prototype.buildCustomDropdown = function(a, b) {
        var c = '<div class="fr-bttn fr-dropdown">';
        c += '<button tabIndex="-1" type="button" class="fr-trigger" title="' + a.title + '" data-name="' + b + '">' + this.prepareIcon(a.icon, a.title) + "</button>", c += '<ul class="fr-dropdown-menu">';
        var d = 0;
        for (var e in a.options) {
            this["call_" + b + d] = a.options[e];
            var f = '<li data-callback="call_' + b + d + '" data-cmd="' + b + d + '" data-name="' + b + d + '"><a href="#">' + e + "</a></li>";
            c += f, d++
        }
        return c += "</ul></div>"
    }, b.prototype.buildDropdownButton = function(a, b, c) {
        c = c || "";
        var d = '<div class="fr-bttn fr-dropdown ' + c + '">',
            e = "";
        e += void 0 === this.options.icons[a.cmd] ? this.addButtonIcon(a) : this.prepareIcon(this.options.icons[a.cmd], a.title);
        var f = '<button tabIndex="-1" type="button" data-name="' + a.cmd + '" class="fr-trigger" title="' + a.title + '">' + e + "</button>";
        return d += f, d += b, d += "</div>"
    }, b.prototype.buildDropdownAlign = function(a) {
        this.bindRefreshListener(a);
        for (var b = '<ul class="fr-dropdown-menu f-align">', c = 0; c < a.seed.length; c++) {
            var d = a.seed[c];
            b += '<li data-cmd="align" data-val="' + d.cmd + '" title="' + d.title + '"><a href="#"><i class="' + d.icon + '"></i></a></li>'
        }
        return b += "</ul>"
    }, b.prototype.buildDropdownFormatBlock = function(a) {
        var b = '<ul class="fr-dropdown-menu">';
        for (var c in this.options.blockTags) {
            var d = '<li data-cmd="' + a.cmd + '" data-val="' + c + '">';
            d += '<a href="#" data-text="true" class="format-' + c + '" title="' + this.options.blockTags[c] + '">' + this.options.blockTags[c] + "</a></li>", b += d
        }
        return b += "</ul>"
    }, b.prototype.buildDefaultDropdown = function(a) {
        for (var b = '<ul class="fr-dropdown-menu">', c = 0; c < a.seed.length; c++) {
            var d = a.seed[c],
                e = '<li data-namespace="' + a.namespace + '" data-cmd="' + (d.cmd || a.cmd) + '" data-val="' + d.value + '" data-param="' + (d.param || a.param) + '">';
            e += '<a href="#" data-text="true" class="' + d.value + '" title="' + d.title + '">' + d.title + "</a></li>", b += e
        }
        return b += "</ul>"
    }, b.prototype.createEditPopupHTML = function() {
        var a = '<div class="froala-popup froala-text-popup" style="display:none;">';
        return a += '<h4><span data-text="true">Edit text</span><i title="Cancel" class="fa fa-times" id="f-text-close-' + this._id + '"></i></h4></h4>', a += '<div class="f-popup-line"><input type="text" placeholder="http://www.example.com" class="f-lu" id="f-ti-' + this._id + '">', a += '<button data-text="true" type="button" class="f-ok" id="f-edit-popup-ok-' + this._id + '">OK</button>', a += "</div>", a += "</div>"
    }, b.prototype.buildEditPopup = function() {
        this.$edit_popup_wrapper = a(this.createEditPopupHTML()), this.$popup_editor.append(this.$edit_popup_wrapper), this.$edit_popup_wrapper.find("#f-ti-" + this._id).on("mouseup keydown", function(a) {
            a.stopPropagation()
        }), this.addListener("hidePopups", a.proxy(function() {
            this.$edit_popup_wrapper.hide()
        }, this)), this.$edit_popup_wrapper.on("click", "#f-edit-popup-ok-" + this._id, a.proxy(function() {
            this.$element.text(this.$edit_popup_wrapper.find("#f-ti-" + this._id).val()), this.sync(), this.hide()
        }, this)), this.$edit_popup_wrapper.on("click", "i#f-text-close-" + this._id, a.proxy(function() {
            this.hide()
        }, this))
    }, b.prototype.createCORSRequest = function(a, b) {
        var c = new XMLHttpRequest;
        if ("withCredentials" in c) {
            c.open(a, b, !0), this.options.withCredentials && (c.withCredentials = !0);
            for (var d in this.options.headers) c.setRequestHeader(d, this.options.headers[d])
        } else "undefined" != typeof XDomainRequest ? (c = new XDomainRequest, c.open(a, b)) : c = null;
        return c
    }, b.prototype.isEnabled = function(b) {
        return a.inArray(b, this.options.buttons) >= 0
    }, b.prototype.bindButtonEvents = function() {
        this.bindDropdownEvents(this.$bttn_wrapper), this.bindCommandEvents(this.$bttn_wrapper)
    }, b.prototype.bindDropdownEvents = function(c) {
        var d = this;
        c.on(this.mousedown, ".fr-dropdown .fr-trigger:not([disabled])", function(b) {
            return "mousedown" === b.type && 1 !== b.which ? !0 : ("LI" === this.tagName && "touchstart" === b.type && d.android() || d.iOS() || b.preventDefault(), void a(this).attr("data-down", !0))
        }), c.on(this.mouseup, ".fr-dropdown .fr-trigger:not([disabled])", function(e) {
            if (d.isDisabled) return !1;
            if (e.stopPropagation(), e.preventDefault(), !a(this).attr("data-down")) return a("[data-down]").removeAttr("data-down"), !1;
            a("[data-down]").removeAttr("data-down"), d.options.inlineMode === !1 && 0 === a(this).parents(".froala-popup").length && (d.hide(), d.closeImageMode(), d.imageMode = !1), a(this).toggleClass("active").trigger("blur");
            var f, g = a(this).attr("data-name");
            return b.commands[g] ? f = b.commands[g].refreshOnShow : d.options.customDropdowns[g] ? f = d.options.customDropdowns[g].refreshOnShow : b.image_commands[g] && (f = b.image_commands[g].refreshOnShow), f && f.call(d), c.find("button.fr-trigger").not(this).removeClass("active"), !1
        }), c.on(this.mouseup, ".fr-dropdown", function(a) {
            a.stopPropagation(), a.preventDefault()
        }), this.$element.on("mouseup", "img, a", a.proxy(function() {
            return this.isDisabled ? !1 : void c.find(".fr-dropdown .fr-trigger").removeClass("active")
        }, this)), c.on("click", "li[data-cmd] > a", function(a) {
            a.preventDefault()
        })
    }, b.prototype.bindCommandEvents = function(b) {
        var c = this;
        b.on(this.mousedown, "button[data-cmd], li[data-cmd], span[data-cmd], a[data-cmd]", function(b) {
            return "mousedown" === b.type && 1 !== b.which ? !0 : ("LI" === this.tagName && "touchstart" === b.type && c.android() || c.iOS() || b.preventDefault(), void a(this).attr("data-down", !0))
        }), b.on(this.mouseup + " " + this.move, "button[data-cmd], li[data-cmd], span[data-cmd], a[data-cmd]", a.proxy(function(b) {
            if (c.isDisabled) return !1;
            if ("mouseup" === b.type && 1 !== b.which) return !0;
            var d = b.currentTarget;
            if ("touchmove" != b.type) {
                if (b.stopPropagation(), b.preventDefault(), !a(d).attr("data-down")) return a("[data-down]").removeAttr("data-down"), !1;
                if (a("[data-down]").removeAttr("data-down"), a(d).data("dragging") || a(d).attr("disabled")) return a(d).removeData("dragging"), !1;
                var e = a(d).data("timeout");
                e && (clearTimeout(e), a(d).removeData("timeout"));
                var f = a(d).attr("data-callback");
                if (c.options.inlineMode === !1 && 0 === a(d).parents(".froala-popup").length && (c.hide(), c.closeImageMode(), c.imageMode = !1), f) a(d).parents(".fr-dropdown").find(".fr-trigger.active").removeClass("active"), c[f]();
                else {
                    var g = a(d).attr("data-namespace"),
                        h = a(d).attr("data-cmd"),
                        i = a(d).attr("data-val"),
                        j = a(d).attr("data-param");
                    g ? c["exec" + g](h, i, j) : (c.exec(h, i, j), c.$bttn_wrapper.find(".fr-dropdown .fr-trigger").removeClass("active"))
                }
                return !1
            }
            a(d).data("timeout") || a(d).data("timeout", setTimeout(function() {
                a(d).data("dragging", !0)
            }, 200))
        }, this))
    }, b.prototype.save = function() {
        if (!this.triggerEvent("beforeSave", [], !1)) return !1;
        if (this.options.saveURL) {
            var b = {};
            for (var c in this.options.saveParams) {
                var d = this.options.saveParams[c];
                b[c] = "function" == typeof d ? d.call(this) : d
            }
            a.ajax({
                type: this.options.saveRequestType,
                url: this.options.saveURL,
                data: a.extend({
                    body: this.getHTML()
                }, this.options.saveParams),
                crossDomain: this.options.crossDomain,
                xhrFields: {
                    withCredentials: this.options.withCredentials
                },
                headers: this.options.headers
            }).done(a.proxy(function(a) {
                this.triggerEvent("afterSave", [a])
            }, this)).fail(a.proxy(function() {
                this.triggerEvent("saveError", ["Save request failed on the server."])
            }, this))
        } else this.triggerEvent("saveError", ["Missing save URL."])
    }, b.prototype.isURL = function(a) {
        if (!/^(https?:|ftps?:|)///.test(a)) return !1;
        a = String(a).replace(/</g, "%3C").replace(/>/g, "%3E").replace(/"/g, "%22").replace(/ /g, "%20");
        var b = /(?(?:(https?:|ftps?:|)//)?(?:((?:[^Ws]|.|-|[:]{1})+)@{1})?((?:www.)?(?:[^Ws]|.|-)+[.][^Ws]{2,4}|(?:www.)?(?:[^Ws]|.|-)|localhost|d{1,3}.d{1,3}.d{1,3}.d{1,3})(?::(d*))?([/]?[^s?]*[/]{1})*(?:/?([^sn?[]{}#]*(?:(?=.)){1}|[^sn?[]{}.#]*)?([.]{1}[^s?#]*)?)?(?:?{1}([^sn#[]]*))?([#][^sn]*)?)?/gi;
        return b.test(a)
    }, b.prototype.sanitizeURL = function(a) {
        if (/^(https?:|ftps?:|)///.test(a)) {
            if (!this.isURL(a)) return ""
        } else a = encodeURIComponent(a).replace(/%23/g, "#").replace(/%2F/g, "/").replace(/%25/g, "%").replace(/mailto%3A/g, "mailto:").replace(/tel%3A/g, "tel:").replace(/data%3Aimage/g, "data:image").replace(/webkit-fake-url%3A/g, "webkit-fake-url:").replace(/%3F/g, "?").replace(/%3D/g, "=").replace(/%26/g, "&").replace(/&amp;/g, "&").replace(/%2C/g, ",").replace(/%3B/g, ";").replace(/%2B/g, "+").replace(/%40/g, "@");
        return a
    }, b.prototype.parents = function(a, b) {
        return a.get(0) != this.$element.get(0) ? a.parentsUntil(this.$element, b) : []
    }, b.prototype.option = function(b, c) {
        if (void 0 === b) return this.options;
        if (b instanceof Object) this.options = a.extend({}, this.options, b), this.initOptions(), this.setCustomText(), this.setLanguage();
        else {
            if (void 0 === c) return this.options[b];
            switch (this.options[b] = c, b) {
                case "direction":
                    this.setDirection();
                    break;
                case "height":
                case "width":
                case "minHeight":
                case "maxHeight":
                    this.setDimensions();
                    break;
                case "spellcheck":
                    this.setSpellcheck();
                    break;
                case "placeholder":
                    this.setPlaceholder();
                    break;
                case "customText":
                    this.setCustomText();
                    break;
                case "language":
                    this.setLanguage();
                    break;
                case "textNearImage":
                    this.setTextNearImage();
                    break;
                case "zIndex":
                    this.setZIndex();
                    break;
                case "theme":
                    this.setTheme()
            }
        }
    };
    var c = a.fn.editable;
    a.fn.editable = function(c) {
        for (var d = [], e = 0; e < arguments.length; e++) d.push(arguments[e]);
        if ("string" == typeof c) {
            var f = [];
            return this.each(function() {
                var b = a(this),
                    e = b.data("fa.editable");
                if (!e[c]) return a.error("Method " + c + " does not exist in Froala Editor.");
                var g = e[c].apply(e, d.slice(1));
                void 0 === g ? f.push(this) : 0 === f.length && f.push(g)
            }), 1 == f.length ? f[0] : f
        }
        return "object" != typeof c && c ? void 0 : this.each(function() {
            var d = this,
                e = a(d),
                f = e.data("fa.editable");
            f || e.data("fa.editable", f = new b(d, c))
        })
    }, a.fn.editable.Constructor = b, a.Editable = b, a.fn.editable.noConflict = function() {
        return a.fn.editable = c, this
    }
}(window.jQuery),
function(a) {
    a.Editable.prototype.initUndoRedo = function() {
        this.undoStack = [], this.undoIndex = 0, this.saveUndoStep(), this.disableBrowserUndo()
    }, a.Editable.prototype.undo = function() {
        if (this.no_verify = !0, this.undoIndex > 1) {
            clearTimeout(this.typingTimer), this.triggerEvent("beforeUndo", [], !1);
            var a = this.undoStack[--this.undoIndex - 1];
            this.restoreSnapshot(a), this.doingRedo = !0, this.triggerEvent("afterUndo", []), this.doingRedo = !1, "" !== this.text() ? this.repositionEditor() : this.hide(), this.$element.trigger("placeholderCheck"), this.focus(), this.refreshButtons()
        }
        this.no_verify = !1
    }, a.Editable.prototype.redo = function() {
        if (this.no_verify = !0, this.undoIndex < this.undoStack.length) {
            clearTimeout(this.typingTimer), this.triggerEvent("beforeRedo", [], !1);
            var a = this.undoStack[this.undoIndex++];
            this.restoreSnapshot(a), this.doingRedo = !0, this.triggerEvent("afterRedo", []), this.doingRedo = !1, "" !== this.text() ? this.repositionEditor() : this.hide(), this.$element.trigger("placeholderCheck"), this.focus(), this.refreshButtons()
        }
        this.no_verify = !1
    }, a.Editable.prototype.saveUndoStep = function() {
        if (!this.undoStack) return !1;
        for (; this.undoStack.length > this.undoIndex;) this.undoStack.pop();
        var a = this.getSnapshot();
        this.undoStack[this.undoIndex - 1] && this.identicSnapshots(this.undoStack[this.undoIndex - 1], a) || (this.undoStack.push(a), this.undoIndex++), this.refreshUndo(), this.refreshRedo()
    }, a.Editable.prototype.refreshUndo = function() {
        if (this.isEnabled("undo")) {
            if (void 0 === this.$editor) return;
            this.$bttn_wrapper.find('[data-cmd="undo"]').removeAttr("disabled"), (0 === this.undoStack.length || this.undoIndex <= 1 || this.isHTML) && this.$bttn_wrapper.find('[data-cmd="undo"]').attr("disabled", !0)
        }
    }, a.Editable.prototype.refreshRedo = function() {
        if (this.isEnabled("redo")) {
            if (void 0 === this.$editor) return;
            this.$bttn_wrapper.find('[data-cmd="redo"]').removeAttr("disabled"), (this.undoIndex == this.undoStack.length || this.isHTML) && this.$bttn_wrapper.find('[data-cmd="redo"]').prop("disabled", !0)
        }
    }, a.Editable.prototype.getNodeIndex = function(a) {
        for (var b = a.parentNode.childNodes, c = 0, d = null, e = 0; e < b.length; e++) {
            if (d) {
                var f = 3 === b[e].nodeType && "" === b[e].textContent,
                    g = 3 === d.nodeType && 3 === b[e].nodeType;
                f || g || c++
            }
            if (b[e] == a) return c;
            d = b[e]
        }
    }, a.Editable.prototype.getNodeLocation = function(a) {
        var b = [];
        if (!a.parentNode) return [];
        for (; a != this.$element.get(0);) b.push(this.getNodeIndex(a)), a = a.parentNode;
        return b.reverse()
    }, a.Editable.prototype.getNodeByLocation = function(a) {
        for (var b = this.$element.get(0), c = 0; c < a.length; c++) b = b.childNodes[a[c]];
        return b
    }, a.Editable.prototype.getRealNodeOffset = function(a, b) {
        for (; a && 3 === a.nodeType;) {
            var c = a.previousSibling;
            c && 3 == c.nodeType && (b += c.textContent.length), a = c
        }
        return b
    }, a.Editable.prototype.getRangeSnapshot = function(a) {
        return {
            scLoc: this.getNodeLocation(a.startContainer),
            scOffset: this.getRealNodeOffset(a.startContainer, a.startOffset),
            ecLoc: this.getNodeLocation(a.endContainer),
            ecOffset: this.getRealNodeOffset(a.endContainer, a.endOffset)
        }
    }, a.Editable.prototype.getSnapshot = function() {
        var a = {};
        if (a.html = this.$element.html(), a.ranges = [], this.selectionInEditor() && this.$element.is(":focus"))
            for (var b = this.getRanges(), c = 0; c < b.length; c++) a.ranges.push(this.getRangeSnapshot(b[c]));
        return a
    }, a.Editable.prototype.identicSnapshots = function(a, b) {
        return a.html != b.html ? !1 : JSON.stringify(a.ranges) != JSON.stringify(b.ranges) ? !1 : !0
    }, a.Editable.prototype.restoreRangeSnapshot = function(a, b) {
        try {
            var c = this.getNodeByLocation(a.scLoc),
                d = a.scOffset,
                e = this.getNodeByLocation(a.ecLoc),
                f = a.ecOffset,
                g = this.document.createRange();
            g.setStart(c, d), g.setEnd(e, f), b.addRange(g)
        } catch (h) {}
    }, a.Editable.prototype.restoreSnapshot = function(b) {
        this.$element.html() != b.html && this.$element.html(b.html);
        var c = this.getSelection();
        this.clearSelection(), this.$element.focus();
        for (var d = 0; d < b.ranges.length; d++) this.restoreRangeSnapshot(b.ranges[d], c);
        setTimeout(a.proxy(function() {
            this.$element.find(".f-img-wrap img").click()
        }, this), 0)
    }
}(jQuery),
function(a) {
    a.Editable.prototype.refreshButtons = function(b) {
        return this.initialized && (this.selectionInEditor() && !this.isHTML || this.browser.msie && a.Editable.getIEversion() < 9 || b) ? (this.$editor.find("button[data-cmd]").removeClass("active"), this.refreshDisabledState(), void this.raiseEvent("refresh")) : !1
    }, a.Editable.prototype.refreshDisabledState = function() {
        if (this.isHTML) return !1;
        if (this.$editor) {
            for (var b = 0; b < this.options.buttons.length; b++) {
                var c = this.options.buttons[b];
                if (void 0 !== a.Editable.commands[c]) {
                    var d = !1;
                    a.isFunction(a.Editable.commands[c].disabled) ? d = a.Editable.commands[c].disabled.apply(this) : void 0 !== a.Editable.commands[c].disabled && (d = !0), d ? (this.$editor.find('button[data-cmd="' + c + '"]').prop("disabled", !0), this.$editor.find('button[data-name="' + c + '"]').prop("disabled", !0)) : (this.$editor.find('button[data-cmd="' + c + '"]').removeAttr("disabled"), this.$editor.find('button[data-name="' + c + '"]').removeAttr("disabled"))
                }
            }
            this.refreshUndo(), this.refreshRedo()
        }
    }, a.Editable.prototype.refreshFormatBlocks = function() {
        var a = this.getSelectionElements()[0],
            b = a.tagName.toLowerCase();
        this.options.paragraphy && b === this.options.defaultTag.toLowerCase() && (b = "n"), this.$editor.find('.fr-bttn > button[data-name="formatBlock"] + ul li').removeClass("active"), this.$bttn_wrapper.find('.fr-bttn > button[data-name="formatBlock"] + ul li[data-val="' + b + '"]').addClass("active")
    }, a.Editable.prototype.refreshDefault = function(a) {
        try {
            this.document.queryCommandState(a) === !0 && this.$editor.find('[data-cmd="' + a + '"]').addClass("active")
        } catch (b) {}
    }, a.Editable.prototype.refreshAlign = function() {
        var b = a(this.getSelectionElements()[0]);
        this.$editor.find('.fr-dropdown > button[data-name="align"] + ul li').removeClass("active");
        var c, d = b.css("text-align");
        ["left", "right", "justify", "center"].indexOf(d) < 0 && (d = "left"), "left" == d ? c = "justifyLeft" : "right" == d ? c = "justifyRight" : "justify" == d ? c = "justifyFull" : "center" == d && (c = "justifyCenter"), this.$editor.find('.fr-dropdown > button[data-name="align"].fr-trigger i').attr("class", "fa fa-align-" + d), this.$editor.find('.fr-dropdown > button[data-name="align"] + ul li[data-val="' + c + '"]').addClass("active")
    }, a.Editable.prototype.refreshHTML = function() {
        this.isActive("html") ? this.$editor.find('[data-cmd="html"]').addClass("active") : this.$editor.find('[data-cmd="html"]').removeClass("active")
    }
}(jQuery),
function(a) {
    a.Editable.commands = {
        bold: {
            title: "Bold",
            icon: "fa fa-bold",
            shortcut: "(Ctrl + B)",
            refresh: a.Editable.prototype.refreshDefault,
            undo: !0,
            callbackWithoutSelection: function(a) {
                this._startInDefault(a)
            }
        },
        italic: {
            title: "Italic",
            icon: "fa fa-italic",
            shortcut: "(Ctrl + I)",
            refresh: a.Editable.prototype.refreshDefault,
            undo: !0,
            callbackWithoutSelection: function(a) {
                this._startInDefault(a)
            }
        },
        underline: {
            cmd: "underline",
            title: "Underline",
            icon: "fa fa-underline",
            shortcut: "(Ctrl + U)",
            refresh: a.Editable.prototype.refreshDefault,
            undo: !0,
            callbackWithoutSelection: function(a) {
                this._startInDefault(a)
            }
        },
        strikeThrough: {
            title: "Strikethrough",
            icon: "fa fa-strikethrough",
            refresh: a.Editable.prototype.refreshDefault,
            undo: !0,
            callbackWithoutSelection: function(a) {
                this._startInDefault(a)
            }
        },
        subscript: {
            title: "Subscript",
            icon: "fa fa-subscript",
            refresh: a.Editable.prototype.refreshDefault,
            undo: !0,
            callbackWithoutSelection: function(a) {
                this._startInDefault(a)
            }
        },
        superscript: {
            title: "Superscript",
            icon: "fa fa-superscript",
            refresh: a.Editable.prototype.refreshDefault,
            undo: !0,
            callbackWithoutSelection: function(a) {
                this._startInDefault(a)
            }
        },
        formatBlock: {
            title: "Format Block",
            icon: "fa fa-paragraph",
            refreshOnShow: a.Editable.prototype.refreshFormatBlocks,
            callback: function(a, b) {
                this.formatBlock(b)
            },
            undo: !0
        },
        align: {
            title: "Alignment",
            icon: "fa fa-align-left",
            refresh: a.Editable.prototype.refreshAlign,
            refreshOnShow: a.Editable.prototype.refreshAlign,
            seed: [{
                cmd: "justifyLeft",
                title: "Align Left",
                icon: "fa fa-align-left"
            }, {
                cmd: "justifyCenter",
                title: "Align Center",
                icon: "fa fa-align-center"
            }, {
                cmd: "justifyRight",
                title: "Align Right",
                icon: "fa fa-align-right"
            }, {
                cmd: "justifyFull",
                title: "Justify",
                icon: "fa fa-align-justify"
            }],
            callback: function(a, b) {
                this.align(b)
            },
            undo: !0
        },
        outdent: {
            title: "Indent Less",
            icon: "fa fa-dedent",
            activeless: !0,
            shortcut: "(Ctrl + <)",
            callback: function() {
                this.outdent(!0)
            },
            undo: !0
        },
        indent: {
            title: "Indent More",
            icon: "fa fa-indent",
            activeless: !0,
            shortcut: "(Ctrl + >)",
            callback: function() {
                this.indent()
            },
            undo: !0
        },
        selectAll: {
            title: "Select All",
            icon: "fa fa-file-text",
            shortcut: "(Ctrl + A)",
            callback: function(a, b) {
                this.$element.focus(), this.execDefault(a, b)
            },
            undo: !1
        },
        createLink: {
            title: "Insert Link",
            icon: "fa fa-link",
            shortcut: "(Ctrl + K)",
            callback: function() {
                this.insertLink()
            },
            undo: !1
        },
        insertImage: {
            title: "Insert Image",
            icon: "fa fa-picture-o",
            activeless: !0,
            shortcut: "(Ctrl + P)",
            callback: function() {
                this.insertImage()
            },
            undo: !1
        },
        undo: {
            title: "Undo",
            icon: "fa fa-undo",
            activeless: !0,
            shortcut: "(Ctrl+Z)",
            refresh: a.Editable.prototype.refreshUndo,
            callback: function() {
                this.undo()
            },
            undo: !1
        },
        redo: {
            title: "Redo",
            icon: "fa fa-repeat",
            activeless: !0,
            shortcut: "(Shift+Ctrl+Z)",
            refresh: a.Editable.prototype.refreshRedo,
            callback: function() {
                this.redo()
            },
            undo: !1
        },
        html: {
            title: "Show HTML",
            icon: "fa fa-code",
            refresh: a.Editable.prototype.refreshHTML,
            callback: function() {
                this.html()
            },
            undo: !1
        },
        save: {
            title: "Save",
            icon: "fa fa-floppy-o",
            callback: function() {
                this.save()
            },
            undo: !1
        },
        insertHorizontalRule: {
            title: "Insert Horizontal Line",
            icon: "fa fa-minus",
            callback: function(a) {
                this.insertHR(a)
            },
            undo: !0
        },
        removeFormat: {
            title: "Clear formatting",
            icon: "fa fa-eraser",
            activeless: !0,
            callback: function() {
                this.removeFormat()
            },
            undo: !0
        }
    }, a.Editable.prototype.exec = function(b, c, d) {
        return !this.selectionInEditor() && a.Editable.commands[b].undo && this.focus(), this.selectionInEditor() && "" === this.text() && a.Editable.commands[b].callbackWithoutSelection ? (a.Editable.commands[b].callbackWithoutSelection.apply(this, [b, c, d]), !1) : void(a.Editable.commands[b].callback ? a.Editable.commands[b].callback.apply(this, [b, c, d]) : this.execDefault(b, c))
    }, a.Editable.prototype.html = function() {
        var a;
        this.isHTML ? (this.isHTML = !1, a = this.$html_area.val(), this.$box.removeClass("f-html"), this.$element.attr("contenteditable", !0), this.setHTML(a, !1), this.$editor.find('.fr-bttn:not([data-cmd="html"]), .fr-trigger').removeAttr("disabled"), this.$editor.find('.fr-bttn[data-cmd="html"]').removeClass("active"), this.$element.blur(), this.focus(), this.refreshButtons(), this.triggerEvent("htmlHide", [a], !0, !1)) : (this.$box.removeClass("f-placeholder"), this.clearSelection(), this.cleanify(!1, !0, !1), a = this.cleanTags(this.getHTML(!1, !1)), this.$html_area.val(a).trigger("resize"), this.$html_area.css("height", this.$element.height() - 1), this.$element.html("").append(this.$html_area).removeAttr("contenteditable"), this.$box.addClass("f-html"), this.$editor.find('button.fr-bttn:not([data-cmd="html"]), button.fr-trigger').attr("disabled", !0), this.$editor.find('.fr-bttn[data-cmd="html"]').addClass("active"), this.isHTML = !0, this.hide(), this.imageMode = !1, this.$element.blur(), this.$element.removeAttr("contenteditable"), this.triggerEvent("htmlShow", [a], !0, !1))
    }, a.Editable.prototype.insertHR = function(b) {
        this.$element.find("hr").addClass("fr-tag"), this.$element.hasClass("f-placeholder") ? a(this.$element.find("> " + this.valid_nodes.join(", >"))[0]).before("<hr/>") : this.document.execCommand(b), this.hide();
        var c = this.$element.find("hr:not(.fr-tag)").next(this.valid_nodes.join(","));
        c.length > 0 ? a(c[0]).prepend(this.markers_html) : this.$element.find("hr:not(.fr-tag)").after(this.options.paragraphy ? "<p>" + this.markers_html + "<br/></p>" : this.markers_html), this.restoreSelectionByMarkers(), this.triggerEvent(b, [], !0, !1)
    }, a.Editable.prototype.formatBlock = function(b) {
        if (this.disabledList.indexOf("formatBlock") >= 0) return !1;
        if (this.browser.msie && a.Editable.getIEversion() < 9) return "n" == b && (b = this.options.defaultTag), this.document.execCommand("formatBlock", !1, "<" + b + ">"), this.triggerEvent("formatBlock"), !1;
        if (this.$element.hasClass("f-placeholder")) {
            if (this.options.paragraphy || "n" != b) {
                "n" == b && (b = this.options.defaultTag);
                var c = a("<" + b + "><br/></" + b + ">");
                this.$element.html(c), this.setSelection(c.get(0), 0), this.$element.removeClass("f-placeholder")
            }
        } else {
            this.saveSelectionByMarkers(), this.wrapText(), this.restoreSelectionByMarkers();
            var d = this.getSelectionElements();
            d[0] == this.$element.get(0) && (d = this.$element.find("> " + this.valid_nodes.join(", >"))), this.saveSelectionByMarkers();
            for (var e, f = function(b) {
                    if ("PRE" == b.get(0).tagName)
                        for (; b.find("br + br").length > 0;) {
                            var c = a(b.find("br + br")[0]);
                            c.prev().remove(), c.replaceWith("nn")
                        }
                }, g = 0; g < d.length; g++) {
                var h = a(d[g]);
                if (!this.fakeEmpty(h)) {
                    if (f(h), !this.options.paragraphy && this.emptyElement(h.get(0)) && h.append("<br/>"), "n" == b)
                        if (this.options.paragraphy) {
                            var i = "<" + this.options.defaultTag + this.attrs(h.get(0)) + ">" + h.html() + "</" + this.options.defaultTag + ">";
                            e = a(i)
                        } else e = h.html() + "<br/>";
                        else e = a("<" + b + this.attrs(h.get(0)) + ">").html(h.html());
                    h.get(0) != this.$element.get(0) ? h.replaceWith(e) : h.html(e)
                }
            }
            this.unwrapText(), this.$element.find("pre + pre").each(function() {
                a(this).prepend(a(this).prev().html() + "<br/><br/>"), a(this).prev().remove()
            });
            var j = this;
            this.$element.find(this.valid_nodes.join(",")).each(function() {
                "PRE" != this.tagName && a(this).replaceWith("<" + this.tagName + j.attrs(this) + ">" + a(this).html().replace(/nn/gi, "</" + this.tagName + "><" + this.tagName + ">") + "</" + this.tagName + ">")
            }), this.$element.find(this.valid_nodes.join(":empty ,") + ":empty").append("<br/>"), this.cleanupLists(), this.restoreSelectionByMarkers()
        }
        this.triggerEvent("formatBlock"), this.repositionEditor()
    }, a.Editable.prototype.align = function(b) {
        if (this.browser.msie && a.Editable.getIEversion() < 9) return this.document.execCommand(b, !1, !1), this.triggerEvent("align", [b]), !1;
        this.saveSelectionByMarkers(), this.wrapText(), this.restoreSelectionByMarkers(), this.saveSelectionByMarkers();
        var c = this.getSelectionElements();
        "justifyLeft" == b ? b = "left" : "justifyRight" == b ? b = "right" : "justifyCenter" == b ? b = "center" : "justifyFull" == b && (b = "justify");
        for (var d = 0; d < c.length; d++) this.parents(a(c[d]), "LI").length > 0 && (c[d] = a(c[d]).parents("LI").get(0)), a(c[d]).css("text-align", b);
        this.cleanupLists(), this.unwrapText(), this.restoreSelectionByMarkers(), this.repositionEditor(), this.triggerEvent("align", [b])
    }, a.Editable.prototype.indent = function(b, c) {
        if (void 0 === c && (c = !0), this.browser.msie && a.Editable.getIEversion() < 9) return b ? this.document.execCommand("outdent", !1, !1) : this.document.execCommand("indent", !1, !1), !1;
        var d = 20;
        b && (d = -20), this.saveSelectionByMarkers(), this.wrapText(), this.restoreSelectionByMarkers();
        var e = this.getSelectionElements();
        this.saveSelectionByMarkers();
        for (var f = 0; f < e.length; f++) {
            var g = a(e[f]);
            if (g.parentsUntil(this.$element, "li").length > 0 && (g = g.closest("li")), this.raiseEvent("indent", [g, b]))
                if (g.get(0) != this.$element.get(0)) {
                    var h = parseInt(g.css("margin-left"), 10),
                        i = Math.max(0, h + d);
                    g.css("marginLeft", i), 0 === i && (g.css("marginLeft", ""), void 0 === g.css("style") && g.removeAttr("style"))
                } else {
                    var j = a("<div>").html(g.html());
                    g.html(j), j.css("marginLeft", Math.max(0, d)), 0 === Math.max(0, d) && (j.css("marginLeft", ""), void 0 === j.css("style") && j.removeAttr("style"))
                }
        }
        this.unwrapText(), this.restoreSelectionByMarkers(), c && this.repositionEditor(), b || this.triggerEvent("indent")
    }, a.Editable.prototype.outdent = function(a) {
        this.indent(!0, a), this.triggerEvent("outdent")
    }, a.Editable.prototype.execDefault = function(a, b) {
        this.saveUndoStep(), this.document.execCommand(a, !1, b), this.triggerEvent(a, [], !0, !0)
    }, a.Editable.prototype._startInDefault = function(a) {
        this.focus(), this.document.execCommand(a, !1, !1), this.refreshButtons()
    }, a.Editable.prototype._startInFontExec = function(b, c, d) {
        this.focus();
        try {
            var e = this.getRange(),
                f = e.cloneRange();
            f.collapse(!1);
            var g = a('<span data-inserted="true" data-fr-verified="true" style="' + b + ": " + d + ';">' + a.Editable.INVISIBLE_SPACE + "</span>", this.document);
            f.insertNode(g[0]), g = this.$element.find("[data-inserted]"), g.removeAttr("data-inserted"), this.setSelection(g.get(0), 1)
        } catch (h) {}
    }, a.Editable.prototype.removeFormat = function() {
        this.document.execCommand("removeFormat", !1, !1), this.document.execCommand("unlink", !1, !1)
    }, a.Editable.prototype.inlineStyle = function(b, c, d) {
        if (this.browser.webkit && "font-size" != b) {
            var e = function(a) {
                return a.attr("style").indexOf("font-size") >= 0
            };
            this.$element.find("span").each(function(b, c) {
                var d = a(c);
                d.attr("style") && e(d) && (d.data("font-size", d.css("font-size")), d.css("font-size", ""))
            })
        }
        this.document.execCommand("fontSize", !1, 4), this.saveSelectionByMarkers(), this.browser.webkit && "font-size" != b && this.$element.find("span").each(function(b, c) {
            var d = a(c);
            d.data("font-size") && (d.css("font-size", d.data("font-size")), d.removeData("font-size"))
        });
        var f = function(c) {
            var e = a(c);
            e.css(b) != d && e.css(b, ""), "" === e.attr("style") && e.replaceWith(e.html())
        };
        this.$element.find("font").each(function(c, e) {
            var g = a('<span data-fr-verified="true" style="' + b + ": " + d + ';">' + a(e).html() + "</span>");
            a(e).replaceWith(g);
            for (var h = g.find("span"), i = h.length - 1; i >= 0; i--) f(h[i])
        }), this.removeBlankSpans(), this.restoreSelectionByMarkers(), this.repositionEditor(), null != c && this.triggerEvent(c, [d], !0, !0)
    }
}(jQuery),
function(a) {
    a.Editable.prototype.addListener = function(a, b) {
        var c = this._events,
            d = c[a] = c[a] || [];
        d.push(b)
    }, a.Editable.prototype.raiseEvent = function(a, b) {
        void 0 === b && (b = []);
        var c = !0,
            d = this._events[a];
        if (d)
            for (var e = 0, f = d.length; f > e; e++) {
                var g = d[e].apply(this, b);
                void 0 !== g && c !== !1 && (c = g)
            }
        return void 0 === c && (c = !0), c
    }
}(jQuery),
function(a) {
    a.Editable.prototype.start_marker = '<span class="f-marker" data-id="0" data-fr-verified="true" data-type="true"></span>', a.Editable.prototype.end_marker = '<span class="f-marker" data-id="0" data-fr-verified="true" data-type="false"></span>', a.Editable.prototype.markers_html = '<span class="f-marker" data-id="0" data-fr-verified="true" data-type="false"></span><span class="f-marker" data-id="0" data-fr-verified="true" data-type="true"></span>', a.Editable.prototype.text = function() {
        var a = "";
        return this.window.getSelection ? a = this.window.getSelection() : this.document.getSelection ? a = this.document.getSelection() : this.document.selection && (a = this.document.selection.createRange().text), a.toString()
    }, a.Editable.prototype.selectionInEditor = function() {
        var b = this.getSelectionParent(),
            c = !1;
        return b == this.$element.get(0) && (c = !0), c === !1 && a(b).parents().each(a.proxy(function(a, b) {
            b == this.$element.get(0) && (c = !0)
        }, this)), c
    }, a.Editable.prototype.getSelection = function() {
        var a = "";
        return a = this.window.getSelection ? this.window.getSelection() : this.document.getSelection ? this.document.getSelection() : this.document.selection.createRange()
    }, a.Editable.prototype.getRange = function() {
        var a = this.getRanges();
        return a.length > 0 ? a[0] : null
    }, a.Editable.prototype.getRanges = function() {
        var a = this.getSelection();
        if (a.getRangeAt && a.rangeCount) {
            for (var b = [], c = 0; c < a.rangeCount; c++) b.push(a.getRangeAt(c));
            return b
        }
        return this.document.createRange ? [this.document.createRange()] : []
    }, a.Editable.prototype.clearSelection = function() {
        var a = this.getSelection();
        try {
            a.removeAllRanges ? a.removeAllRanges() : a.empty ? a.empty() : a.clear && a.clear()
        } catch (b) {}
    }, a.Editable.prototype.getSelectionElement = function() {
        var b = this.getSelection();
        if (b.rangeCount) {
            var c = this.getRange(),
                d = c.startContainer;
            if (1 == d.nodeType) {
                var e = !1;
                d.childNodes.length > 0 && d.childNodes[c.startOffset] && a(d.childNodes[c.startOffset]).text() === this.text() && (d = d.childNodes[c.startOffset], e = !0), !e && d.childNodes.length > 0 && a(d.childNodes[0]).text() === this.text() && ["BR", "IMG", "HR"].indexOf(d.childNodes[0].tagName) < 0 && (d = d.childNodes[0])
            }
            for (; 1 != d.nodeType && d.parentNode;) d = d.parentNode;
            for (var f = d; f && "BODY" != f.tagName;) {
                if (f == this.$element.get(0)) return d;
                f = a(f).parent()[0]
            }
        }
        return this.$element.get(0)
    }, a.Editable.prototype.getSelectionParent = function() {
        var b, c = null;
        return this.window.getSelection ? (b = this.window.getSelection(), b.rangeCount && (c = b.getRangeAt(0).commonAncestorContainer, 1 != c.nodeType && (c = c.parentNode))) : (b = this.document.selection) && "Control" != b.type && (c = b.createRange().parentElement()), null != c && (a.inArray(this.$element.get(0), a(c).parents()) >= 0 || c == this.$element.get(0)) ? c : null
    }, a.Editable.prototype.nodeInRange = function(a, b) {
        var c;
        if (a.intersectsNode) return a.intersectsNode(b);
        c = b.ownerthis.document.createRange();
        try {
            c.selectNode(b)
        } catch (d) {
            c.selectNodeContents(b)
        }
        return -1 == a.compareBoundaryPoints(Range.END_TO_START, c) && 1 == a.compareBoundaryPoints(Range.START_TO_END, c)
    }, a.Editable.prototype.getElementFromNode = function(b) {
        for (1 != b.nodeType && (b = b.parentNode); null !== b && this.valid_nodes.indexOf(b.tagName) < 0;) b = b.parentNode;
        return null != b && "LI" == b.tagName && a(b).find(this.valid_nodes.join(",")).not("li").length > 0 ? null : a.makeArray(a(b).parents()).indexOf(this.$element.get(0)) >= 0 ? b : null
    }, a.Editable.prototype.nextNode = function(a, b) {
        if (a.hasChildNodes()) return a.firstChild;
        for (; a && !a.nextSibling && a != b;) a = a.parentNode;
        return a && a != b ? a.nextSibling : null
    }, a.Editable.prototype.getRangeSelectedNodes = function(a) {
        var b = [],
            c = a.startContainer,
            d = a.endContainer;
        if (c == d && "TR" != c.tagName) {
            if (c.hasChildNodes() && 0 !== c.children.length) {
                for (var e = c.children, f = a.startOffset; f < a.endOffset; f++) e[f] && b.push(e[f]);
                return 0 === b.length && b.push(c), b
            }
            return [c]
        }
        if (c == d && "TR" == c.tagName) {
            var g = c.childNodes,
                h = a.startOffset;
            if (g.length > h && h >= 0) {
                var i = g[h];
                if ("TD" == i.tagName || "TH" == i.tagName) return [i]
            }
        }
        for (; c && c != d;) b.push(c = this.nextNode(c, d));
        for (c = a.startContainer; c && c != a.commonAncestorContainer;) b.unshift(c), c = c.parentNode;
        return b
    }, a.Editable.prototype.getSelectedNodes = function() {
        if (this.window.getSelection) {
            var b = this.window.getSelection();
            if (!b.isCollapsed) {
                for (var c = this.getRanges(), d = [], e = 0; e < c.length; e++) d = a.merge(d, this.getRangeSelectedNodes(c[e]));
                return d
            }
            if (this.selectionInEditor()) {
                var f = b.getRangeAt(0).startContainer;
                return 3 == f.nodeType ? [f.parentNode] : [f]
            }
        }
        return []
    }, a.Editable.prototype.getSelectionElements = function() {
        var b = this.getSelectedNodes(),
            c = [];
        return a.each(b, a.proxy(function(a, b) {
            if (null !== b) {
                var d = this.getElementFromNode(b);
                c.indexOf(d) < 0 && d != this.$element.get(0) && null !== d && c.push(d)
            }
        }, this)), 0 === c.length && c.push(this.$element.get(0)), c
    }, a.Editable.prototype.getSelectionLink = function() {
        var b = this.getSelectionLinks();
        return b.length > 0 ? a(b[0]).attr("href") : null
    }, a.Editable.prototype.saveSelection = function() {
        if (!this.selectionDisabled) {
            this.savedRanges = [];
            for (var a = this.getRanges(), b = 0; b < a.length; b++) this.savedRanges.push(a[b].cloneRange())
        }
    }, a.Editable.prototype.restoreSelection = function() {
        if (!this.selectionDisabled) {
            var a, b, c = this.getSelection();
            if (this.savedRanges && this.savedRanges.length)
                for (c.removeAllRanges(), a = 0, b = this.savedRanges.length; b > a; a += 1) c.addRange(this.savedRanges[a]);
            this.savedRanges = null
        }
    }, a.Editable.prototype.insertMarkersAtPoint = function(a) {
        var b = a.clientX,
            c = a.clientY;
        this.removeMarkers();
        var d, e = null;
        if ("undefined" != typeof this.document.caretPositionFromPoint ? (d = this.document.caretPositionFromPoint(b, c), e = this.document.createRange(), e.setStart(d.offsetNode, d.offset), e.setEnd(d.offsetNode, d.offset)) : "undefined" != typeof this.document.caretRangeFromPoint && (d = this.document.caretRangeFromPoint(b, c), e = this.document.createRange(), e.setStart(d.startContainer, d.startOffset), e.setEnd(d.startContainer, d.startOffset)), null !== e && "undefined" != typeof this.window.getSelection) {
            var f = this.window.getSelection();
            f.removeAllRanges(), f.addRange(e)
        } else if ("undefined" != typeof this.document.body.createTextRange) try {
            e = this.document.body.createTextRange(), e.moveToPoint(b, c);
            var g = e.duplicate();
            g.moveToPoint(b, c), e.setEndPoint("EndToEnd", g), e.select()
        } catch (h) {}
        this.placeMarker(e, !0, 0), this.placeMarker(e, !1, 0)
    }, a.Editable.prototype.saveSelectionByMarkers = function() {
        if (!this.selectionDisabled) {
            this.selectionInEditor() || this.focus(), this.removeMarkers();
            for (var a = this.getRanges(), b = 0; b < a.length; b++)
                if (a[b].startContainer !== this.document) {
                    var c = a[b];
                    this.placeMarker(c, !0, b), this.placeMarker(c, !1, b)
                }
        }
    }, a.Editable.prototype.hasSelectionByMarkers = function() {
        var a = this.$element.find('.f-marker[data-type="true"]');
        return a.length > 0 ? !0 : !1
    }, a.Editable.prototype.restoreSelectionByMarkers = function(b) {
        if (void 0 === b && (b = !0), !this.selectionDisabled) {
            var c = this.$element.find('.f-marker[data-type="true"]');
            if (0 === c.length) return !1;
            this.$element.is(":focus") || this.browser.msie || this.$element.focus();
            var d = this.getSelection();
            (b || this.getRange() && !this.getRange().collapsed || !a(c[0]).attr("data-collapsed")) && (this.browser.msie && a.Editable.getIEversion() < 9 || (this.clearSelection(), b = !0));
            for (var e = 0; e < c.length; e++) {
                var f = a(c[e]).data("id"),
                    g = c[e],
                    h = this.$element.find('.f-marker[data-type="false"][data-id="' + f + '"]');
                if (this.browser.msie && a.Editable.getIEversion() < 9) return this.setSelection(g, 0, h, 0), this.removeMarkers(), !1;
                var i;
                if (i = b ? this.document.createRange() : this.getRange(), h.length > 0) {
                    h = h[0];
                    try {
                        i.setStartAfter(g), i.setEndBefore(h)
                    } catch (j) {}
                }
                b && d.addRange(i)
            }
            this.removeMarkers()
        }
    }, a.Editable.prototype.setSelection = function(a, b, c, d) {
        var e = this.getSelection();
        if (e) {
            this.clearSelection();
            try {
                c || (c = a), void 0 === b && (b = 0), void 0 === d && (d = b);
                var f = this.getRange();
                f.setStart(a, b), f.setEnd(c, d), e.addRange(f)
            } catch (g) {}
        }
    }, a.Editable.prototype.buildMarker = function(b, c, d) {
        return void 0 === d && (d = ""), a('<span class="f-marker"' + d + ' style="display:none; line-height: 0;" data-fr-verified="true" data-id="' + c + '" data-type="' + b + '">', this.document)[0]
    }, a.Editable.prototype.placeMarker = function(b, c, d) {
        var e = "";
        b.collapsed && (e = ' data-collapsed="true"');
        try {
            var f = b.cloneRange();
            if (f.collapse(c), f.insertNode(this.buildMarker(c, d, e)), c === !0 && e)
                for (var g = this.$element.find('span.f-marker[data-type="true"][data-id="' + d + '"]').get(0).nextSibling; 3 === g.nodeType && 0 === g.data.length;) a(g).remove(), g = this.$element.find('span.f-marker[data-type="true"][data-id="' + d + '"]').get(0).nextSibling
        } catch (h) {}
    }, a.Editable.prototype.removeMarkers = function() {
        this.$element.find(".f-marker").remove()
    }, a.Editable.prototype.getSelectionTextInfo = function(a) {
        var b, c, d = !1,
            e = !1;
        if (this.window.getSelection) {
            var f = this.window.getSelection();
            f.rangeCount && (b = f.getRangeAt(0), c = b.cloneRange(), c.selectNodeContents(a), c.setEnd(b.startContainer, b.startOffset), d = "" === c.toString(), c.selectNodeContents(a), c.setStart(b.endContainer, b.endOffset), e = "" === c.toString())
        } else this.document.selection && "Control" != this.document.selection.type && (b = this.document.selection.createRange(), c = b.duplicate(), c.moveToElementText(a), c.setEndPoint("EndToStart", b), d = "" === c.text, c.moveToElementText(a), c.setEndPoint("StartToEnd", b), e = "" === c.text);
        return {
            atStart: d,
            atEnd: e
        }
    }, a.Editable.prototype.endsWith = function(a, b) {
        return -1 !== a.indexOf(b, a.length - b.length)
    }
}(jQuery),
function(a) {
    a.Editable.hexToRGB = function(a) {
        var b = /^#?([a-fd])([a-fd])([a-fd])$/i;
        a = a.replace(b, function(a, b, c, d) {
            return b + b + c + c + d + d
        });
        var c = /^#?([a-fd]{2})([a-fd]{2})([a-fd]{2})$/i.exec(a);
        return c ? {
            r: parseInt(c[1], 16),
            g: parseInt(c[2], 16),
            b: parseInt(c[3], 16)
        } : null
    }, a.Editable.hexToRGBString = function(a) {
        var b = this.hexToRGB(a);
        return b ? "rgb(" + b.r + ", " + b.g + ", " + b.b + ")" : ""
    }, a.Editable.RGBToHex = function(a) {
        function b(a) {
            return ("0" + parseInt(a, 10).toString(16)).slice(-2)
        }
        try {
            return a && "transparent" !== a ? /^#[0-9A-F]{6}$/i.test(a) ? a : (a = a.match(/^rgb((d+),s*(d+),s*(d+))$/), ("#" + b(a[1]) + b(a[2]) + b(a[3])).toUpperCase()) : ""
        } catch (c) {
            return null
        }
    }, a.Editable.getIEversion = function() {
        var a, b, c = -1;
        return "Microsoft Internet Explorer" == navigator.appName ? (a = navigator.userAgent, b = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"), null !== b.exec(a) && (c = parseFloat(RegExp.$1))) : "Netscape" == navigator.appName && (a = navigator.userAgent, b = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})"), null !== b.exec(a) && (c = parseFloat(RegExp.$1))), c
    }, a.Editable.browser = function() {
        var a = {};
        if (this.getIEversion() > 0) a.msie = !0;
        else {
            var b = navigator.userAgent.toLowerCase(),
                c = /(chrome)[ /]([w.]+)/.exec(b) || /(webkit)[ /]([w.]+)/.exec(b) || /(opera)(?:.*version|)[ /]([w.]+)/.exec(b) || /(msie) ([w.]+)/.exec(b) || b.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([w.]+)|)/.exec(b) || [],
                d = {
                    browser: c[1] || "",
                    version: c[2] || "0"
                };
            c[1] && (a[d.browser] = !0), parseInt(d.version, 10) < 9 && a.msie && (a.oldMsie = !0), a.chrome ? a.webkit = !0 : a.webkit && (a.safari = !0)
        }
        return a
    }, a.Editable.isArray = function(a) {
        return a && !a.propertyIsEnumerable("length") && "object" == typeof a && "number" == typeof a.length
    }, a.Editable.uniq = function(b) {
        return a.grep(b, function(c, d) {
            return d == a.inArray(c, b)
        })
    }, a.Editable.cleanWhitespace = function(b) {
        b.contents().filter(function() {
            return 1 == this.nodeType && a.Editable.cleanWhitespace(a(this)), 3 == this.nodeType && !/S/.test(this.nodeValue)
        }).remove()
    }
}(jQuery),
function(a) {
    a.Editable.prototype.show = function(b) {
        if (this.hideDropdowns(), void 0 !== b) {
            if (this.options.inlineMode || this.options.editInPopup)
                if (null !== b && "touchend" !== b.type) {
                    if (this.options.showNextToCursor) {
                        var c = b.pageX,
                            d = b.pageY;
                        c < this.$element.offset().left && (c = this.$element.offset().left), c > this.$element.offset().left + this.$element.width() && (c = this.$element.offset().left + this.$element.width()), d < this.$element.offset.top && (d = this.$element.offset().top), d > this.$element.offset().top + this.$element.height() && (d = this.$element.offset().top + this.$element.height()), 20 > c && (c = 20), 0 > d && (d = 0), this.showByCoordinates(c, d)
                    } else this.repositionEditor();
                    a(".froala-editor:not(.f-basic)").hide(), this.$editor.show(), 0 !== this.options.buttons.length || this.options.editInPopup || this.$editor.hide()
                } else a(".froala-editor:not(.f-basic)").hide(), this.$editor.show(), this.repositionEditor();
            this.hidePopups(), this.options.editInPopup || this.showEditPopupWrapper(), this.$bttn_wrapper.show(), this.refreshButtons(), this.imageMode = !1
        }
    }, a.Editable.prototype.hideDropdowns = function() {
        this.$bttn_wrapper.find(".fr-dropdown .fr-trigger").removeClass("active"), this.$bttn_wrapper.find(".fr-dropdown .fr-trigger")
    }, a.Editable.prototype.hide = function(a) {
        return this.initialized ? (void 0 === a && (a = !0), a ? this.hideOtherEditors() : (this.closeImageMode(), this.imageMode = !1), this.$popup_editor.hide(), this.hidePopups(!1), void(this.link = !1)) : !1
    }, a.Editable.prototype.hideOtherEditors = function() {
        for (var b = 1; b <= a.Editable.count; b++) b != this._id && this.$window.trigger("hide." + b)
    }, a.Editable.prototype.hideBttnWrapper = function() {
        this.options.inlineMode && this.$bttn_wrapper.hide()
    }, a.Editable.prototype.showBttnWrapper = function() {
        this.options.inlineMode && this.$bttn_wrapper.show()
    }, a.Editable.prototype.showEditPopupWrapper = function() {
        this.$edit_popup_wrapper && (this.$edit_popup_wrapper.show(), setTimeout(a.proxy(function() {
            this.$edit_popup_wrapper.find("input").val(this.$element.text()).focus().select()
        }, this), 1))
    }, a.Editable.prototype.hidePopups = function(a) {
        void 0 === a && (a = !0), a && this.hideBttnWrapper(), this.raiseEvent("hidePopups")
    }, a.Editable.prototype.showEditPopup = function() {
        this.showEditPopupWrapper()
    }
}(jQuery),
function(a) {
    a.Editable.prototype.getBoundingRect = function() {
        var b;
        if (this.isLink) {
            b = {};
            var c = this.$element;
            b.left = c.offset().left - this.$window.scrollLeft(), b.top = c.offset().top - this.$window.scrollTop(), b.width = c.outerWidth(), b.height = parseInt(c.css("padding-top").replace("px", ""), 10) + c.height(), b.right = 1, b.bottom = 1, b.ok = !0
        } else if (this.getRange() && this.getRange().collapsed) {
            var d = a(this.getSelectionElement());
            this.saveSelectionByMarkers();
            var e = this.$element.find(".f-marker:first");
            e.css("display", "inline");
            var f = e.offset();
            e.css("display", "none"), b = {}, b.left = f.left - this.$window.scrollLeft(), b.width = 0, b.height = (parseInt(d.css("line-height").replace("px", ""), 10) || 10) - 10 - this.$window.scrollTop(), b.top = f.top, b.right = 1, b.bottom = 1, b.ok = !0, this.removeMarkers()
        } else this.getRange() && (b = this.getRange().getBoundingClientRect());
        return b
    }, a.Editable.prototype.repositionEditor = function(a) {
        var b, c, d;
        if (this.options.inlineMode || a) {
            if (b = this.getBoundingRect(), this.showBttnWrapper(), b.ok || b.left >= 0 && b.top >= 0 && b.right > 0 && b.bottom > 0) c = b.left + b.width / 2, d = b.top + b.height, this.iOS() && this.iOSVersion() < 8 || (c += this.$window.scrollLeft(), d += this.$window.scrollTop()), this.showByCoordinates(c, d);
            else if (this.options.alwaysVisible) this.hide();
            else {
                var e = this.$element.offset();
                this.showByCoordinates(e.left, e.top + 10)
            }
            0 === this.options.buttons.length && this.hide()
        }
    }, a.Editable.prototype.showByCoordinates = function(a, b) {
        a -= 22, b += 8;
        var c = this.$document.find(this.options.scrollableContainer);
        "body" != this.options.scrollableContainer && (a -= c.offset().left, b -= c.offset().top, this.iPad() || (b += c.scrollTop(), a += c.scrollLeft()));
        var d = Math.max(this.$popup_editor.outerWidth(), 250);
        a + d >= c.outerWidth() - 50 && a + 44 - d > 0 ? (this.$popup_editor.addClass("right-side"), a = c.outerWidth() - (a + 44), "static" == c.css("position") && (a = a + parseFloat(c.css("margin-left"), 10) + parseFloat(c.css("margin-right"), 10)), this.$popup_editor.css("top", b), this.$popup_editor.css("right", a), this.$popup_editor.css("left", "auto")) : a + d < c.outerWidth() - 50 ? (this.$popup_editor.removeClass("right-side"), this.$popup_editor.css("top", b), this.$popup_editor.css("left", a), this.$popup_editor.css("right", "auto")) : (this.$popup_editor.removeClass("right-side"), this.$popup_editor.css("top", b), this.$popup_editor.css("left", Math.max(c.outerWidth() - d, 10) / 2), this.$popup_editor.css("right", "auto")), this.$popup_editor.show()
    }, a.Editable.prototype.positionPopup = function(b) {
        if (a(this.$editor.find('button.fr-bttn[data-cmd="' + b + '"]')).length) {
            var c = this.$editor.find('button.fr-bttn[data-cmd="' + b + '"]'),
                d = c.width(),
                e = c.height(),
                f = c.offset().left + d / 2,
                g = c.offset().top + e;
            this.showByCoordinates(f, g)
        }
    }
}(jQuery),
function(a) {
    a.Editable.prototype.refreshImageAlign = function(a) {
        this.$image_editor.find('.fr-dropdown > button[data-name="align"] + ul li').removeClass("active");
        var b = "floatImageNone",
            c = "center";
        a.hasClass("fr-fil") ? (c = "left", b = "floatImageLeft") : a.hasClass("fr-fir") && (c = "right", b = "floatImageRight"), this.$image_editor.find('.fr-dropdown > button[data-name="align"].fr-trigger i').attr("class", "fa fa-align-" + c), this.$image_editor.find('.fr-dropdown > button[data-name="align"] + ul li[data-val="' + b + '"]').addClass("active")
    }, a.Editable.prototype.refreshImageDisplay = function() {
        var a = this.$element.find(".f-img-editor");
        this.$image_editor.find('.fr-dropdown > button[data-name="display"] + ul li').removeClass("active"), a.hasClass("fr-dib") ? this.$image_editor.find('.fr-dropdown > button[data-name="display"] + ul li[data-val="fr-dib"]').addClass("active") : this.$image_editor.find('.fr-dropdown > button[data-name="display"] + ul li[data-val="fr-dii"]').addClass("active")
    }, a.Editable.image_commands = {
        align: {
            title: "Alignment",
            icon: "fa fa-align-center",
            refresh: a.Editable.prototype.refreshImageAlign,
            refreshOnShow: a.Editable.prototype.refreshImageAlign,
            seed: [{
                cmd: "floatImageLeft",
                title: "Align Left",
                icon: "fa fa-align-left"
            }, {
                cmd: "floatImageNone",
                title: "Align Center",
                icon: "fa fa-align-center"
            }, {
                cmd: "floatImageRight",
                title: "Align Right",
                icon: "fa fa-align-right"
            }],
            callback: function(a, b, c) {
                this[c](a)
            },
            undo: !0
        },
        display: {
            title: "Text Wrap",
            icon: "fa fa-star",
            refreshOnShow: a.Editable.prototype.refreshImageDisplay,
            namespace: "Image",
            seed: [{
                title: "Inline",
                value: "fr-dii"
            }, {
                title: "Break Text",
                value: "fr-dib"
            }],
            callback: function(a, b, c) {
                this.displayImage(a, c)
            },
            undo: !0
        },
        linkImage: {
            title: "Insert Link",
            icon: {
                type: "font",
                value: "fa fa-link"
            },
            callback: function(a) {
                this.linkImage(a)
            }
        },
        replaceImage: {
            title: "Replace Image",
            icon: {
                type: "font",
                value: "fa fa-exchange"
            },
            callback: function(a) {
                this.replaceImage(a)
            }
        },
        removeImage: {
            title: "Remove Image",
            icon: {
                type: "font",
                value: "fa fa-trash-o"
            },
            callback: function(a) {
                this.removeImage(a)
            }
        }
    }, a.Editable.DEFAULTS = a.extend(a.Editable.DEFAULTS, {
        allowedImageTypes: ["jpeg", "jpg", "png", "gif"],
        customImageButtons: {},
        defaultImageTitle: "Image title",
        defaultImageWidth: 300,
        defaultImageDisplay: "block",
        defaultImageAlignment: "center",
        imageButtons: ["display", "align", "linkImage", "replaceImage", "removeImage"],
        imageDeleteConfirmation: !0,
        imageDeleteURL: null,
        imageDeleteParams: {},
        imageMove: !0,
        imageResize: !0,
        imageLink: !0,
        imageTitle: !0,
        imageUpload: !0,
        imageUploadParams: {},
        imageUploadParam: "file",
        imageUploadToS3: !1,
        imageUploadURL: "https://i.froala.com/upload",
        maxImageSize: 10485760,
        pasteImage: !0,
        textNearImage: !0
    }), a.Editable.prototype.hideImageEditorPopup = function() {
        this.$image_editor && this.$image_editor.hide()
    }, a.Editable.prototype.showImageEditorPopup = function() {
        this.$image_editor && this.$image_editor.show(), this.options.imageMove || this.$element.attr("contenteditable", !1)
    }, a.Editable.prototype.showImageWrapper = function() {
        this.$image_wrapper && this.$image_wrapper.show()
    }, a.Editable.prototype.hideImageWrapper = function(a) {
        this.$image_wrapper && (this.$element.attr("data-resize") || a || (this.closeImageMode(), this.imageMode = !1), this.$image_wrapper.hide(), this.$image_wrapper.find("input").blur())
    }, a.Editable.prototype.showInsertImage = function() {
        this.hidePopups(), this.showImageWrapper()
    }, a.Editable.prototype.showImageEditor = function() {
        this.hidePopups(), this.showImageEditorPopup()
    }, a.Editable.prototype.insertImageHTML = function() {
        var b = '<div class="froala-popup froala-image-popup" style="display: none;"><h4><span data-text="true">Insert Image</span><span data-text="true">Uploading image</span><i title="Cancel" class="fa fa-times" id="f-image-close-' + this._id + '"></i></h4>';
        return b += '<div id="f-image-list-' + this._id + '">', this.options.imageUpload && (b += '<div class="f-popup-line drop-upload">', b += '<div class="f-upload" id="f-upload-div-' + this._id + '"><strong data-text="true">Drop Image</strong><br>(<span data-text="true">or click</span>)<form target="frame-' + this._id + '" enctype="multipart/form-data" encoding="multipart/form-data" action="' + this.options.imageUploadURL + '" method="post" id="f-upload-form-' + this._id + '"><input id="f-file-upload-' + this._id + '" type="file" name="' + this.options.imageUploadParam + '" accept="image/*"></form></div>', this.browser.msie && a.Editable.getIEversion() <= 9 && (b += '<iframe id="frame-' + this._id + '" name="frame-' + this._id + '" src="javascript:false;" style="width:0; height:0; border:0px solid #FFF; position: fixed; z-index: -1;"></iframe>'), b += "</div>"), this.options.imageLink && (b += '<div class="f-popup-line"><label><span data-text="true">Enter URL</span>: </label><input id="f-image-url-' + this._id + '" type="text" placeholder="http://example.com"><button class="f-browse fr-p-bttn" id="f-browser-' + this._id + '"><i class="fa fa-search"></i></button><button data-text="true" class="f-ok fr-p-bttn f-submit" id="f-image-ok-' + this._id + '">OK</button></div>'), b += "</div>", b += '<p class="f-progress" id="f-progress-' + this._id + '"><span></span></p>', b += "</div>"
    }, a.Editable.prototype.iFrameLoad = function() {
        var a = this.$image_wrapper.find("iframe#frame-" + this._id);
        if (!a.attr("data-loaded")) return a.attr("data-loaded", !0), !1;
        try {
            var b = this.$image_wrapper.find("#f-upload-form-" + this._id);
            if (this.options.imageUploadToS3) {
                var c = b.attr("action"),
                    d = b.find('input[name="key"]').val(),
                    e = c + d;
                this.writeImage(e), this.options.imageUploadToS3.callback && this.options.imageUploadToS3.callback.call(this, e, d)
            } else {
                var f = a.contents().text();
                this.parseImageResponse(f)
            }
        } catch (g) {
            this.throwImageError(7)
        }
    }, a.Editable.prototype.initImage = function() {
        this.buildInsertImage(), (!this.isLink || this.isImage) && this.initImagePopup(), this.addListener("destroy", this.destroyImage)
    }, a.Editable.initializers.push(a.Editable.prototype.initImage), a.Editable.prototype.destroyImage = function() {
        this.$image_editor && this.$image_editor.html("").removeData().remove(), this.$image_wrapper && this.$image_wrapper.html("").removeData().remove()
    }, a.Editable.prototype.buildInsertImage = function() {
        this.$image_wrapper = a(this.insertImageHTML()), this.$popup_editor.append(this.$image_wrapper);
        var b = this;
        if (this.$image_wrapper.on("mouseup touchend", a.proxy(function(a) {
            this.isResizing() || a.stopPropagation()
        }, this)), this.addListener("hidePopups", a.proxy(function() {
            this.hideImageWrapper(!0)
        }), this), this.$progress_bar = this.$image_wrapper.find("p#f-progress-" + this._id), this.options.imageUpload) {
            if (this.browser.msie && a.Editable.getIEversion() <= 9) {
                var c = this.$image_wrapper.find("iframe").get(0);
                c.attachEvent ? c.attachEvent("onload", function() {
                    b.iFrameLoad()
                }) : c.onload = function() {
                    b.iFrameLoad()
                }
            }
            this.$image_wrapper.on("change", 'input[type="file"]', function() {
                if (void 0 !== this.files) b.uploadImage(this.files);
                else {
                    var c = a(this).parents("form");
                    c.find('input[type="hidden"]').remove();
                    var d;
                    for (d in b.options.imageUploadParams) c.prepend('<input type="hidden" name="' + d + '" value="' + b.options.imageUploadParams[d] + '" />');
                    if (b.options.imageUploadToS3 !== !1) {
                        for (d in b.options.imageUploadToS3.params) c.prepend('<input type="hidden" name="' + d + '" value="' + b.options.imageUploadToS3.params[d] + '" />');
                        c.prepend('<input type="hidden" name="success_action_status" value="201" />'), c.prepend('<input type="hidden" name="X-Requested-With" value="xhr" />'), c.prepend('<input type="hidden" name="Content-Type" value="" />'), c.prepend('<input type="hidden" name="key" value="' + b.options.imageUploadToS3.keyStart + (new Date).getTime() + "-" + a(this).val().match(/[^/\]+$/) + '" />')
                    } else c.prepend('<input type="hidden" name="XHR_CORS_TRARGETORIGIN" value="' + b.window.location.href + '" />');
                    b.showInsertImage(), b.showImageLoader(!0), b.disable(), c.submit()
                }
                a(this).val("")
            })
        }
        this.buildDragUpload(), this.$image_wrapper.on("mouseup keydown", "#f-image-url-" + this._id, a.proxy(function(a) {
            var b = a.which;
            b && 27 === b || a.stopPropagation()
        }, this)), this.$image_wrapper.on("click", "#f-image-ok-" + this._id, a.proxy(function() {
            this.writeImage(this.$image_wrapper.find("#f-image-url-" + this._id).val(), !0)
        }, this)), this.$image_wrapper.on(this.mouseup, "#f-image-close-" + this._id, a.proxy(function(a) {
            return this.isDisabled ? !1 : (a.stopPropagation(), this.$bttn_wrapper.show(), this.hideImageWrapper(!0), this.options.inlineMode && 0 === this.options.buttons.length && (this.imageMode ? this.showImageEditor() : this.hide()), this.imageMode || (this.restoreSelection(), this.focus()), void(this.options.inlineMode || this.imageMode ? this.imageMode && this.showImageEditor() : this.hide()))
        }, this)), this.$image_wrapper.on("click", function(a) {
            a.stopPropagation()
        }), this.$image_wrapper.on("click", "*", function(a) {
            a.stopPropagation()
        })
    }, a.Editable.prototype.deleteImage = function(b) {
        if (this.options.imageDeleteURL) {
            var c = this.options.imageDeleteParams;
            c.info = b.data("info"), c.src = b.attr("src"), a.ajax({
                type: "POST",
                url: this.options.imageDeleteURL,
                data: c,
                crossDomain: this.options.crossDomain,
                xhrFields: {
                    withCredentials: this.options.withCredentials
                },
                headers: this.options.headers
            }).done(a.proxy(function(a) {
                b.parent().parent().hasClass("f-image-list") ? b.parent().remove() : b.parent().removeClass("f-img-deleting"), this.triggerEvent("imageDeleteSuccess", [a], !1)
            }, this)).fail(a.proxy(function() {
                b.parent().removeClass("f-img-deleting"), this.triggerEvent("imageDeleteError", ["Error during image delete."], !1)
            }, this))
        } else b.parent().removeClass("f-img-deleting"), this.triggerEvent("imageDeleteError", ["Missing imageDeleteURL option."], !1)
    }, a.Editable.prototype.imageHandle = function() {
        var b = this,
            c = a('<span data-fr-verified="true">').addClass("f-img-handle").on({
                movestart: function(c) {
                    b.hide(), b.$element.addClass("f-non-selectable").attr("contenteditable", !1), b.$element.attr("data-resize", !0), a(this).attr("data-start-x", c.startX), a(this).attr("data-start-y", c.startY)
                },
                move: function(c) {
                    var d = a(this),
                        e = c.pageX - parseInt(d.attr("data-start-x"), 10);
                    d.attr("data-start-x", c.pageX), d.attr("data-start-y", c.pageY);
                    var f = d.prevAll("img"),
                        g = f.width();
                    d.hasClass("f-h-ne") || d.hasClass("f-h-se") ? f.attr("width", g + e) : f.attr("width", g - e), b.triggerEvent("imageResize", [], !1)
                },
                moveend: function() {
                    a(this).removeAttr("data-start-x"), a(this).removeAttr("data-start-y"), b.$element.removeClass("f-non-selectable"), b.isImage || b.$element.attr("contenteditable", !0), b.triggerEvent("imageResizeEnd"), a(this).trigger("mouseup")
                },
                touchend: function() {
                    a(this).trigger("moveend")
                }
            });
        return c
    }, a.Editable.prototype.disableImageResize = function() {
        if (this.browser.mozilla) try {
            document.execCommand("enableObjectResizing", !1, !1), document.execCommand("enableInlineTableEditing", !1, !1)
        } catch (a) {}
    }, a.Editable.prototype.isResizing = function() {
        return this.$element.attr("data-resize")
    }, a.Editable.prototype.getImageStyle = function(a) {
        var b = "z-index: 1; position: relative; overflow: auto;",
            c = a,
            d = "padding";
        return a.parent().hasClass("f-img-editor") && (c = a.parent(), d = "margin"), b += " padding-left:" + c.css(d + "-left") + ";", b += " padding-right:" + c.css(d + "-right") + ";", b += " padding-bottom:" + c.css(d + "-bottom") + ";", b += " padding-top:" + c.css(d + "-top") + ";", a.hasClass("fr-dib") ? (b += " vertical-align: top; display: block;", b += a.hasClass("fr-fir") ? " float: none; margin-right: 0; margin-left: auto;" : a.hasClass("fr-fil") ? " float: none; margin-left: 0; margin-right: auto;" : " float: none; margin: auto;") : (b += " display: inline-block;", b += a.hasClass("fr-fir") ? " float: right;" : a.hasClass("fr-fil") ? " float: left;" : " float: none;"), b
    }, a.Editable.prototype.getImageClass = function(a) {
        var b = a.split(" ");
        return a = "fr-fin", b.indexOf("fr-fir") >= 0 && (a = "fr-fir"), b.indexOf("fr-fil") >= 0 && (a = "fr-fil"), b.indexOf("fr-dib") >= 0 && (a += " fr-dib"), b.indexOf("fr-dii") >= 0 && (a += " fr-dii"), a
    }, a.Editable.prototype.refreshImageButtons = function(a) {
        this.$image_editor.find("button").removeClass("active");
        var b = a.css("float");
        b = a.hasClass("fr-fil") ? "Left" : a.hasClass("fr-fir") ? "Right" : "None", this.$image_editor.find('button[data-cmd="floatImage' + b + '"]').addClass("active"), this.raiseEvent("refreshImage", [a])
    }, a.Editable.prototype.initImageEvents = function() {
        document.addEventListener && !document.dropAssigned && (document.dropAssigned = !0, document.addEventListener("drop", a.proxy(function(b) {
            return a(".froala-element img.fr-image-move").length ? (b.preventDefault(), b.stopPropagation(), a(".froala-element img.fr-image-move").removeClass("fr-image-move"), !1) : void 0
        }, this))), this.disableImageResize();
        var b = this;
        this.$element.on("mousedown", 'img:not([contenteditable="false"])', function(c) {
            return b.isDisabled ? !1 : void(b.isResizing() || (b.initialized && c.stopPropagation(), b.$element.attr("contenteditable", !1), a(this).addClass("fr-image-move")))
        }), this.$element.on("mouseup", 'img:not([contenteditable="false"])', function() {
            return b.isDisabled ? !1 : void(b.isResizing() || (b.options.imageMove || b.isImage || b.isHTML || b.$element.attr("contenteditable", !0), a(this).removeClass("fr-image-move")))
        }), this.$element.on("click touchend", 'img:not([contenteditable="false"])', function(c) {
            if (b.isDisabled) return !1;
            if (!b.isResizing() && b.initialized) {
                if (c.preventDefault(), c.stopPropagation(), b.closeImageMode(), b.$element.blur(), b.refreshImageButtons(a(this)), b.$image_editor.find('.f-image-alt input[type="text"]').val(a(this).attr("alt") || a(this).attr("title")), b.showImageEditor(), !a(this).parent().hasClass("f-img-editor") || "SPAN" != a(this).parent().get(0).tagName) {
                    var d = b.getImageClass(a(this).attr("class"));
                    a(this).wrap('<span data-fr-verified="true" class="f-img-editor ' + d + '"></span>'), 0 !== a(this).parents(".f-img-wrap").length || b.isImage ? a(this).parents(".f-img-wrap").attr("class", d + " f-img-wrap") : a(this).parents("a").length > 0 ? a(this).parents("a:first").wrap('<span data-fr-verified="true" class="f-img-wrap ' + d + '"></span>') : a(this).parent().wrap('<span data-fr-verified="true" class="f-img-wrap ' + d + '"></span>')
                }
                if (a(this).parent().find(".f-img-handle").remove(), b.options.imageResize) {
                    var e = b.imageHandle();
                    a(this).parent().append(e.clone(!0).addClass("f-h-ne")), a(this).parent().append(e.clone(!0).addClass("f-h-se")), a(this).parent().append(e.clone(!0).addClass("f-h-sw")), a(this).parent().append(e.clone(!0).addClass("f-h-nw"))
                }
                b.showByCoordinates(a(this).offset().left + a(this).width() / 2, a(this).offset().top + a(this).height()), b.imageMode = !0, b.$bttn_wrapper.find(".fr-bttn").removeClass("active"), b.clearSelection()
            }
        }), this.$element.on("mousedown touchstart", ".f-img-handle", a.proxy(function() {
            return b.isDisabled ? !1 : void this.$element.attr("data-resize", !0)
        }, this)), this.$element.on("mouseup", ".f-img-handle", a.proxy(function(c) {
            if (b.isDisabled) return !1;
            var d = a(c.target).prevAll("img");
            setTimeout(a.proxy(function() {
                this.$element.removeAttr("data-resize"), d.click()
            }, this), 0)
        }, this))
    }, a.Editable.prototype.execImage = function(b, c, d) {
        var e = this.$element.find("span.f-img-editor"),
            f = e.find("img"),
            g = a.Editable.image_commands[b] || this.options.customImageButtons[b];
        g && g.callback && g.callback.apply(this, [f, b, c, d])
    }, a.Editable.prototype.bindImageRefreshListener = function(b) {
        b.refresh && this.addListener("refreshImage", a.proxy(function(a) {
            b.refresh.apply(this, [a])
        }, this))
    }, a.Editable.prototype.buildImageButton = function(a, b) {
        var c = '<button class="fr-bttn" data-namespace="Image" data-cmd="' + b + '" title="' + a.title + '">';
        return c += void 0 !== this.options.icons[b] ? this.prepareIcon(this.options.icons[b], a.title) : this.prepareIcon(a.icon, a.title), c += "</button>", this.bindImageRefreshListener(a), c
    }, a.Editable.prototype.buildImageAlignDropdown = function(a) {
        this.bindImageRefreshListener(a);
        for (var b = '<ul class="fr-dropdown-menu f-align">', c = 0; c < a.seed.length; c++) {
            var d = a.seed[c];
            b += '<li data-cmd="align" data-namespace="Image" data-val="' + d.cmd + '" title="' + d.title + '"><a href="#"><i class="' + d.icon + '"></i></a></li>'
        }
        return b += "</ul>"
    }, a.Editable.prototype.buildImageDropdown = function(a) {
        return dropdown = this.buildDefaultDropdown(a), btn = this.buildDropdownButton(a, dropdown), btn
    }, a.Editable.prototype.image_command_dispatcher = {
        align: function(a) {
            var b = this.buildImageAlignDropdown(a),
                c = this.buildDropdownButton(a, b);
            return c
        }
    }, a.Editable.prototype.buildImageButtons = function() {
        for (var b = "", c = 0; c < this.options.imageButtons.length; c++) {
            var d = this.options.imageButtons[c];
            if (void 0 !== a.Editable.image_commands[d] || void 0 !== this.options.customImageButtons[d]) {
                var e = a.Editable.image_commands[d] || this.options.customImageButtons[d];
                e.cmd = d;
                var f = this.image_command_dispatcher[d];
                b += f ? f.apply(this, [e]) : e.seed ? this.buildImageDropdown(e, d) : this.buildImageButton(e, d)
            }
        }
        return b
    }, a.Editable.prototype.initImagePopup = function() {
        this.$image_editor = a('<div class="froala-popup froala-image-editor-popup" style="display: none">');
        var b = a('<div class="f-popup-line f-popup-toolbar">').appendTo(this.$image_editor);
        b.append(this.buildImageButtons()), this.addListener("hidePopups", this.hideImageEditorPopup), this.options.imageTitle && a('<div class="f-popup-line f-image-alt">').append('<label><span data-text="true">Title</span>: </label>').append(a('<input type="text">').on("mouseup keydown touchend", function(a) {
            var b = a.which;
            b && 27 === b || a.stopPropagation()
        })).append('<button class="fr-p-bttn f-ok" data-text="true" data-callback="setImageAlt" data-cmd="setImageAlt" title="OK">OK</button>').appendTo(this.$image_editor), this.$popup_editor.append(this.$image_editor), this.bindCommandEvents(this.$image_editor), this.bindDropdownEvents(this.$image_editor)
    }, a.Editable.prototype.displayImage = function(a, b) {
        var c = a.parents("span.f-img-editor");
        c.removeClass("fr-dii fr-dib").addClass(b), this.triggerEvent("imageDisplayed", [a, b]), a.click()
    }, a.Editable.prototype.floatImageLeft = function(a) {
        var b = a.parents("span.f-img-editor");
        b.removeClass("fr-fin fr-fil fr-fir").addClass("fr-fil"), this.isImage && this.$element.css("float", "left"), this.triggerEvent("imageFloatedLeft", [a]), a.click()
    }, a.Editable.prototype.floatImageNone = function(a) {
        var b = a.parents("span.f-img-editor");
        b.removeClass("fr-fin fr-fil fr-fir").addClass("fr-fin"), this.isImage || (b.parent().get(0) == this.$element.get(0) ? b.wrap('<div style="text-align: center;"></div>') : b.parents(".f-img-wrap:first").css("text-align", "center")), this.isImage && this.$element.css("float", "none"), this.triggerEvent("imageFloatedNone", [a]), a.click()
    }, a.Editable.prototype.floatImageRight = function(a) {
        var b = a.parents("span.f-img-editor");
        b.removeClass("fr-fin fr-fil fr-fir").addClass("fr-fir"), this.isImage && this.$element.css("float", "right"), this.triggerEvent("imageFloatedRight", [a]), a.click()
    }, a.Editable.prototype.linkImage = function(a) {
        this.imageMode = !0, this.showInsertLink();
        var b = a.parents("span.f-img-editor");
        "A" == b.parent().get(0).tagName ? (this.$link_wrapper.find('input[type="text"]').val(b.parent().attr("href")), this.$link_wrapper.find(".f-external-link").attr("href", b.parent().attr("href")), "_blank" == b.parent().attr("target") ? this.$link_wrapper.find('input[type="checkbox"]').prop("checked", !0) : this.$link_wrapper.find('input[type="checkbox"]').prop("checked", !1), this.$link_wrapper.find("a.f-external-link, button.f-unlink").show()) : (this.$link_wrapper.find('input[type="text"]').val("http://"), this.$link_wrapper.find(".f-external-link").attr("href", "#"), this.$link_wrapper.find('input[type="checkbox"]').prop("checked", this.options.alwaysBlank), this.$link_wrapper.find("a.f-external-link, button.f-unlink").hide())
    }, a.Editable.prototype.replaceImage = function(a) {
        this.showInsertImage(), this.imageMode = !0, this.$image_wrapper.find('input[type="text"]').val(a.attr("src")), this.showByCoordinates(a.offset().left + a.width() / 2, a.offset().top + a.height())
    }, a.Editable.prototype.removeImage = function(b) {
        var c = b.parents("span.f-img-editor");
        if (0 === c.length) return !1;
        var d = b.get(0),
            e = "Are you sure? Image will be deleted.";
        if (a.Editable.LANGS[this.options.language] && (e = a.Editable.LANGS[this.options.language].translation[e]), !this.options.imageDeleteConfirmation || confirm(e)) {
            if (this.triggerEvent("beforeRemoveImage", [a(d)], !1)) {
                var f = c.parents(this.valid_nodes.join(","));
                c.parents(".f-img-wrap").length ? c.parents(".f-img-wrap").remove() : c.remove(), this.refreshImageList(!0), this.hide(), f.length && f[0] != this.$element.get(0) && "" === a(f[0]).text() && a(f[0]).remove(), this.wrapText(), this.triggerEvent("afterRemoveImage", [b]), this.focus(), this.imageMode = !1
            }
        } else b.click()
    }, a.Editable.prototype.setImageAlt = function() {
        var a = this.$element.find("span.f-img-editor");
        a.find("img").attr("alt", this.$image_editor.find('.f-image-alt input[type="text"]').val()), a.find("img").attr("title", this.$image_editor.find('.f-image-alt input[type="text"]').val()), this.hide(), this.closeImageMode(), this.triggerEvent("imageAltSet")
    }, a.Editable.prototype.buildImageMove = function() {
        var b = this;
        this.isLink || this.initDrag(), b.$element.on("dragover dragenter dragend", function() {
            return !1
        }), b.$element.on("drop", function(c) {
            if (b.isDisabled) return !1;
            if (b.closeImageMode(), b.hide(), b.imageMode = !1, b.initialized || (b.$element.unbind("mousedown.element"), b.lateInit()), !b.options.imageUpload || 0 !== a(".froala-element img.fr-image-move").length) {
                if (a(".froala-element .fr-image-move").length > 0 && b.options.imageMove) {
                    c.preventDefault(), c.stopPropagation(), b.insertMarkersAtPoint(c.originalEvent), b.restoreSelectionByMarkers();
                    var d = a("<div>").append(a(".froala-element img.fr-image-move").clone().removeClass("fr-image-move").addClass("fr-image-dropped")).html();
                    b.insertHTML(d);
                    var e = a(".froala-element img.fr-image-move").parent();
                    a(".froala-element img.fr-image-move").remove(), e.get(0) != b.$element.get(0) && e.is(":empty") && e.remove(), b.clearSelection(), b.initialized ? setTimeout(function() {
                        b.$element.find(".fr-image-dropped").removeClass(".fr-image-dropped").click()
                    }, 0) : b.$element.find(".fr-image-dropped").removeClass(".fr-image-dropped"), b.sync(), b.hideOtherEditors()
                } else c.preventDefault(), c.stopPropagation(), a(".froala-element img.fr-image-move").removeClass("fr-image-move");
                return !1
            }
            if (c.originalEvent.dataTransfer && c.originalEvent.dataTransfer.files && c.originalEvent.dataTransfer.files.length) {
                if (b.isDisabled) return !1;
                var f = c.originalEvent.dataTransfer.files;
                b.options.allowedImageTypes.indexOf(f[0].type.replace(/image//g, "")) >= 0 && (b.insertMarkersAtPoint(c.originalEvent), b.showByCoordinates(c.originalEvent.pageX, c.originalEvent.pageY), b.uploadImage(f), c.preventDefault(), c.stopPropagation())
            }
        })
    }, a.Editable.prototype.buildDragUpload = function() {
        var b = this;
        b.$image_wrapper.on("dragover", "#f-upload-div-" + this._id, function() {
            return a(this).addClass("f-hover"), !1
        }), b.$image_wrapper.on("dragend", "#f-upload-div-" + this._id, function() {
            return a(this).removeClass("f-hover"), !1
        }), b.$image_wrapper.on("drop", "#f-upload-div-" + this._id, function(c) {
            return c.preventDefault(), c.stopPropagation(), b.options.imageUpload ? (a(this).removeClass("f-hover"), void b.uploadImage(c.originalEvent.dataTransfer.files)) : !1
        })
    }, a.Editable.prototype.showImageLoader = function(b) {
        if (void 0 === b && (b = !1), b) {
            var c = "Please wait!";
            a.Editable.LANGS[this.options.language] && (c = a.Editable.LANGS[this.options.language].translation[c]), this.$progress_bar.find("span").css("width", "100%").text(c)
        } else this.$image_wrapper.find("h4").addClass("uploading");
        this.$image_wrapper.find("#f-image-list-" + this._id).hide(), this.$progress_bar.show(), this.showInsertImage()
    }, a.Editable.prototype.hideImageLoader = function() {
        this.$progress_bar.hide(), this.$progress_bar.find("span").css("width", "0%").text(""), this.$image_wrapper.find("#f-image-list-" + this._id).show(), this.$image_wrapper.find("h4").removeClass("uploading")
    }, a.Editable.prototype.writeImage = function(b, c, d) {
        if (c && (b = this.sanitizeURL(b), "" === b)) return !1;
        var e = new Image;
        e.onerror = a.proxy(function() {
            this.hideImageLoader(), this.throwImageError(1)
        }, this), e.onload = this.imageMode ? a.proxy(function() {
            var a = this.$element.find(".f-img-editor > img");
            a.attr("src", b), this.hide(), this.hideImageLoader(), this.$image_editor.show(), this.enable(), this.triggerEvent("imageReplaced", [a, d]), setTimeout(function() {
                a.trigger("click")
            }, 0)
        }, this) : a.proxy(function() {
            this.insertLoadedImage(b, d)
        }, this), this.showImageLoader(!0), e.src = b
    }, a.Editable.prototype.processInsertImage = function(b, c) {
        void 0 === c && (c = !0), this.enable(), this.restoreSelection(), this.focus();
        var d = "";
        parseInt(this.options.defaultImageWidth, 10) && (d = ' width="' + this.options.defaultImageWidth + '"');
        var e = "fr-fin";
        "left" == this.options.defaultImageAlignment && (e = "fr-fil"), "right" == this.options.defaultImageAlignment && (e = "fr-fir"), e += " fr-di" + this.options.defaultImageDisplay[0];
        var f = '<img class="' + e + ' fr-just-inserted" href="'+ b +'" alt="' + this.options.defaultImageTitle + '" src="' + b + '"' + d + ">",
            g = this.getSelectionElements()[0],
            h = this.getRange(),
            i = !this.browser.msie && a.Editable.getIEversion() > 8 ? a(h.startContainer) : null;
        i && i.hasClass("f-img-wrap") ? (1 === h.startOffset ? (i.after("<" + this.options.defaultTag + '><span class="f-marker" data-type="true" data-id="0"></span><br/><span class="f-marker" data-type="false" data-id="0"></span></' + this.options.defaultTag + ">"), this.restoreSelectionByMarkers(), this.getSelection().collapseToStart()) : 0 === h.startOffset && (i.before("<" + this.options.defaultTag + '><span class="f-marker" data-type="true" data-id="0"></span><br/><span class="f-marker" data-type="false" data-id="0"></span></' + this.options.defaultTag + ">"), this.restoreSelectionByMarkers(), this.getSelection().collapseToStart()), this.insertHTML(f)) : this.getSelectionTextInfo(g).atStart && g != this.$element.get(0) && "TD" != g.tagName && "TH" != g.tagName && "LI" != g.tagName ? a(g).before("<" + this.options.defaultTag + ">" + f + "</" + this.options.defaultTag + ">") : this.insertHTML(f), this.disable()
    }, a.Editable.prototype.insertLoadedImage = function(b, c) {
        this.triggerEvent("imageLoaded", [b], !1), this.processInsertImage(b, !1), this.browser.msie && this.$element.find("img").each(function(a, b) {
            b.oncontrolselect = function() {
                return !1
            }
        }), this.enable(), this.hide(), this.hideImageLoader(), this.wrapText(), this.cleanupLists();
        var d, e = this.$element.find("img.fr-just-inserted").get(0);
        e && (d = e.previousSibling), d && 3 == d.nodeType && /u200B/gi.test(d.textContent) && a(d).remove(), this.triggerEvent("imageInserted", [this.$element.find("img.fr-just-inserted"), c]), setTimeout(a.proxy(function() {
            this.$element.find("img.fr-just-inserted").removeClass("fr-just-inserted").trigger("touchend")
        }, this), 50)
    }, a.Editable.prototype.throwImageErrorWithMessage = function(a) {
        this.enable(), this.triggerEvent("imageError", [{
            message: a,
            code: 0
        }], !1), this.hideImageLoader()
    }, a.Editable.prototype.throwImageError = function(a) {
        this.enable();
        var b = "Unknown image upload error.";
        1 == a ? b = "Bad link." : 2 == a ? b = "No link in upload response." : 3 == a ? b = "Error during file upload." : 4 == a ? b = "Parsing response failed." : 5 == a ? b = "Image too large." : 6 == a ? b = "Invalid image type." : 7 == a && (b = "Image can be uploaded only to same domain in IE 8 and IE 9."), this.triggerEvent("imageError", [{
            code: a,
            message: b
        }], !1), this.hideImageLoader()
    }, a.Editable.prototype.uploadImage = function(b) {
        if (!this.triggerEvent("beforeImageUpload", [b], !1)) return !1;
        if (void 0 !== b && b.length > 0) {
            var c;
            if (this.drag_support.formdata && (c = this.drag_support.formdata ? new FormData : null), c) {
                var d;
                for (d in this.options.imageUploadParams) c.append(d, this.options.imageUploadParams[d]);
                if (this.options.imageUploadToS3 !== !1) {
                    for (d in this.options.imageUploadToS3.params) c.append(d, this.options.imageUploadToS3.params[d]);
                    c.append("success_action_status", "201"), c.append("X-Requested-With", "xhr"), c.append("Content-Type", b[0].type), c.append("key", this.options.imageUploadToS3.keyStart + (new Date).getTime() + "-" + b[0].name)
                }
                if (c.append(this.options.imageUploadParam, b[0]), b[0].size > this.options.maxImageSize) return this.throwImageError(5), !1;
                if (this.options.allowedImageTypes.indexOf(b[0].type.replace(/image//g, "")) < 0) return this.throwImageError(6), !1
            }
            if (c) {
                var e;
                if (this.options.crossDomain) e = this.createCORSRequest("POST", this.options.imageUploadURL);
                else {
                    e = new XMLHttpRequest, e.open("POST", this.options.imageUploadURL);
                    for (var f in this.options.headers) e.setRequestHeader(f, this.options.headers[f])
                }
                e.onload = a.proxy(function() {
                    var b = "Please wait!";
                    a.Editable.LANGS[this.options.language] && (b = a.Editable.LANGS[this.options.language].translation[b]), this.$progress_bar.find("span").css("width", "100%").text(b);
                    try {
                        this.options.imageUploadToS3 ? 201 == e.status ? this.parseImageResponseXML(e.responseXML) : this.throwImageError(3) : e.status >= 200 && e.status < 300 ? this.parseImageResponse(e.responseText) : this.throwImageError(3)
                    } catch (c) {
                        this.throwImageError(4)
                    }
                }, this), e.onerror = a.proxy(function() {
                    this.throwImageError(3)
                }, this), e.upload.onprogress = a.proxy(function(a) {
                    if (a.lengthComputable) {
                        var b = a.loaded / a.total * 100 | 0;
                        this.$progress_bar.find("span").css("width", b + "%")
                    }
                }, this), this.disable(), e.send(c), this.showImageLoader()
            }
        }
    }, a.Editable.prototype.parseImageResponse = function(b) {
        try {
            var c = a.parseJSON(b);
            c.link ? this.writeImage(c.link, !1, b) : c.error ? this.throwImageErrorWithMessage(c.error) : this.throwImageError(2)
        } catch (d) {
            this.throwImageError(4)
        }
    }, a.Editable.prototype.parseImageResponseXML = function(b) {
        try {
            var c = a(b).find("Location").text(),
                d = a(b).find("Key").text();
            this.options.imageUploadToS3.callback.call(this, c, d), c ? this.writeImage(c) : this.throwImageError(2)
        } catch (e) {
            this.throwImageError(4)
        }
    }, a.Editable.prototype.setImageUploadURL = function(a) {
        a && (this.options.imageUploadURL = a), this.options.imageUploadToS3 && (this.options.imageUploadURL = "https://" + this.options.imageUploadToS3.bucket + "." + this.options.imageUploadToS3.region + ".amazonaws.com/")
    }, a.Editable.prototype.closeImageMode = function() {
        this.$element.find("span.f-img-editor > img").each(a.proxy(function(b, c) {
            a(c).removeClass("fr-fin fr-fil fr-fir fr-dib fr-dii").addClass(this.getImageClass(a(c).parent().attr("class"))), a(c).parents(".f-img-wrap").length > 0 ? "A" == a(c).parent().parent().get(0).tagName ? a(c).siblings("span.f-img-handle").remove().end().unwrap().parent().unwrap() : a(c).siblings("span.f-img-handle").remove().end().unwrap().unwrap() : a(c).siblings("span.f-img-handle").remove().end().unwrap()
        }, this)), this.$element.find("span.f-img-editor").length && (this.$element.find("span.f-img-editor").remove(), this.$element.parents("span.f-img-editor").remove()), this.$element.removeClass("f-non-selectable"), this.editableDisabled || this.isHTML || this.$element.attr("contenteditable", !0), this.$image_editor && this.$image_editor.hide(), this.$link_wrapper && this.options.linkText && this.$link_wrapper.find('input[type="text"].f-lt').parent().removeClass("fr-hidden")
    }, a.Editable.prototype.refreshImageList = function(b) {
        if (!this.isLink && !this.options.editInPopup) {
            var c = [],
                d = [],
                e = this;
            if (this.$element.find("img").each(function(b, f) {
                var g = a(f);
                if (c.push(g.attr("src")), d.push(g), 0 !== g.parents(".f-img-editor").length || g.hasClass("fr-dii") || g.hasClass("fr-dib") || (e.options.textNearImage ? g.addClass(g.hasClass("fr-fin") ? "fr-dib" : g.hasClass("fr-fil") || g.hasClass("fr-fir") ? "fr-dii" : "block" == g.css("display") && "none" == g.css("float") ? "fr-dib" : "fr-dii") : (g.addClass("fr-dib"), e.options.imageButtons.splice(e.options.imageButtons.indexOf("display"), 1))), e.options.textNearImage || g.removeClass("fr-dii").addClass("fr-dib"), 0 === g.parents(".f-img-editor").length && !g.hasClass("fr-fil") && !g.hasClass("fr-fir") && !g.hasClass("fr-fin"))
                    if (g.hasClass("fr-dii")) g.addClass("right" == g.css("float") ? "fr-fir" : "left" == g.css("float") ? "fr-fil" : "fr-fin");
                    else {
                        var h = g.attr("style");
                        g.hide(), g.addClass(0 === parseInt(g.css("margin-right"), 10) && h ? "fr-fir" : 0 === parseInt(g.css("margin-left"), 10) && h ? "fr-fil" : "fr-fin"), g.show()
                    }
                g.css("margin", ""), g.css("float", ""), g.removeAttr("style"), g.removeAttr("data-style")
            }), void 0 === b)
                for (var f = 0; f < this.imageList.length; f++) c.indexOf(this.imageList[f].attr("src")) < 0 && this.triggerEvent("afterRemoveImage", [this.imageList[f]], !1);
            this.imageList = d
        }
    }, a.Editable.prototype.insertImage = function() {
        this.options.inlineMode || (this.closeImageMode(), this.imageMode = !1, this.positionPopup("insertImage")), this.selectionInEditor() && this.saveSelection(), this.showInsertImage(), this.imageMode = !1, this.$image_wrapper.find('input[type="text"]').val("")
    }
}(jQuery),
function(a) {
    a.Editable.prototype.showLinkWrapper = function() {
        this.$link_wrapper && (this.$link_wrapper.show(), this.$link_wrapper.trigger("hideLinkList"), this.$link_wrapper.trigger("hideLinkClassList"), this.$link_wrapper.find("input.f-lu").removeClass("fr-error"), this.imageMode || !this.options.linkText ? this.$link_wrapper.find('input[type="text"].f-lt').parent().addClass("fr-hidden") : this.$link_wrapper.find('input[type="text"].f-lt').parent().removeClass("fr-hidden"), this.imageMode && this.$link_wrapper.find('input[type="text"].f-lu').removeAttr("disabled"), this.phone() ? this.$document.scrollTop(this.$link_wrapper.offset().top + 30) : setTimeout(a.proxy(function() {
            this.imageMode && this.iPad() || this.$link_wrapper.find('input[type="text"].f-lu').focus().select()
        }, this), 0), this.link = !0), this.refreshDisabledState()
    }, a.Editable.prototype.hideLinkWrapper = function() {
        this.$link_wrapper && (this.$link_wrapper.hide(), this.$link_wrapper.find("input").blur()), this.refreshDisabledState()
    }, a.Editable.prototype.showInsertLink = function() {
        this.hidePopups(), this.showLinkWrapper()
    }, a.Editable.prototype.initLinkEvents = function() {
        var b = this,
            c = function(a) {
                a.stopPropagation(), a.preventDefault()
            }, d = function(c) {
                if (c.stopPropagation(), c.preventDefault(), b.isDisabled) return !1;
                if ("" !== b.text()) return b.hide(), !1;
                b.link = !0, b.clearSelection(), b.removeMarkers(), b.selectionDisabled || (a(this).before('<span class="f-marker" data-type="true" data-id="0" data-fr-verified="true"></span>'), a(this).after('<span class="f-marker" data-type="false" data-id="0" data-fr-verified="true"></span>'), b.restoreSelectionByMarkers()), b.exec("createLink");
                var d = a(this).attr("href") || "";
                b.$link_wrapper.find("input.f-lt").val(a(this).text()), b.isLink ? ("#" == d && (d = ""), b.$link_wrapper.find("input#f-lu-" + b._id).val(d.replace(/&amp;/g, "&")), b.$link_wrapper.find(".f-external-link").attr("href", d || "#")) : (b.$link_wrapper.find("input.f-lu").val(d.replace(/&amp;/g, "&")), b.$link_wrapper.find(".f-external-link").attr("href", d)), b.$link_wrapper.find('input[type="checkbox"]').prop("checked", "_blank" == a(this).attr("target")), b.$link_wrapper.find("li.f-choose-link-class").each(a.proxy(function(b, c) {
                    a(this).hasClass(a(c).data("class")) && a(c).click()
                }, this)), b.showByCoordinates(a(this).offset().left + a(this).outerWidth() / 2, a(this).offset().top + (parseInt(a(this).css("padding-top"), 10) || 0) + a(this).height()), b.showInsertLink(), a(this).hasClass("fr-file") ? b.$link_wrapper.find("input.f-lu").attr("disabled", "disabled") : b.$link_wrapper.find("input.f-lu").removeAttr("disabled"), b.closeImageMode()
            };
        this.$element.on("mousedown", "a", a.proxy(function(a) {
            this.isResizing() || a.stopPropagation()
        }, this)), this.isLink ? this.iOS() ? (this.$element.on("touchstart", c), this.$element.on("touchend", d)) : this.$element.on("click", d) : this.iOS() ? (this.$element.on("touchstart", 'a:not([contenteditable="false"])', c), this.$element.on("touchend", 'a:not([contenteditable="false"])', d), this.$element.on("touchstart", 'a[contenteditable="false"]', c), this.$element.on("touchend", 'a[contenteditable="false"]', c)) : (this.$element.on("click", 'a:not([contenteditable="false"])', d), this.$element.on("click", 'a[contenteditable="false"]', c))
    }, a.Editable.prototype.destroyLink = function() {
        this.$link_wrapper.html("").removeData().remove()
    }, a.Editable.prototype.initLink = function() {
        this.buildCreateLink(), this.initLinkEvents(), this.addListener("destroy", this.destroyLink)
    }, a.Editable.initializers.push(a.Editable.prototype.initLink), a.Editable.prototype.removeLink = function() {
        this.imageMode ? ("A" == this.$element.find(".f-img-editor").parent().get(0).tagName && a(this.$element.find(".f-img-editor").get(0)).unwrap(), this.triggerEvent("imageLinkRemoved"), this.showImageEditor(), this.$element.find(".f-img-editor").find("img").click(), this.link = !1) : (this.restoreSelection(), this.document.execCommand("unlink", !1, null), this.isLink || this.$element.find("a:empty").remove(), this.triggerEvent("linkRemoved"), this.hideLinkWrapper(), this.$bttn_wrapper.show(), (!this.options.inlineMode || this.isLink) && this.hide(), this.link = !1)
    }, a.Editable.prototype.writeLink = function(b, c, d, e, f) {
        var g;
        this.options.noFollow && (f = !0), this.options.alwaysBlank && (e = !0);
        var h = "",
            i = "";
        f === !0 && /^https?:///.test(b) && (h = 'rel="nofollow"'), e === !0 && (i = 'target="_blank"');
        var j = b;
        if (b = this.sanitizeURL(b), this.options.convertMailAddresses) {
            var k = /^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$/i;
            k.test(b) && 0 !== b.indexOf("mailto:") && (b = "mailto:" + b)
        }
        if (0 === b.indexOf("mailto:") || "" === this.options.linkAutoPrefix || /^(https?:|ftps?:|)///.test(b) || (b = this.options.linkAutoPrefix + b), "" === b) return this.$link_wrapper.find("input.f-lu").addClass("fr-error").focus(), this.triggerEvent("badLink", [j], !1), !1;
        if (this.$link_wrapper.find("input.f-lu").removeClass("fr-error"), this.imageMode) {
            if ("A" != this.$element.find(".f-img-editor").parent().get(0).tagName) this.$element.find(".f-img-editor").wrap('<a data-fr-link="true" href="' + b + '" ' + i + " " + h + "></a>");
            else {
                var l = this.$element.find(".f-img-editor").parent();
                e === !0 ? l.attr("target", "_blank") : l.removeAttr("target"), f === !0 ? l.attr("rel", "nofollow") : l.removeAttr("rel"), l.removeClass(Object.keys(this.options.linkClasses).join(" ")), l.attr("href", b).addClass(d)
            }
            this.triggerEvent("imageLinkInserted", [b]), this.showImageEditor(), this.$element.find(".f-img-editor").find("img").click(), this.link = !1
        } else {
            var m = null;
            this.isLink ? "" === c && (c = this.$element.text()) : (this.restoreSelection(), g = this.getSelectionLinks(), g.length > 0 && (m = g[0].attributes, is_file = a(g[0]).hasClass("fr-file")), this.saveSelectionByMarkers(), this.document.execCommand("unlink", !1, b), this.$element.find('span[data-fr-link="true"]').each(function(b, c) {
                a(c).replaceWith(a(c).html())
            }), this.restoreSelectionByMarkers()), this.isLink ? (this.$element.text(c), g = [this.$element.attr("href", b).get(0)]) : (this.removeMarkers(), (this.options.linkText || "" === this.text()) && (this.insertHTML('<span class="f-marker" data-fr-verified="true" data-id="0" data-type="true"></span>' + (c || b) + '<span class="f-marker" data-fr-verified="true" data-id="0" data-type="false"></span>'), this.restoreSelectionByMarkers()), this.document.execCommand("createLink", !1, b), g = this.getSelectionLinks());
            for (var n = 0; n < g.length; n++) {
                if (m)
                    for (var o = 0; o < m.length; o++) "href" != m[o].nodeName && a(g[n]).attr(m[o].nodeName, m[o].value);
                e === !0 ? a(g[n]).attr("target", "_blank") : a(g[n]).removeAttr("target"), f === !0 && /^https?:///.test(b) ? a(g[n]).attr("rel", "nofollow") : a(g[n]).removeAttr("rel"), a(g[n]).data("fr-link", !0), a(g[n]).removeClass(Object.keys(this.options.linkClasses).join(" ")), a(g[n]).addClass(d)
            }
            this.$element.find("a:empty").remove(), this.triggerEvent("linkInserted", [b]), this.hideLinkWrapper(), this.$bttn_wrapper.show(), (!this.options.inlineMode || this.isLink) && this.hide(), this.link = !1
        }
    }, a.Editable.prototype.createLinkHTML = function() {
        var a = '<div class="froala-popup froala-link-popup" style="display: none;">';
        a += '<h4><span data-text="true">Insert Link</span><a target="_blank" title="Open Link" class="f-external-link" href="#"><i class="fa fa-external-link"></i></a><i title="Cancel" class="fa fa-times" id="f-link-close-' + this._id + '"></i></h4>', a += '<div class="f-popup-line fr-hidden"><input type="text" placeholder="Text" class="f-lt" id="f-lt-' + this._id + '"></div>';
        var b = "";
        if (this.options.linkList.length && (b = "f-bi"), a += '<div class="f-popup-line"><input type="text" placeholder="http://www.example.com" class="f-lu ' + b + '" id="f-lu-' + this._id + '"/>', this.options.linkList.length) {
            a += '<button class="fr-p-bttn f-browse-links" id="f-browse-links-' + this._id + '"><i class="fa fa-chevron-down"></i></button>', a += '<ul id="f-link-list-' + this._id + '">';
            for (var c = 0; c < this.options.linkList.length; c++) {
                var d = this.options.linkList[c];
                a += '<li class="f-choose-link" data-nofollow="' + d.nofollow + '" data-blank="' + d.blank + '" data-body="' + d.body + '" data-title="' + d.title + '" data-href="' + d.href + '">' + d.body + "</li>"
            }
            a += "</ul>"
        }
        if (a += "</div>", Object.keys(this.options.linkClasses).length) {
            a += '<div class="f-popup-line"><input type="text" placeholder="Choose link type" class="f-bi" id="f-luc-' + this._id + '" disabled="disabled"/>', a += '<button class="fr-p-bttn f-browse-links" id="f-links-class-' + this._id + '"><i class="fa fa-chevron-down"></i></button>', a += '<ul id="f-link-class-list-' + this._id + '">';
            for (var e in this.options.linkClasses) {
                var f = this.options.linkClasses[e];
                a += '<li class="f-choose-link-class" data-class="' + e + '">' + f + "</li>"
            }
            a += "</ul>", a += "</div>"
        }
        return a += '<div class="f-popup-line"><input type="checkbox" id="f-checkbox-' + this._id + '"> <label data-text="true" for="f-checkbox-' + this._id + '">Open in new tab</label><button data-text="true" type="button" class="fr-p-bttn f-ok f-submit" id="f-ok-' + this._id + '">OK</button>', this.options.unlinkButton && (a += '<button type="button" data-text="true" class="fr-p-bttn f-ok f-unlink" id="f-unlink-' + this._id + '">UNLINK</button>'), a += "</div></div>"
    }, a.Editable.prototype.buildCreateLink = function() {
        this.$link_wrapper = a(this.createLinkHTML()), this.$popup_editor.append(this.$link_wrapper);
        var b = this;
        this.addListener("hidePopups", this.hideLinkWrapper), this.$link_wrapper.on("mouseup touchend", a.proxy(function(a) {
            this.isResizing() || (a.stopPropagation(), this.$link_wrapper.trigger("hideLinkList"))
        }, this)), this.$link_wrapper.on("click", function(a) {
            a.stopPropagation()
        }), this.$link_wrapper.on("click", "*", function(a) {
            a.stopPropagation()
        }), this.options.linkText && this.$link_wrapper.on("mouseup keydown", "input#f-lt-" + this._id, a.proxy(function(a) {
            var b = a.which;
            b && 27 === b || a.stopPropagation(), this.$link_wrapper.trigger("hideLinkList"), this.$link_wrapper.trigger("hideLinkClassList")
        }, this)), this.$link_wrapper.on("mouseup keydown touchend touchstart", "input#f-lu-" + this._id, a.proxy(function(a) {
            var b = a.which;
            b && 27 === b || a.stopPropagation(), this.$link_wrapper.trigger("hideLinkList"), this.$link_wrapper.trigger("hideLinkClassList")
        }, this)), this.$link_wrapper.on("click keydown", "input#f-checkbox-" + this._id, function(a) {
            var b = a.which;
            b && 27 === b || a.stopPropagation()
        }), this.$link_wrapper.on("touchend", "button#f-ok-" + this._id, function(a) {
            a.stopPropagation()
        }).on("click", "button#f-ok-" + this._id, a.proxy(function() {
            var a, b = this.$link_wrapper.find("input#f-lt-" + this._id),
                c = this.$link_wrapper.find("input#f-lu-" + this._id),
                d = this.$link_wrapper.find("input#f-luc-" + this._id),
                e = this.$link_wrapper.find("input#f-checkbox-" + this._id);
            a = b ? b.val() : "";
            var f = c.val();
            this.isLink && "" === f && (f = "#");
            var g = "";
            d && (g = d.data("class")), this.writeLink(f, a, g, e.prop("checked"))
        }, this)), this.$link_wrapper.on("click touch", "button#f-unlink-" + this._id, a.proxy(function() {
            this.link = !0, this.removeLink()
        }, this)), this.options.linkList.length && (this.$link_wrapper.on("click touch", "li.f-choose-link", function() {
            var c = b.$link_wrapper.find("button#f-browse-links-" + b._id),
                d = b.$link_wrapper.find("input#f-lt-" + b._id),
                e = b.$link_wrapper.find("input#f-lu-" + b._id),
                f = b.$link_wrapper.find("input#f-checkbox-" + b._id);
            d && d.val(a(this).data("body")), e.val(a(this).data("href")), f.prop("checked", a(this).data("blank")), c.click()
        }).on("mouseup", "li.f-choose-link", function(a) {
            a.stopPropagation()
        }), this.$link_wrapper.on("click", "button#f-browse-links-" + this._id + ", button#f-browse-links-" + this._id + " > i", function(c) {
            c.stopPropagation();
            var d = b.$link_wrapper.find("ul#f-link-list-" + b._id);
            b.$link_wrapper.trigger("hideLinkClassList"), a(this).find("i").toggleClass("fa-chevron-down"), a(this).find("i").toggleClass("fa-chevron-up"), d.toggle()
        }).on("mouseup", "button#f-browse-links-" + this._id + ", button#f-browse-links-" + this._id + " > i", function(a) {
            a.stopPropagation()
        }), this.$link_wrapper.bind("hideLinkList", function() {
            var a = b.$link_wrapper.find("ul#f-link-list-" + b._id),
                c = b.$link_wrapper.find("button#f-browse-links-" + b._id);
            a && a.is(":visible") && c.click()
        })), Object.keys(this.options.linkClasses).length && (this.$link_wrapper.on("mouseup keydown", "input#f-luc-" + this._id, a.proxy(function(a) {
            var b = a.which;
            b && 27 === b || a.stopPropagation(), this.$link_wrapper.trigger("hideLinkList"), this.$link_wrapper.trigger("hideLinkClassList")
        }, this)), this.$link_wrapper.on("click touch", "li.f-choose-link-class", function() {
            var c = b.$link_wrapper.find("input#f-luc-" + b._id);
            c.val(a(this).text()), c.data("class", a(this).data("class")), b.$link_wrapper.trigger("hideLinkClassList")
        }).on("mouseup", "li.f-choose-link-class", function(a) {
            a.stopPropagation()
        }), this.$link_wrapper.on("click", "button#f-links-class-" + this._id, function(c) {
            c.stopPropagation(), b.$link_wrapper.trigger("hideLinkList");
            var d = b.$link_wrapper.find("ul#f-link-class-list-" + b._id);
            a(this).find("i").toggleClass("fa-chevron-down"), a(this).find("i").toggleClass("fa-chevron-up"), d.toggle()
        }).on("mouseup", "button#f-links-class-" + this._id, function(a) {
            a.stopPropagation()
        }), this.$link_wrapper.bind("hideLinkClassList", function() {
            var a = b.$link_wrapper.find("ul#f-link-class-list-" + b._id),
                c = b.$link_wrapper.find("button#f-links-class-" + b._id);
            a && a.is(":visible") && c.click()
        })), this.$link_wrapper.on(this.mouseup, "i#f-link-close-" + this._id, a.proxy(function() {
            this.$bttn_wrapper.show(), this.hideLinkWrapper(), (!this.options.inlineMode && !this.imageMode || this.isLink || 0 === this.options.buttons.length) && this.hide(), this.imageMode ? this.showImageEditor() : (this.restoreSelection(), this.focus())
        }, this))
    }, a.Editable.prototype.getSelectionLinks = function() {
        var a, b, c, d, e = [];
        if (window.getSelection) {
            var f = window.getSelection();
            if (f.getRangeAt && f.rangeCount) {
                d = this.document.createRange();
                for (var g = 0; g < f.rangeCount; ++g)
                    if (a = f.getRangeAt(g), b = a.commonAncestorContainer, b && 1 != b.nodeType && (b = b.parentNode), b && "a" == b.nodeName.toLowerCase()) e.push(b);
                    else {
                        c = b.getElementsByTagName("a");
                        for (var h = 0; h < c.length; ++h) d.selectNodeContents(c[h]), d.compareBoundaryPoints(a.END_TO_START, a) < 1 && d.compareBoundaryPoints(a.START_TO_END, a) > -1 && e.push(c[h])
                    }
            }
        } else if (this.document.selection && "Control" != this.document.selection.type)
            if (a = this.document.selection.createRange(), b = a.parentElement(), "a" == b.nodeName.toLowerCase()) e.push(b);
            else {
                c = b.getElementsByTagName("a"), d = this.document.body.createTextRange();
                for (var i = 0; i < c.length; ++i) d.moveToElementText(c[i]), d.compareEndPoints("StartToEnd", a) > -1 && d.compareEndPoints("EndToStart", a) < 1 && e.push(c[i])
            }
        return e
    }, a.Editable.prototype.insertLink = function() {
        this.options.inlineMode || (this.closeImageMode(), this.imageMode = !1, this.positionPopup("createLink")), this.selectionInEditor() && this.saveSelection(), this.showInsertLink();
        var b = this.getSelectionLink() || "",
            c = this.getSelectionLinks();
        c.length > 0 ? (this.$link_wrapper.find('input[type="checkbox"]').prop("checked", "_blank" == a(c[0]).attr("target")), this.$link_wrapper.find('input[type="text"].f-lt').val(a(c[0]).text() || ""), a(c[0]).hasClass("fr-file") ? this.$link_wrapper.find('input[type="text"].f-lu').attr("disabled", "disabled") : this.$link_wrapper.find('input[type="text"].f-lu').removeAttr("disabled"), this.$link_wrapper.find("a.f-external-link, button.f-unlink").show()) : (this.$link_wrapper.find('input[type="checkbox"]').prop("checked", this.options.alwaysBlank), this.$link_wrapper.find('input[type="text"].f-lt').val(this.text()), this.$link_wrapper.find('input[type="text"].f-lu').removeAttr("disabled"), this.$link_wrapper.find("a.f-external-link, button.f-unlink").hide()), this.$link_wrapper.find(".f-external-link").attr("href", b || "#"), this.$link_wrapper.find('input[type="text"].f-lu').val(b.replace(/&amp;/g, "&") || "http://")
    }
}(jQuery),
function(a) {
    a.Editable.prototype.browserFixes = function() {
        this.backspaceEmpty(), this.backspaceInEmptyBlock(), this.fixHR(), this.domInsert(), this.fixIME(), this.cleanInvisibleSpace(), this.cleanBR(), this.insertSpace()
    }, a.Editable.prototype.backspaceInEmptyBlock = function() {
        this.$element.on("keyup", a.proxy(function(b) {
            var c = b.which;
            if (this.browser.mozilla && !this.isHTML && 8 == c) {
                var d = a(this.getSelectionElement());
                this.valid_nodes.indexOf(d.get(0).tagName) >= 0 && 1 == d.find("*").length && "" === d.text() && 1 == d.find("br").length && this.setSelection(d.get(0))
            }
        }, this))
    }, a.Editable.prototype.insertSpace = function() {
        this.browser.mozilla && this.$element.on("keypress", a.proxy(function(a) {
            var b = a.which,
                c = this.getSelectionElements()[0];
            this.isHTML || 32 != b || "PRE" == c.tagName || (a.preventDefault(), this.insertSimpleHTML("&nbsp;"))
        }, this))
    }, a.Editable.prototype.cleanBR = function() {
        this.$element.on("keyup", a.proxy(function() {
            this.$element.find(this.valid_nodes.join(" > br:last, ") + " > br:last").each(a.proxy(function(b, c) {
                var d = c.previousSibling;
                ["TH", "TD"].indexOf(a(c).parent().get(0).tagName) < 0 && d && "BR" != d.tagName && a(c).parent().text().length > 0 && this.isLastSibling(c) && a(c).remove()
            }, this))
        }, this))
    }, a.Editable.prototype.replaceU200B = function(b) {
        for (var c = 0; c < b.length; c++) 3 == b[c].nodeType && /u200B/gi.test(b[c].textContent) ? b[c].textContent = b[c].textContent.replace(/u200B/gi, "") : 1 == b[c].nodeType && this.replaceU200B(a(b[c]).contents())
    }, a.Editable.prototype.cleanInvisibleSpace = function() {
        var b = function(b) {
            var c = a(b).text();
            return b && /u200B/.test(a(b).text()) && c.replace(/u200B/gi, "").length > 0 ? !0 : !1
        };
        this.$element.on("keyup", a.proxy(function() {
            var c = this.getSelectionElement();
            b(c) && 0 === a(c).find("li").length && (this.saveSelectionByMarkers(), this.replaceU200B(a(c).contents()), this.restoreSelectionByMarkers())
        }, this))
    }, a.Editable.prototype.fixHR = function() {
        this.$element.on("keypress", a.proxy(function(b) {
            var c = a(this.getSelectionElement());
            if (c.is("hr") || c.parents("hr").length) return !1;
            var d = b.which;
            if (8 == d) {
                var e = a(this.getSelectionElements()[0]);
                e.prev().is("hr") && this.getSelectionTextInfo(e.get(0)).atStart && (this.saveSelectionByMarkers(), e.prev().remove(), this.restoreSelectionByMarkers(), b.preventDefault())
            }
        }, this))
    }, a.Editable.prototype.backspaceEmpty = function() {
        this.$element.on("keydown", a.proxy(function(a) {
            var b = a.which;
            !this.isHTML && 8 == b && this.$element.hasClass("f-placeholder") && a.preventDefault()
        }, this))
    }, a.Editable.prototype.domInsert = function() {
        this.$element.on("keydown", a.proxy(function(a) {
            var b = a.which;
            8 === b && (this.no_verify = !0), 13 === b && (this.add_br = !0)
        }, this)), this.$element.on("DOMNodeInserted", a.proxy(function(b) {
            if ("SPAN" !== b.target.tagName || a(b.target).attr("data-fr-verified") || this.no_verify || this.textEmpty(b.target) || a(b.target).replaceWith(a(b.target).contents()), "BR" === b.target.tagName && setTimeout(function() {
                a(b.target).removeAttr("type")
            }, 0), "A" === b.target.tagName && setTimeout(function() {
                a(b.target).removeAttr("_moz_dirty")
            }, 0), this.options.paragraphy && this.add_br && "BR" === b.target.tagName && (a(b.target).prev().length && "TABLE" === a(b.target).prev().get(0).tagName || a(b.target).next().length && "TABLE" === a(b.target).next().get(0).tagName)) {
                a(b.target).wrap('<p class="fr-p-wrap">');
                var c = this.$element.find("p.fr-p-wrap").removeAttr("class");
                this.setSelection(c.get(0))
            }
            "BR" === b.target.tagName && this.isLastSibling(b.target) && "LI" == b.target.parentNode.tagName && a(b.target).remove()
        }, this)), this.$element.on("keyup", a.proxy(function(a) {
            var b = a.which;
            8 === b && (this.$element.find("span:not(.fr-verified)").attr("data-fr-verified", !0), this.no_verify = !1), 13 === b && (this.add_br = !1)
        }, this))
    }, a.Editable.prototype.fixIME = function() {
        try {
            this.$element.get(0).msGetInputContext && (this.$element.get(0).msGetInputContext().addEventListener("MSCandidateWindowShow", a.proxy(function() {
                this.ime = !0
            }, this)), this.$element.get(0).msGetInputContext().addEventListener("MSCandidateWindowHide", a.proxy(function() {
                this.ime = !1, this.$element.trigger("keydown"), this.oldHTML = ""
            }, this)))
        } catch (b) {}
    }
}(jQuery),
function(a) {
    a.Editable.prototype.handleEnter = function() {
        var b = a.proxy(function() {
            var b = this.getSelectionElement();
            return "LI" == b.tagName || this.parents(a(b), "li").length > 0 ? !0 : !1
        }, this);
        this.$element.on("keypress", a.proxy(function(a) {
            if (!this.isHTML && !b()) {
                var c = a.which;
                if (13 == c && !a.shiftKey) {
                    a.preventDefault(), this.saveUndoStep(), this.insertSimpleHTML("<break></break>");
                    var d = this.getSelectionElements();
                    d[0] == this.$element.get(0) ? this.enterInMainElement(d[0]) : this.enterInElement(d[0])
                }
            }
        }, this))
    }, a.Editable.prototype.enterInMainElement = function(b) {
        var c = a(b).find("break").get(0);
        if (a(c).parent().get(0) == b) this.isLastSibling(c) ? this.insertSimpleHTML("</br>" + this.markers_html + this.br) : a(b).hasClass("f-placeholder") ? a(b).html("</br>" + this.markers_html + this.br) : this.insertSimpleHTML("</br>" + this.markers_html), a(b).find("break").remove(), this.restoreSelectionByMarkers();
        else if (a(c).parents(this.$element).length) {
            for (b = this.getSelectionElement();
                "BREAK" == b.tagName || 0 === a(b).text().length;) b = b.parentNode;
            if (this.getSelectionTextInfo(b).atEnd) a(b).after(this.breakEnd(this.getDeepParent(b), !0)), this.$element.find("break").remove(), this.restoreSelectionByMarkers();
            else if (this.getSelectionTextInfo(b).atStart) {
                for (; c.parentNode != this.$element.get(0);) c = c.parentNode;
                a(c).before("<br/>"), this.$element.find("break").remove(), this.$element.find("a:empty").replaceWith(this.markers_html + "<br/>"), this.restoreSelectionByMarkers()
            } else this.breakMiddle(this.getDeepParent(b), !0), this.restoreSelectionByMarkers()
        } else a(c).remove()
    }, a.Editable.prototype.enterInElement = function(b) {
        ["TD", "TH"].indexOf(b.tagName) < 0 ? this.getSelectionTextInfo(b).atEnd ? (a(b).after(this.breakEnd(b)), this.$element.find("break").remove(), this.restoreSelectionByMarkers()) : this.getSelectionTextInfo(b).atStart ? (a(b).before(this.options.paragraphy ? "<" + this.options.defaultTag + ">" + this.br + "</" + this.options.defaultTag + ">" : "<br/>"), this.$element.find("break").remove()) : "PRE" == b.tagName ? (this.$element.find("break").after("<br/>" + this.markers_html), this.$element.find("break").remove(), this.restoreSelectionByMarkers()) : (this.breakMiddle(b), this.restoreSelectionByMarkers()) : this.enterInMainElement(b)
    }, a.Editable.prototype.breakEnd = function(b, c) {
        void 0 === c && (c = !1);
        var d = a(b).find("break").get(0),
            e = this.br;
        this.options.paragraphy || (e = "<br/>");
        var f = this.markers_html + e;
        for (c && (f = this.markers_html + a.Editable.INVISIBLE_SPACE); d != b;) "A" != d.tagName && "BREAK" != d.tagName && (f = "<" + d.tagName + this.attrs(d) + ">" + f + "</" + d.tagName + ">"), d = d.parentNode;
        return c && "A" != d.tagName && "BREAK" != d.tagName && (f = "<" + d.tagName + this.attrs(d) + ">" + f + "</" + d.tagName + ">"), this.options.paragraphy && (f = "<" + this.options.defaultTag + ">" + f + "</" + this.options.defaultTag + ">"), c && (f = e + f), f
    }, a.Editable.prototype.breakMiddle = function(b, c) {
        void 0 === c && (c = !1);
        for (var d = a(b).find("break").get(0), e = this.markers_html, f = ""; d != b;) d = d.parentNode, f = f + "</" + d.tagName + ">", e = "<" + d.tagName + this.attrs(d) + ">" + e;
        var g = "<" + b.tagName + this.attrs(b) + ">" + a(b).html() + "</" + b.tagName + ">";
        g = g.replace(/<break></break>/, f + (c ? this.br : "") + e), a(b).replaceWith(g)
    }
}(jQuery),
function(a) {
    a.Editable.prototype.isFirstSibling = function(a) {
        var b = a.previousSibling;
        return b ? 3 == b.nodeType && "" === b.textContent ? this.isFirstSibling(b) : !1 : !0
    }, a.Editable.prototype.isLastSibling = function(a) {
        var b = a.nextSibling;
        return b ? 3 == b.nodeType && "" === b.textContent ? this.isLastSibling(b) : !1 : !0
    }, a.Editable.prototype.getDeepParent = function(a) {
        return a.parentNode == this.$element.get(0) ? a : this.getDeepParent(a.parentNode)
    }, a.Editable.prototype.attrs = function(a) {
        for (var b = "", c = a.attributes, d = 0; d < c.length; d++) {
            var e = c[d];
            b += " " + e.nodeName + '="' + e.value + '"'
        }
        return b
    }
}(jQuery),
function(a) {
    "function" == typeof define && define.amd ? define(["jquery"], a) : a(jQuery)
}(function(a, b) {
    function c(a) {
        function b() {
            d ? (c(), M(b), e = !0, d = !1) : e = !1
        }
        var c = a,
            d = !1,
            e = !1;
        this.kick = function() {
            d = !0, e || b()
        }, this.end = function(a) {
            var b = c;
            a && (e ? (c = d ? function() {
                b(), a()
            } : a, d = !0) : a())
        }
    }

    function d() {
        return !0
    }

    function e() {
        return !1
    }

    function f(a) {
        a.preventDefault()
    }

    function g(a) {
        N[a.target.tagName.toLowerCase()] || a.preventDefault()
    }

    function h(a) {
        return 1 === a.which && !a.ctrlKey && !a.altKey
    }

    function i(a, b) {
        var c, d;
        if (a.identifiedTouch) return a.identifiedTouch(b);
        for (c = -1, d = a.length; ++c < d;)
            if (a[c].identifier === b) return a[c]
    }

    function j(a, b) {
        var c = i(a.changedTouches, b.identifier);
        if (c && (c.pageX !== b.pageX || c.pageY !== b.pageY)) return c
    }

    function k(a) {
        var b;
        h(a) && (b = {
            target: a.target,
            startX: a.pageX,
            startY: a.pageY,
            timeStamp: a.timeStamp
        }, J(document, O.move, l, b), J(document, O.cancel, m, b))
    }

    function l(a) {
        var b = a.data;
        s(a, b, a, n)
    }

    function m() {
        n()
    }

    function n() {
        K(document, O.move, l), K(document, O.cancel, m)
    }

    function o(a) {
        var b, c;
        N[a.target.tagName.toLowerCase()] || (b = a.changedTouches[0], c = {
            target: b.target,
            startX: b.pageX,
            startY: b.pageY,
            timeStamp: a.timeStamp,
            identifier: b.identifier
        }, J(document, P.move + "." + b.identifier, p, c), J(document, P.cancel + "." + b.identifier, q, c))
    }

    function p(a) {
        var b = a.data,
            c = j(a, b);
        c && s(a, b, c, r)
    }

    function q(a) {
        var b = a.data,
            c = i(a.changedTouches, b.identifier);
        c && r(b.identifier)
    }

    function r(a) {
        K(document, "." + a, p), K(document, "." + a, q)
    }

    function s(a, b, c, d) {
        var e = c.pageX - b.startX,
            f = c.pageY - b.startY;
        I * I > e * e + f * f || v(a, b, c, e, f, d)
    }

    function t() {
        return this._handled = d, !1
    }

    function u(a) {
        try {
            a._handled()
        } catch (b) {
            return !1
        }
    }

    function v(a, b, c, d, e, f) {
        {
            var g, h;
            b.target
        }
        g = a.targetTouches, h = a.timeStamp - b.timeStamp, b.type = "movestart", b.distX = d, b.distY = e, b.deltaX = d, b.deltaY = e, b.pageX = c.pageX, b.pageY = c.pageY, b.velocityX = d / h, b.velocityY = e / h, b.targetTouches = g, b.finger = g ? g.length : 1, b._handled = t, b._preventTouchmoveDefault = function() {
            a.preventDefault()
        }, L(b.target, b), f(b.identifier)
    }

    function w(a) {
        var b = a.data.timer;
        a.data.touch = a, a.data.timeStamp = a.timeStamp, b.kick()
    }

    function x(a) {
        var b = a.data.event,
            c = a.data.timer;
        y(), D(b, c, function() {
            setTimeout(function() {
                K(b.target, "click", e)
            }, 0)
        })
    }

    function y() {
        K(document, O.move, w), K(document, O.end, x)
    }

    function z(a) {
        var b = a.data.event,
            c = a.data.timer,
            d = j(a, b);
        d && (a.preventDefault(), b.targetTouches = a.targetTouches, a.data.touch = d, a.data.timeStamp = a.timeStamp, c.kick())
    }

    function A(a) {
        var b = a.data.event,
            c = a.data.timer,
            d = i(a.changedTouches, b.identifier);
        d && (B(b), D(b, c))
    }

    function B(a) {
        K(document, "." + a.identifier, z), K(document, "." + a.identifier, A)
    }

    function C(a, b, c) {
        var d = c - a.timeStamp;
        a.type = "move", a.distX = b.pageX - a.startX, a.distY = b.pageY - a.startY, a.deltaX = b.pageX - a.pageX, a.deltaY = b.pageY - a.pageY, a.velocityX = .3 * a.velocityX + .7 * a.deltaX / d, a.velocityY = .3 * a.velocityY + .7 * a.deltaY / d, a.pageX = b.pageX, a.pageY = b.pageY
    }

    function D(a, b, c) {
        b.end(function() {
            return a.type = "moveend", L(a.target, a), c && c()
        })
    }

    function E() {
        return J(this, "movestart.move", u), !0
    }

    function F() {
        return K(this, "dragstart drag", f), K(this, "mousedown touchstart", g), K(this, "movestart", u), !0
    }

    function G(a) {
        "move" !== a.namespace && "moveend" !== a.namespace && (J(this, "dragstart." + a.guid + " drag." + a.guid, f, b, a.selector), J(this, "mousedown." + a.guid, g, b, a.selector))
    }

    function H(a) {
        "move" !== a.namespace && "moveend" !== a.namespace && (K(this, "dragstart." + a.guid + " drag." + a.guid), K(this, "mousedown." + a.guid))
    }
    var I = 6,
        J = a.event.add,
        K = a.event.remove,
        L = function(b, c, d) {
            a.event.trigger(c, d, b)
        }, M = function() {
            return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(a) {
                return window.setTimeout(function() {
                    a()
                }, 25)
            }
        }(),
        N = {
            textarea: !0,
            input: !0,
            select: !0,
            button: !0
        }, O = {
            move: "mousemove",
            cancel: "mouseup dragstart",
            end: "mouseup"
        }, P = {
            move: "touchmove",
            cancel: "touchend",
            end: "touchend"
        };
    a.event.special.movestart = {
        setup: E,
        teardown: F,
        add: G,
        remove: H,
        _default: function(a) {
            function d() {
                C(f, g.touch, g.timeStamp), L(a.target, f)
            }
            var f, g;
            a._handled() && (f = {
                target: a.target,
                startX: a.startX,
                startY: a.startY,
                pageX: a.pageX,
                pageY: a.pageY,
                distX: a.distX,
                distY: a.distY,
                deltaX: a.deltaX,
                deltaY: a.deltaY,
                velocityX: a.velocityX,
                velocityY: a.velocityY,
                timeStamp: a.timeStamp,
                identifier: a.identifier,
                targetTouches: a.targetTouches,
                finger: a.finger
            }, g = {
                event: f,
                timer: new c(d),
                touch: b,
                timeStamp: b
            }, a.identifier === b ? (J(a.target, "click", e), J(document, O.move, w, g), J(document, O.end, x, g)) : (a._preventTouchmoveDefault(), J(document, P.move + "." + a.identifier, z, g), J(document, P.end + "." + a.identifier, A, g)))
        }
    }, a.event.special.move = {
        setup: function() {
            J(this, "movestart.move", a.noop)
        },
        teardown: function() {
            K(this, "movestart.move", a.noop)
        }
    }, a.event.special.moveend = {
        setup: function() {
            J(this, "movestart.moveend", a.noop)
        },
        teardown: function() {
            K(this, "movestart.moveend", a.noop)
        }
    }, J(document, "mousedown.move", k), J(document, "touchstart.move", o), "function" == typeof Array.prototype.indexOf && ! function(a) {
        for (var b = ["changedTouches", "targetTouches"], c = b.length; c--;) - 1 === a.event.props.indexOf(b[c]) && a.event.props.push(b[c])
    }(a)
}), window.WYSIWYGModernizr = function(a, b, c) {
    function d(a) {
        n.cssText = a
    }

    function e(a, b) {
        return typeof a === b
    }
    var f, g, h, i = "2.7.1",
        j = {}, k = b.documentElement,
        l = "modernizr",
        m = b.createElement(l),
        n = m.style,
        o = ({}.toString, " -webkit- -moz- -o- -ms- ".split(" ")),
        p = {}, q = [],
        r = q.slice,
        s = function(a, c, d, e) {
            var f, g, h, i, j = b.createElement("div"),
                m = b.body,
                n = m || b.createElement("body");
            if (parseInt(d, 10))
                for (; d--;) h = b.createElement("div"), h.id = e ? e[d] : l + (d + 1), j.appendChild(h);
            return f = ["&#173;", '<style id="s', l, '">', a, "</style>"].join(""), j.id = l, (m ? j : n).innerHTML += f, n.appendChild(j), m || (n.style.background = "", n.style.overflow = "hidden", i = k.style.overflow, k.style.overflow = "hidden", k.appendChild(n)), g = c(j, a), m ? j.parentNode.removeChild(j) : (n.parentNode.removeChild(n), k.style.overflow = i), !! g
        }, t = function(b) {
            var c = a.matchMedia || a.msMatchMedia;
            if (c) return c(b).matches;
            var d;
            return s("@media " + b + " { #" + l + " { position: absolute; } }", function(b) {
                d = "absolute" == (a.getComputedStyle ? getComputedStyle(b, null) : b.currentStyle).position
            }), d
        }, u = {}.hasOwnProperty;
    h = e(u, "undefined") || e(u.call, "undefined") ? function(a, b) {
        return b in a && e(a.constructor.prototype[b], "undefined")
    } : function(a, b) {
        return u.call(a, b)
    }, Function.prototype.bind || (Function.prototype.bind = function(a) {
        var b = this;
        if ("function" != typeof b) throw new TypeError;
        var c = r.call(arguments, 1),
            d = function() {
                if (this instanceof d) {
                    var e = function() {};
                    e.prototype = b.prototype;
                    var f = new e,
                        g = b.apply(f, c.concat(r.call(arguments)));
                    return Object(g) === g ? g : f
                }
                return b.apply(a, c.concat(r.call(arguments)))
            };
        return d
    }), p.touch = function() {
        var c;
        return "ontouchstart" in a || a.DocumentTouch && b instanceof DocumentTouch ? c = !0 : s(["@media (", o.join("touch-enabled),("), l, ")", "{#modernizr{top:9px;position:absolute}}"].join(""), function(a) {
            c = 9 === a.offsetTop
        }), c
    };
    for (var v in p) h(p, v) && (g = v.toLowerCase(), j[g] = p[v](), q.push((j[g] ? "" : "no-") + g));
    return j.addTest = function(a, b) {
        if ("object" == typeof a)
            for (var d in a) h(a, d) && j.addTest(d, a[d]);
        else {
            if (a = a.toLowerCase(), j[a] !== c) return j;
            b = "function" == typeof b ? b() : b, "undefined" != typeof enableClasses && enableClasses && (k.className += " " + (b ? "" : "no-") + a), j[a] = b
        }
        return j
    }, d(""), m = f = null, j._version = i, j._prefixes = o, j.mq = t, j.testStyles = s, j
}(this, this.document), ! function(a) {
    a.Editable.prototype.coreInit = function() {
        var a = this,
            b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
            c = function(a) {
                for (var b = a.toString(), c = 0, d = 0; d < b.length; d++) c += parseInt(b.charAt(d), 10);
                return c > 10 ? c % 9 + 1 : c
            };
        if (a.options.key !== !1) {
            var d = function(a, b, c) {
                for (var d = Math.abs(c); d-- > 0;) a -= b;
                return 0 > c && (a += 123), a
            }, e = function(a) {
                    return a
                }, f = function(a) {
                    if (!a) return a;
                    for (var f = "", g = e("charCodeAt"), h = e("fromCharCode"), i = b.indexOf(a[0]), j = 1; j < a.length - 2; j++) {
                        for (var k = c(++i), l = a[g](j), m = "";
                            /[0-9-]/.test(a[j + 1]);) m += a[++j];
                        m = parseInt(m, 10) || 0, l = d(l, k, m), l ^= i - 1 & 31, f += String[h](l)
                    }
                    return f
                }, g = e(f),
                h = function(a) {
                    return "none" == a.css("display") ? (a.attr("style", a.attr("style") + g("zD4D2qJ-7dhuB-11bB4E1wqlhlfE4gjhkbB6C5eg1C-8h1besB-16e1==")), !0) : !1
                }, i = function() {
                    for (var a = 0, b = document.domain, c = b.split("."), d = "_gd" + (new Date).getTime(); a < c.length - 1 && -1 == document.cookie.indexOf(d + "=" + d);) b = c.slice(-1 - ++a).join("."), document.cookie = d + "=" + d + ";domain=" + b + ";";
                    return document.cookie = d + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain=" + b + ";", b
                }(),
                j = function() {
                    var b = g(a.options.key) || "";
                    //return b !== g("eQZMe1NJGC1HTMVANU==") && b.indexOf(i, b.length - i.length) < 0 && [g("9qqG-7amjlwq=="), g("KA3B3C2A6D1D5H5H1A3==")].indexOf(i) < 0 ? (a.$box.append(g("uA5kygD3g1h1lzrA7E2jtotjvooB2A5eguhdC-22C-16nC2B3lh1deA-21C-16B4A2B4gi1F4D1wyA-13jA4H5C2rA-65A1C10dhzmoyJ2A10A-21d1B-13xvC2I4enC4C2B5B4G4G4H1H4A10aA8jqacD1C3c1B-16D-13A-13B2E5A4jtxfB-13fA1pewxvzA3E-11qrB4E4qwB-16icA1B3ykohde1hF4A2E4clA4C7E6haA4D1xtmolf1F-10A1H4lhkagoD5naalB-22B8B4quvB-8pjvouxB3A-9plnpA2B6D6BD2D1C2H1C3C3A4mf1G-10C-8i1G3C5B3pqB-9E5B1oyejA3ddalvdrnggE3C3bbj1jC6B3D3gugqrlD8B2DB-9qC-7qkA10D2VjiodmgynhA4HA-9D-8pI-7rD4PrE-11lvhE3B5A-16C7A6A3ekuD1==")), a.$lb = a.$box.find("> div:last"), a.$ab = a.$lb.find("> a"), h(a.$lb) || h(a.$ab)) : void 0
                };
            j()
        }
    }, a.Editable.initializers.push(a.Editable.prototype.coreInit)
}(jQuery),
function(a) {
    a.Editable.DEFAULTS = a.extend(a.Editable.DEFAULTS, {
        allowedBlankTags: ["TEXTAREA"],
        selfClosingTags: ["br", "button", "input", "img", "hr", "param", "!--", "source", "embed", "!", "meta", "link", "base"]
    }), a.Editable.prototype.isClosingTag = function(a) {
        return a ? null !== a.match(/^</([a-zA-Z0-9]+)([^<]+)*>$/gi) : !1
    }, a.Editable.prototype.tagName = function(a) {
        return a.replace(/^</?([a-zA-Z0-9-!]+)([^>]+)*>$/gi, "$1").toLowerCase()
    }, a.Editable.SELF_CLOSING_AFTER = ["source"], a.Editable.prototype.isSelfClosingTag = function(a) {
        var b = this.tagName(a);
        return this.options.selfClosingTags.indexOf(b.toLowerCase()) >= 0
    }, a.Editable.prototype.tagKey = function(a) {
        return a.type + (a.attrs || []).sort().join("|")
    }, a.Editable.prototype.extendedKey = function(a) {
        return this.tagKey(a) + JSON.stringify(a.style)
    }, a.Editable.prototype.mapDOM = function(b) {
        var c = [],
            d = {}, e = {}, f = 0,
            g = this;
        a(b).find(".f-marker").html(a.Editable.INVISIBLE_SPACE);
        var h = function(b, c) {
            if (3 === b.nodeType) return [];
            if (8 === b.nodeType) return [{
                comment: !0,
                attrs: {},
                styles: {},
                idx: f++,
                sp: c,
                ep: c,
                text: b.textContent
            }];
            var d = b.tagName;
            "B" == d && (d = "STRONG"), "I" == d && (!b.className || b.className.indexOf("fa-") < 0) && (d = "EM"), b.style.display = "";
            var e = {}, h = {}, i = null;
            if (b.attributes)
                for (var j = 0; j < b.attributes.length; j++) {
                    var k = b.attributes[j];
                    "style" == k.nodeName ? i = k.value : e[k.nodeName] = k.value
                }
            if (i) {
                var l = i.match(/([^:]*):([^:;]*(;|$))/gi);
                if (l)
                    for (var m = 0; m < l.length; m++) {
                        var n = l[m].split(":"),
                            o = n.slice(1).join(":").trim();
                        ";" == o[o.length - 1] && (o = o.substr(0, o.length - 1)), h[n[0].trim()] = o
                    }
            }
            var p = [];
            if (a.isEmptyObject(e) && "SPAN" == b.tagName && !a.isEmptyObject(h)) {
                for (var q in h) {
                    var r = {};
                    r[q] = h[q], p.push({
                        selfClosing: !1,
                        attrs: e,
                        styles: r,
                        idx: f++,
                        sp: c,
                        ep: c + b.textContent.length,
                        tagName: d
                    })
                }
                return p
            }
            return [{
                selfClosing: g.options.selfClosingTags.indexOf(d.toLowerCase()) >= 0,
                attrs: e,
                styles: h,
                idx: f++,
                sp: c,
                ep: c + b.textContent.length,
                tagName: d
            }]
        }, i = function(a, g) {
                var j, k, l;
                if (a != b)
                    for (k = h(a, g), j = 0; j < k.length; j++) l = k[j], c.push(l), d[l.sp] || (d[l.sp] = {}), e[l.ep] || (e[l.ep] = {}), d[l.sp][l.tagName] || (d[l.sp][l.tagName] = []), e[l.ep][l.tagName] || (e[l.ep][l.tagName] = []), d[l.sp][l.tagName].push(l), e[l.ep][l.tagName].push(l);
                var m = a.childNodes;
                if (m) {
                    for (j = 0; j < m.length; j++) j > 0 && 8 != m[j - 1].nodeType && (g += m[j - 1].textContent.length), i(m[j], g);
                    if (k)
                        for (j = 0; j < k.length; j++) l = k[j], l.ci = f++, d[l.ep] || (d[l.ep] = {}), d[l.ep][l.tagName] || (d[l.ep][l.tagName] = []), d[l.ep][l.tagName].push({
                            shadow: !0,
                            ci: f - 1
                        })
                }
            }, j = function() {
                var b, e, f, h;
                for (b in d)
                    for (var i in d[b])
                        for (f = 0; f < d[b][i].length; f++)
                            if (e = d[b][i][f], !(e.selfClosing || e.dirty || e.shadow || e.comment))
                                for (var j = f + 1; j < d[b][i].length; j++)
                                    if (h = d[b][i][j], !(h.selfClosing || h.dirty || h.shadow || h.comment || 1 != Object.keys(e.styles).length || 1 != Object.keys(h.styles).length || h.sp == h.ep)) {
                                        var k = Object.keys(e.styles)[0];
                                        if (h.styles[k]) {
                                            e.sp = h.ep;
                                            for (var l = 0; l < d[e.sp][e.tagName].length; l++) {
                                                var m = d[e.sp][e.tagName][l];
                                                if (m.shadow && m.ci == h.ci) {
                                                    d[e.sp][e.tagName].splice(l, 0, e);
                                                    break
                                                }
                                            }
                                            d[b][i].splice(f, 1), f--;
                                            break
                                        }
                                    }
                for (b = 0; b < c.length; b++)
                    if (e = c[b], !e.dirty && !e.selfClosing && !e.comment)
                        if (e.sp == e.ep && a.isEmptyObject(e.attrs) && a.isEmptyObject(e.style) && g.options.allowedBlankTags.indexOf(e.tagName) < 0) e.dirty = !0;
                        else if (d[e.ep] && d[e.ep][e.tagName])
                    for (f = 0; f < d[e.ep][e.tagName].length; f++)
                        if (h = d[e.ep][e.tagName][f], !h.dirty && e != h && !e.selfClosing && !h.shadow && !h.comment && a.isEmptyObject(h.attrs) && JSON.stringify(h.styles) == JSON.stringify(e.styles)) {
                            e.ep = h.ep, h.dirty = !0, b--;
                            break
                        }
                for (b = 0; b < c.length; b++)
                    if (e = c[b], !e.dirty && !e.selfClosing && !e.comment)
                        if (e.sp == e.ep && a.isEmptyObject(e.attrs) && a.isEmptyObject(e.style) && g.options.allowedBlankTags.indexOf(e.tagName) < 0) e.dirty = !0;
                        else if (d[e.sp] && d[e.sp][e.tagName])
                    for (f = d[e.sp][e.tagName].length - 1; f >= 0; f--) h = d[e.sp][e.tagName][f], h.dirty || e != h && (e.selfClosing || h.shadow || h.comment || e.ep == h.ep && a.isEmptyObject(h.attrs) && (e.styles = a.extend(e.styles, h.styles), h.dirty = !0))
            };
        i(b, 0), j();
        for (var k = c.length - 1; k >= 0; k--) c.dirty && c.splice(k, 1);
        return c
    }, a.Editable.prototype.sortNodes = function(a, b) {
        if ("BR" == a.tagName) return -1;
        if ("BR" == b.tagName) return 1;
        if (a.comment) return 1;
        var c = a.ep - a.sp,
            d = b.ep - a.sp;
        return 0 === c && 0 === d ? a.idx - b.idx : c === d ? b.ci - a.ci : d - c
    }, a.Editable.prototype.openTag = function(a) {
        var b, c = "<" + a.tagName.toLowerCase(),
            d = Object.keys(a.attrs).sort();
        for (b = 0; b < d.length; b++) {
            var e = d[b];
            c += " " + e + '="' + a.attrs[e] + '"'
        }
        var f = "",
            g = Object.keys(a.styles).sort();
        for (b = 0; b < g.length; b++) {
            var h = g[b];
            null != a.styles[h] && (f += h.replace("_", "-") + ": " + a.styles[h] + "; ")
        }
        return "" !== f && (c += ' style="' + f.trim() + '"'), c += ">"
    }, a.Editable.prototype.commentTag = function(a) {
        var b = "";
        if (a.selfClosing) {
            var c;
            b = "<" + a.tagName.toLowerCase();
            var d = Object.keys(a.attrs).sort();
            for (c = 0; c < d.length; c++) {
                var e = d[c];
                b += " " + e + '="' + a.attrs[e] + '"'
            }
            var f = "",
                g = Object.keys(a.styles).sort();
            for (c = 0; c < g.length; c++) {
                var h = g[c];
                null != a.styles[h] && (f += h.replace("_", "-") + ": " + a.styles[h] + "; ")
            }
            "" !== f && (b += ' style="' + f.trim() + '"'), b += "/>"
        } else a.comment && (b = "<!--" + a.text + "-->");
        return b
    }, a.Editable.prototype.closeTag = function(a) {
        return "</" + a.tagName.toLowerCase() + ">"
    }, a.Editable.prototype.nodesOpenedAt = function(a, b) {
        for (var c = [], d = a.length - 1; d >= 0 && a[d].sp == b;) c.push(a.pop()), d--;
        return c
    }, a.Editable.prototype.entity = function(a) {
        return ch_map = {
            ">": "&gt;",
            "<": "&lt;",
            "&": "&amp;"
        }, ch_map[a] ? ch_map[a] : a
    }, a.Editable.prototype.removeInvisibleWhitespace = function(a) {
        for (var b = 0; b < a.childNodes.length; b++) {
            var c = a.childNodes[b];
            c.childNodes.length ? this.removeInvisibleWhitespace(c) : c.textContent = c.textContent.replace(/u200B/gi, "")
        }
    }, a.Editable.prototype.cleanOutput = function(b, c) {
        var d, e, f, g;
        c && this.removeInvisibleWhitespace(b);
        var h = this.mapDOM(b, c).sort(function(a, b) {
            return b.sp - a.sp
        }),
            i = b.textContent;
        html = "";
        var j = [],
            k = -1,
            l = a.proxy(function() {
                for (var b = ""; j.length;) {
                    var c = j.pop();
                    c.selfClosing || c.comment ? b += this.commentTag(c) : (!a.isEmptyObject(c.attrs) || this.options.allowedBlankTags.indexOf(c.tagName) >= 0) && (b = this.openTag(c) + b + this.closeTag(c))
                }
                html += b
            }, this),
            m = {}, n = [];
        for (d = 0; d <= i.length; d++) {
            if (m[d])
                for (e = m[d].length - 1; e >= 0; e--)
                    if (n[n.length - 1].tagName == m[d][e].tagName && JSON.stringify(n[n.length - 1].styles) == JSON.stringify(m[d][e].styles)) html += this.closeTag(m[d][e]), n.pop();
                    else {
                        for (var o = []; n[n.length - 1].tagName !== m[d][e].tagName || JSON.stringify(n[n.length - 1].styles) !== JSON.stringify(m[d][e].styles);) g = n.pop(), html += this.closeTag(g), o.push(g);
                        for (html += this.closeTag(m[d][e]), n.pop(); o.length;) {
                            var p = o.pop();
                            html += this.openTag(p), n.push(p)
                        }
                    }
            for (var q = this.nodesOpenedAt(h, d).sort(this.sortNodes).reverse(); q.length;) {
                var r = q.pop();
                if (!r.dirty)
                    if (r.selfClosing || r.comment) r.ci > k || "BR" == r.tagName ? (l(), html += this.commentTag(r), k = r.ci) : j.length ? (j.push(r), k = r.ci) : (html += this.commentTag(r), k = r.ci);
                    else if (r.ep > r.sp) {
                    r.ci > k && l();
                    var s = [];
                    if ("A" == r.tagName)
                        for (var t = r.sp + 1; t < r.ep; t++)
                            if (m[t] && m[t].length)
                                for (f = 0; f < m[t].length; f++) s.push(m[t][f]), html += this.closeTag(m[t][f]), n.pop();
                    var u = [];
                    if ("SPAN" == r.tagName && ("#123456" == r.styles["background-color"] || "#123456" === a.Editable.RGBToHex(r.styles["background-color"]) || "#123456" == r.styles.color || "#123456" === a.Editable.RGBToHex(r.styles.color)))
                        for (; n.length;) {
                            var v = n.pop();
                            html += this.closeTag(v), u.push(v)
                        }
                    for (html += this.openTag(r), k = r.ci, n.push(r), m[r.ep] || (m[r.ep] = []), m[r.ep].push(r); s.length;) r = s.pop(), html += this.openTag(r), n.push(r);
                    for (; u.length;) r = u.pop(), html += this.openTag(r), n.push(r)
                } else r.sp == r.ep && (j.push(r), k = r.ci)
            }
            l(), d != i.length && (html += this.entity(i[d]))
        }
        return html = html.replace(/(<span[^>]*? classs*=s*["']?f-marker["']?[^>]+>)u200B(</span>)/gi, "$1$2"), html
    }, a.Editable.prototype.wrapDirectContent = function() {
        if (!this.options.paragraphy)
            for (var b = null, c = this.$element.contents(), d = 0; d < c.length; d++) 1 != c[d].nodeType || this.valid_nodes.indexOf(c[d].tagName) < 0 ? (b || (b = a('<div class="fr-wrap">'), a(c[d]).before(b)), b.append(c[d])) : b = null
    }, a.Editable.prototype.cleanify = function(b, c, d) {
        if (this.browser.msie && a.Editable.getIEversion() < 9) return !1;
        var e;
        if (this.isHTML) return !1;
        void 0 === b && (b = !0), void 0 === d && (d = !0), this.no_verify = !0, this.$element.find("span").removeAttr("data-fr-verified"), d && this.saveSelectionByMarkers(), b ? e = this.getSelectionElements() : (this.wrapDirectContent(), e = this.$element.find(this.valid_nodes.join(",")), 0 === e.length && (e = [this.$element.get(0)]));
        var f, g;
        if (e[0] != this.$element.get(0))
            for (var h = 0; h < e.length; h++) {
                var i = a(e[h]);
                0 === i.find(this.valid_nodes.join(",")).length && (f = i.html(), g = this.cleanOutput(i.get(0), c), g !== f && i.html(g))
            } else 0 === this.$element.find(this.valid_nodes.join(",")).length && (f = this.$element.html(), g = this.cleanOutput(this.$element.get(0), c), g !== f && this.$element.html(g));
        this.$element.find("[data-fr-idx]").removeAttr("data-fr-idx"), this.$element.find(".fr-wrap").each(function() {
            a(this).replaceWith(a(this).html())
        }), this.$element.find(".f-marker").html(""), d && this.restoreSelectionByMarkers(), this.$element.find("span").attr("data-fr-verified", !0), this.no_verify = !1
    }
}(jQuery);
?>
Онлайн: 2
Реклама