﻿
var bkExtend = function()
{
    var A = arguments; if (A.length == 1) { A = [this, A[0]] } for (var B in A[1]) { A[0][B] = A[1][B] } return A[0]
};
function bkClass() { }
bkClass.prototype.construct = function() { };
bkClass.extend = function(C) { var A = function() { if (arguments[0] !== bkClass) { return this.construct.apply(this, arguments) } }; var B = new this(bkClass); bkExtend(B, C); A.prototype = B; A.extend = this.extend; return A }; var bkElement = bkClass.extend({ construct: function(A) { if (typeof (A) == "string") { A = document.createElement(A) } A = $BK(A); return A }, appendTo: function(A) { A.appendChild(this); return this }, appendBefore: function(A) { A.parentNode.insertBefore(this, A); return this }, addEvent: function(B, A) { bkLib.addEvent(this, B, A); return this }, setContent: function(A) { this.innerHTML = A; return this }, pos: function() { var C = curtop = 0; var B = obj = this; if (obj.offsetParent) { do { C += obj.offsetLeft; curtop += obj.offsetTop } while (obj = obj.offsetParent) } var A = (!window.opera) ? parseInt(this.getStyle("border-width") || this.style.border) || 0 : 0; return [C + A, curtop + A + this.offsetHeight] }, noSelect: function() { bkLib.noSelect(this); return this }, parentTag: function(A) { var B = this; do { if (B && B.nodeName && B.nodeName.toUpperCase() == A) { return B } B = B.parentNode } while (B); return false }, hasClass: function(A) { return this.className.match(new RegExp("(\\s|^)nicEdit-" + A + "(\\s|$)")) }, addClass: function(A) { if (!this.hasClass(A)) { this.className += " nicEdit-" + A } return this }, removeClass: function(A) { if (this.hasClass(A)) { this.className = this.className.replace(new RegExp("(\\s|^)nicEdit-" + A + "(\\s|$)"), " ") } return this }, setStyle: function(A) { var B = this.style; for (var C in A) { switch (C) { case "float": B.cssFloat = B.styleFloat = A[C]; break; case "opacity": B.opacity = A[C]; B.filter = "alpha(opacity=" + Math.round(A[C] * 100) + ")"; break; case "className": this.className = A[C]; break; default: B[C] = A[C] } } return this }, getStyle: function(A, C) { var B = (!C) ? document.defaultView : C; if (this.nodeType == 1) { return (B && B.getComputedStyle) ? B.getComputedStyle(this, null).getPropertyValue(A) : this.currentStyle[bkLib.camelize(A)] } }, remove: function() { this.parentNode.removeChild(this); return this }, setAttributes: function(A) { for (var B in A) { this[B] = A[B] } return this } }); var bkLib = { isMSIE: (navigator.appVersion.indexOf("MSIE") != -1), addEvent: function(C, B, A) { (C.addEventListener) ? C.addEventListener(B, A, false) : C.attachEvent("on" + B, A) }, toArray: function(C) { var B = C.length, A = new Array(B); while (B--) { A[B] = C[B] } return A }, noSelect: function(B) { if (B.setAttribute && B.nodeName.toLowerCase() != "input" && B.nodeName.toLowerCase() != "textarea") { B.setAttribute("unselectable", "on") } for (var A = 0; A < B.childNodes.length; A++) { bkLib.noSelect(B.childNodes[A]) } }, camelize: function(A) { return A.replace(/\-(.)/g, function(B, C) { return C.toUpperCase() }) }, inArray: function(A, B) { return (bkLib.search(A, B) != null) }, search: function(A, C) { for (var B = 0; B < A.length; B++) { if (A[B] == C) { return B } } return null }, cancelEvent: function(A) { A = A || window.event; if (A.preventDefault && A.stopPropagation) { A.preventDefault(); A.stopPropagation() } return false }, domLoad: [], domLoaded: function() { if (arguments.callee.done) { return } arguments.callee.done = true; for (i = 0; i < bkLib.domLoad.length; i++) { bkLib.domLoad[i]() } }, onDomLoaded: function(A) { this.domLoad.push(A); if (document.addEventListener) { document.addEventListener("DOMContentLoaded", bkLib.domLoaded, null) } else { if (bkLib.isMSIE) { document.write("<style>.nicEdit-main p { margin: 0; }</style><script id=__ie_onload defer " + ((location.protocol == "https:") ? "src='javascript:void(0)'" : "src=//0") + "><\/script>"); $BK("__ie_onload").onreadystatechange = function() { if (this.readyState == "complete") { bkLib.domLoaded() } } } } window.onload = bkLib.domLoaded } }; function $BK(A) { if (typeof (A) == "string") { A = document.getElementById(A) } return (A && !A.appendTo) ? bkExtend(A, bkElement.prototype) : A } var bkEvent = { addEvent: function(A, B) { if (B) { this.eventList = this.eventList || {}; this.eventList[A] = this.eventList[A] || []; this.eventList[A].push(B) } return this }, fireEvent: function() { var A = bkLib.toArray(arguments), C = A.shift(); if (this.eventList && this.eventList[C]) { for (var B = 0; B < this.eventList[C].length; B++) { this.eventList[C][B].apply(this, A) } } } }; function __(A) { return A } Function.prototype.closure = function() { var A = this, B = bkLib.toArray(arguments), C = B.shift(); return function() { if (typeof (bkLib) != "undefined") { return A.apply(C, B.concat(bkLib.toArray(arguments))) } } }; Function.prototype.closureListener = function() { var A = this, C = bkLib.toArray(arguments), B = C.shift(); return function(E) { E = E || window.event; if (E.target) { var D = E.target } else { var D = E.srcElement } return A.apply(B, [E, D].concat(C)) } };



var nicEditorConfig = bkClass.extend({
    buttons: {
        'bold': { name: __('Выделить полужирным'), command: 'Bold', tags: ['B', 'STRONG'], css: { 'font-weight': 'bold' }, key: 'b' },
        'italic': { name: __('Выделить курсивом'), command: 'Italic', tags: ['EM', 'I'], css: { 'font-style': 'italic' }, key: 'i' },
        'underline': { name: __('Подчеркнуть'), command: 'Underline', tags: ['U'], css: { 'text-decoration': 'underline' }, key: 'u' },
        'left': { name: __('Выровнить влево'), command: 'justifyleft', noActive: true },
        'center': { name: __('Выровнить по центру'), command: 'justifycenter', noActive: true },
        'right': { name: __('Выровнить вправо'), command: 'justifyright', noActive: true },
        'ol': { name: __('Вставить нумерованный список'), command: 'insertorderedlist', tags: ['OL'] },
        'ul': { name: __('Вставить ненумерованный список'), command: 'insertunorderedlist', tags: ['UL'] },
        'subscript': { name: __('Выделить подстрочным'), command: 'subscript', tags: ['SUB'] },
        'superscript': { name: __('Выделить надстрочным'), command: 'superscript', tags: ['SUP'] },
        'strikethrough': { name: __('Зачеркнуть'), command: 'strikeThrough', css: { 'text-decoration': 'line-through'} },
        'indent': { name: __('Добавить отступ'), command: 'indent', noActive: true },
        'outdent': { name: __('Убрать оступ'), command: 'outdent', noActive: true },
        'hr': { name: __('Вставить горизонтальную черту'), command: 'insertHorizontalRule', noActive: true }
    },
    iconsPath: '/resource/images/nicEditorIcons.gif',
    buttonList: ['bold', 'italic', 'underline', 'strikethrough', 'subscript', 'superscript', 'fontSize', 'fontFamily', 'fontFormat', 'left', 'center', 'right', 'ol', 'ul', 'indent', 'outdent', 'link', 'unlink', 'image'],
    iconList: { "xhtml": 1, "bgcolor": 2, "forecolor": 3, "bold": 4, "center": 5, "hr": 6, "indent": 7, "italic": 8, "justify": 9, "left": 10, "ol": 11, "outdent": 12, "right": 13, "save": 14, "strikethrough": 15, "subscript": 16, "superscript": 17, "ul": 18, "underline": 19, "image": 20, "link": 21, "unlink": 22, "close": 23, "arrow": 24 }

});
;
var nicEditors = { nicPlugins: [], editors: [], registerPlugin: function(B, A) { this.nicPlugins.push({ p: B, o: A }) }, allTextAreas: function(C) { var A = document.getElementsByTagName("textarea"); for (var B = 0; B < A.length; B++) { nicEditors.editors.push(new nicEditor(C).panelInstance(A[B])) } return nicEditors.editors }, findEditor: function(C) { var B = nicEditors.editors; for (var A = 0; A < B.length; A++) { if (B[A].instanceById(C)) { return B[A].instanceById(C) } } } }; var nicEditor = bkClass.extend({ construct: function(C) { this.options = new nicEditorConfig(); bkExtend(this.options, C); this.nicInstances = new Array(); this.loadedPlugins = new Array(); var A = nicEditors.nicPlugins; for (var B = 0; B < A.length; B++) { this.loadedPlugins.push(new A[B].p(this, A[B].o)) } nicEditors.editors.push(this); bkLib.addEvent(document.body, "mousedown", this.selectCheck.closureListener(this)) }, panelInstance: function(B, C) { B = this.checkReplace($BK(B)); var A = new bkElement("DIV").setStyle({ width: (parseInt(B.getStyle("width")) || B.clientWidth) + "px" }).appendBefore(B); this.setPanel(A); return this.addInstance(B, C) }, checkReplace: function(B) { var A = nicEditors.findEditor(B); if (A) { A.removeInstance(B); A.removePanel() } return B }, addInstance: function(B, C) { B = this.checkReplace($BK(B)); if ((B.contentEditable || !!window.opera) && navigator.userAgent.indexOf("Firefox/3") == -1) { var A = new nicEditorInstance(B, C, this) } else { var A = new nicEditorIFrameInstance(B, C, this) } this.nicInstances.push(A); return this }, removeInstance: function(C) { C = $BK(C); var B = this.nicInstances; for (var A = 0; A < B.length; A++) { if (B[A].e == C) { B[A].remove(); this.nicInstances.splice(A, 1) } } }, removePanel: function(A) { if (this.nicPanel) { this.nicPanel.remove(); this.nicPanel = null } }, instanceById: function(C) { C = $BK(C); var B = this.nicInstances; for (var A = 0; A < B.length; A++) { if (B[A].e == C) { return B[A] } } }, setPanel: function(A) { this.nicPanel = new nicEditorPanel($BK(A), this.options, this); this.fireEvent("panel", this.nicPanel); return this }, nicCommand: function(B, A) { if (this.selectedInstance) { this.selectedInstance.nicCommand(B, A) } }, getIcon: function(D, A) { var C = this.options.iconList[D]; var B = (A.iconFiles) ? A.iconFiles[D] : ""; return { backgroundImage: "url('" + ((C) ? this.options.iconsPath : B) + "')", backgroundPosition: ((C) ? ((C - 1) * -18) : 0) + "px 0px"} }, selectCheck: function(C, A) { var B = false; do { if (A.className && A.className.indexOf("nicEdit") != -1) { return false } } while (A = A.parentNode); this.fireEvent("blur", this.selectedInstance, A); this.lastSelectedInstance = this.selectedInstance; this.selectedInstance = null; return false } }); nicEditor = nicEditor.extend(bkEvent);
var nicEditorInstance = bkClass.extend(
{
    isSelected: false,
    construct: function(F, D, C)
    {
        this.ne = C;
        this.elm = this.e = F;
        this.options = D || {};
        newX = parseInt(F.getStyle("width")) || F.clientWidth;
        newY = parseInt(F.getStyle("height")) || F.clientHeight;
        this.initialHeight = newY - 8;
        var G = (F.nodeName.toLowerCase() == "textarea");
        if (G || this.options.hasPanel)
        {
            this.editorContain = new bkElement("DIV")
                .setStyle({ width: newX + "px", border: "1px solid #ccc", borderTop: 0, overflowY: "auto", overflowX: "hidden", maxHeight: (this.ne.options.maxHeight) ? this.ne.options.maxHeight + "px" : null })
                .appendBefore(F);
            var A = new bkElement("DIV").setStyle({ width: (newX - 8) + "px", margin: "4px", minHeight: newY + "px" })
                .addClass("main").appendTo(this.editorContain);
            F.setStyle({ display: "none" });
            A.innerHTML = F.innerHTML;
            if (G)
            {
                A.setContent(F.value);
                this.copyElm = F;
                var E = F.parentTag("FORM");
                if (E)
                {
                    bkLib.addEvent(E, "submit", this.saveContent.closure(this))
                }
            }
            var B = (bkLib.isMSIE && !((typeof document.body.style.maxHeight != "undefined") && document.compatMode == "CSS1Compat"));
            A.setStyle((B) ? { height: newY + "px"} : { overflow: "hidden" });
            this.elm = A
        }
        this.ne.addEvent("blur", this.blur.closure(this));
        this.init();
        this.blur();
        try
        {
            this.nicCommand("styleWithCSS", true)
        }
        catch (F) { }
    },
    init: function()
    {
        this.elm.setAttribute("contentEditable", "true");
        if (this.getContent() == "")
        {
            this.setContent("<br />")
        }
        this.instanceDoc = document.defaultView;
        this.elm.addEvent("mousedown", this.selected.closureListener(this))
                .addEvent("mouseup", this.mouseup.closureListener(this))
                .addEvent("keypress", this.keyDown.closureListener(this))
                .addEvent("focus", this.selected.closure(this))
                .addEvent("blur", this.blur.closure(this))
                .addEvent("keyup", this.selected.closure(this));
        this.ne.fireEvent("add", this)
    },
    mouseup: function()
    {
    },
    remove: function()
    {
        this.saveContent();
        if (this.copyElm || this.options.hasPanel)
        {
            this.editorContain.remove();
            this.e.setStyle({ display: "block" });
            this.ne.removePanel()
        }
        this.disable();
        this.ne.fireEvent("remove", this)
    },
    disable: function()
    {
        this.elm.setAttribute("contentEditable", "false")
    },
    getSel: function()
    {
        return (window.getSelection) ? window.getSelection() : document.selection
    },
    getRng: function()
    {
        var A = this.getSel();
        if (!A)
        {
            return null
        }
        return (A.rangeCount > 0) ? A.getRangeAt(0) : A.createRange()
    },
    selRng: function(A, B)
    {
        if (window.getSelection)
        {
            B.removeAllRanges();
            B.addRange(A)
        }
        else
        {
            A.select()
        }
    },
    selElm: function()
    {
        var C = this.getRng();
        if (C.startContainer)
        {
            var D = C.startContainer;
            if (C.cloneContents().childNodes.length == 1)
            {
                for (var B = 0; B < D.childNodes.length; B++)
                {
                    var A = D.childNodes[B].ownerDocument.createRange(); A.selectNode(D.childNodes[B]);
                    if (C.compareBoundaryPoints(Range.START_TO_START, A) != 1 && C.compareBoundaryPoints(Range.END_TO_END, A) != -1)
                    {
                        return $BK(D.childNodes[B])
                    }
                }
            }
            return $BK(D)
        }
        else
        {
            return $BK((this.getSel().type == "Control") ? C.item(0) : C.parentElement())
        }
    },
    saveRng: function()
    {
        this.savedRange = this.getRng();
        this.savedSel = this.getSel()
    },
    restoreRng: function()
    {
        if (this.savedRange)
        {
            this.selRng(this.savedRange, this.savedSel)
        }
    },
    keyDown: function(B, A)
    {
        if (B.ctrlKey)
        {
            this.ne.fireEvent("key", this, B)
        }
    },
    selected: function(C, A)
    {
        if (!A)
        {
            A = this.selElm()
        }
        if (!C.ctrlKey)
        {
            var B = this.ne.selectedInstance;
            if (B != this)
            {
                if (B)
                {
                    this.ne.fireEvent("blur", B, A)
                }
                this.ne.selectedInstance = this;
                this.ne.fireEvent("focus", B, A)
            }
            this.ne.fireEvent("selected", B, A);
            this.isFocused = true;
            this.elm.addClass("selected")
        }
        return false
    },
    blur: function()
    {
        this.isFocused = false;
        this.elm.removeClass("selected")
    },
    saveContent: function()
    {
        if (this.copyElm || this.options.hasPanel)
        {
            this.ne.fireEvent("save", this); (this.copyElm) ? this.copyElm.value = this.getContent() : this.e.innerHTML = this.getContent()
        }
    },
    getElm: function()
    {
        return this.elm
    },
    getContent: function()
    {
        this.content = this.getElm().innerHTML;
        this.ne.fireEvent("get", this);
        return this.content
    },
    setContent: function(A)
    {
        this.content = A;
        this.ne.fireEvent("set", this);
        this.elm.innerHTML = this.content
    },
    nicCommand: function(B, A)
    {
        document.execCommand(B, false, A)
    }
});
var nicEditorIFrameInstance = nicEditorInstance.extend({ savedStyles: [], init: function() { var B = this.elm.innerHTML.replace(/^\s+|\s+$/g, ""); this.elm.innerHTML = ""; (!B) ? B = "<br />" : B; this.initialContent = B; this.elmFrame = new bkElement("iframe").setAttributes({ src: "javascript:;", frameBorder: 0, allowTransparency: "true", scrolling: "no" }).setStyle({ height: "100px", width: "100%" }).addClass("frame").appendTo(this.elm); if (this.copyElm) { this.elmFrame.setStyle({ width: (this.elm.offsetWidth - 4) + "px" }) } var A = ["font-size", "font-family", "font-weight", "color"]; for (itm in A) { this.savedStyles[bkLib.camelize(itm)] = this.elm.getStyle(itm) } setTimeout(this.initFrame.closure(this), 50) }, disable: function() { this.elm.innerHTML = this.getContent() }, initFrame: function() { var B = $BK(this.elmFrame.contentWindow.document); B.designMode = "on"; B.open(); var A = this.ne.options.externalCSS; B.write("<html><head>" + ((A) ? '<link href="' + A + '" rel="stylesheet" type="text/css" />' : "") + '</head><body id="nicEditContent" style="margin: 0 !important; background-color: transparent !important;">' + this.initialContent + "</body></html>"); B.close(); this.frameDoc = B; this.frameWin = $BK(this.elmFrame.contentWindow); this.frameContent = $BK(this.frameWin.document.body).setStyle(this.savedStyles); this.instanceDoc = this.frameWin.document.defaultView; this.heightUpdate(); this.frameDoc.addEvent("mousedown", this.selected.closureListener(this)).addEvent("keyup", this.heightUpdate.closureListener(this)).addEvent("keydown", this.keyDown.closureListener(this)).addEvent("keyup", this.selected.closure(this)); this.ne.fireEvent("add", this) }, getElm: function() { return this.frameContent }, setContent: function(A) { this.content = A; this.ne.fireEvent("set", this); this.frameContent.innerHTML = this.content; this.heightUpdate() }, getSel: function() { return (this.frameWin) ? this.frameWin.getSelection() : this.frameDoc.selection }, heightUpdate: function() { this.elmFrame.style.height = Math.max(this.frameContent.offsetHeight, this.initialHeight) + "px" }, nicCommand: function(B, A) { this.frameDoc.execCommand(B, false, A); setTimeout(this.heightUpdate.closure(this), 100) } });
var nicEditorPanel = bkClass.extend({ construct: function(E, B, A) { this.elm = E; this.options = B; this.ne = A; this.panelButtons = new Array(); this.buttonList = bkExtend([], this.ne.options.buttonList); this.panelContain = new bkElement("DIV").setStyle({ overflow: "hidden", width: "100%", border: "1px solid #cccccc", backgroundColor: "#efefef" }).addClass("panelContain"); this.panelElm = new bkElement("DIV").setStyle({ margin: "2px", marginTop: "0px", zoom: 1, overflow: "hidden" }).addClass("panel").appendTo(this.panelContain); this.panelContain.appendTo(E); var C = this.ne.options; var D = C.buttons; for (button in D) { this.addButton(button, C, true) } this.reorder(); E.noSelect() }, addButton: function(buttonName, options, noOrder) { var button = options.buttons[buttonName]; var type = (button.type) ? eval("(typeof(" + button.type + ') == "undefined") ? null : ' + button.type + ";") : nicEditorButton; var hasButton = bkLib.inArray(this.buttonList, buttonName); if (type && (hasButton || this.ne.options.fullPanel)) { this.panelButtons.push(new type(this.panelElm, buttonName, options, this.ne)); if (!hasButton) { this.buttonList.push(buttonName) } } }, findButton: function(B) { for (var A = 0; A < this.panelButtons.length; A++) { if (this.panelButtons[A].name == B) { return this.panelButtons[A] } } }, reorder: function() { var C = this.buttonList; for (var B = 0; B < C.length; B++) { var A = this.findButton(C[B]); if (A) { this.panelElm.appendChild(A.margin) } } }, remove: function() { this.elm.remove() } });
var nicEditorButton = bkClass.extend(
{
    construct: function(D, A, C, B)
    {
        this.options = C.buttons[A];
        this.name = A;
        this.ne = B;
        this.elm = D;
        this.margin = new bkElement("DIV").setStyle({ "float": "left", marginTop: "2px" }).appendTo(D);
        this.contain = new bkElement("DIV").setStyle({ width: "20px", height: "20px" }).addClass("buttonContain").appendTo(this.margin);
        this.border = new bkElement("DIV").setStyle({ backgroundColor: "#efefef", border: "1px solid #efefef" }).appendTo(this.contain);
        this.button = new bkElement("DIV").setStyle({ width: "18px", height: "18px", overflow: "hidden", zoom: 1, cursor: "pointer" }).addClass("button").setStyle(this.ne.getIcon(A, C)).appendTo(this.border);
        this.button.addEvent("mouseover", this.hoverOn.closure(this)).addEvent("mouseout", this.hoverOff.closure(this))
            .addEvent("mousedown", this.mouseClick.closure(this)).noSelect();
        if (!window.opera)
        {
            this.button.onmousedown = this.button.onclick = bkLib.cancelEvent
        }
        B.addEvent("selected", this.enable.closure(this)).addEvent("blur", this.disable.closure(this))
         .addEvent("key", this.key.closure(this));
        this.disable();
        this.init()
    },
    init: function() { },
    hide: function()
    {
        this.contain.setStyle({ display: "none" })
    },
    updateState: function()
    {
        if (this.isDisabled)
        {
            this.setBg()
        }
        else
        {
            if (this.isHover)
            {
                this.setBg("hover")
            }
            else
            {
                if (this.isActive)
                {
                    this.setBg("active")
                }
                else
                {
                    this.setBg()
                }
            }
        }
    },
    setBg: function(A)
    {
        switch (A)
        {
            case "hover":
                var B = { border: "1px solid #666", backgroundColor: "#ddd" };
                break;
            case "active":
                var B = { border: "1px solid #666", backgroundColor: "#ccc" };
                break;
            default:
                var B = { border: "1px solid #efefef", backgroundColor: "#efefef" }
        }
        this.border.setStyle(B).addClass("button-" + A)
    },
    checkNodes: function(A)
    {
        var B = A;
        do
        {
            if (this.options.tags && bkLib.inArray(this.options.tags, B.nodeName))
            {
                this.activate();
                return true
            }
        }
        while (B = B.parentNode && B.className != "nicEdit");
        B = $BK(A);
        while (B.nodeType == 3)
        {
            B = $BK(B.parentNode)
        }
        if (this.options.css)
        {
            for (itm in this.options.css)
            {
                if (B.getStyle(itm, this.ne.selectedInstance.instanceDoc) == this.options.css[itm])
                {
                    this.activate();
                    return true
                }
            }
        }
        this.deactivate();
        return false
    },
    activate: function()
    {
        if (!this.isDisabled)
        {
            this.isActive = true;
            this.updateState();
            this.ne.fireEvent("buttonActivate", this)
        }
    },
    deactivate: function()
    {
        this.isActive = false;
        this.updateState();
        if (!this.isDisabled)
        {
            this.ne.fireEvent("buttonDeactivate", this)
        }
    },
    enable: function(A, B)
    {
        this.isDisabled = false;
        this.contain.setStyle({ opacity: 1 }).addClass("buttonEnabled");
        this.updateState();
        this.checkNodes(B)
    },
    disable: function(A, B)
    {
        this.isDisabled = true;
        this.contain.setStyle({ opacity: 0.6 }).removeClass("buttonEnabled");
        this.updateState()
    },
    toggleActive: function()
    {
        (this.isActive) ? this.deactivate() : this.activate()
    },
    hoverOn: function()
    {
        if (!this.isDisabled)
        {
            this.isHover = true;
            this.updateState();
            this.ne.fireEvent("buttonOver", this)
        }
    },
    hoverOff: function()
    {
        this.isHover = false;
        this.updateState();
        this.ne.fireEvent("buttonOut", this)
    },
    mouseClick: function()
    {
        if (this.options.command)
        {
            this.ne.nicCommand(this.options.command, this.options.commandArgs);
            if (!this.options.noActive)
            {
                this.toggleActive()
            }
        }
        this.ne.fireEvent("buttonClick", this)
    },
    key: function(A, B)
    {
        if (this.options.key && B.ctrlKey && String.fromCharCode(B.keyCode || B.charCode).toLowerCase() == this.options.key)
        {
            this.mouseClick();
            if (B.preventDefault)
            {
                B.preventDefault()
            }
        }
    }
}
        );
var nicPlugin = bkClass.extend({ construct: function(B, A) { this.options = A; this.ne = B; this.ne.addEvent("panel", this.loadPanel.closure(this)); this.init() }, loadPanel: function(C) { var B = this.options.buttons; for (var A in B) { C.addButton(A, this.options) } C.reorder() }, init: function() { } });


var nicPaneOptions = {};

var nicEditorPane = bkClass.extend(
{
    construct: function(D, C, B, A)
    {
        this.ne = C;
        this.elm = D;
        this.pos = D.pos();
        this.contain = new bkElement("div").setStyle({ zIndex: "99999", overflow: "hidden", position: "absolute", left: this.pos[0] + "px", top: this.pos[1] + "px" });
        this.pane = new bkElement("div").setStyle({ fontSize: "12px", border: "1px solid #ccc", overflow: "hidden", padding: "4px", textAlign: "left", backgroundColor: "#ffffc9" }).addClass("pane").setStyle(B).appendTo(this.contain);
        if (A && !A.options.noClose)
        {
            this.close = new bkElement("div").setStyle({ "float": "right", height: "16px", width: "16px", cursor: "pointer" }).setStyle(this.ne.getIcon("close", nicPaneOptions)).addEvent("mousedown", A.removePane.closure(this)).appendTo(this.pane)
        }
        this.contain.noSelect().appendTo(document.body);
        this.position();
        this.init()
    },
    init: function() { },
    position: function()
    {
        if (this.ne.nicPanel)
        {
            var B = this.ne.nicPanel.elm;
            var A = B.pos();
            var C = A[0] + parseInt(B.getStyle("width")) - (parseInt(this.pane.getStyle("width")) + 8); if (C < this.pos[0])
            {
                this.contain.setStyle({ left: C + "px" })
            }
        }
    },
    toggle: function()
    {
        this.isVisible = !this.isVisible;
        this.contain.setStyle({ display: ((this.isVisible) ? "block" : "none") })
    },
    remove: function()
    {
        if (this.contain)
        {
            this.contain.remove(); this.contain = null
        }
    },
    append: function(A)
    {
        A.appendTo(this.pane)
    },
    setContent: function(A)
    {
        this.pane.setContent(A)
    }
});

var nicEditorAdvancedButton = nicEditorButton.extend(
{
    init: function()
    {
        this.ne.addEvent("selected", this.removePane.closure(this)).addEvent("blur", this.removePane.closure(this))
    },
    mouseClick: function()
    {
        if (!this.isDisabled)
        {
            if (this.pane && this.pane.pane)
            {
                this.removePane()
            }
            else
            {
                this.pane = new nicEditorPane(this.contain, this.ne, { width: (this.width || "270px"), backgroundColor: "#fff" }, this);
                this.addPane();
                this.ne.selectedInstance.saveRng()
            }
        }
    },
    addForm: function(C, G)
    {
        this.form = new bkElement("form").addEvent("submit", this.submit.closureListener(this));
        this.pane.append(this.form);
        this.inputs = {};
        for (itm in C)
        {
            var D = C[itm];
            var F = "";
            if (G)
            {
                F = G.getAttribute(itm)
            }
            if (!F)
            {
                F = D.value || ""
            }
            var A = C[itm].type;
            if (A == "title")
            {
                new bkElement("div").setContent(D.txt).setStyle({ fontSize: "14px", fontWeight: "bold", padding: "0px", margin: "2px 0" }).appendTo(this.form)
            }
            else
            {
                var B = new bkElement("div").setStyle({ overflow: "hidden", clear: "both" }).appendTo(this.form);
                if (D.txt)
                {
                    new bkElement("label").setAttributes({ "for": itm }).setContent(D.txt)
                        .setStyle({ margin: "2px 4px", fontSize: "13px", width: "50px", lineHeight: "20px", textAlign: "right", "float": "left" }).appendTo(B)
                }
                switch (A)
                {
                    case "text":
                        this.inputs[itm] = new bkElement("input").setAttributes({ id: itm, value: F, type: "text" }).setStyle({ margin: "2px 0", fontSize: "13px", "float": "left", height: "20px", border: "1px solid #ccc", overflow: "hidden" }).setStyle(D.style).appendTo(B);
                        break;
                    case "select":
                        this.inputs[itm] = new bkElement("select").setAttributes({ id: itm }).setStyle({ border: "1px solid #ccc", "float": "left", margin: "2px 0" }).appendTo(B);
                        for (opt in D.options)
                        {
                            var E = new bkElement("option").setAttributes({ value: opt, selected: (opt == F) ? "selected" : "" })
                                .setContent(D.options[opt]).appendTo(this.inputs[itm])
                        }
                        break;
                    case "content":
                        this.inputs[itm] = new bkElement("textarea").setAttributes({ id: itm }).setStyle({ border: "1px solid #ccc", "float": "left" }).setStyle(D.style).appendTo(B);
                        this.inputs[itm].value = F
                }
            }
        }
        new bkElement("input").setAttributes({ type: "submit", value: "OK" }).setStyle({ backgroundColor: "#efefef", border: "1px solid #ccc", margin: "3px 0", "float": "left", clear: "both" }).appendTo(this.form);
        this.form.onsubmit = bkLib.cancelEvent
    },
    submit: function() { },
    findElm: function(B, A, E)
    {
        var D = this.ne.selectedInstance.getElm().getElementsByTagName(B);
        for (var C = 0; C < D.length; C++)
        {
            if (D[C].getAttribute(A) == E)
            {
                return $BK(D[C])
            }
        }
    },
    removePane: function()
    {
        if (this.pane)
        {
            this.pane.remove();
            this.pane = null;
            this.ne.selectedInstance.restoreRng()
        }
    }
});
var nicButtonTips = bkClass.extend({ construct: function(A) { this.ne = A; A.addEvent("buttonOver", this.show.closure(this)).addEvent("buttonOut", this.hide.closure(this)) }, show: function(A) { this.timer = setTimeout(this.create.closure(this, A), 400) }, create: function(A) { this.timer = null; if (!this.pane) { this.pane = new nicEditorPane(A.button, this.ne, { fontSize: "12px", marginTop: "5px" }); this.pane.setContent(A.options.name) } }, hide: function(A) { if (this.timer) { clearTimeout(this.timer) } if (this.pane) { this.pane = this.pane.remove() } } }); nicEditors.registerPlugin(nicButtonTips);


var nicSelectOptions = {
    buttons: {
        'fontSize': { name: __('Select Font Size'), type: 'nicEditorFontSizeSelect', command: 'fontsize' },
        'fontFamily': { name: __('Select Font Family'), type: 'nicEditorFontFamilySelect', command: 'fontname' },
        'fontFormat': { name: __('Select Font Format'), type: 'nicEditorFontFormatSelect', command: 'formatBlock' }
    }
};

var nicEditorSelect = bkClass.extend(
{
    construct: function(D, A, C, B)
    {
        this.options = C.buttons[A];
        this.elm = D;
        this.ne = B;
        this.name = A;
        this.selOptions = new Array();
        this.margin = new bkElement("div").setStyle({ "float": "left", margin: "2px 1px 0 1px" }).appendTo(this.elm);
        this.contain = new bkElement("div").setStyle({ width: "90px", height: "20px", cursor: "pointer", overflow: "hidden" }).addClass("selectContain")
            .addEvent("click", this.toggle.closure(this)).appendTo(this.margin);
        this.items = new bkElement("div").setStyle({ overflow: "hidden", zoom: 1, border: "1px solid #ccc", paddingLeft: "3px", backgroundColor: "#fff" }).appendTo(this.contain);
        this.control = new bkElement("div").setStyle({ overflow: "hidden", "float": "right", height: "18px", width: "16px" }).addClass("selectControl").setStyle(this.ne.getIcon("arrow", C)).appendTo(this.items);
        this.txt = new bkElement("div").setStyle({ overflow: "hidden", "float": "left", width: "66px", height: "14px", marginTop: "1px", fontFamily: "sans-serif", textAlign: "center", fontSize: "12px" }).addClass("selectTxt").appendTo(this.items);
        if (!window.opera)
        {
            this.contain.onmousedown = this.control.onmousedown = this.txt.onmousedown = bkLib.cancelEvent
        }
        this.margin.noSelect();
        this.ne.addEvent("selected", this.enable.closure(this)).addEvent("blur", this.disable.closure(this));
        this.disable();
        this.init()
    },
    disable: function()
    {
        this.isDisabled = true;
        this.close();
        this.contain.setStyle({ opacity: 0.6 })
    },
    enable: function(A)
    {
        this.isDisabled = false;
        this.close();
        this.contain.setStyle({ opacity: 1 })
    },
    setDisplay: function(A)
    {
        this.txt.setContent(A)
    },
    toggle: function()
    {
        if (!this.isDisabled)
        {
            (this.pane) ? this.close() : this.open()
        }
    },
    open: function()
    {
        if (window["_openedNicInstPanel"])
            window["_openedNicInstPanel"].close();
        window["_openedNicInstPanel"] = this;
        this.pane = new nicEditorPane(this.items, this.ne, { width: "150px", padding: "0px", borderTop: 0, borderLeft: "1px solid #ccc", borderRight: "1px solid #ccc", borderBottom: "0px", backgroundColor: "#fff" });
        for (var C = 0; C < this.selOptions.length; C++)
        {
            var B = this.selOptions[C];
            var A = new bkElement("div").setStyle({ overflow: "hidden", borderBottom: "1px solid #ccc", width: "150px", textAlign: "left", overflow: "hidden", cursor: "pointer" });
            var D = new bkElement("div").setStyle({ padding: "0px 4px" }).setContent(B[1]).appendTo(A).noSelect();
            D.addEvent("click", this.update.closure(this, B[0])).addEvent("mouseover", this.over.closure(this, D)).addEvent("mouseout", this.out.closure(this, D)).setAttributes("id", B[0]);
            this.pane.append(A);
            if (!window.opera)
            {
                D.onmousedown = bkLib.cancelEvent
            }
        }
    },
    close: function()
    {
        if (this.pane)
        {
            this.pane = this.pane.remove()
            window["_openedNicInstPanel"] = null;
        }
    },
    over: function(A)
    {
        A.setStyle({ backgroundColor: "#ccc" })
    },
    out: function(A)
    {
        A.setStyle({ backgroundColor: "#fff" })
    },
    add: function(B, A)
    {
        this.selOptions.push(new Array(B, A))
    },
    update: function(A)
    {
        this.ne.nicCommand(this.options.command, A);
        this.setDisplay(this.sel[A.replace(/\</gi, "").replace(/\>/gi, "").toLowerCase()]);
        this.close()
    }
});
var nicEditorFontSizeSelect = nicEditorSelect.extend(
{
    sel:
    {
        1: "1&nbsp;(8pt)",
        2: "2&nbsp;(10pt)",
        3: "3&nbsp;(12pt)",
        4: "4&nbsp;(14pt)",
        5: "5&nbsp;(18pt)",
        6: "6&nbsp;(24pt)"
    },
    init: function()
    {
        this.setDisplay("Размер");
        for (itm in this.sel)
        {
            this.add(itm, '<font size="' + itm + '">' + this.sel[itm] + "</font>")
        }
        var elm = this.ne.nicInstances[0].elm;
        if (!$G.Browser.Detect.ie)
        {
            elm = elm.firstChild;
            this.oldLoad = elm.onload;
            elm.onload = function(e)
            {
                $G.Event.Add($G.GetIframeDocument(this.elm).body, "mouseup", this.th.mouseup.closure(this.th), "FontSizeSelectMouseUpEvent");
                $G.Event.Add($G.GetIframeDocument(this.elm).body, "keyup", this.th.mouseup.closure(this.th), "FontSizeSelectKeyUpEvent");
                if (this.th.oldLoad)
                    this.th.oldLoad(e);
            } .bind({ th: this, elm: elm });
        }
        else
        {
            $G.Event.Add(elm, "mouseup", this.mouseup.closure(this), "FontSizeSelectMouseUpEvent");
            $G.Event.Add(elm, "keyup", this.mouseup.closure(this), "FontSizeSelectKeyUpEvent");
        }
        elm = null;
    },
    mouseup: function()
    {
        var rng = this.ne.selectedInstance.getRng();

        if (rng && (rng.parentElement || rng.commonAncestorContainer))
        {
            var tag = rng.parentElement ? rng.parentElement() : rng.commonAncestorContainer.parentNode;
            var size = "";
            if (tag && tag.tagName)
            {
                //   debugger
                while (!($G.ClassName.Has(tag, "EditorInstance") || tag.tagName.toLowerCase() == "body") && tag.tagName.toString().toLowerCase() != "font")
                    tag = tag.parentNode;
                if (tag.size)
                    size = tag.size.toLowerCase();

                if (this.sel[size])
                    this.setDisplay(this.sel[size]);
                else
                    this.setDisplay("Размер");
            }
            else
                this.setDisplay("Размер");
            tag = size = null;
        }
        rng = null;
    }
});
var nicEditorFontFamilySelect = nicEditorSelect.extend(
{
    sel:
    {
        arial: "Arial",
        "comic sans ms": "Comic Sans",
        "courier new": "Courier New",
        georgia: "Georgia",
        helvetica: "Helvetica",
        impact: "Impact",
        "times new roman": "Times",
        "trebuchet ms": "Trebuchet",
        verdana: "Verdana"
    },
    init: function()
    {
        this.setDisplay("Шрифт");
        for (itm in this.sel)
        {
            this.add(itm, '<font face="' + itm + '">' + this.sel[itm] + "</font>")
        }
        var elm = this.ne.nicInstances[0].elm;
        if (!$G.Browser.Detect.ie)
        {
            elm = elm.firstChild;
            this.oldLoad = elm.onload;
            elm.onload = function(e)
            {
                $G.Event.Add($G.GetIframeDocument(this.elm).body, "mouseup", this.th.mouseup.closure(this.th), "FontFamilySelectMouseUpEvent");
                $G.Event.Add($G.GetIframeDocument(this.elm).body, "keyup", this.th.mouseup.closure(this.th), "FontFamilySelectKeyUpEvent");
                if (this.th.oldLoad)
                    this.th.oldLoad(e);
            } .bind({ th: this, elm: elm });
        }
        else
        {
            $G.Event.Add(elm, "mouseup", this.mouseup.closure(this), "FontFamilySelectMouseUpEvent");
            $G.Event.Add(elm, "keyup", this.mouseup.closure(this), "FontFamilySelectKeyUpEvent");
        }
        elm = null;
    },
    mouseup: function()
    {
        var rng = this.ne.selectedInstance.getRng();
        var tag = rng.parentElement ? rng.parentElement() : rng.commonAncestorContainer.parentNode;
        var size = "";
        if (tag && tag.tagName)
        {
            while (!($G.ClassName.Has(tag, "EditorInstance") || tag.tagName.toString().toLowerCase() == "body") && !(tag.style.fontFamily || tag.face))
                tag = tag.parentNode;

            if (tag.style.fontFamily)
                size = tag.style.fontFamily.toString().toLowerCase();
            else if (tag.face)
                size = tag.face.toLowerCase();

            if (this.sel[size])
                this.setDisplay(this.sel[size]);
            else
                this.setDisplay("Шрифт");
        }
        else
            this.setDisplay("Шрифт");
        rng = tag = size = null;
    }
});
var nicEditorFontFormatSelect = nicEditorSelect.extend(
{
    sel:
    {
        p: "Параграф",
        pre: "Pre",
        h1: "Заголовок&nbsp;1",
        h2: "Заголовок&nbsp;2",
        h3: "Заголовок&nbsp;3",
        h4: "Заголовок&nbsp;4",
        h5: "Заголовок&nbsp;5",
        h6: "Заголовок&nbsp;6"
    },
    init: function()
    {
        this.setDisplay("Формат");

        for (itm in this.sel)
        {
            var A = itm.toUpperCase();
            this.add("<" + A + ">", "<" + itm + ' style="padding: 0px; margin: 0px;">' + this.sel[itm] + "</" + A + ">")
        }
        var elm = this.ne.nicInstances[0].elm;
        if (!$G.Browser.Detect.ie)
        {
            elm = elm.firstChild;
            this.oldLoad = elm.onload;
            elm.onload = function(e)
            {
                $G.Event.Add($G.GetIframeDocument(this.elm).body, "mouseup", this.th.mouseup.closure(this.th), "FontFormatSelectMouseUpEvent");
                $G.Event.Add($G.GetIframeDocument(this.elm).body, "keyup", this.th.mouseup.closure(this.th), "FontFormatSelectKeyUpEvent");
                if (this.th.oldLoad)
                    this.th.oldLoad(e);
            } .bind({ th: this, elm: elm });
        }
        else
        {
            $G.Event.Add(elm, "mouseup", this.mouseup.closure(this), "FontFormatSelectMouseUpEvent");
            $G.Event.Add(elm, "keyup", this.mouseup.closure(this), "FontFormatSelectKeyUpEvent");
        }
        elm = null;
    },
    mouseup: function()
    {
        var rng = this.ne.selectedInstance.getRng();
        if (rng && (rng.parentElement || rng.startContainer))
        {
            var tag = rng.parentElement ? rng.parentElement() : rng.commonAncestorContainer.parentNode;
            if (tag && tag.tagName)
            {
                while (!($G.ClassName.Has(tag, "EditorInstance") || tag.tagName.toLowerCase() == "body") && !nicTextFormatTags.contains(tag.tagName.toString().toLowerCase()))
                    tag = tag.parentNode;
                tag = tag.tagName.toString();
                if (tag && this.sel[tag.toLowerCase()])
                    this.setDisplay(this.sel[tag.toLowerCase()]);
                else
                    this.setDisplay("Формат");
            }
            else
                this.setDisplay("Формат");
            tag = null;
        }
        else
            this.setDisplay("Формат");
    }
});
nicFormatingTags = ["b", "strong", "i", "strike", "u"];
nicTextFormatTags = ["p", "pre", "h1", "h2", "h3", "h4", "h5", "h6"];
nicEditors.registerPlugin(nicPlugin, nicSelectOptions);


var nicLinkOptions = {
    buttons: {
        'link': { name: 'Добавить ссылку', type: 'nicLinkButton', tags: ['A'] },
        'unlink': { name: 'Удалить ссылку', command: 'unlink', noActive: true }
    }
};

var nicLinkButton = nicEditorAdvancedButton.extend({ addPane: function() { this.ln = this.ne.selectedInstance.selElm().parentTag("A"); this.addForm({ "": { type: "title", txt: "Add/Edit Link" }, href: { type: "text", txt: "URL", value: "http://", style: { width: "150px"} }, title: { type: "text", txt: "Title" }, target: { type: "select", txt: "Open In", options: { "": "Current Window", _blank: "New Window" }, style: { width: "100px"}} }, this.ln) }, submit: function(C) { var A = this.inputs.href.value; if (A == "http://" || A == "") { alert("You must enter a URL to Create a Link"); return false } this.removePane(); if (!this.ln) { var B = "javascript:nicTemp();"; this.ne.nicCommand("createlink", B); this.ln = this.findElm("A", "href", B) } if (this.ln) { this.ln.setAttributes({ href: this.inputs.href.value, title: this.inputs.title.value, target: this.inputs.target.options[this.inputs.target.selectedIndex].value }) } } }); nicEditors.registerPlugin(nicPlugin, nicLinkOptions);


var nicColorOptions = {
    buttons: {
        'forecolor': { name: __('Изменить цвет текста'), type: 'nicEditorColorButton', noClose: true },
        'bgcolor': { name: __('Изменить цвет заливки'), type: 'nicEditorBgColorButton', noClose: true }
    }
};

var nicEditorColorButton = nicEditorAdvancedButton.extend({ addPane: function() { var D = { 0: "00", 1: "33", 2: "66", 3: "99", 4: "CC", 5: "FF" }; var H = new bkElement("DIV").setStyle({ width: "270px" }); for (var A in D) { for (var F in D) { for (var E in D) { var I = "#" + D[A] + D[E] + D[F]; var C = new bkElement("DIV").setStyle({ cursor: "pointer", height: "15px", "float": "left" }).appendTo(H); var G = new bkElement("DIV").setStyle({ border: "2px solid " + I }).appendTo(C); var B = new bkElement("DIV").setStyle({ backgroundColor: I, overflow: "hidden", width: "11px", height: "11px" }).addEvent("click", this.colorSelect.closure(this, I)).addEvent("mouseover", this.on.closure(this, G)).addEvent("mouseout", this.off.closure(this, G, I)).appendTo(G); if (!window.opera) { C.onmousedown = B.onmousedown = bkLib.cancelEvent } } } } this.pane.append(H.noSelect()) }, colorSelect: function(A) { this.ne.nicCommand("foreColor", A); this.removePane() }, on: function(A) { A.setStyle({ border: "2px solid #000" }) }, off: function(A, B) { A.setStyle({ border: "2px solid " + B }) } }); var nicEditorBgColorButton = nicEditorColorButton.extend({ colorSelect: function(A) { this.ne.nicCommand("hiliteColor", A); this.removePane() } }); nicEditors.registerPlugin(nicPlugin, nicColorOptions);


var nicImageOptions = {
    buttons: {
        'image': { name: 'Добавить изображение', type: 'nicImageButton', tags: ['IMG'] }
    }

};

var nicImageButton = nicEditorAdvancedButton.extend({ addPane: function() { this.im = this.ne.selectedInstance.selElm().parentTag("IMG"); this.addForm({ "": { type: "title", txt: "Add/Edit Image" }, src: { type: "text", txt: "URL", value: "http://", style: { width: "150px"} }, alt: { type: "text", txt: "Alt Text", style: { width: "100px"} }, align: { type: "select", txt: "Align", options: { none: "Default", left: "Left", right: "Right"}} }, this.im) }, submit: function(B) { var C = this.inputs.src.value; if (C == "" || C == "http://") { alert("You must enter a Image URL to insert"); return false } this.removePane(); if (!this.im) { var A = "javascript:nicImTemp();"; this.ne.nicCommand("insertImage", A); this.im = this.findElm("IMG", "src", A) } if (this.im) { this.im.setAttributes({ src: this.inputs.src.value, alt: this.inputs.alt.value, align: this.inputs.align.value }) } } }); nicEditors.registerPlugin(nicPlugin, nicImageOptions);


var nicSaveOptions = {
    buttons: {
        'save': { name: __('Save this content'), type: 'nicEditorSaveButton' }
    }
};

var nicEditorSaveButton = nicEditorButton.extend({ init: function() { if (!this.ne.options.onSave) { this.margin.setStyle({ display: "none" }) } }, mouseClick: function() { var B = this.ne.options.onSave; var A = this.ne.selectedInstance; B(A.getContent(), A.elm.id, A) } }); nicEditors.registerPlugin(nicPlugin, nicSaveOptions);


var nicCodeOptions = {
    buttons: {
        'xhtml': { name: 'Редактировать исходный код', type: 'nicCodeButton' }
    }

};

var nicCodeButton = nicEditorAdvancedButton.extend(
{
    width: "673px",
    addPane: function()
    {
        this.addForm({ "": { type: "title", txt: "Редактрор исходного кода" }, code: { type: "content", value: this.ne.selectedInstance.getContent(), style: { width: "669px", height: "348px"}} })
    }, submit: function(B) { var A = this.inputs.code.value; this.ne.selectedInstance.setContent(A); this.removePane() }
}); nicEditors.registerPlugin(nicPlugin, nicCodeOptions);

