﻿/*
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/

(function () {
    if (!window.CKEDITOR) window.CKEDITOR = (function () {
        var a = {
            timestamp: 'A1QD',
            version: '3.2',
            revision: '5205',
            _: {},
            status: 'unloaded',
            basePath: (function () {
                var d = window.CKEDITOR_BASEPATH || '';
                if (!d) {
                    var e = document.getElementsByTagName('script');
                    for (var f = 0; f < e.length; f++) {
                        var g = e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);
                        if (g) {
                            d = g[1];
                            break;
                        }
                    }
                }
                if (d.indexOf('://') == -1) if (d.indexOf('/') === 0) d = location.href.match(/^.*?:\/\/[^\/]*/)[0] + d;
                else d = location.href.match(/^[^\?]*\/(?:)/)[0] + d;
                return d;
            })(),
            getUrl: function (d) {
                if (d.indexOf('://') == -1 && d.indexOf('/') !== 0) d = this.basePath + d;
                if (this.timestamp && d.charAt(d.length - 1) != '/') d += (d.indexOf('?') >= 0 ? '&' : '?') + 't=' + this.timestamp;
                return d;
            }
        },
            b = window.CKEDITOR_GETURL;
        if (b) {
            var c = a.getUrl;
            a.getUrl = function (d) {
                return b.call(a, d) || c.call(a, d);
            };
        }
        return a;
    })();
    var a = CKEDITOR;
    if (!a.event) {
        a.event = function () {};
        a.event.implementOn = function (b, c) {
            var d = a.event.prototype;
            for (var e in d) {
                if (b[e] == undefined) b[e] = d[e];
            }
        };
        a.event.prototype = (function () {
            var b = function (d) {
                var e = d.getPrivate && d.getPrivate() || d._ || (d._ = {});
                return e.events || (e.events = {});
            },
                c = function (d) {
                    this.name = d;
                    this.listeners = [];
                };
            c.prototype = {
                getListenerIndex: function (d) {
                    for (var e = 0, f = this.listeners; e < f.length; e++) {
                        if (f[e].fn == d) return e;
                    }
                    return -1;
                }
            };
            return {
                on: function (d, e, f, g, h) {
                    var i = b(this),
                        j = i[d] || (i[d] = new c(d));
                    if (j.getListenerIndex(e) < 0) {
                        var k = j.listeners;
                        if (!f) f = this;
                        if (isNaN(h)) h = 10;
                        var l = this,
                            m = function (o, p, q, r) {
                                var s = {
                                    name: d,
                                    sender: this,
                                    editor: o,
                                    data: p,
                                    listenerData: g,
                                    stop: q,
                                    cancel: r,
                                    removeListener: function () {
                                        l.removeListener(d, e);
                                    }
                                };
                                e.call(f, s);
                                return s.data;
                            };
                        m.fn = e;
                        m.priority = h;
                        for (var n = k.length - 1; n >= 0; n--) {
                            if (k[n].priority <= h) {
                                k.splice(n + 1, 0, m);
                                return;
                            }
                        }
                        k.unshift(m);
                    }
                },
                fire: (function () {
                    var d = false,
                        e = function () {
                            d = true;
                        },
                        f = false,
                        g = function () {
                            f = true;
                        };
                    return function (h, i, j) {
                        var k = b(this)[h],
                            l = d,
                            m = f;
                        d = f = false;
                        if (k) {
                            var n = k.listeners;
                            if (n.length) {
                                n = n.slice(0);
                                for (var o = 0; o < n.length; o++) {
                                    var p = n[o].call(this, j, i, e, g);
                                    if (typeof p != 'undefined') i = p;
                                    if (d || f) break;
                                }
                            }
                        }
                        var q = f || (typeof i == 'undefined' ? false : i);
                        d = l;
                        f = m;
                        return q;
                    };
                })(),
                fireOnce: function (d, e, f) {
                    var g = this.fire(d, e, f);
                    delete b(this)[d];
                    return g;
                },
                removeListener: function (d, e) {
                    var f = b(this)[d];
                    if (f) {
                        var g = f.getListenerIndex(e);
                        if (g >= 0) f.listeners.splice(g, 1);
                    }
                },
                hasListeners: function (d) {
                    var e = b(this)[d];
                    return e && e.listeners.length > 0;
                }
            };
        })();
    }
    if (!a.editor) {
        a.ELEMENT_MODE_NONE = 0;
        a.ELEMENT_MODE_REPLACE = 1;
        a.ELEMENT_MODE_APPENDTO = 2;
        a.editor = function (b, c, d) {
            var e = this;
            e._ = {
                instanceConfig: b,
                element: c
            };
            e.elementMode = d || 0;
            a.event.call(e);
            e._init();
        };
        a.editor.replace = function (b, c) {
            var d = b;
            if (typeof d != 'object') {
                d = document.getElementById(b);
                if (!d) {
                    var e = 0,
                        f = document.getElementsByName(b);
                    while ((d = f[e++]) && d.tagName.toLowerCase() != 'textarea') {}
                }
                if (!d) throw '[CKEDITOR.editor.replace] The element with id or name "' + b + '" was not found.';
            }
            d.style.visibility = 'hidden';
            return new a.editor(c, d, 1);
        };
        a.editor.appendTo = function (b, c) {
            var d = b;
            if (typeof d != 'object') {
                d = document.getElementById(b);
                if (!d) throw '[CKEDITOR.editor.appendTo] The element with id "' + b + '" was not found.';
            }
            return new a.editor(c, d, 2);
        };
        a.editor.prototype = {
            _init: function () {
                var b = a.editor._pending || (a.editor._pending = []);
                b.push(this);
            },
            fire: function (b, c) {
                return a.event.prototype.fire.call(this, b, c, this);
            },
            fireOnce: function (b, c) {
                return a.event.prototype.fireOnce.call(this, b, c, this);
            }
        };
        a.event.implementOn(a.editor.prototype, true);
    }
    if (!a.env) a.env = (function () {
        var b = navigator.userAgent.toLowerCase(),
            c = window.opera,
            d = {
                ie: /*@cc_on!@*/
                false,
                opera: !! c && c.version,
                webkit: b.indexOf(' applewebkit/') > -1,
                air: b.indexOf(' adobeair/') > -1,
                mac: b.indexOf('macintosh') > -1,
                quirks: document.compatMode == 'BackCompat',
                isCustomDomain: function () {
                    return this.ie && document.domain != window.location.hostname;
                }
            };
        d.gecko = navigator.product == 'Gecko' && !d.webkit && !d.opera;
        var e = 0;
        if (d.ie) {
            e = parseFloat(b.match(/msie (\d+)/)[1]);
            d.ie8 = !! document.documentMode;
            d.ie8Compat = document.documentMode == 8;
            d.ie7Compat = e == 7 && !document.documentMode || document.documentMode == 7;
            d.ie6Compat = e < 7 || d.quirks;
        }
        if (d.gecko) {
            var f = b.match(/rv:([\d\.]+)/);
            if (f) {
                f = f[1].split('.');
                e = f[0] * 10000 + (f[1] || 0) * 100 + +(f[2] || 0);
            }
        }
        if (d.opera) e = parseFloat(c.version());
        if (d.air) e = parseFloat(b.match(/ adobeair\/(\d+)/)[1]);
        if (d.webkit) e = parseFloat(b.match(/ applewebkit\/(\d+)/)[1]);
        d.version = e;
        d.isCompatible = d.ie && e >= 6 || d.gecko && e >= 10801 || d.opera && e >= 9.5 || d.air && e >= 1 || d.webkit && e >= 522 || false;
        d.cssClass = 'cke_browser_' + (d.ie ? 'ie' : d.gecko ? 'gecko' : d.opera ? 'opera' : d.air ? 'air' : d.webkit ? 'webkit' : 'unknown');
        if (d.quirks) d.cssClass += ' cke_browser_quirks';
        if (d.ie) {
            d.cssClass += ' cke_browser_ie' + (d.version < 7 ? '6' : d.version >= 8 ? '8' : '7');
            if (d.quirks) d.cssClass += ' cke_browser_iequirks';
        }
        if (d.gecko && e < 10900) d.cssClass += ' cke_browser_gecko18';
        return d;
    })();
    var b = a.env;
    var c = b.ie;
    if (a.status == 'unloaded')(function () {
        a.event.implementOn(a);
        a.loadFullCore = function () {
            if (a.status != 'basic_ready') {
                a.loadFullCore._load = true;
                return;
            }
            delete a.loadFullCore;
            var e = document.createElement('script');
            e.type = 'text/javascript';
            e.src = a.basePath + 'ckeditor.js';
            document.getElementsByTagName('head')[0].appendChild(e);
        };
        a.loadFullCoreTimeout = 0;
        a.replaceClass = 'ckeditor';
        a.replaceByClassEnabled = true;
        var d = function (e, f, g) {
            if (b.isCompatible) {
                if (a.loadFullCore) a.loadFullCore();
                var h = g(e, f);
                a.add(h);
                return h;
            }
            return null;
        };
        a.replace = function (e, f) {
            return d(e, f, a.editor.replace);
        };
        a.appendTo = function (e, f) {
            return d(e, f, a.editor.appendTo);
        };
        a.add = function (e) {
            var f = this._.pending || (this._.pending = []);
            f.push(e);
        };
        a.replaceAll = function () {
            var e = document.getElementsByTagName('textarea');
            for (var f = 0; f < e.length; f++) {
                var g = null,
                    h = e[f],
                    i = h.name;
                if (!h.name && !h.id) continue;
                if (typeof arguments[0] == 'string') {
                    var j = new RegExp('(?:^| )' + arguments[0] + '(?:$| )');
                    if (!j.test(h.className)) continue;
                } else if (typeof arguments[0] == 'function') {
                    g = {};
                    if (arguments[0](h, g) === false) continue;
                }
                this.replace(h, g);
            }
        };
        (function () {
            var e = function () {
                var f = a.loadFullCore,
                    g = a.loadFullCoreTimeout;
                if (a.replaceByClassEnabled) a.replaceAll(a.replaceClass);
                a.status = 'basic_ready';
                if (f && f._load) f();
                else if (g) setTimeout(function () {
                    if (a.loadFullCore) a.loadFullCore();
                }, g * 1000);
            };
            if (window.addEventListener) window.addEventListener('load', e, false);
            else if (window.attachEvent) window.attachEvent('onload', e);
        })();
        a.status = 'basic_loaded';
    })();
    a.dom = {};
    var d = a.dom;
    (function () {
        var e = [];
        a.tools = {
            arrayCompare: function (f, g) {
                if (!f && !g) return true;
                if (!f || !g || f.length != g.length) return false;
                for (var h = 0; h < f.length; h++) {
                    if (f[h] != g[h]) return false;
                }
                return true;
            },
            clone: function (f) {
                var g;
                if (f && f instanceof Array) {
                    g = [];
                    for (var h = 0; h < f.length; h++) g[h] = this.clone(f[h]);
                    return g;
                }
                if (f === null || typeof f != 'object' || f instanceof String || f instanceof Number || f instanceof Boolean || f instanceof Date || f instanceof RegExp) return f;
                g = new f.constructor();
                for (var i in f) {
                    var j = f[i];
                    g[i] = this.clone(j);
                }
                return g;
            },
            capitalize: function (f) {
                return f.charAt(0).toUpperCase() + f.substring(1).toLowerCase();
            },
            extend: function (f) {
                var g = arguments.length,
                    h, i;
                if (typeof(h = arguments[g - 1]) == 'boolean') g--;
                else if (typeof(h = arguments[g - 2]) == 'boolean') {
                    i = arguments[g - 1];
                    g -= 2;
                }
                for (var j = 1; j < g; j++) {
                    var k = arguments[j];
                    for (var l in k) {
                        if (h === true || f[l] == undefined) if (!i || l in i) f[l] = k[l];
                    }
                }
                return f;
            },
            prototypedCopy: function (f) {
                var g = function () {};
                g.prototype = f;
                return new g();
            },
            isArray: function (f) {
                return !!f && f instanceof Array;
            },
            isEmpty: function (f) {
                for (var g in f) {
                    if (f.hasOwnProperty(g)) return false;
                }
                return true;
            },
            cssStyleToDomStyle: (function () {
                var f = document.createElement('div').style,
                    g = typeof f.cssFloat != 'undefined' ? 'cssFloat' : typeof f.styleFloat != 'undefined' ? 'styleFloat' : 'float';
                return function (h) {
                    if (h == 'float') return g;
                    else return h.replace(/-./g, function (i) {
                        return i.substr(1).toUpperCase();
                    });
                };
            })(),
            buildStyleHtml: function (f) {
                f = [].concat(f);
                var g, h = [];
                for (var i = 0; i < f.length; i++) {
                    g = f[i];
                    if (/@import|[{}]/.test(g)) h.push('<style>' + g + '</style>');
                    else h.push('<link type="text/css" rel=stylesheet href="' + g + '">');
                }
                return h.join('');
            },
            htmlEncode: function (f) {
                var g = function (k) {
                    var l = new d.element('span');
                    l.setText(k);
                    return l.getHtml();
                },
                    h = g('\n').toLowerCase() == '<br>' ?
                    function (k) {
                        return g(k).replace(/<br>/gi, '\n');
                    } : g,
                    i = g('>') == '>' ?
                    function (k) {
                        return h(k).replace(/>/g, '&gt;');
                    } : h,
                    j = g('  ') == '&nbsp; ' ?
                    function (k) {
                        return i(k).replace(/&nbsp;/g, ' ');
                    } : i;
                this.htmlEncode = j;
                return this.htmlEncode(f);
            },
            escapeCssSelector: function (f) {
                return f.replace(/[\s#:.,$*^\[\]()~=+>]/g, '\\$&');
            },
            getNextNumber: (function () {
                var f = 0;
                return function () {
                    return ++f;
                };
            })(),
            override: function (f, g) {
                return g(f);
            },
            setTimeout: function (f, g, h, i, j) {
                if (!j) j = window;
                if (!h) h = j;
                return j.setTimeout(function () {
                    if (i) f.apply(h, [].concat(i));
                    else f.apply(h);
                }, g || 0);
            },
            trim: (function () {
                var f = /(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;
                return function (g) {
                    return g.replace(f, '');
                };
            })(),
            ltrim: (function () {
                var f = /^[ \t\n\r]+/g;
                return function (g) {
                    return g.replace(f, '');
                };
            })(),
            rtrim: (function () {
                var f = /[ \t\n\r]+$/g;
                return function (g) {
                    return g.replace(f, '');
                };
            })(),
            indexOf: Array.prototype.indexOf ?
            function (f, g) {
                return f.indexOf(g);
            } : function (f, g) {
                for (var h = 0, i = f.length; h < i; h++) {
                    if (f[h] === g) return h;
                }
                return -1;
            },
            bind: function (f, g) {
                return function () {
                    return f.apply(g, arguments);
                };
            },
            createClass: function (f) {
                var g = f.$,
                    h = f.base,
                    i = f.privates || f._,
                    j = f.proto,
                    k = f.statics;
                if (i) {
                    var l = g;
                    g = function () {
                        var p = this;
                        var m = p._ || (p._ = {});
                        for (var n in i) {
                            var o = i[n];
                            m[n] = typeof o == 'function' ? a.tools.bind(o, p) : o;
                        }
                        l.apply(p, arguments);
                    };
                }
                if (h) {
                    g.prototype = this.prototypedCopy(h.prototype);
                    g.prototype['constructor'] = g;
                    g.prototype.base = function () {
                        this.base = h.prototype.base;
                        h.apply(this, arguments);
                        this.base = arguments.callee;
                    };
                }
                if (j) this.extend(g.prototype, j, true);
                if (k) this.extend(g, k, true);
                return g;
            },
            addFunction: function (f, g) {
                return e.push(function () {
                    f.apply(g || this, arguments);
                }) - 1;
            },
            removeFunction: function (f) {
                e[f] = null;
            },
            callFunction: function (f) {
                var g = e[f];
                return g && g.apply(window, Array.prototype.slice.call(arguments, 1));
            },
            cssLength: (function () {
                var f = /^\d+(?:\.\d+)?$/;
                return function (g) {
                    return g + (f.test(g) ? 'px' : '');
                };
            })(),
            repeat: function (f, g) {
                return new Array(g + 1).join(f);
            },
            tryThese: function () {
                var f;
                for (var g = 0, h = arguments.length; g < h; g++) {
                    var i = arguments[g];
                    try {
                        f = i();
                        break;
                    } catch (j) {}
                }
                return f;
            }
        };
    })();
    var e = a.tools;
    a.dtd = (function () {
        var f = e.extend,
            g = {
                isindex: 1,
                fieldset: 1
            },
            h = {
                input: 1,
                button: 1,
                select: 1,
                textarea: 1,
                label: 1
            },
            i = f({
                a: 1
            }, h),
            j = f({
                iframe: 1
            }, i),
            k = {
                hr: 1,
                ul: 1,
                menu: 1,
                div: 1,
                blockquote: 1,
                noscript: 1,
                table: 1,
                center: 1,
                address: 1,
                dir: 1,
                pre: 1,
                h5: 1,
                dl: 1,
                h4: 1,
                noframes: 1,
                h6: 1,
                ol: 1,
                h1: 1,
                h3: 1,
                h2: 1
            },
            l = {
                ins: 1,
                del: 1,
                script: 1
            },
            m = f({
                b: 1,
                acronym: 1,
                bdo: 1,
                'var': 1,
                '#': 1,
                abbr: 1,
                code: 1,
                br: 1,
                i: 1,
                cite: 1,
                kbd: 1,
                u: 1,
                strike: 1,
                s: 1,
                tt: 1,
                strong: 1,
                q: 1,
                samp: 1,
                em: 1,
                dfn: 1,
                span: 1
            }, l),
            n = f({
                sub: 1,
                img: 1,
                object: 1,
                sup: 1,
                basefont: 1,
                map: 1,
                applet: 1,
                font: 1,
                big: 1,
                small: 1
            }, m),
            o = f({
                p: 1
            }, n),
            p = f({
                iframe: 1
            }, n, h),
            q = {
                img: 1,
                noscript: 1,
                br: 1,
                kbd: 1,
                center: 1,
                button: 1,
                basefont: 1,
                h5: 1,
                h4: 1,
                samp: 1,
                h6: 1,
                ol: 1,
                h1: 1,
                h3: 1,
                h2: 1,
                form: 1,
                font: 1,
                '#': 1,
                select: 1,
                menu: 1,
                ins: 1,
                abbr: 1,
                label: 1,
                code: 1,
                table: 1,
                script: 1,
                cite: 1,
                input: 1,
                iframe: 1,
                strong: 1,
                textarea: 1,
                noframes: 1,
                big: 1,
                small: 1,
                span: 1,
                hr: 1,
                sub: 1,
                bdo: 1,
                'var': 1,
                div: 1,
                object: 1,
                sup: 1,
                strike: 1,
                dir: 1,
                map: 1,
                dl: 1,
                applet: 1,
                del: 1,
                isindex: 1,
                fieldset: 1,
                ul: 1,
                b: 1,
                acronym: 1,
                a: 1,
                blockquote: 1,
                i: 1,
                u: 1,
                s: 1,
                tt: 1,
                address: 1,
                q: 1,
                pre: 1,
                p: 1,
                em: 1,
                dfn: 1
            },
            r = f({
                a: 1
            }, p),
            s = {
                tr: 1
            },
            t = {
                '#': 1
            },
            u = f({
                param: 1
            }, q),
            v = f({
                form: 1
            }, g, j, k, o),
            w = {
                li: 1
            },
            x = {
                style: 1,
                script: 1
            },
            y = {
                base: 1,
                link: 1,
                meta: 1,
                title: 1
            },
            z = f(y, x),
            A = {
                head: 1,
                body: 1
            },
            B = {
                html: 1
            },
            C = {
                address: 1,
                blockquote: 1,
                center: 1,
                dir: 1,
                div: 1,
                dl: 1,
                fieldset: 1,
                form: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                hr: 1,
                isindex: 1,
                menu: 1,
                noframes: 1,
                ol: 1,
                p: 1,
                pre: 1,
                table: 1,
                ul: 1
            };
        return {
            $nonBodyContent: f(B, A, y),
            $block: C,
            $blockLimit: {
                body: 1,
                div: 1,
                td: 1,
                th: 1,
                caption: 1,
                form: 1
            },
            $inline: r,
            $body: f({
                script: 1,
                style: 1
            }, C),
            $cdata: {
                script: 1,
                style: 1
            },
            $empty: {
                area: 1,
                base: 1,
                br: 1,
                col: 1,
                hr: 1,
                img: 1,
                input: 1,
                link: 1,
                meta: 1,
                param: 1
            },
            $listItem: {
                dd: 1,
                dt: 1,
                li: 1
            },
            $list: {
                ul: 1,
                ol: 1,
                dl: 1
            },
            $nonEditable: {
                applet: 1,
                button: 1,
                embed: 1,
                iframe: 1,
                map: 1,
                object: 1,
                option: 1,
                script: 1,
                textarea: 1,
                param: 1
            },
            $removeEmpty: {
                abbr: 1,
                acronym: 1,
                address: 1,
                b: 1,
                bdo: 1,
                big: 1,
                cite: 1,
                code: 1,
                del: 1,
                dfn: 1,
                em: 1,
                font: 1,
                i: 1,
                ins: 1,
                label: 1,
                kbd: 1,
                q: 1,
                s: 1,
                samp: 1,
                small: 1,
                span: 1,
                strike: 1,
                strong: 1,
                sub: 1,
                sup: 1,
                tt: 1,
                u: 1,
                'var': 1
            },
            $tabIndex: {
                a: 1,
                area: 1,
                button: 1,
                input: 1,
                object: 1,
                select: 1,
                textarea: 1
            },
            $tableContent: {
                caption: 1,
                col: 1,
                colgroup: 1,
                tbody: 1,
                td: 1,
                tfoot: 1,
                th: 1,
                thead: 1,
                tr: 1
            },
            html: A,
            head: z,
            style: t,
            script: t,
            body: v,
            base: {},
            link: {},
            meta: {},
            title: t,
            col: {},
            tr: {
                td: 1,
                th: 1
            },
            img: {},
            colgroup: {
                col: 1
            },
            noscript: v,
            td: v,
            br: {},
            th: v,
            center: v,
            kbd: r,
            button: f(o, k),
            basefont: {},
            h5: r,
            h4: r,
            samp: r,
            h6: r,
            ol: w,
            h1: r,
            h3: r,
            option: t,
            h2: r,
            form: f(g, j, k, o),
            select: {
                optgroup: 1,
                option: 1
            },
            font: r,
            ins: r,
            menu: w,
            abbr: r,
            label: r,
            table: {
                thead: 1,
                col: 1,
                tbody: 1,
                tr: 1,
                colgroup: 1,
                caption: 1,
                tfoot: 1
            },
            code: r,
            script: t,
            tfoot: s,
            cite: r,
            li: v,
            input: {},
            iframe: v,
            strong: r,
            textarea: t,
            noframes: v,
            big: r,
            small: r,
            span: r,
            hr: {},
            dt: r,
            sub: r,
            optgroup: {
                option: 1
            },
            param: {},
            bdo: r,
            'var': r,
            div: v,
            object: u,
            sup: r,
            dd: v,
            strike: r,
            area: {},
            dir: w,
            map: f({
                area: 1,
                form: 1,
                p: 1
            }, g, l, k),
            applet: u,
            dl: {
                dt: 1,
                dd: 1
            },
            del: r,
            isindex: {},
            fieldset: f({
                legend: 1
            }, q),
            thead: s,
            ul: w,
            acronym: r,
            b: r,
            a: p,
            blockquote: v,
            caption: r,
            i: r,
            u: r,
            tbody: s,
            s: r,
            address: f(j, o),
            tt: r,
            legend: r,
            q: r,
            pre: f(m, i),
            p: r,
            em: r,
            dfn: r
        };
    })();
    var f = a.dtd;
    d.event = function (g) {
        this.$ = g;
    };
    d.event.prototype = {
        getKey: function () {
            return this.$.keyCode || this.$.which;
        },
        getKeystroke: function () {
            var h = this;
            var g = h.getKey();
            if (h.$.ctrlKey || h.$.metaKey) g += 1000;
            if (h.$.shiftKey) g += 2000;
            if (h.$.altKey) g += 4000;
            return g;
        },
        preventDefault: function (g) {
            var h = this.$;
            if (h.preventDefault) h.preventDefault();
            else h.returnValue = false;
            if (g) this.stopPropagation();
        },
        stopPropagation: function () {
            var g = this.$;
            if (g.stopPropagation) g.stopPropagation();
            else g.cancelBubble = true;
        },
        getTarget: function () {
            var g = this.$.target || this.$.srcElement;
            return g ? new d.node(g) : null;
        }
    };
    a.CTRL = 1000;
    a.SHIFT = 2000;
    a.ALT = 4000;
    d.domObject = function (g) {
        if (g) this.$ = g;
    };
    d.domObject.prototype = (function () {
        var g = function (h, i) {
            return function (j) {
                if (typeof a != 'undefined') h.fire(i, new d.event(j));
            };
        };
        return {
            getPrivate: function () {
                var h;
                if (!(h = this.getCustomData('_'))) this.setCustomData('_', h = {});
                return h;
            },
            on: function (h) {
                var k = this;
                var i = k.getCustomData('_cke_nativeListeners');
                if (!i) {
                    i = {};
                    k.setCustomData('_cke_nativeListeners', i);
                }
                if (!i[h]) {
                    var j = i[h] = g(k, h);
                    if (k.$.addEventListener) k.$.addEventListener(h, j, !! a.event.useCapture);
                    else if (k.$.attachEvent) k.$.attachEvent('on' + h, j);
                }
                return a.event.prototype.on.apply(k, arguments);
            },
            removeListener: function (h) {
                var k = this;
                a.event.prototype.removeListener.apply(k, arguments);
                if (!k.hasListeners(h)) {
                    var i = k.getCustomData('_cke_nativeListeners'),
                        j = i && i[h];
                    if (j) {
                        if (k.$.removeEventListener) k.$.removeEventListener(h, j, false);
                        else if (k.$.detachEvent) k.$.detachEvent('on' + h, j);
                        delete i[h];
                    }
                }
            }
        };
    })();
    (function (g) {
        var h = {};
        g.equals = function (i) {
            return i && i.$ === this.$;
        };
        g.setCustomData = function (i, j) {
            var k = this.getUniqueId(),
                l = h[k] || (h[k] = {});
            l[i] = j;
            return this;
        };
        g.getCustomData = function (i) {
            var j = this.$._cke_expando,
                k = j && h[j];
            return k && k[i];
        };
        g.removeCustomData = function (i) {
            var j = this.$._cke_expando,
                k = j && h[j],
                l = k && k[i];
            if (typeof l != 'undefined') delete k[i];
            return l || null;
        };
        g.getUniqueId = function () {
            return this.$._cke_expando || (this.$._cke_expando = e.getNextNumber());
        };
        a.event.implementOn(g);
    })(d.domObject.prototype);
    d.window = function (g) {
        d.domObject.call(this, g);
    };
    d.window.prototype = new d.domObject();
    e.extend(d.window.prototype, {
        focus: function () {
            if (b.webkit && this.$.parent) this.$.parent.focus();
            this.$.focus();
        },
        getViewPaneSize: function () {
            var g = this.$.document,
                h = g.compatMode == 'CSS1Compat';
            return {
                width: (h ? g.documentElement.clientWidth : g.body.clientWidth) || 0,
                height: (h ? g.documentElement.clientHeight : g.body.clientHeight) || 0
            };
        },
        getScrollPosition: function () {
            var g = this.$;
            if ('pageXOffset' in g) return {
                x: g.pageXOffset || 0,
                y: g.pageYOffset || 0
            };
            else {
                var h = g.document;
                return {
                    x: h.documentElement.scrollLeft || h.body.scrollLeft || 0,
                    y: h.documentElement.scrollTop || h.body.scrollTop || 0
                };
            }
        }
    });
    d.document = function (g) {
        d.domObject.call(this, g);
    };
    var g = d.document;
    g.prototype = new d.domObject();
    e.extend(g.prototype, {
        appendStyleSheet: function (h) {
            if (this.$.createStyleSheet) this.$.createStyleSheet(h);
            else {
                var i = new d.element('link');
                i.setAttributes({
                    rel: 'stylesheet',
                    type: 'text/css',
                    href: h
                });
                this.getHead().append(i);
            }
        },
        appendStyleText: function (h) {
            var k = this;
            if (k.$.createStyleSheet) {
                var i = k.$.createStyleSheet('');
                i.cssText = h;
            } else {
                var j = new d.element('style', k);
                j.append(new d.text(h, k));
                k.getHead().append(j);
            }
        },
        createElement: function (h, i) {
            var j = new d.element(h, this);
            if (i) {
                if (i.attributes) j.setAttributes(i.attributes);
                if (i.styles) j.setStyles(i.styles);
            }
            return j;
        },
        createText: function (h) {
            return new d.text(h, this);
        },
        focus: function () {
            this.getWindow().focus();
        },
        getById: function (h) {
            var i = this.$.getElementById(h);
            return i ? new d.element(i) : null;
        },
        getByAddress: function (h, i) {
            var j = this.$.documentElement;
            for (var k = 0; j && k < h.length; k++) {
                var l = h[k];
                if (!i) {
                    j = j.childNodes[l];
                    continue;
                }
                var m = -1;
                for (var n = 0; n < j.childNodes.length; n++) {
                    var o = j.childNodes[n];
                    if (i === true && o.nodeType == 3 && o.previousSibling && o.previousSibling.nodeType == 3) continue;
                    m++;
                    if (m == l) {
                        j = o;
                        break;
                    }
                }
            }
            return j ? new d.node(j) : null;
        },
        getElementsByTag: function (h, i) {
            if (!c && i) h = i + ':' + h;
            return new d.nodeList(this.$.getElementsByTagName(h));
        },
        getHead: function () {
            var h = this.$.getElementsByTagName('head')[0];
            h = new d.element(h);
            return (this.getHead = function () {
                return h;
            })();
        },
        getBody: function () {
            var h = new d.element(this.$.body);
            return (this.getBody = function () {
                return h;
            })();
        },
        getDocumentElement: function () {
            var h = new d.element(this.$.documentElement);
            return (this.getDocumentElement = function () {
                return h;
            })();
        },
        getWindow: function () {
            var h = new d.window(this.$.parentWindow || this.$.defaultView);
            return (this.getWindow = function () {
                return h;
            })();
        }
    });
    d.node = function (h) {
        if (h) {
            switch (h.nodeType) {
            case 9:
                return new g(h);
            case 1:
                return new d.element(h);
            case 3:
                return new d.text(h);
            }
            d.domObject.call(this, h);
        }
        return this;
    };
    d.node.prototype = new d.domObject();
    a.NODE_ELEMENT = 1;
    a.NODE_DOCUMENT = 9;
    a.NODE_TEXT = 3;
    a.NODE_COMMENT = 8;
    a.NODE_DOCUMENT_FRAGMENT = 11;
    a.POSITION_IDENTICAL = 0;
    a.POSITION_DISCONNECTED = 1;
    a.POSITION_FOLLOWING = 2;
    a.POSITION_PRECEDING = 4;
    a.POSITION_IS_CONTAINED = 8;
    a.POSITION_CONTAINS = 16;
    e.extend(d.node.prototype, {
        appendTo: function (h, i) {
            h.append(this, i);
            return h;
        },
        clone: function (h, i) {
            var j = this.$.cloneNode(h);
            if (!i) {
                var k = function (l) {
                    if (l.nodeType != 1) return;
                    l.removeAttribute('id', false);
                    l.removeAttribute('_cke_expando', false);
                    var m = l.childNodes;
                    for (var n = 0; n < m.length; n++) k(m[n]);
                };
                k(j);
            }
            return new d.node(j);
        },
        hasPrevious: function () {
            return !!this.$.previousSibling;
        },
        hasNext: function () {
            return !!this.$.nextSibling;
        },
        insertAfter: function (h) {
            h.$.parentNode.insertBefore(this.$, h.$.nextSibling);
            return h;
        },
        insertBefore: function (h) {
            h.$.parentNode.insertBefore(this.$, h.$);
            return h;
        },
        insertBeforeMe: function (h) {
            this.$.parentNode.insertBefore(h.$, this.$);
            return h;
        },
        getAddress: function (h) {
            var i = [],
                j = this.getDocument().$.documentElement,
                k = this.$;
            while (k && k != j) {
                var l = k.parentNode,
                    m = -1;
                if (l) {
                    for (var n = 0; n < l.childNodes.length; n++) {
                        var o = l.childNodes[n];
                        if (h && o.nodeType == 3 && o.previousSibling && o.previousSibling.nodeType == 3) continue;
                        m++;
                        if (o == k) break;
                    }
                    i.unshift(m);
                }
                k = l;
            }
            return i;
        },
        getDocument: function () {
            var h = new g(this.$.ownerDocument || this.$.parentNode.ownerDocument);
            return (this.getDocument = function () {
                return h;
            })();
        },
        getIndex: function () {
            var h = this.$,
                i = h.parentNode && h.parentNode.firstChild,
                j = -1;
            while (i) {
                j++;
                if (i == h) return j;
                i = i.nextSibling;
            }
            return -1;
        },
        getNextSourceNode: function (h, i, j) {
            if (j && !j.call) {
                var k = j;
                j = function (n) {
                    return !n.equals(k);
                };
            }
            var l = !h && this.getFirst && this.getFirst(),
                m;
            if (!l) {
                if (this.type == 1 && j && j(this, true) === false) return null;
                l = this.getNext();
            }
            while (!l && (m = (m || this).getParent())) {
                if (j && j(m, true) === false) return null;
                l = m.getNext();
            }
            if (!l) return null;
            if (j && j(l) === false) return null;
            if (i && i != l.type) return l.getNextSourceNode(false, i, j);
            return l;
        },
        getPreviousSourceNode: function (h, i, j) {
            if (j && !j.call) {
                var k = j;
                j = function (n) {
                    return !n.equals(k);
                };
            }
            var l = !h && this.getLast && this.getLast(),
                m;
            if (!l) {
                if (this.type == 1 && j && j(this, true) === false) return null;
                l = this.getPrevious();
            }
            while (!l && (m = (m || this).getParent())) {
                if (j && j(m, true) === false) return null;
                l = m.getPrevious();
            }
            if (!l) return null;
            if (j && j(l) === false) return null;
            if (i && l.type != i) return l.getPreviousSourceNode(false, i, j);
            return l;
        },
        getPrevious: function (h) {
            var i = this.$,
                j;
            do {
                i = i.previousSibling;
                j = i && new d.node(i);
            } while (j && h && !h(j)) return j;
        },
        getNext: function (h) {
            var i = this.$,
                j;
            do {
                i = i.nextSibling;
                j = i && new d.node(i);
            } while (j && h && !h(j)) return j;
        },
        getParent: function () {
            var h = this.$.parentNode;
            return h && h.nodeType == 1 ? new d.node(h) : null;
        },
        getParents: function (h) {
            var i = this,
                j = [];
            do j[h ? 'push' : 'unshift'](i);
            while (i = i.getParent()) return j;
        },
        getCommonAncestor: function (h) {
            var j = this;
            if (h.equals(j)) return j;
            if (h.contains && h.contains(j)) return h;
            var i = j.contains ? j : j.getParent();
            do {
                if (i.contains(h)) return i;
            } while (i = i.getParent()) return null;
        },
        getPosition: function (h) {
            var i = this.$,
                j = h.$;
            if (i.compareDocumentPosition) return i.compareDocumentPosition(j);
            if (i == j) return 0;
            if (this.type == 1 && h.type == 1) {
                if (i.contains) {
                    if (i.contains(j)) return 16 + 4;
                    if (j.contains(i)) return 8 + 2;
                }
                if ('sourceIndex' in i) return i.sourceIndex < 0 || j.sourceIndex < 0 ? 1 : i.sourceIndex < j.sourceIndex ? 4 : 2;
            }
            var k = this.getAddress(),
                l = h.getAddress(),
                m = Math.min(k.length, l.length);
            for (var n = 0; n <= m - 1; n++) {
                if (k[n] != l[n]) {
                    if (n < m) return k[n] < l[n] ? 4 : 2;
                    break;
                }
            }
            return k.length < l.length ? 16 + 4 : 8 + 2;
        },
        getAscendant: function (h, i) {
            var j = this.$;
            if (!i) j = j.parentNode;
            while (j) {
                if (j.nodeName && j.nodeName.toLowerCase() == h) return new d.node(j);
                j = j.parentNode;
            }
            return null;
        },
        hasAscendant: function (h, i) {
            var j = this.$;
            if (!i) j = j.parentNode;
            while (j) {
                if (j.nodeName && j.nodeName.toLowerCase() == h) return true;
                j = j.parentNode;
            }
            return false;
        },
        move: function (h, i) {
            h.append(this.remove(), i);
        },
        remove: function (h) {
            var i = this.$,
                j = i.parentNode;
            if (j) {
                if (h) for (var k; k = i.firstChild;) j.insertBefore(i.removeChild(k), i);
                j.removeChild(i);
            }
            return this;
        },
        replace: function (h) {
            this.insertBefore(h);
            h.remove();
        },
        trim: function () {
            this.ltrim();
            this.rtrim();
        },
        ltrim: function () {
            var k = this;
            var h;
            while (k.getFirst && (h = k.getFirst())) {
                if (h.type == 3) {
                    var i = e.ltrim(h.getText()),
                        j = h.getLength();
                    if (!i) {
                        h.remove();
                        continue;
                    } else if (i.length < j) {
                        h.split(j - i.length);
                        k.$.removeChild(k.$.firstChild);
                    }
                }
                break;
            }
        },
        rtrim: function () {
            var k = this;
            var h;
            while (k.getLast && (h = k.getLast())) {
                if (h.type == 3) {
                    var i = e.rtrim(h.getText()),
                        j = h.getLength();
                    if (!i) {
                        h.remove();
                        continue;
                    } else if (i.length < j) {
                        h.split(i.length);
                        k.$.lastChild.parentNode.removeChild(k.$.lastChild);
                    }
                }
                break;
            }
            if (!c && !b.opera) {
                h = k.$.lastChild;
                if (h && h.type == 1 && h.nodeName.toLowerCase() == 'br') h.parentNode.removeChild(h);
            }
        }
    });
    d.nodeList = function (h) {
        this.$ = h;
    };
    d.nodeList.prototype = {
        count: function () {
            return this.$.length;
        },
        getItem: function (h) {
            var i = this.$[h];
            return i ? new d.node(i) : null;
        }
    };
    d.element = function (h, i) {
        if (typeof h == 'string') h = (i ? i.$ : document).createElement(h);
        d.domObject.call(this, h);
    };
    var h = d.element;
    h.get = function (i) {
        return i && (i.$ ? i : new h(i));
    };
    h.prototype = new d.node();
    h.createFromHtml = function (i, j) {
        var k = new h('div', j);
        k.setHtml(i);
        return k.getFirst().remove();
    };
    h.setMarker = function (i, j, k, l) {
        var m = j.getCustomData('list_marker_id') || j.setCustomData('list_marker_id', e.getNextNumber()).getCustomData('list_marker_id'),
            n = j.getCustomData('list_marker_names') || j.setCustomData('list_marker_names', {}).getCustomData('list_marker_names');
        i[m] = j;
        n[k] = 1;
        return j.setCustomData(k, l);
    };
    h.clearAllMarkers = function (i) {
        for (var j in i) h.clearMarkers(i, i[j], true);
    };
    h.clearMarkers = function (i, j, k) {
        var l = j.getCustomData('list_marker_names'),
            m = j.getCustomData('list_marker_id');
        for (var n in l) j.removeCustomData(n);
        j.removeCustomData('list_marker_names');
        if (k) {
            j.removeCustomData('list_marker_id');
            delete i[m];
        }
    };
    e.extend(h.prototype, {
        type: 1,
        addClass: function (i) {
            var j = this.$.className;
            if (j) {
                var k = new RegExp('(?:^|\\s)' + i + '(?:\\s|$)', '');
                if (!k.test(j)) j += ' ' + i;
            }
            this.$.className = j || i;
        },
        removeClass: function (i) {
            var j = this.getAttribute('class');
            if (j) {
                var k = new RegExp('(?:^|\\s+)' + i + '(?=\\s|$)', 'i');
                if (k.test(j)) {
                    j = j.replace(k, '').replace(/^\s+/, '');
                    if (j) this.setAttribute('class', j);
                    else this.removeAttribute('class');
                }
            }
        },
        hasClass: function (i) {
            var j = new RegExp('(?:^|\\s+)' + i + '(?=\\s|$)', '');
            return j.test(this.getAttribute('class'));
        },
        append: function (i, j) {
            var k = this;
            if (typeof i == 'string') i = k.getDocument().createElement(i);
            if (j) k.$.insertBefore(i.$, k.$.firstChild);
            else k.$.appendChild(i.$);
            return i;
        },
        appendHtml: function (i) {
            var k = this;
            if (!k.$.childNodes.length) k.setHtml(i);
            else {
                var j = new h('div', k.getDocument());
                j.setHtml(i);
                j.moveChildren(k);
            }
        },
        appendText: function (i) {
            if (this.$.text != undefined) this.$.text += i;
            else this.append(new d.text(i));
        },
        appendBogus: function () {
            var k = this;
            var i = k.getLast();
            while (i && i.type == 3 && !e.rtrim(i.getText())) i = i.getPrevious();
            if (!i || !i.is || !i.is('br')) {
                var j = b.opera ? k.getDocument().createText('') : k.getDocument().createElement('br');
                b.gecko && j.setAttribute('type', '_moz');
                k.append(j);
            }
        },
        breakParent: function (i) {
            var l = this;
            var j = new d.range(l.getDocument());
            j.setStartAfter(l);
            j.setEndAfter(i);
            var k = j.extractContents();
            j.insertNode(l.remove());
            k.insertAfterNode(l);
        },
        contains: c || b.webkit ?
        function (i) {
            var j = this.$;
            return i.type != 1 ? j.contains(i.getParent().$) : j != i.$ && j.contains(i.$);
        } : function (i) {
            return !!(this.$.compareDocumentPosition(i.$) & 16);
        },
        focus: function () {
            try {
                this.$.focus();
            } catch (i) {}
        },
        getHtml: function () {
            var i = this.$.innerHTML;
            return c ? i.replace(/<\?[^>]*>/g, '') : i;
        },
        getOuterHtml: function () {
            var j = this;
            if (j.$.outerHTML) return j.$.outerHTML.replace(/<\?[^>]*>/, '');
            var i = j.$.ownerDocument.createElement('div');
            i.appendChild(j.$.cloneNode(true));
            return i.innerHTML;
        },
        setHtml: function (i) {
            return this.$.innerHTML = i;
        },
        setText: function (i) {
            h.prototype.setText = this.$.innerText != undefined ?
            function (j) {
                return this.$.innerText = j;
            } : function (j) {
                return this.$.textContent = j;
            };
            return this.setText(i);
        },
        getAttribute: (function () {
            var i = function (j) {
                return this.$.getAttribute(j, 2);
            };
            if (c && (b.ie7Compat || b.ie6Compat)) return function (j) {
                var n = this;
                switch (j) {
                case 'class':
                    j = 'className';
                    break;
                case 'tabindex':
                    var k = i.call(n, j);
                    if (k !== 0 && n.$.tabIndex === 0) k = null;
                    return k;
                    break;
                case 'checked':
                    var l = n.$.attributes.getNamedItem(j),
                        m = l.specified ? l.nodeValue : n.$.checked;
                    return m ? 'checked' : null;
                case 'hspace':
                    return n.$.hspace;
                case 'style':
                    return n.$.style.cssText;
                }
                return i.call(n, j);
            };
            else return i;
        })(),
        getChildren: function () {
            return new d.nodeList(this.$.childNodes);
        },
        getComputedStyle: c ?
        function (i) {
            return this.$.currentStyle[e.cssStyleToDomStyle(i)];
        } : function (i) {
            return this.getWindow().$.getComputedStyle(this.$, '').getPropertyValue(i);
        },
        getDtd: function () {
            var i = f[this.getName()];
            this.getDtd = function () {
                return i;
            };
            return i;
        },
        getElementsByTag: g.prototype.getElementsByTag,
        getTabIndex: c ?
        function () {
            var i = this.$.tabIndex;
            if (i === 0 && !f.$tabIndex[this.getName()] && parseInt(this.getAttribute('tabindex'), 10) !== 0) i = -1;
            return i;
        } : b.webkit ?
        function () {
            var i = this.$.tabIndex;
            if (i == undefined) {
                i = parseInt(this.getAttribute('tabindex'), 10);
                if (isNaN(i)) i = -1;
            }
            return i;
        } : function () {
            return this.$.tabIndex;
        },
        getText: function () {
            return this.$.textContent || this.$.innerText || '';
        },
        getWindow: function () {
            return this.getDocument().getWindow();
        },
        getId: function () {
            return this.$.id || null;
        },
        getNameAtt: function () {
            return this.$.name || null;
        },
        getName: function () {
            var i = this.$.nodeName.toLowerCase();
            if (c) {
                var j = this.$.scopeName;
                if (j != 'HTML') i = j.toLowerCase() + ':' + i;
            }
            return (this.getName = function () {
                return i;
            })();
        },
        getValue: function () {
            return this.$.value;
        },
        getFirst: function (i) {
            var j = this.$.firstChild,
                k = j && new d.node(j);
            if (k && i && !i(k)) k = k.getNext(i);
            return k;
        },
        getLast: function (i) {
            var j = this.$.lastChild,
                k = j && new d.node(j);
            if (k && i && !i(k)) k = k.getPrevious(i);
            return k;
        },
        getStyle: function (i) {
            return this.$.style[e.cssStyleToDomStyle(i)];
        },
        is: function () {
            var i = this.getName();
            for (var j = 0; j < arguments.length; j++) {
                if (arguments[j] == i) return true;
            }
            return false;
        },
        isEditable: function () {
            var i = this.getName(),
                j = !f.$nonEditable[i] && (f[i] || f.span);
            return j && j['#'];
        },
        isIdentical: function (i) {
            if (this.getName() != i.getName()) return false;
            var j = this.$.attributes,
                k = i.$.attributes,
                l = j.length,
                m = k.length;
            if (!c && l != m) return false;
            for (var n = 0; n < l; n++) {
                var o = j[n];
                if ((!c || o.specified && o.nodeName != '_cke_expando') && o.nodeValue != i.getAttribute(o.nodeName)) return false;
            }
            if (c) for (n = 0; n < m; n++) {
                o = k[n];
                if (o.specified && o.nodeName != '_cke_expando' && o.nodeValue != this.getAttribute(o.nodeName)) return false;
            }
            return true;
        },
        isVisible: function () {
            var i = !! this.$.offsetHeight && this.getComputedStyle('visibility') != 'hidden',
                j, k;
            if (i && (b.webkit || b.opera)) {
                j = this.getWindow();
                if (!j.equals(a.document.getWindow()) && (k = j.$.frameElement)) i = new h(k).isVisible();
            }
            return i;
        },
        hasAttributes: c && (b.ie7Compat || b.ie6Compat) ?
        function () {
            var i = this.$.attributes;
            for (var j = 0; j < i.length; j++) {
                var k = i[j];
                switch (k.nodeName) {
                case 'class':
                    if (this.getAttribute('class')) return true;
                case '_cke_expando':
                    continue;
                default:
                    if (k.specified) return true;
                }
            }
            return false;
        } : function () {
            var i = this.$.attributes;
            return i.length > 1 || i.length == 1 && i[0].nodeName != '_cke_expando';
        },
        hasAttribute: function (i) {
            var j = this.$.attributes.getNamedItem(i);
            return !!(j && j.specified);
        },
        hide: function () {
            this.setStyle('display', 'none');
        },
        moveChildren: function (i, j) {
            var k = this.$;
            i = i.$;
            if (k == i) return;
            var l;
            if (j) while (l = k.lastChild) i.insertBefore(k.removeChild(l), i.firstChild);
            else while (l = k.firstChild) i.appendChild(k.removeChild(l));
        },
        show: function () {
            this.setStyles({
                display: '',
                visibility: ''
            });
        },
        setAttribute: (function () {
            var i = function (j, k) {
                this.$.setAttribute(j, k);
                return this;
            };
            if (c && (b.ie7Compat || b.ie6Compat)) return function (j, k) {
                var l = this;
                if (j == 'class') l.$.className = k;
                else if (j == 'style') l.$.style.cssText = k;
                else if (j == 'tabindex') l.$.tabIndex = k;
                else if (j == 'checked') l.$.checked = k;
                else i.apply(l, arguments);
                return l;
            };
            else return i;
        })(),
        setAttributes: function (i) {
            for (var j in i) this.setAttribute(j, i[j]);
            return this;
        },
        setValue: function (i) {
            this.$.value = i;
            return this;
        },
        removeAttribute: (function () {
            var i = function (j) {
                this.$.removeAttribute(j);
            };
            if (c && (b.ie7Compat || b.ie6Compat)) return function (j) {
                if (j == 'class') j = 'className';
                else if (j == 'tabindex') j = 'tabIndex';
                i.call(this, j);
            };
            else return i;
        })(),
        removeAttributes: function (i) {
            if (e.isArray(i)) for (var j = 0; j < i.length; j++) this.removeAttribute(i[j]);
            else for (var k in i) i.hasOwnProperty(k) && this.removeAttribute(k);
        },
        removeStyle: function (i) {
            var j = this;
            j.setStyle(i, '');
            if (j.$.style.removeAttribute) j.$.style.removeAttribute(e.cssStyleToDomStyle(i));
            if (!j.$.style.cssText) j.removeAttribute('style');
        },
        setStyle: function (i, j) {
            this.$.style[e.cssStyleToDomStyle(i)] = j;
            return this;
        },
        setStyles: function (i) {
            for (var j in i) this.setStyle(j, i[j]);
            return this;
        },
        setOpacity: function (i) {
            if (c) {
                i = Math.round(i * 100);
                this.setStyle('filter', i >= 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + i + ')');
            } else this.setStyle('opacity', i);
        },
        unselectable: b.gecko ?
        function () {
            this.$.style.MozUserSelect = 'none';
        } : b.webkit ?
        function () {
            this.$.style.KhtmlUserSelect = 'none';
        } : function () {
            if (c || b.opera) {
                var i = this.$,
                    j, k = 0;
                i.unselectable = 'on';
                while (j = i.all[k++]) switch (j.tagName.toLowerCase()) {
                case 'iframe':
                case 'textarea':
                case 'input':
                case 'select':
                    break;
                default:
                    j.unselectable = 'on';
                }
            }
        },
        getPositionedAncestor: function () {
            var i = this;
            while (i.getName() != 'html') {
                if (i.getComputedStyle('position') != 'static') return i;
                i = i.getParent();
            }
            return null;
        },
        getDocumentPosition: function (i) {
            var D = this;
            var j = 0,
                k = 0,
                l = D.getDocument().getBody(),
                m = D.getDocument().$.compatMode == 'BackCompat',
                n = D.getDocument();
            if (document.documentElement.getBoundingClientRect) {
                var o = D.$.getBoundingClientRect(),
                    p = n.$,
                    q = p.documentElement,
                    r = q.clientTop || l.$.clientTop || 0,
                    s = q.clientLeft || l.$.clientLeft || 0,
                    t = true;
                if (c) {
                    var u = n.getDocumentElement().contains(D),
                        v = n.getBody().contains(D);
                    t = m && v || !m && u;
                }
                if (t) {
                    j = o.left + (!m && q.scrollLeft || l.$.scrollLeft);
                    j -= s;
                    k = o.top + (!m && q.scrollTop || l.$.scrollTop);
                    k -= r;
                }
            } else {
                var w = D,
                    x = null,
                    y;
                while (w && !(w.getName() == 'body' || w.getName() == 'html')) {
                    j += w.$.offsetLeft - w.$.scrollLeft;
                    k += w.$.offsetTop - w.$.scrollTop;
                    if (!w.equals(D)) {
                        j += w.$.clientLeft || 0;
                        k += w.$.clientTop || 0;
                    }
                    var z = x;
                    while (z && !z.equals(w)) {
                        j -= z.$.scrollLeft;
                        k -= z.$.scrollTop;
                        z = z.getParent();
                    }
                    x = w;
                    w = (y = w.$.offsetParent) ? new h(y) : null;
                }
            }
            if (i) {
                var A = D.getWindow(),
                    B = i.getWindow();
                if (!A.equals(B) && A.$.frameElement) {
                    var C = new h(A.$.frameElement).getDocumentPosition(i);
                    j += C.x;
                    k += C.y;
                }
            }
            if (!document.documentElement.getBoundingClientRect) if (b.gecko && !m) {
                j += D.$.clientLeft ? 1 : 0;
                k += D.$.clientTop ? 1 : 0;
            }
            return {
                x: j,
                y: k
            };
        },
        scrollIntoView: function (i) {
            var o = this;
            var j = o.getWindow(),
                k = j.getViewPaneSize().height,
                l = k * -1;
            if (i) l += k;
            else {
                l += o.$.offsetHeight || 0;
                l += parseInt(o.getComputedStyle('marginBottom') || 0, 10) || 0;
            }
            var m = o.getDocumentPosition();
            l += m.y;
            l = l < 0 ? 0 : l;
            var n = j.getScrollPosition().y;
            if (l > n || l < n - k) j.$.scrollTo(0, l);
        },
        setState: function (i) {
            var j = this;
            switch (i) {
            case 1:
                j.addClass('cke_on');
                j.removeClass('cke_off');
                j.removeClass('cke_disabled');
                break;
            case 0:
                j.addClass('cke_disabled');
                j.removeClass('cke_off');
                j.removeClass('cke_on');
                break;
            default:
                j.addClass('cke_off');
                j.removeClass('cke_on');
                j.removeClass('cke_disabled');
                break;
            }
        },
        getFrameDocument: function () {
            var i = this.$;
            try {
                i.contentWindow.document;
            } catch (j) {
                i.src = i.src;
                if (c && b.version < 7) window.showModalDialog('javascript:document.write("<script>window.setTimeout(function(){window.close();},50);</script>")');
            }
		
            return i && new g(i.contentWindow.document);
        },
        copyAttributes: function (i, j) {
            var p = this;
            var k = p.$.attributes;
            j = j || {};
            for (var l = 0; l < k.length; l++) {
                var m = k[l],
                    n = m.nodeName.toLowerCase(),
                    o;
                if (n in j) continue;
                if (n == 'checked' && (o = p.getAttribute(n))) i.setAttribute(n, o);
                else if (m.specified || c && m.nodeValue && n == 'value') {
                    o = p.getAttribute(n);
                    if (o === null) o = m.nodeValue;
                    i.setAttribute(n, o);
                }
            }
            if (p.$.style.cssText !== '') i.$.style.cssText = p.$.style.cssText;
        },
        renameNode: function (i) {
            var l = this;
            if (l.getName() == i) return;
            var j = l.getDocument(),
                k = new h(i, j);
            l.copyAttributes(k);
            l.moveChildren(k);
            l.$.parentNode.replaceChild(k.$, l.$);
            k.$._cke_expando = l.$._cke_expando;
            l.$ = k.$;
        },
        getChild: function (i) {
            var j = this.$;
            if (!i.slice) j = j.childNodes[i];
            else while (i.length > 0 && j) j = j.childNodes[i.shift()];
            return j ? new d.node(j) : null;
        },
        getChildCount: function () {
            return this.$.childNodes.length;
        },
        disableContextMenu: function () {
            this.on('contextmenu', function (i) {
                if (!i.data.getTarget().hasClass('cke_enable_context_menu')) i.data.preventDefault();
            });
        }
    });
    a.command = function (i, j) {
        this.uiItems = [];
        this.exec = function (k) {
            if (this.state == 0) return false;
            if (this.editorFocus) i.focus();
            return j.exec.call(this, i, k) !== false;
        };
        e.extend(this, j, {
            modes: {
                wysiwyg: 1
            },
            editorFocus: true,
            state: 2
        });
        a.event.call(this);
    };
    a.command.prototype = {
        enable: function () {
            var i = this;
            if (i.state == 0) i.setState(!i.preserveState || typeof i.previousState == 'undefined' ? 2 : i.previousState);
        },
        disable: function () {
            this.setState(0);
        },
        setState: function (i) {
            var j = this;
            if (j.state == i) return false;
            j.previousState = j.state;
            j.state = i;
            j.fire('state');
            return true;
        },
        toggleState: function () {
            var i = this;
            if (i.state == 2) i.setState(1);
            else if (i.state == 1) i.setState(2);
        }
    };
    a.event.implementOn(a.command.prototype, true);
    a.ENTER_P = 1;
    a.ENTER_BR = 2;
    a.ENTER_DIV = 3;
    a.config = {
        customConfig: 'config.js',
        autoUpdateElement: true,
        baseHref: '',
        contentsCss: a.basePath + 'contents.css',
        contentsLangDirection: 'ltr',
        language: '',
        defaultLanguage: 'en',
        enterMode: 1,
        shiftEnterMode: 2,
        corePlugins: '',
        docType: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
        bodyId: '',
        bodyClass: '',
        fullPage: false,
        height: 200,
        plugins: 'about,a11yhelp,basicstyles,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,showborders,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
        extraPlugins: '',
        removePlugins: '',
        protectedSource: [],
        tabIndex: 0,
        theme: 'default',
        skin: 'kama',
        width: '',
        baseFloatZIndex: 10000
    };
    var i = a.config;
    a.focusManager = function (j) {
        if (j.focusManager) return j.focusManager;
        this.hasFocus = false;
        this._ = {
            editor: j
        };
        return this;
    };
    a.focusManager.prototype = {
        focus: function () {
            var k = this;
            if (k._.timer) clearTimeout(k._.timer);
            if (!k.hasFocus) {
                if (a.currentInstance) a.currentInstance.focusManager.forceBlur();
                var j = k._.editor;
                j.container.getChild(1).addClass('cke_focus');
                k.hasFocus = true;
                j.fire('focus');
            }
        },
        blur: function () {
            var j = this;
            if (j._.timer) clearTimeout(j._.timer);
            j._.timer = setTimeout(function () {
                delete j._.timer;
                j.forceBlur();
            }, 100);
        },
        forceBlur: function () {
            if (this.hasFocus) {
                var j = this._.editor;
                j.container.getChild(1).removeClass('cke_focus');
                this.hasFocus = false;
                j.fire('blur');
            }
        }
    };
    (function () {
        var j = {};
        a.lang = {
            languages: {
                af: 1,
                ar: 1,
                bg: 1,
                bn: 1,
                bs: 1,
                ca: 1,
                cs: 1,
                cy: 1,
                da: 1,
                de: 1,
                el: 1,
                'en-au': 1,
                'en-ca': 1,
                'en-gb': 1,
                en: 1,
                eo: 1,
                es: 1,
                et: 1,
                eu: 1,
                fa: 1,
                fi: 1,
                fo: 1,
                'fr-ca': 1,
                fr: 1,
                gl: 1,
                gu: 1,
                he: 1,
                hi: 1,
                hr: 1,
                hu: 1,
                is: 1,
                it: 1,
                ja: 1,
                km: 1,
                ko: 1,
                lt: 1,
                lv: 1,
                mn: 1,
                ms: 1,
                nb: 1,
                nl: 1,
                no: 1,
                pl: 1,
                'pt-br': 1,
                pt: 1,
                ro: 1,
                ru: 1,
                sk: 1,
                sl: 1,
                'sr-latn': 1,
                sr: 1,
                sv: 1,
                th: 1,
                tr: 1,
                uk: 1,
                vi: 1,
                'zh-cn': 1,
                zh: 1
            },
            load: function (k, l, m) {
                if (!k || !a.lang.languages[k]) k = this.detect(l, k);
                if (!this[k]) a.scriptLoader.load(a.getUrl('lang/' + k + '.js'), function () {
                    m(k, this[k]);
                }, this);
                else m(k, this[k]);
            },
            detect: function (k, l) {
                var m = this.languages;
                l = l || navigator.userLanguage || navigator.language;
                var n = l.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),
                    o = n[1],
                    p = n[2];
                if (m[o + '-' + p]) o = o + '-' + p;
                else if (!m[o]) o = null;
                a.lang.detect = o ?
                function () {
                    return o;
                } : function (q) {
                    return q;
                };
                return o || k;
            }
        };
    })();
    a.scriptLoader = (function () {
        var j = {},
            k = {};
        return {
            load: function (l, m, n, o, p) {
                var q = typeof l == 'string';
                if (q) l = [l];
                if (!n) n = a;
                var r = l.length,
                    s = [],
                    t = [],
                    u = function (z) {
                        if (m) if (q) m.call(n, z);
                        else m.call(n, s, t);
                    };
                if (r === 0) {
                    u(true);
                    return;
                }
                var v = function (z, A) {
                    (A ? s : t).push(z);
                    if (--r <= 0) {
                        p && a.document.getDocumentElement().removeStyle('cursor');
                        u(A);
                    }
                },
                    w = function (z, A) {
                        j[z] = 1;
                        var B = k[z];
                        delete k[z];
                        for (var C = 0; C < B.length; C++) B[C](z, A);
                    },
                    x = function (z) {
                        if (o !== true && j[z]) {
                            v(z, true);
                            return;
                        }
                        var A = k[z] || (k[z] = []);
                        A.push(v);
                        if (A.length > 1) return;
                        var B = new h('script');
                        B.setAttributes({
                            type: 'text/javascript',
                            src: z
                        });
                        if (m) if (c) B.$.onreadystatechange = function () {
                            if (B.$.readyState == 'loaded' || B.$.readyState == 'complete') {
                                B.$.onreadystatechange = null;
                                w(z, true);
                            }
                        };
                        else {
                            B.$.onload = function () {
                                setTimeout(function () {
                                    w(z, true);
                                }, 0);
                            };
                            B.$.onerror = function () {
                                w(z, false);
                            };
                        }
                        B.appendTo(a.document.getHead());
                    };
                p && a.document.getDocumentElement().setStyle('cursor', 'wait');
                for (var y = 0; y < r; y++) x(l[y]);
            },
            loadCode: function (l) {
                var m = new h('script');
                m.setAttribute('type', 'text/javascript');
                m.appendText(l);
                m.appendTo(a.document.getHead());
            }
        };
    })();
    a.resourceManager = function (j, k) {
        var l = this;
        l.basePath = j;
        l.fileName = k;
        l.registered = {};
        l.loaded = {};
        l.externals = {};
        l._ = {
            waitingList: {}
        };
    };
    a.resourceManager.prototype = {
        add: function (j, k) {
            if (this.registered[j]) throw '[CKEDITOR.resourceManager.add] The resource name "' + j + '" is already registered.';
            a.fire(j + e.capitalize(this.fileName) + 'Ready', this.registered[j] = k || {});
        },
        get: function (j) {
            return this.registered[j] || null;
        },
        getPath: function (j) {
            var k = this.externals[j];
            return a.getUrl(k && k.dir || this.basePath + j + '/');
        },
        getFilePath: function (j) {
            var k = this.externals[j];
            return a.getUrl(this.getPath(j) + (k && typeof k.file == 'string' ? k.file : this.fileName + '.js'));
        },
        addExternal: function (j, k, l) {
            j = j.split(',');
            for (var m = 0; m < j.length; m++) {
                var n = j[m];
                this.externals[n] = {
                    dir: k,
                    file: l
                };
            }
        },
        load: function (j, k, l) {
            if (!e.isArray(j)) j = j ? [j] : [];
            var m = this.loaded,
                n = this.registered,
                o = [],
                p = {},
                q = {};
            for (var r = 0; r < j.length; r++) {
                var s = j[r];
                if (!s) continue;
                if (!m[s] && !n[s]) {
                    var t = this.getFilePath(s);
                    o.push(t);
                    if (!(t in p)) p[t] = [];
                    p[t].push(s);
                } else q[s] = this.get(s);
            }
            a.scriptLoader.load(o, function (u, v) {
                if (v.length) throw '[CKEDITOR.resourceManager.load] Resource name "' + p[v[0]].join(',') + '" was not found at "' + v[0] + '".';
                for (var w = 0; w < u.length; w++) {
                    var x = p[u[w]];
                    for (var y = 0; y < x.length; y++) {
                        var z = x[y];
                        q[z] = this.get(z);
                        m[z] = 1;
                    }
                }
                k.call(l, q);
            }, this);
        }
    };
    a.plugins = new a.resourceManager('plugins/', 'plugin');
    var j = a.plugins;
    j.load = e.override(j.load, function (k) {
        return function (l, m, n) {
            var o = {},
                p = function (q) {
                    k.call(this, q, function (r) {
                        e.extend(o, r);
                        var s = [];
                        for (var t in r) {
                            var u = r[t],
                                v = u && u.requires;
                            if (v) for (var w = 0; w < v.length; w++) {
                                if (!o[v[w]]) s.push(v[w]);
                            }
                        }
                        if (s.length) p.call(this, s);
                        else {
                            for (t in o) {
                                u = o[t];
                                if (u.onLoad && !u.onLoad._called) {
                                    u.onLoad();
                                    u.onLoad._called = 1;
                                }
                            }
                            if (m) m.call(n || window, o);
                        }
                    }, this);
                };
            p.call(this, l);
        };
    });
    j.setLang = function (k, l, m) {
        var n = this.get(k),
            o = n.lang || (n.lang = {});
        o[l] = m;
    };
    (function () {
        var k = {},
            l = function (m, n) {
                var o = function () {
                    k[m] = 1;
                    n();
                },
                    p = new h('img');
                p.on('load', o);
                p.on('error', o);
                p.setAttribute('src', m);
            };
        a.imageCacher = {
            load: function (m, n) {
                var o = m.length,
                    p = function () {
                        if (--o === 0) n();
                    };
                for (var q = 0; q < m.length; q++) {
                    var r = m[q];
                    if (k[r]) p();
                    else l(r, p);
                }
            }
        };
    })();
    a.skins = (function () {
        var k = {},
            l = {},
            m = {},
            n = function (o, p, q, r) {
                var s = k[p];
                if (!o.skin) {
                    o.skin = s;
                    if (s.init) s.init(o);
                }
                var t = function (D) {
                    for (var E = 0; E < D.length; E++) D[E] = a.getUrl(m[p] + D[E]);
                };

                function u(D, E) {
                    return D.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g, function (F, G, H, I) {
                        if (/^\/|^\w?:/.test(H)) return F;
                        else return 'url(' + E + G + H + I + ')';
                    });
                };
                if (!l[p]) {
                    var v = s.preload;
                    if (v && v.length > 0) {
                        t(v);
                        a.imageCacher.load(v, function () {
                            l[p] = 1;
                            n(o, p, q, r);
                        });
                        return;
                    }
                    l[p] = 1;
                }
                q = s[q];
                var w = !q || !! q._isLoaded;
                if (w) r && r();
                else {
                    var x = q._pending || (q._pending = []);
                    x.push(r);
                    if (x.length > 1) return;
                    var y = !q.css || !q.css.length,
                        z = !q.js || !q.js.length,
                        A = function () {
                            if (y && z) {
                                q._isLoaded = 1;
                                for (var D = 0; D < x.length; D++) {
                                    if (x[D]) x[D]();
                                }
                            }
                        };
                    if (!y) {
                        var B = q.css;
                        if (e.isArray(B)) {
                            t(B);
                            for (var C = 0; C < B.length; C++) a.document.appendStyleSheet(B[C]);
                        } else {
                            B = u(B, a.getUrl(m[p]));
                            a.document.appendStyleText(B);
                        }
                        q.css = B;
                        y = 1;
                    }
                    if (!z) {
                        t(q.js);
                        a.scriptLoader.load(q.js, function () {
                            z = 1;
                            A();
                        });
                    }
                    A();
                }
            };
        return {
            add: function (o, p) {
                k[o] = p;
                p.skinPath = m[o] || (m[o] = a.getUrl('skins/' + o + '/'));
            },
            load: function (o, p, q) {
                var r = o.skinName,
                    s = o.skinPath;
                if (k[r]) n(o, r, p, q);
                else {
                    m[r] = s;
                    a.scriptLoader.load(a.getUrl(s + 'skin.js'), function () {
                        n(o, r, p, q);
                    });
                }
            }
        };
    })();
    a.themes = new a.resourceManager('themes/', 'theme');
    a.ui = function (k) {
        if (k.ui) return k.ui;
        this._ = {
            handlers: {},
            items: {},
            editor: k
        };
        return this;
    };
    var k = a.ui;
    k.prototype = {
        add: function (l, m, n) {
            this._.items[l] = {
                type: m,
                command: n.command || null,
                args: Array.prototype.slice.call(arguments, 2)
            };
        },
        create: function (l) {
            var q = this;
            var m = q._.items[l],
                n = m && q._.handlers[m.type],
                o = m && m.command && q._.editor.getCommand(m.command),
                p = n && n.create.apply(q, m.args);
            if (o) o.uiItems.push(p);
            return p;
        },
        addHandler: function (l, m) {
            this._.handlers[l] = m;
        }
    };
    (function () {
        var l = 0,
            m = function () {
                var x = 'editor' + ++l;
                return a.instances && a.instances[x] ? m() : x;
            },
            n = {},
            o = function (x) {
                var y = x.config.customConfig;
                if (!y) return false;
                y = a.getUrl(y);
                var z = n[y] || (n[y] = {});
                if (z.fn) {
                    z.fn.call(x, x.config);
                    if (a.getUrl(x.config.customConfig) == y || !o(x)) x.fireOnce('customConfigLoaded');
                } else a.scriptLoader.load(y, function () {
                    if (a.editorConfig) z.fn = a.editorConfig;
                    else z.fn = function () {};
                    o(x);
                });
                return true;
            },
            p = function (x, y) {
                x.on('customConfigLoaded', function () {
                    if (y) {
                        if (y.on) for (var z in y.on) x.on(z, y.on[z]);
                        e.extend(x.config, y, true);
                        delete x.config.on;
                    }
                    q(x);
                });
                if (y && y.customConfig != undefined) x.config.customConfig = y.customConfig;
                if (!o(x)) x.fireOnce('customConfigLoaded');
            },
            q = function (x) {
                var y = x.config.skin.split(','),
                    z = y[0],
                    A = a.getUrl(y[1] || 'skins/' + z + '/');
                x.skinName = z;
                x.skinPath = A;
                x.skinClass = 'cke_skin_' + z;
                x.tabIndex = x.config.tabIndex || x.element.getAttribute('tabindex') || 0;
                x.fireOnce('configLoaded');
                t(x);
            },
            r = function (x) {
                a.lang.load(x.config.language, x.config.defaultLanguage, function (y, z) {
                    x.langCode = y;
                    x.lang = e.prototypedCopy(z);
                    if (b.gecko && b.version < 10900 && x.lang.dir == 'rtl') x.lang.dir = 'ltr';
                    s(x);
                });
            },
            s = function (x) {
                var y = x.config,
                    z = y.plugins,
                    A = y.extraPlugins,
                    B = y.removePlugins;
                if (A) {
                    var C = new RegExp('(?:^|,)(?:' + A.replace(/\s*,\s*/g, '|') + ')(?=,|$)', 'g');
                    z = z.replace(C, '');
                    z += ',' + A;
                }
                if (B) {
                    C = new RegExp('(?:^|,)(?:' + B.replace(/\s*,\s*/g, '|') + ')(?=,|$)', 'g');
                    z = z.replace(C, '');
                }
                j.load(z.split(','), function (D) {
                    var E = [],
                        F = [],
                        G = [];
                    x.plugins = D;
                    for (var H in D) {
                        var I = D[H],
                            J = I.lang,
                            K = j.getPath(H),
                            L = null;
                        I.path = K;
                        if (J) {
                            L = e.indexOf(J, x.langCode) >= 0 ? x.langCode : J[0];
                            if (!I.lang[L]) G.push(a.getUrl(K + 'lang/' + L + '.js'));
                            else {
                                e.extend(x.lang, I.lang[L]);
                                L = null;
                            }
                        }
                        F.push(L);
                        E.push(I);
                    }
                    a.scriptLoader.load(G, function () {
                        var M = ['beforeInit', 'init', 'afterInit'];
                        for (var N = 0; N < M.length; N++) for (var O = 0; O < E.length; O++) {
                            var P = E[O];
                            if (N === 0 && F[O] && P.lang) e.extend(x.lang, P.lang[F[O]]);
                            if (P[M[N]]) P[M[N]](x);
                        }
                        x.fire('pluginsLoaded');
                        u(x);
                    });
                });
            },
            t = function (x) {
                a.skins.load(x, 'editor', function () {
                    r(x);
                });
            },
            u = function (x) {
                var y = x.config.theme;
                a.themes.load(y, function () {
                    var z = x.theme = a.themes.get(y);
                    z.path = a.themes.getPath(y);
                    z.build(x);
                    if (x.config.autoUpdateElement) v(x);
                });
            },
            v = function (x) {
                var y = x.element;
                if (x.elementMode == 1 && y.is('textarea')) {
                    var z = y.$.form && new h(y.$.form);
                    if (z) {
                        function A() {
                            x.updateElement();
                        };
                        z.on('submit', A);
                        if (!z.$.submit.nodeName) z.$.submit = e.override(z.$.submit, function (B) {
                            return function () {
                                x.updateElement();
                                if (B.apply) B.apply(this, arguments);
                                else B();
                            };
                        });
                        x.on('destroy', function () {
                            z.removeListener('submit', A);
                        });
                    }
                }
            };

        function w() {
            var x, y = this._.commands,
                z = this.mode;
            for (var A in y) {
                x = y[A];
                x[x.modes[z] ? 'enable' : 'disable']();
            }
        };
        a.editor.prototype._init = function () {
            var z = this;
            var x = h.get(z._.element),
                y = z._.instanceConfig;
            delete z._.element;
            delete z._.instanceConfig;
            z._.commands = {};
            z._.styles = [];
            z.element = x;
            z.name = x && z.elementMode == 1 && (x.getId() || x.getNameAtt()) || m();
            if (z.name in a.instances) throw '[CKEDITOR.editor] The instance "' + z.name + '" already exists.';
            z.config = e.prototypedCopy(i);
            z.ui = new k(z);
            z.focusManager = new a.focusManager(z);
            a.fire('instanceCreated', null, z);
            z.on('mode', w, null, null, 1);
            p(z, y);
        };
    })();
    e.extend(a.editor.prototype, {
        addCommand: function (l, m) {
            return this._.commands[l] = new a.command(this, m);
        },
        addCss: function (l) {
            this._.styles.push(l);
        },
        destroy: function (l) {
            var m = this;
            if (!l) m.updateElement();
            m.theme.destroy(m);
            m.fire('destroy');
            a.remove(m);
            a.fire('instanceDestroyed', null, m);
        },
        execCommand: function (l, m) {
            var n = this.getCommand(l),
                o = {
                    name: l,
                    commandData: m,
                    command: n
                };
            if (n && n.state != 0) if (this.fire('beforeCommandExec', o) !== true) {
                o.returnValue = n.exec(o.commandData);
                if (!n.async && this.fire('afterCommandExec', o) !== true) return o.returnValue;
            }
            return false;
        },
        getCommand: function (l) {
            return this._.commands[l];
        },
        getData: function () {
            var n = this;
            n.fire('beforeGetData');
            var l = n._.data;
            if (typeof l != 'string') {
                var m = n.element;
                if (m && n.elementMode == 1) l = m.is('textarea') ? m.getValue() : m.getHtml();
                else l = '';
            }
            l = {
                dataValue: l
            };
            n.fire('getData', l);
            return l.dataValue;
        },
        getSnapshot: function () {
            var l = this.fire('getSnapshot');
            if (typeof l != 'string') {
                var m = this.element;
                if (m && this.elementMode == 1) l = m.is('textarea') ? m.getValue() : m.getHtml();
            }
            return l;
        },
        loadSnapshot: function (l) {
            this.fire('loadSnapshot', l);
        },
        setData: function (l, m) {
            if (m) this.on('dataReady', function (o) {
                o.removeListener();
                m.call(o.editor);
            });
            var n = {
                dataValue: l
            };
            this.fire('setData', n);
            this._.data = n.dataValue;
            this.fire('afterSetData', n);
        },
        insertHtml: function (l) {
            this.fire('insertHtml', l);
        },
        insertElement: function (l) {
            this.fire('insertElement', l);
        },
        checkDirty: function () {
            return this.mayBeDirty && this._.previousValue !== this.getSnapshot();
        },
        resetDirty: function () {
            if (this.mayBeDirty) this._.previousValue = this.getSnapshot();
        },
        updateElement: function () {
            var n = this;
            var l = n.element;
            if (l && n.elementMode == 1) {
                var m = n.getData();
                if (n.config.htmlEncodeOutput) m = e.htmlEncode(m);
                if (l.is('textarea')) l.setValue(m);
                else l.setHtml(m);
            }
        }
    });
    a.on('loaded', function () {
        var l = a.editor._pending;
        if (l) {
            delete a.editor._pending;
            for (var m = 0; m < l.length; m++) l[m]._init();
        }
    });
    a.htmlParser = function () {
        this._ = {
            htmlPartsRegex: new RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:[^\"'>]+)|(?:\"[^\"]*\")|(?:'[^']*'))*)\\/?>))", 'g')
        };
    };
    (function () {
        var l = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,
            m = {
                checked: 1,
                compact: 1,
                declare: 1,
                defer: 1,
                disabled: 1,
                ismap: 1,
                multiple: 1,
                nohref: 1,
                noresize: 1,
                noshade: 1,
                nowrap: 1,
                readonly: 1,
                selected: 1
            };
        a.htmlParser.prototype = {
            onTagOpen: function () {},
            onTagClose: function () {},
            onText: function () {},
            onCDATA: function () {},
            onComment: function () {},
            parse: function (n) {
                var A = this;
                var o, p, q = 0,
                    r;
                while (o = A._.htmlPartsRegex.exec(n)) {
                    var s = o.index;
                    if (s > q) {
                        var t = n.substring(q, s);
                        if (r) r.push(t);
                        else A.onText(t);
                    }
                    q = A._.htmlPartsRegex.lastIndex;
                    if (p = o[1]) {
                        p = p.toLowerCase();
                        if (r && f.$cdata[p]) {
                            A.onCDATA(r.join(''));
                            r = null;
                        }
                        if (!r) {
                            A.onTagClose(p);
                            continue;
                        }
                    }
                    if (r) {
                        r.push(o[0]);
                        continue;
                    }
                    if (p = o[3]) {
                        p = p.toLowerCase();
                        var u = {},
                            v, w = o[4],
                            x = !! (w && w.charAt(w.length - 1) == '/');
                        if (w) while (v = l.exec(w)) {
                            var y = v[1].toLowerCase(),
                                z = v[2] || v[3] || v[4] || '';
                            if (!z && m[y]) u[y] = y;
                            else u[y] = z;
                        }
                        A.onTagOpen(p, u, x);
                        if (!r && f.$cdata[p]) r = [];
                        continue;
                    }
                    if (p = o[2]) A.onComment(p);
                }
                if (n.length > q) A.onText(n.substring(q, n.length));
            }
        };
    })();
    a.htmlParser.comment = function (l) {
        this.value = l;
        this._ = {
            isBlockLike: false
        };
    };
    a.htmlParser.comment.prototype = {
        type: 8,
        writeHtml: function (l, m) {
            var n = this.value;
            if (m) {
                if (!(n = m.onComment(n, this))) return;
                if (typeof n != 'string') {
                    n.parent = this.parent;
                    n.writeHtml(l, m);
                    return;
                }
            }
            l.comment(n);
        }
    };
    (function () {
        var l = /[\t\r\n ]{2,}|[\t\r\n]/g;
        a.htmlParser.text = function (m) {
            this.value = m;
            this._ = {
                isBlockLike: false
            };
        };
        a.htmlParser.text.prototype = {
            type: 3,
            writeHtml: function (m, n) {
                var o = this.value;
                if (n && !(o = n.onText(o, this))) return;
                m.text(o);
            }
        };
    })();
    (function () {
        a.htmlParser.cdata = function (l) {
            this.value = l;
        };
        a.htmlParser.cdata.prototype = {
            type: 3,
            writeHtml: function (l) {
                l.write(this.value);
            }
        };
    })();
    a.htmlParser.fragment = function () {
        this.children = [];
        this.parent = null;
        this._ = {
            isBlockLike: true,
            hasInlineStarted: false
        };
    };
    (function () {
        var l = {
            colgroup: 1,
            dd: 1,
            dt: 1,
            li: 1,
            option: 1,
            p: 1,
            td: 1,
            tfoot: 1,
            th: 1,
            thead: 1,
            tr: 1
        },
            m = e.extend({
                table: 1,
                ul: 1,
                ol: 1,
                dl: 1
            }, f.table, f.ul, f.ol, f.dl),
            n = f.$list,
            o = f.$listItem;
        a.htmlParser.fragment.fromHtml = function (p, q) {
            var r = new a.htmlParser(),
                s = [],
                t = new a.htmlParser.fragment(),
                u = [],
                v = [],
                w = t,
                x = false,
                y;

            function z(E) {
                var F;
                if (u.length > 0) for (var G = 0; G < u.length; G++) {
                    var H = u[G],
                        I = H.name,
                        J = f[I],
                        K = w.name && f[w.name];
                    if ((!K || K[I]) && (!E || !J || J[E] || !f[E])) {
                        if (!F) {
                            A();
                            F = 1;
                        }
                        H = H.clone();
                        H.parent = w;
                        w = H;
                        u.splice(G, 1);
                        G--;
                    }
                }
            };

            function A() {
                while (v.length) w.add(v.shift());
            };

            function B(E, F, G) {
                F = F || w || t;
                if (q && !F.type) {
                    var H, I;
                    if (E.attributes && (I = E.attributes._cke_real_element_type)) H = I;
                    else H = E.name;
                    if (H && !(H in f.$body) && !(H in f.$nonBodyContent)) {
                        var J = w;
                        w = F;
                        r.onTagOpen(q, {});
                        F = w;
                        if (G) w = J;
                    }
                }
                if (E._.isBlockLike && E.name != 'pre') {
                    var K = E.children.length,
                        L = E.children[K - 1],
                        M;
                    if (L && L.type == 3) if (!(M = e.rtrim(L.value))) E.children.length = K - 1;
                    else L.value = M;
                }
                F.add(E);
                if (E.returnPoint) {
                    w = E.returnPoint;
                    delete E.returnPoint;
                }
            };
            r.onTagOpen = function (E, F, G) {
                var H = new a.htmlParser.element(E, F);
                if (H.isUnknown && G) H.isEmpty = true;
                if (f.$removeEmpty[E]) {
                    u.push(H);
                    return;
                } else if (E == 'pre') x = true;
                else if (E == 'br' && x) {
                    w.add(new a.htmlParser.text('\n'));
                    return;
                }
                if (E == 'br') {
                    v.push(H);
                    return;
                }
                var I = w.name,
                    J = I && (f[I] || (w._.isBlockLike ? f.div : f.span));
                if (J && !H.isUnknown && !w.isUnknown && !J[E]) {
                    var K = false,
                        L;
                    if (E in n && I in n) {
                        var M = w.children,
                            N = M[M.length - 1];
                        if (!(N && N.name in o)) B(N = new a.htmlParser.element('li'), w);
                        y = w, L = N;
                    } else if (E == I) B(w, w.parent);
                    else {
                        if (m[I]) {
                            if (!y) y = w;
                        } else {
                            B(w, w.parent, true);
                            if (!l[I]) u.unshift(w);
                        }
                        K = true;
                    }
                    if (L) w = L;
                    else w = w.returnPoint || w.parent;
                    if (K) {
                        r.onTagOpen.apply(this, arguments);
                        return;
                    }
                }
                z(E);
                H.parent = w;
                H.returnPoint = y;
                y = 0;
                if (H.isEmpty) B(H);
                else w = H;
            };
            r.onTagClose = function (E) {
                for (var F = u.length - 1; F >= 0; F--) {
                    if (E == u[F].name) {
                        u.splice(F, 1);
                        return;
                    }
                }
                var G = [],
                    H = [],
                    I = w;
                while (I.type && I.name != E) {
                    if (!I._.isBlockLike) H.unshift(I);
                    G.push(I);
                    I = I.parent;
                }
                if (I.type) {
                    for (F = 0; F < G.length; F++) {
                        var J = G[F];
                        B(J, J.parent);
                    }
                    w = I;
                    if (w.name == 'pre') x = false;
                    if (I._.isBlockLike) A();
                    B(I, I.parent);
                    if (I == w) w = w.parent;
                    u = u.concat(H);
                }
                if (E == 'body') q = false;
            };
            r.onText = function (E) {
                if (!w._.hasInlineStarted && !x) {
                    E = e.ltrim(E);
                    if (E.length === 0) return;
                }
                A();
                z();
                if (q && (!w.type || w.name == 'body') && e.trim(E)) this.onTagOpen(q, {});
                if (!x) E = E.replace(/[\t\r\n ]{2,}|[\t\r\n]/g, ' ');
                w.add(new a.htmlParser.text(E));
            };
            r.onCDATA = function (E) {
                w.add(new a.htmlParser.cdata(E));
            };
            r.onComment = function (E) {
                w.add(new a.htmlParser.comment(E));
            };
            r.parse(p);
            A();
            while (w.type) {
                var C = w.parent,
                    D = w;
                if (q && (!C.type || C.name == 'body') && !f.$body[D.name]) {
                    w = C;
                    r.onTagOpen(q, {});
                    C = w;
                }
                C.add(D);
                w = C;
            }
            return t;
        };
        a.htmlParser.fragment.prototype = {
            add: function (p) {
                var s = this;
                var q = s.children.length,
                    r = q > 0 && s.children[q - 1] || null;
                if (r) {
                    if (p._.isBlockLike && r.type == 3) {
                        r.value = e.rtrim(r.value);
                        if (r.value.length === 0) {
                            s.children.pop();
                            s.add(p);
                            return;
                        }
                    }
                    r.next = p;
                }
                p.previous = r;
                p.parent = s;
                s.children.push(p);
                s._.hasInlineStarted = p.type == 3 || p.type == 1 && !p._.isBlockLike;
            },
            writeHtml: function (p, q) {
                var r;
                this.filterChildren = function () {
                    var s = new a.htmlParser.basicWriter();
                    this.writeChildrenHtml.call(this, s, q, true);
                    var t = s.getHtml();
                    this.children = new a.htmlParser.fragment.fromHtml(t).children;
                    r = 1;
                };
                !this.name && q && q.onFragment(this);
                this.writeChildrenHtml(p, r ? null : q);
            },
            writeChildrenHtml: function (p, q) {
                for (var r = 0; r < this.children.length; r++) this.children[r].writeHtml(p, q);
            }
        };
    })();
    a.htmlParser.element = function (l, m) {
        var r = this;
        r.name = l;
        r.attributes = m || (m = {});
        r.children = [];
        var n = m._cke_real_element_type || l,
            o = f,
            p = !! (o.$nonBodyContent[n] || o.$block[n] || o.$listItem[n] || o.$tableContent[n] || o.$nonEditable[n] || n == 'br'),
            q = !! o.$empty[l];
        r.isEmpty = q;
        r.isUnknown = !o[l];
        r._ = {
            isBlockLike: p,
            hasInlineStarted: q || !p
        };
    };
    (function () {
        var l = function (m, n) {
            m = m[0];
            n = n[0];
            return m < n ? -1 : m > n ? 1 : 0;
        };
        a.htmlParser.element.prototype = {
            type: 1,
            add: a.htmlParser.fragment.prototype.add,
            clone: function () {
                return new a.htmlParser.element(this.name, this.attributes);
            },
            writeHtml: function (m, n) {
                var o = this.attributes,
                    p = this,
                    q = p.name,
                    r, s, t, u;
                p.filterChildren = function () {
                    if (!u) {
                        var z = new a.htmlParser.basicWriter();
                        a.htmlParser.fragment.prototype.writeChildrenHtml.call(p, z, n);
                        p.children = new a.htmlParser.fragment.fromHtml(z.getHtml()).children;
                        u = 1;
                    }
                };
                if (n) {
                    for (;;) {
                        if (!(q = n.onElementName(q))) return;
                        p.name = q;
                        if (!(p = n.onElement(p))) return;
                        p.parent = this.parent;
                        if (p.name == q) break;
                        if (p.type != 1) {
                            p.writeHtml(m, n);
                            return;
                        }
                        q = p.name;
                        if (!q) {
                            this.writeChildrenHtml.call(p, m, u ? null : n);
                            return;
                        }
                    }
                    o = p.attributes;
                }
                m.openTag(q, o);
                var v = [];
                for (var w = 0; w < 2; w++) for (r in o) {
                    s = r;
                    t = o[r];
                    if (w == 1) v.push([r, t]);
                    else if (n) {
                        for (;;) {
                            if (!(s = n.onAttributeName(r))) {
                                delete o[r];
                                break;
                            } else if (s != r) {
                                delete o[r];
                                r = s;
                                continue;
                            } else break;
                        }
                        if (s) if ((t = n.onAttribute(p, s, t)) === false) delete o[s];
                        else o[s] = t;
                    }
                }
                if (m.sortAttributes) v.sort(l);
                var x = v.length;
                for (w = 0; w < x; w++) {
                    var y = v[w];
                    m.attribute(y[0], y[1]);
                }
                m.openTagClose(q, p.isEmpty);
                if (!p.isEmpty) {
                    this.writeChildrenHtml.call(p, m, u ? null : n);
                    m.closeTag(q);
                }
            },
            writeChildrenHtml: function (m, n) {
                a.htmlParser.fragment.prototype.writeChildrenHtml.apply(this, arguments);
            }
        };
    })();
    (function () {
        a.htmlParser.filter = e.createClass({
            $: function (q) {
                this._ = {
                    elementNames: [],
                    attributeNames: [],
                    elements: {
                        $length: 0
                    },
                    attributes: {
                        $length: 0
                    }
                };
                if (q) this.addRules(q, 10);
            },
            proto: {
                addRules: function (q, r) {
                    var s = this;
                    if (typeof r != 'number') r = 10;
                    m(s._.elementNames, q.elementNames, r);
                    m(s._.attributeNames, q.attributeNames, r);
                    n(s._.elements, q.elements, r);
                    n(s._.attributes, q.attributes, r);
                    s._.text = o(s._.text, q.text, r) || s._.text;
                    s._.comment = o(s._.comment, q.comment, r) || s._.comment;
                    s._.root = o(s._.root, q.root, r) || s._.root;
                },
                onElementName: function (q) {
                    return l(q, this._.elementNames);
                },
                onAttributeName: function (q) {
                    return l(q, this._.attributeNames);
                },
                onText: function (q) {
                    var r = this._.text;
                    return r ? r.filter(q) : q;
                },
                onComment: function (q, r) {
                    var s = this._.comment;
                    return s ? s.filter(q, r) : q;
                },
                onFragment: function (q) {
                    var r = this._.root;
                    return r ? r.filter(q) : q;
                },
                onElement: function (q) {
                    var v = this;
                    var r = [v._.elements['^'], v._.elements[q.name], v._.elements.$],
                        s, t;
                    for (var u = 0; u < 3; u++) {
                        s = r[u];
                        if (s) {
                            t = s.filter(q, v);
                            if (t === false) return null;
                            if (t && t != q) return v.onNode(t);
                            if (q.parent && !q.name) break;
                        }
                    }
                    return q;
                },
                onNode: function (q) {
                    var r = q.type;
                    return r == 1 ? this.onElement(q) : r == 3 ? new a.htmlParser.text(this.onText(q.value)) : r == 8 ? new a.htmlParser.comment(this.onComment(q.value)) : null;
                },
                onAttribute: function (q, r, s) {
                    var t = this._.attributes[r];
                    if (t) {
                        var u = t.filter(s, q, this);
                        if (u === false) return false;
                        if (typeof u != 'undefined') return u;
                    }
                    return s;
                }
            }
        });

        function l(q, r) {
            for (var s = 0; q && s < r.length; s++) {
                var t = r[s];
                q = q.replace(t[0], t[1]);
            }
            return q;
        };

        function m(q, r, s) {
            if (typeof r == 'function') r = [r];
            var t, u, v = q.length,
                w = r && r.length;
            if (w) {
                for (t = 0; t < v && q[t].pri < s; t++) {}
                for (u = w - 1; u >= 0; u--) {
                    var x = r[u];
                    if (x) {
                        x.pri = s;
                        q.splice(t, 0, x);
                    }
                }
            }
        };

        function n(q, r, s) {
            if (r) for (var t in r) {
                var u = q[t];
                q[t] = o(u, r[t], s);
                if (!u) q.$length++;
            }
        };

        function o(q, r, s) {
            if (r) {
                r.pri = s;
                if (q) {
                    if (!q.splice) {
                        if (q.pri > s) q = [r, q];
                        else q = [q, r];
                        q.filter = p;
                    } else m(q, r, s);
                    return q;
                } else {
                    r.filter = r;
                    return r;
                }
            }
        };

        function p(q) {
            var r = typeof q == 'object';
            for (var s = 0; s < this.length; s++) {
                var t = this[s],
                    u = t.apply(window, arguments);
                if (typeof u != 'undefined') {
                    if (u === false) return false;
                    if (r && u != q) return u;
                }
            }
            return null;
        };
    })();
    a.htmlParser.basicWriter = e.createClass({
        $: function () {
            this._ = {
                output: []
            };
        },
        proto: {
            openTag: function (l, m) {
                this._.output.push('<', l);
            },
            openTagClose: function (l, m) {
                if (m) this._.output.push(' />');
                else this._.output.push('>');
            },
            attribute: function (l, m) {
                if (typeof m == 'string') m = m.replace(/"/g, '&quot;');
                this._.output.push(' ', l, '="', m, '"');
            },
            closeTag: function (l) {
                this._.output.push('</', l, '>');
            },
            text: function (l) {
                this._.output.push(l);
            },
            comment: function (l) {
                this._.output.push('<!--', l, '-->');
            },
            write: function (l) {
                this._.output.push(l);
            },
            reset: function () {
                this._.output = [];
                this._.indent = false;
            },
            getHtml: function (l) {
                var m = this._.output.join('');
                if (l) this.reset();
                return m;
            }
        }
    });
    delete a.loadFullCore;
    a.instances = {};
    a.document = new g(document);
    a.add = function (l) {
        a.instances[l.name] = l;
        l.on('focus', function () {
            if (a.currentInstance != l) {
                a.currentInstance = l;
                a.fire('currentInstance');
            }
        });
        l.on('blur', function () {
            if (a.currentInstance == l) {
                a.currentInstance = null;
                a.fire('currentInstance');
            }
        });
    };
    a.remove = function (l) {
        delete a.instances[l.name];
    };
    a.TRISTATE_ON = 1;
    a.TRISTATE_OFF = 2;
    a.TRISTATE_DISABLED = 0;
    d.comment = e.createClass({
        base: d.node,
        $: function (l, m) {
            if (typeof l == 'string') l = (m ? m.$ : document).createComment(l);
            this.base(l);
        },
        proto: {
            type: 8,
            getOuterHtml: function () {
                return '<!--' + this.$.nodeValue + '-->';
            }
        }
    });
    (function () {
        var l = {
            address: 1,
            blockquote: 1,
            dl: 1,
            h1: 1,
            h2: 1,
            h3: 1,
            h4: 1,
            h5: 1,
            h6: 1,
            p: 1,
            pre: 1,
            li: 1,
            dt: 1,
            de: 1
        },
            m = {
                body: 1,
                div: 1,
                table: 1,
                tbody: 1,
                tr: 1,
                td: 1,
                th: 1,
                caption: 1,
                form: 1
            },
            n = function (o) {
                var p = o.getChildren();
                for (var q = 0, r = p.count(); q < r; q++) {
                    var s = p.getItem(q);
                    if (s.type == 1 && f.$block[s.getName()]) return true;
                }
                return false;
            };
        d.elementPath = function (o) {
            var u = this;
            var p = null,
                q = null,
                r = [],
                s = o;
            while (s) {
                if (s.type == 1) {
                    if (!u.lastElement) u.lastElement = s;
                    var t = s.getName();
                    if (c && s.$.scopeName != 'HTML') t = s.$.scopeName.toLowerCase() + ':' + t;
                    if (!q) {
                        if (!p && l[t]) p = s;
                        if (m[t]) if (!p && t == 'div' && !n(s)) p = s;
                        else q = s;
                    }
                    r.push(s);
                    if (t == 'body') break;
                }
                s = s.getParent();
            }
            u.block = p;
            u.blockLimit = q;
            u.elements = r;
        };
    })();
    d.elementPath.prototype = {
        compare: function (l) {
            var m = this.elements,
                n = l && l.elements;
            if (!n || m.length != n.length) return false;
            for (var o = 0; o < m.length; o++) {
                if (!m[o].equals(n[o])) return false;
            }
            return true;
        }
    };
    d.text = function (l, m) {
        if (typeof l == 'string') l = (m ? m.$ : document).createTextNode(l);
        this.$ = l;
    };
    d.text.prototype = new d.node();
    e.extend(d.text.prototype, {
        type: 3,
        getLength: function () {
            return this.$.nodeValue.length;
        },
        getText: function () {
            return this.$.nodeValue;
        },
        split: function (l) {
            var q = this;
            if (c && l == q.getLength()) {
                var m = q.getDocument().createText('');
                m.insertAfter(q);
                return m;
            }
            var n = q.getDocument(),
                o = new d.text(q.$.splitText(l), n);
            if (b.ie8) {
                var p = new d.text('', n);
                p.insertAfter(o);
                p.remove();
            }
            return o;
        },
        substring: function (l, m) {
            if (typeof m != 'number') return this.$.nodeValue.substr(l);
            else return this.$.nodeValue.substring(l, m);
        }
    });
    d.documentFragment = function (l) {
        l = l || a.document;
        this.$ = l.$.createDocumentFragment();
    };
    e.extend(d.documentFragment.prototype, h.prototype, {
        type: 11,
        insertAfterNode: function (l) {
            l = l.$;
            l.parentNode.insertBefore(this.$, l.nextSibling);
        }
    }, true, {
        append: 1,
        appendBogus: 1,
        getFirst: 1,
        getLast: 1,
        appendTo: 1,
        moveChildren: 1,
        insertBefore: 1,
        insertAfterNode: 1,
        replace: 1,
        trim: 1,
        type: 1,
        ltrim: 1,
        rtrim: 1,
        getDocument: 1,
        getChildCount: 1,
        getChild: 1,
        getChildren: 1
    });
    (function () {
        function l(t, u) {
            if (this._.end) return null;
            var v, w = this.range,
                x, y = this.guard,
                z = this.type,
                A = t ? 'getPreviousSourceNode' : 'getNextSourceNode';
            if (!this._.start) {
                this._.start = 1;
                w.trim();
                if (w.collapsed) {
                    this.end();
                    return null;
                }
            }
            if (!t && !this._.guardLTR) {
                var B = w.endContainer,
                    C = B.getChild(w.endOffset);
                this._.guardLTR = function (G, H) {
                    return (!H || !B.equals(G)) && (!C || !G.equals(C)) && (G.type != 1 || !H || G.getName() != 'body');
                };
            }
            if (t && !this._.guardRTL) {
                var D = w.startContainer,
                    E = w.startOffset > 0 && D.getChild(w.startOffset - 1);
                this._.guardRTL = function (G, H) {
                    return (!H || !D.equals(G)) && (!E || !G.equals(E)) && (G.type != 1 || !H || G.getName() != 'body');
                };
            }
            var F = t ? this._.guardRTL : this._.guardLTR;
            if (y) x = function (G, H) {
                if (F(G, H) === false) return false;
                return y(G, H);
            };
            else x = F;
            if (this.current) v = this.current[A](false, z, x);
            else if (t) {
                v = w.endContainer;
                if (w.endOffset > 0) {
                    v = v.getChild(w.endOffset - 1);
                    if (x(v) === false) v = null;
                } else v = x(v) === false ? null : v.getPreviousSourceNode(true, z, x);
            } else {
                v = w.startContainer;
                v = v.getChild(w.startOffset);
                if (v) {
                    if (x(v) === false) v = null;
                } else v = x(w.startContainer) === false ? null : w.startContainer.getNextSourceNode(true, z, x);
            }
            while (v && !this._.end) {
                this.current = v;
                if (!this.evaluator || this.evaluator(v) !== false) {
                    if (!u) return v;
                } else if (u && this.evaluator) return false;
                v = v[A](false, z, x);
            }
            this.end();
            return this.current = null;
        };

        function m(t) {
            var u, v = null;
            while (u = l.call(this, t)) v = u;
            return v;
        };
        d.walker = e.createClass({
            $: function (t) {
                this.range = t;
                this._ = {};
            },
            proto: {
                end: function () {
                    this._.end = 1;
                },
                next: function () {
                    return l.call(this);
                },
                previous: function () {
                    return l.call(this, true);
                },
                checkForward: function () {
                    return l.call(this, false, true) !== false;
                },
                checkBackward: function () {
                    return l.call(this, true, true) !== false;
                },
                lastForward: function () {
                    return m.call(this);
                },
                lastBackward: function () {
                    return m.call(this, true);
                },
                reset: function () {
                    delete this.current;
                    this._ = {};
                }
            }
        });
        var n = {
            block: 1,
            'list-item': 1,
            table: 1,
            'table-row-group': 1,
            'table-header-group': 1,
            'table-footer-group': 1,
            'table-row': 1,
            'table-column-group': 1,
            'table-column': 1,
            'table-cell': 1,
            'table-caption': 1
        },
            o = {
                hr: 1
            };
        h.prototype.isBlockBoundary = function (t) {
            var u = e.extend({}, o, t || {});
            return n[this.getComputedStyle('display')] || u[this.getName()];
        };
        d.walker.blockBoundary = function (t) {
            return function (u, v) {
                return !(u.type == 1 && u.isBlockBoundary(t));
            };
        };
        d.walker.listItemBoundary = function () {
            return this.blockBoundary({
                br: 1
            });
        };
        d.walker.bookmarkContents = function (t) {}, d.walker.bookmark = function (t, u) {
            function v(w) {
                return w && w.getName && w.getName() == 'span' && w.hasAttribute('_fck_bookmark');
            };
            return function (w) {
                var x, y;
                x = w && !w.getName && (y = w.getParent()) && v(y);
                x = t ? x : x || v(w);
                return u ^ x;
            };
        };
        d.walker.whitespaces = function (t) {
            return function (u) {
                var v = u && u.type == 3 && !e.trim(u.getText());
                return t ^ v;
            };
        };
        d.walker.invisible = function (t) {
            var u = d.walker.whitespaces();
            return function (v) {
                var w = u(v) || v.is && !v.$.offsetHeight;
                return t ^ w;
            };
        };
        var p = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/,
            q = d.walker.whitespaces(true),
            r = d.walker.bookmark(false, true),
            s = function (t) {
                return r(t) && q(t);
            };
        h.prototype.getBogus = function () {
            var t = this.getLast(s);
            if (t && (!c ? t.is && t.is('br') : t.getText && p.test(t.getText()))) return t;
            return false;
        };
    })();
    d.range = function (l) {
        var m = this;
        m.startContainer = null;
        m.startOffset = null;
        m.endContainer = null;
        m.endOffset = null;
        m.collapsed = true;
        m.document = l;
    };
    (function () {
        var l = function (t) {
            t.collapsed = t.startContainer && t.endContainer && t.startContainer.equals(t.endContainer) && t.startOffset == t.endOffset;
        },
            m = function (t, u, v) {
                t.optimizeBookmark();
                var w = t.startContainer,
                    x = t.endContainer,
                    y = t.startOffset,
                    z = t.endOffset,
                    A, B;
                if (x.type == 3) x = x.split(z);
                else if (x.getChildCount() > 0) if (z >= x.getChildCount()) {
                    x = x.append(t.document.createText(''));
                    B = true;
                } else x = x.getChild(z);
                if (w.type == 3) {
                    w.split(y);
                    if (w.equals(x)) x = w.getNext();
                } else if (!y) {
                    w = w.getFirst().insertBeforeMe(t.document.createText(''));
                    A = true;
                } else if (y >= w.getChildCount()) {
                    w = w.append(t.document.createText(''));
                    A = true;
                } else w = w.getChild(y).getPrevious();
                var C = w.getParents(),
                    D = x.getParents(),
                    E, F, G;
                for (E = 0; E < C.length; E++) {
                    F = C[E];
                    G = D[E];
                    if (!F.equals(G)) break;
                }
                var H = v,
                    I, J, K, L;
                for (var M = E; M < C.length; M++) {
                    I = C[M];
                    if (H && !I.equals(w)) J = H.append(I.clone());
                    K = I.getNext();
                    while (K) {
                        if (K.equals(D[M]) || K.equals(x)) break;
                        L = K.getNext();
                        if (u == 2) H.append(K.clone(true));
                        else {
                            K.remove();
                            if (u == 1) H.append(K);
                        }
                        K = L;
                    }
                    if (H) H = J;
                }
                H = v;
                for (var N = E; N < D.length; N++) {
                    I = D[N];
                    if (u > 0 && !I.equals(x)) J = H.append(I.clone());
                    if (!C[N] || I.$.parentNode != C[N].$.parentNode) {
                        K = I.getPrevious();
                        while (K) {
                            if (K.equals(C[N]) || K.equals(w)) break;
                            L = K.getPrevious();
                            if (u == 2) H.$.insertBefore(K.$.cloneNode(true), H.$.firstChild);
                            else {
                                K.remove();
                                if (u == 1) H.$.insertBefore(K.$, H.$.firstChild);
                            }
                            K = L;
                        }
                    }
                    if (H) H = J;
                }
                if (u == 2) {
                    var O = t.startContainer;
                    if (O.type == 3) {
                        O.$.data += O.$.nextSibling.data;
                        O.$.parentNode.removeChild(O.$.nextSibling);
                    }
                    var P = t.endContainer;
                    if (P.type == 3 && P.$.nextSibling) {
                        P.$.data += P.$.nextSibling.data;
                        P.$.parentNode.removeChild(P.$.nextSibling);
                    }
                } else {
                    if (F && G && (w.$.parentNode != F.$.parentNode || x.$.parentNode != G.$.parentNode)) {
                        var Q = G.getIndex();
                        if (A && G.$.parentNode == w.$.parentNode) Q--;
                        t.setStart(G.getParent(), Q);
                    }
                    t.collapse(true);
                }
                if (A) w.remove();
                if (B && x.$.parentNode) x.remove();
            },
            n = {
                abbr: 1,
                acronym: 1,
                b: 1,
                bdo: 1,
                big: 1,
                cite: 1,
                code: 1,
                del: 1,
                dfn: 1,
                em: 1,
                font: 1,
                i: 1,
                ins: 1,
                label: 1,
                kbd: 1,
                q: 1,
                samp: 1,
                small: 1,
                span: 1,
                strike: 1,
                strong: 1,
                sub: 1,
                sup: 1,
                tt: 1,
                u: 1,
                'var': 1
            };

        function o(t) {
            var u = false,
                v = d.walker.bookmark(true);
            return function (w) {
                if (v(w)) return true;
                if (w.type == 3) {
                    if (e.trim(w.getText()).length) return false;
                } else if (w.type == 1) if (!n[w.getName()]) if (!t && !c && w.getName() == 'br' && !u) u = true;
                else return false;
                return true;
            };
        };

        function p(t) {
            return t.type != 3 && t.getName() in f.$removeEmpty || !e.trim(t.getText()) || t.getParent().hasAttribute('_fck_bookmark');
        };
        var q = new d.walker.whitespaces(),
            r = new d.walker.bookmark();

        function s(t) {
            return !q(t) && !r(t);
        };
        d.range.prototype = {
            clone: function () {
                var u = this;
                var t = new d.range(u.document);
                t.startContainer = u.startContainer;
                t.startOffset = u.startOffset;
                t.endContainer = u.endContainer;
                t.endOffset = u.endOffset;
                t.collapsed = u.collapsed;
                return t;
            },
            collapse: function (t) {
                var u = this;
                if (t) {
                    u.endContainer = u.startContainer;
                    u.endOffset = u.startOffset;
                } else {
                    u.startContainer = u.endContainer;
                    u.startOffset = u.endOffset;
                }
                u.collapsed = true;
            },
            cloneContents: function () {
                var t = new d.documentFragment(this.document);
                if (!this.collapsed) m(this, 2, t);
                return t;
            },
            deleteContents: function () {
                if (this.collapsed) return;
                m(this, 0);
            },
            extractContents: function () {
                var t = new d.documentFragment(this.document);
                if (!this.collapsed) m(this, 1, t);
                return t;
            },
            createBookmark: function (t) {
                var y = this;
                var u, v, w, x;
                u = y.document.createElement('span');
                u.setAttribute('_fck_bookmark', 1);
                u.setStyle('display', 'none');
                u.setHtml('&nbsp;');
                if (t) {
                    w = 'cke_bm_' + e.getNextNumber();
                    u.setAttribute('id', w + 'S');
                }
                if (!y.collapsed) {
                    v = u.clone();
                    v.setHtml('&nbsp;');
                    if (t) v.setAttribute('id', w + 'E');
                    x = y.clone();
                    x.collapse();
                    x.insertNode(v);
                }
                x = y.clone();
                x.collapse(true);
                x.insertNode(u);
                if (v) {
                    y.setStartAfter(u);
                    y.setEndBefore(v);
                } else y.moveToPosition(u, 4);
                return {
                    startNode: t ? w + 'S' : u,
                    endNode: t ? w + 'E' : v,
                    serializable: t
                };
            },
            createBookmark2: function (t) {
                var A = this;
                var u = A.startContainer,
                    v = A.endContainer,
                    w = A.startOffset,
                    x = A.endOffset,
                    y, z;
                if (!u || !v) return {
                    start: 0,
                    end: 0
                };
                if (t) {
                    if (u.type == 1) {
                        y = u.getChild(w);
                        if (y && y.type == 3 && w > 0 && y.getPrevious().type == 3) {
                            u = y;
                            w = 0;
                        }
                    }
                    while (u.type == 3 && (z = u.getPrevious()) && z.type == 3) {
                        u = z;
                        w += z.getLength();
                    }
                    if (!A.isCollapsed) {
                        if (v.type == 1) {
                            y = v.getChild(x);
                            if (y && y.type == 3 && x > 0 && y.getPrevious().type == 3) {
                                v = y;
                                x = 0;
                            }
                        }
                        while (v.type == 3 && (z = v.getPrevious()) && z.type == 3) {
                            v = z;
                            x += z.getLength();
                        }
                    }
                }
                return {
                    start: u.getAddress(t),
                    end: A.isCollapsed ? null : v.getAddress(t),
                    startOffset: w,
                    endOffset: x,
                    normalized: t,
                    is2: true
                };
            },
            moveToBookmark: function (t) {
                var B = this;
                if (t.is2) {
                    var u = B.document.getByAddress(t.start, t.normalized),
                        v = t.startOffset,
                        w = t.end && B.document.getByAddress(t.end, t.normalized),
                        x = t.endOffset;
                    B.setStart(u, v);
                    if (w) B.setEnd(w, x);
                    else B.collapse(true);
                } else {
                    var y = t.serializable,
                        z = y ? B.document.getById(t.startNode) : t.startNode,
                        A = y ? B.document.getById(t.endNode) : t.endNode;
                    B.setStartBefore(z);
                    z.remove();
                    if (A) {
                        B.setEndBefore(A);
                        A.remove();
                    } else B.collapse(true);
                }
            },
            getBoundaryNodes: function () {
                var y = this;
                var t = y.startContainer,
                    u = y.endContainer,
                    v = y.startOffset,
                    w = y.endOffset,
                    x;
                if (t.type == 1) {
                    x = t.getChildCount();
                    if (x > v) t = t.getChild(v);
                    else if (x < 1) t = t.getPreviousSourceNode();
                    else {
                        t = t.$;
                        while (t.lastChild) t = t.lastChild;
                        t = new d.node(t);
                        t = t.getNextSourceNode() || t;
                    }
                }
                if (u.type == 1) {
                    x = u.getChildCount();
                    if (x > w) u = u.getChild(w).getPreviousSourceNode(true);
                    else if (x < 1) u = u.getPreviousSourceNode();
                    else {
                        u = u.$;
                        while (u.lastChild) u = u.lastChild;
                        u = new d.node(u);
                    }
                }
                if (t.getPosition(u) & 2) t = u;
                return {
                    startNode: t,
                    endNode: u
                };
            },
            getCommonAncestor: function (t, u) {
                var y = this;
                var v = y.startContainer,
                    w = y.endContainer,
                    x;
                if (v.equals(w)) {
                    if (t && v.type == 1 && y.startOffset == y.endOffset - 1) x = v.getChild(y.startOffset);
                    else x = v;
                } else x = v.getCommonAncestor(w);
                return u && !x.is ? x.getParent() : x;
            },
            optimize: function () {
                var v = this;
                var t = v.startContainer,
                    u = v.startOffset;
                if (t.type != 1) if (!u) v.setStartBefore(t);
                else if (u >= t.getLength()) v.setStartAfter(t);
                t = v.endContainer;
                u = v.endOffset;
                if (t.type != 1) if (!u) v.setEndBefore(t);
                else if (u >= t.getLength()) v.setEndAfter(t);
            },
            optimizeBookmark: function () {
                var v = this;
                var t = v.startContainer,
                    u = v.endContainer;
                if (t.is && t.is('span') && t.hasAttribute('_fck_bookmark')) v.setStartAt(t, 3);
                if (u && u.is && u.is('span') && u.hasAttribute('_fck_bookmark')) v.setEndAt(u, 4);
            },
            trim: function (t, u) {
                var B = this;
                var v = B.startContainer,
                    w = B.startOffset,
                    x = B.collapsed;
                if ((!t || x) && v && v.type == 3) {
                    if (!w) {
                        w = v.getIndex();
                        v = v.getParent();
                    } else if (w >= v.getLength()) {
                        w = v.getIndex() + 1;
                        v = v.getParent();
                    } else {
                        var y = v.split(w);
                        w = v.getIndex() + 1;
                        v = v.getParent();
                        if (B.startContainer.equals(B.endContainer)) B.setEnd(y, B.endOffset - B.startOffset);
                        else if (v.equals(B.endContainer)) B.endOffset += 1;
                    }
                    B.setStart(v, w);
                    if (x) {
                        B.collapse(true);
                        return;
                    }
                }
                var z = B.endContainer,
                    A = B.endOffset;
                if (!(u || x) && z && z.type == 3) {
                    if (!A) {
                        A = z.getIndex();
                        z = z.getParent();
                    } else if (A >= z.getLength()) {
                        A = z.getIndex() + 1;
                        z = z.getParent();
                    } else {
                        z.split(A);
                        A = z.getIndex() + 1;
                        z = z.getParent();
                    }
                    B.setEnd(z, A);
                }
            },
            enlarge: function (t) {
                switch (t) {
                case 1:
                    if (this.collapsed) return;
                    var u = this.getCommonAncestor(),
                        v = this.document.getBody(),
                        w, x, y, z, A, B = false,
                        C, D, E = this.startContainer,
                        F = this.startOffset;
                    if (E.type == 3) {
                        if (F) {
                            E = !e.trim(E.substring(0, F)).length && E;
                            B = !! E;
                        }
                        if (E) if (!(z = E.getPrevious())) y = E.getParent();
                    } else {
                        if (F) z = E.getChild(F - 1) || E.getLast();
                        if (!z) y = E;
                    }
                    while (y || z) {
                        if (y && !z) {
                            if (!A && y.equals(u)) A = true;
                            if (!v.contains(y)) break;
                            if (!B || y.getComputedStyle('display') != 'inline') {
                                B = false;
                                if (A) w = y;
                                else this.setStartBefore(y);
                            }
                            z = y.getPrevious();
                        }
                        while (z) {
                            C = false;
                            if (z.type == 3) {
                                D = z.getText();
                                if (/[^\s\ufeff]/.test(D)) z = null;
                                C = /[\s\ufeff]$/.test(D);
                            } else if (z.$.offsetWidth > 0 && !z.getAttribute('_fck_bookmark')) if (B && f.$removeEmpty[z.getName()]) {
                                D = z.getText();
                                if (!/[^\s\ufeff]/.test(D)) z = null;
                                else {
                                    var G = z.$.all || z.$.getElementsByTagName('*');
                                    for (var H = 0, I; I = G[H++];) {
                                        if (!f.$removeEmpty[I.nodeName.toLowerCase()]) {
                                            z = null;
                                            break;
                                        }
                                    }
                                }
                                if (z) C = !! D.length;
                            } else z = null;
                            if (C) if (B) {
                                if (A) w = y;
                                else if (y) this.setStartBefore(y);
                            } else B = true;
                            if (z) {
                                var J = z.getPrevious();
                                if (!y && !J) {
                                    y = z;
                                    z = null;
                                    break;
                                }
                                z = J;
                            } else y = null;
                        }
                        if (y) y = y.getParent();
                    }
                    E = this.endContainer;
                    F = this.endOffset;
                    y = z = null;
                    A = B = false;
                    if (E.type == 3) {
                        E = !e.trim(E.substring(F)).length && E;
                        B = !(E && E.getLength());
                        if (E) if (!(z = E.getNext())) y = E.getParent();
                    } else {
                        z = E.getChild(F);
                        if (!z) y = E;
                    }
                    while (y || z) {
                        if (y && !z) {
                            if (!A && y.equals(u)) A = true;
                            if (!v.contains(y)) break;
                            if (!B || y.getComputedStyle('display') != 'inline') {
                                B = false;
                                if (A) x = y;
                                else if (y) this.setEndAfter(y);
                            }
                            z = y.getNext();
                        }
                        while (z) {
                            C = false;
                            if (z.type == 3) {
                                D = z.getText();
                                if (/[^\s\ufeff]/.test(D)) z = null;
                                C = /^[\s\ufeff]/.test(D);
                            } else if (z.$.offsetWidth > 0 && !z.getAttribute('_fck_bookmark')) if (B && f.$removeEmpty[z.getName()]) {
                                D = z.getText();
                                if (!/[^\s\ufeff]/.test(D)) z = null;
                                else {
                                    G = z.$.all || z.$.getElementsByTagName('*');
                                    for (H = 0; I = G[H++];) {
                                        if (!f.$removeEmpty[I.nodeName.toLowerCase()]) {
                                            z = null;
                                            break;
                                        }
                                    }
                                }
                                if (z) C = !! D.length;
                            } else z = null;
                            if (C) if (B) if (A) x = y;
                            else this.setEndAfter(y);
                            if (z) {
                                J = z.getNext();
                                if (!y && !J) {
                                    y = z;
                                    z = null;
                                    break;
                                }
                                z = J;
                            } else y = null;
                        }
                        if (y) y = y.getParent();
                    }
                    if (w && x) {
                        u = w.contains(x) ? x : w;
                        this.setStartBefore(u);
                        this.setEndAfter(u);
                    }
                    break;
                case 2:
                case 3:
                    var K = new d.range(this.document);
                    v = this.document.getBody();
                    K.setStartAt(v, 1);
                    K.setEnd(this.startContainer, this.startOffset);
                    var L = new d.walker(K),
                        M, N, O = d.walker.blockBoundary(t == 3 ? {
                            br: 1
                        } : null),
                        P = function (R) {
                            var S = O(R);
                            if (!S) M = R;
                            return S;
                        },
                        Q = function (R) {
                            var S = P(R);
                            if (!S && R.is && R.is('br')) N = R;
                            return S;
                        };
                    L.guard = P;
                    y = L.lastBackward();
                    M = M || v;
                    this.setStartAt(M, !M.is('br') && (!y && this.checkStartOfBlock() || y && M.contains(y)) ? 1 : 4);
                    K = this.clone();
                    K.collapse();
                    K.setEndAt(v, 2);
                    L = new d.walker(K);
                    L.guard = t == 3 ? Q : P;
                    M = null;
                    y = L.lastForward();
                    M = M || v;
                    this.setEndAt(M, !y && this.checkEndOfBlock() || y && M.contains(y) ? 2 : 3);
                    if (N) this.setEndAfter(N);
                }
            },
            insertNode: function (t) {
                var x = this;
                x.optimizeBookmark();
                x.trim(false, true);
                var u = x.startContainer,
                    v = x.startOffset,
                    w = u.getChild(v);
                if (w) t.insertBefore(w);
                else u.append(t);
                if (t.getParent().equals(x.endContainer)) x.endOffset++;
                x.setStartBefore(t);
            },
            moveToPosition: function (t, u) {
                this.setStartAt(t, u);
                this.collapse(true);
            },
            selectNodeContents: function (t) {
                this.setStart(t, 0);
                this.setEnd(t, t.type == 3 ? t.getLength() : t.getChildCount());
            },
            setStart: function (t, u) {
                var v = this;
                v.startContainer = t;
                v.startOffset = u;
                if (!v.endContainer) {
                    v.endContainer = t;
                    v.endOffset = u;
                }
                l(v);
            },
            setEnd: function (t, u) {
                var v = this;
                v.endContainer = t;
                v.endOffset = u;
                if (!v.startContainer) {
                    v.startContainer = t;
                    v.startOffset = u;
                }
                l(v);
            },
            setStartAfter: function (t) {
                this.setStart(t.getParent(), t.getIndex() + 1);
            },
            setStartBefore: function (t) {
                this.setStart(t.getParent(), t.getIndex());
            },
            setEndAfter: function (t) {
                this.setEnd(t.getParent(), t.getIndex() + 1);
            },
            setEndBefore: function (t) {
                this.setEnd(t.getParent(), t.getIndex());
            },
            setStartAt: function (t, u) {
                var v = this;
                switch (u) {
                case 1:
                    v.setStart(t, 0);
                    break;
                case 2:
                    if (t.type == 3) v.setStart(t, t.getLength());
                    else v.setStart(t, t.getChildCount());
                    break;
                case 3:
                    v.setStartBefore(t);
                    break;
                case 4:
                    v.setStartAfter(t);
                }
                l(v);
            },
            setEndAt: function (t, u) {
                var v = this;
                switch (u) {
                case 1:
                    v.setEnd(t, 0);
                    break;
                case 2:
                    if (t.type == 3) v.setEnd(t, t.getLength());
                    else v.setEnd(t, t.getChildCount());
                    break;
                case 3:
                    v.setEndBefore(t);
                    break;
                case 4:
                    v.setEndAfter(t);
                }
                l(v);
            },
            fixBlock: function (t, u) {
                var x = this;
                var v = x.createBookmark(),
                    w = x.document.createElement(u);
                x.collapse(t);
                x.enlarge(2);
                x.extractContents().appendTo(w);
                w.trim();
                if (!c) w.appendBogus();
                x.insertNode(w);
                x.moveToBookmark(v);
                return w;
            },
            splitBlock: function (t) {
                var D = this;
                var u = new d.elementPath(D.startContainer),
                    v = new d.elementPath(D.endContainer),
                    w = u.blockLimit,
                    x = v.blockLimit,
                    y = u.block,
                    z = v.block,
                    A = null;
                if (!w.equals(x)) return null;
                if (t != 'br') {
                    if (!y) {
                        y = D.fixBlock(true, t);
                        z = new d.elementPath(D.endContainer).block;
                    }
                    if (!z) z = D.fixBlock(false, t);
                }
                var B = y && D.checkStartOfBlock(),
                    C = z && D.checkEndOfBlock();
                D.deleteContents();
                if (y && y.equals(z)) if (C) {
                    A = new d.elementPath(D.startContainer);
                    D.moveToPosition(z, 4);
                    z = null;
                } else if (B) {
                    A = new d.elementPath(D.startContainer);
                    D.moveToPosition(y, 3);
                    y = null;
                } else {
                    z = D.splitElement(y);
                    if (!c && !y.is('ul', 'ol')) y.appendBogus();
                }
                return {
                    previousBlock: y,
                    nextBlock: z,
                    wasStartOfBlock: B,
                    wasEndOfBlock: C,
                    elementPath: A
                };
            },
            splitElement: function (t) {
                var w = this;
                if (!w.collapsed) return null;
                w.setEndAt(t, 2);
                var u = w.extractContents(),
                    v = t.clone(false);
                u.appendTo(v);
                v.insertAfter(t);
                w.moveToPosition(t, 4);
                return v;
            },
            checkBoundaryOfElement: function (t, u) {
                var v = this.clone();
                v[u == 1 ? 'setStartAt' : 'setEndAt'](t, u == 1 ? 1 : 2);
                var w = new d.walker(v),
                    x = false;
                w.evaluator = p;
                return w[u == 1 ? 'checkBackward' : 'checkForward']();
            },
            checkStartOfBlock: function () {
                var z = this;
                var t = z.startContainer,
                    u = z.startOffset;
                if (u && t.type == 3) {
                    var v = e.ltrim(t.substring(0, u));
                    if (v.length) return false;
                }
                z.trim();
                var w = new d.elementPath(z.startContainer),
                    x = z.clone();
                x.collapse(true);
                x.setStartAt(w.block || w.blockLimit, 1);
                var y = new d.walker(x);
                y.evaluator = o(true);
                return y.checkBackward();
            },
            checkEndOfBlock: function () {
                var z = this;
                var t = z.endContainer,
                    u = z.endOffset;
                if (t.type == 3) {
                    var v = e.rtrim(t.substring(u));
                    if (v.length) return false;
                }
                z.trim();
                var w = new d.elementPath(z.endContainer),
                    x = z.clone();
                x.collapse(false);
                x.setEndAt(w.block || w.blockLimit, 2);
                var y = new d.walker(x);
                y.evaluator = o(false);
                return y.checkForward();
            },
            moveToElementEditablePosition: function (t, u) {
                var v;
                while (t && t.type == 1) {
                    v = t.isEditable();
                    if (v) this.moveToPosition(t, u ? 2 : 1);
                    else if (f.$inline[t.getName()]) {
                        this.moveToPosition(t, u ? 4 : 3);
                        return true;
                    }
                    if (f.$empty[t.getName()]) t = t[u ? 'getPrevious' : 'getNext'](s);
                    else t = t[u ? 'getLast' : 'getFirst'](s);
                    if (t && t.type == 3) {
                        this.moveToPosition(t, u ? 4 : 3);
                        return true;
                    }
                }
                return v;
            },
            moveToElementEditStart: function (t) {
                return this.moveToElementEditablePosition(t);
            },
            moveToElementEditEnd: function (t) {
                return this.moveToElementEditablePosition(t, true);
            },
            getEnclosedNode: function () {
                var t = this.clone(),
                    u = new d.walker(t),
                    v = d.walker.bookmark(true),
                    w = d.walker.whitespaces(true),
                    x = function (z) {
                        return w(z) && v(z);
                    };
                t.evaluator = x;
                var y = u.next();
                u.reset();
                return y && y.equals(u.previous()) ? y : null;
            },
            getTouchedStartNode: function () {
                var t = this.startContainer;
                if (this.collapsed || t.type != 1) return t;
                return t.getChild(this.startOffset) || t;
            },
            getTouchedEndNode: function () {
                var t = this.endContainer;
                if (this.collapsed || t.type != 1) return t;
                return t.getChild(this.endOffset - 1) || t;
            }
        };
    })();
    a.POSITION_AFTER_START = 1;
    a.POSITION_BEFORE_END = 2;
    a.POSITION_BEFORE_START = 3;
    a.POSITION_AFTER_END = 4;
    a.ENLARGE_ELEMENT = 1;
    a.ENLARGE_BLOCK_CONTENTS = 2;
    a.ENLARGE_LIST_ITEM_CONTENTS = 3;
    a.START = 1;
    a.END = 2;
    a.STARTEND = 3;
    (function () {
        var l = c && b.version < 7,
            m = c && b.version == 7,
            n = l ? a.basePath + 'images/spacer.gif' : m ? 'about:blank' : 'data:image/png;base64,',
            o = h.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;background-image:url(' + n + ')"></div>', a.document);
        o.appendTo(a.document.getHead());
        try {
            b.hc = o.getComputedStyle('background-image') == 'none';
        } catch (p) {
            b.hc = false;
        }
        if (b.hc) b.cssClass += ' cke_hc';
        o.remove();
    })();
    j.load(i.corePlugins.split(','), function () {
        a.status = 'loaded';
        a.fire('loaded');
        var l = a._.pending;
        if (l) {
            delete a._.pending;
            for (var m = 0; m < l.length; m++) a.add(l[m]);
        }
    });
    a.skins.add('kama', (function () {
        var l = [],
            m = 'cke_ui_color';
        if (c && b.version < 7) l.push('icons.png', 'images/sprites_ie6.png', 'images/dialog_sides.gif');
        return {
            preload: l,
            editor: {
                css: ['editor.css']
            },
            dialog: {
                css: ['dialog.css']
            },
            templates: {
                css: ['templates.css']
            },
            margins: [0, 0, 0, 0],
            init: function (n) {
                if (n.config.width && !isNaN(n.config.width)) n.config.width -= 12;
                var o = [],
                    p = /\$color/g,
                    q = '/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';
                if (b.webkit) {
                    q = q.split('}').slice(0, -1);
                    for (var r = 0; r < q.length; r++) q[r] = q[r].split('{');
                }
                function s(v) {
                    var w = v.getById(m);
                    if (!w) {
                        w = v.getHead().append('style');
                        w.setAttribute('id', m);
                        w.setAttribute('type', 'text/css');
                    }
                    return w;
                };

                function t(v, w, x) {
                    var y, z, A;
                    for (var B = 0; B < v.length; B++) {
                        if (b.webkit) for (z = 0; z < w.length; z++) {
                            A = w[z][1];
                            for (y = 0; y < x.length; y++) A = A.replace(x[y][0], x[y][1]);
                            v[B].$.sheet.addRule(w[z][0], A);
                        } else {
                            A = w;
                            for (y = 0; y < x.length; y++) A = A.replace(x[y][0], x[y][1]);
                            if (c) v[B].$.styleSheet.cssText += A;
                            else v[B].$.innerHTML += A;
                        }
                    }
                };
                var u = /\$color/g;
                e.extend(n, {
                    uiColor: null,
                    getUiColor: function () {
                        return this.uiColor;
                    },
                    setUiColor: function (v) {
                        var w, x = s(a.document),
                            y = '.cke_editor_' + e.escapeCssSelector(n.name),
                            z = [y + ' .cke_wrapper', y + '_dialog .cke_dialog_contents', y + '_dialog a.cke_dialog_tab', y + '_dialog .cke_dialog_footer'].join(','),
                            A = 'background-color: $color !important;';
                        if (b.webkit) w = [
                            [z, A]
                        ];
                        else w = z + '{' + A + '}';
                        return (this.setUiColor = function (B) {
                            var C = [
                                [u, B]
                            ];
                            n.uiColor = B;
                            t([x], w, C);
                            t(o, q, C);
                        })(v);
                    }
                });
                n.on('menuShow', function (v) {
                    var w = v.data[0],
                        x = w.element.getElementsByTag('iframe').getItem(0).getFrameDocument();
                    if (!x.getById('cke_ui_color')) {
                        var y = s(x);
                        o.push(y);
                        var z = n.getUiColor();
                        if (z) t([y], q, [
                            [u, z]
                        ]);
                    }
                });
                if (n.config.uiColor) n.setUiColor(n.config.uiColor);
            }
        };
    })());
    (function () {
        a.dialog ? l() : a.on('dialogPluginReady', l);

        function l() {
            a.dialog.on('resize', function (m) {
                var n = m.data,
                    o = n.width,
                    p = n.height,
                    q = n.dialog,
                    r = q.parts.contents;
                if (n.skin != 'kama') return;
                r.setStyles({
                    width: o + 'px',
                    height: p + 'px'
                });
                setTimeout(function () {
                    var s = q.parts.dialog.getChild([0, 0, 0]),
                        t = s.getChild(0),
                        u = s.getChild(2);
                    u.setStyle('width', t.$.offsetWidth + 'px');
                    u = s.getChild(7);
                    u.setStyle('width', t.$.offsetWidth - 28 + 'px');
                    u = s.getChild(4);
                    u.setStyle('height', t.$.offsetHeight - 31 - 14 + 'px');
                    u = s.getChild(5);
                    u.setStyle('height', t.$.offsetHeight - 31 - 14 + 'px');
                }, 100);
            });
        };
    })();
    j.add('about', {
        requires: ['dialog'],
        init: function (l) {
            var m = l.addCommand('about', new a.dialogCommand('about'));
            m.modes = {
                wysiwyg: 1,
                source: 1
            };
            m.canUndo = false;
            l.ui.addButton('About', {
                label: l.lang.about.title,
                command: 'about'
            });
            a.dialog.add('about', this.path + 'dialogs/about.js');
        }
    });
    (function () {
        var l = 'a11yhelp',
            m = 'a11yHelp';
        j.add(l, {
            availableLangs: {
                en: 1
            },
            init: function (n) {
                var o = this;
                n.addCommand(m, {
                    exec: function () {
                        var p = n.langCode;
                        p = o.availableLangs[p] ? p : 'en';
                        a.scriptLoader.load(a.getUrl(o.path + 'lang/' + p + '.js'), function () {
                            e.extend(n.lang, o.lang[p]);
                            n.openDialog(m);
                        });
                    },
                    modes: {
                        wysiwyg: 1,
                        source: 1
                    },
                    canUndo: false
                });
                a.dialog.add(m, this.path + 'dialogs/a11yhelp.js');
            }
        });
    })();
    j.add('basicstyles', {
        requires: ['styles', 'button'],
        init: function (l) {
            var m = function (p, q, r, s) {
                var t = new a.style(s);
                l.attachStyleStateChange(t, function (u) {
                    l.getCommand(r).setState(u);
                });
                l.addCommand(r, new a.styleCommand(t));
                l.ui.addButton(p, {
                    label: q,
                    command: r
                });
            },
                n = l.config,
                o = l.lang;
            m('Bold', o.bold, 'bold', n.coreStyles_bold);
            m('Italic', o.italic, 'italic', n.coreStyles_italic);
            m('Underline', o.underline, 'underline', n.coreStyles_underline);
            m('Strike', o.strike, 'strike', n.coreStyles_strike);
            m('Subscript', o.subscript, 'subscript', n.coreStyles_subscript);
            m('Superscript', o.superscript, 'superscript', n.coreStyles_superscript);
        }
    });
    i.coreStyles_bold = {
        element: 'strong',
        overrides: 'b'
    };
    i.coreStyles_italic = {
        element: 'em',
        overrides: 'i'
    };
    i.coreStyles_underline = {
        element: 'u'
    };
    i.coreStyles_strike = {
        element: 'strike'
    };
    i.coreStyles_subscript = {
        element: 'sub'
    };
    i.coreStyles_superscript = {
        element: 'sup'
    };
    (function () {
        function l(p, q) {
            var r = q.block || q.blockLimit;
            if (!r || r.getName() == 'body') return 2;
            if (r.getAscendant('blockquote', true)) return 1;
            return 2;
        };

        function m(p) {
            var q = p.editor,
                r = q.getCommand('blockquote');
            r.state = l(q, p.data.path);
            r.fire('state');
        };

        function n(p) {
            for (var q = 0, r = p.getChildCount(), s; q < r && (s = p.getChild(q)); q++) {
                if (s.type == 1 && s.isBlockBoundary()) return false;
            }
            return true;
        };
        var o = {
            exec: function (p) {
                var q = p.getCommand('blockquote').state,
                    r = p.getSelection(),
                    s = r && r.getRanges()[0];
                if (!s) return;
                var t = r.createBookmarks();
                if (c) {
                    var u = t[0].startNode,
                        v = t[0].endNode,
                        w;
                    if (u && u.getParent().getName() == 'blockquote') {
                        w = u;
                        while (w = w.getNext()) {
                            if (w.type == 1 && w.isBlockBoundary()) {
                                u.move(w, true);
                                break;
                            }
                        }
                    }
                    if (v && v.getParent().getName() == 'blockquote') {
                        w = v;
                        while (w = w.getPrevious()) {
                            if (w.type == 1 && w.isBlockBoundary()) {
                                v.move(w);
                                break;
                            }
                        }
                    }
                }
                var x = s.createIterator(),
                    y;
                if (q == 2) {
                    var z = [];
                    while (y = x.getNextParagraph()) z.push(y);
                    if (z.length < 1) {
                        var A = p.document.createElement(p.config.enterMode == 1 ? 'p' : 'div'),
                            B = t.shift();
                        s.insertNode(A);
                        A.append(new d.text('﻿', p.document));
                        s.moveToBookmark(B);
                        s.selectNodeContents(A);
                        s.collapse(true);
                        B = s.createBookmark();
                        z.push(A);
                        t.unshift(B);
                    }
                    var C = z[0].getParent(),
                        D = [];
                    for (var E = 0; E < z.length; E++) {
                        y = z[E];
                        C = C.getCommonAncestor(y.getParent());
                    }
                    var F = {
                        table: 1,
                        tbody: 1,
                        tr: 1,
                        ol: 1,
                        ul: 1
                    };
                    while (F[C.getName()]) C = C.getParent();
                    var G = null;
                    while (z.length > 0) {
                        y = z.shift();
                        while (!y.getParent().equals(C)) y = y.getParent();
                        if (!y.equals(G)) D.push(y);
                        G = y;
                    }
                    while (D.length > 0) {
                        y = D.shift();
                        if (y.getName() == 'blockquote') {
                            var H = new d.documentFragment(p.document);
                            while (y.getFirst()) {
                                H.append(y.getFirst().remove());
                                z.push(H.getLast());
                            }
                            H.replace(y);
                        } else z.push(y);
                    }
                    var I = p.document.createElement('blockquote');
                    I.insertBefore(z[0]);
                    while (z.length > 0) {
                        y = z.shift();
                        I.append(y);
                    }
                } else if (q == 1) {
                    var J = [],
                        K = {};
                    while (y = x.getNextParagraph()) {
                        var L = null,
                            M = null;
                        while (y.getParent()) {
                            if (y.getParent().getName() == 'blockquote') {
                                L = y.getParent();
                                M = y;
                                break;
                            }
                            y = y.getParent();
                        }
                        if (L && M && !M.getCustomData('blockquote_moveout')) {
                            J.push(M);
                            h.setMarker(K, M, 'blockquote_moveout', true);
                        }
                    }
                    h.clearAllMarkers(K);
                    var N = [],
                        O = [];
                    K = {};
                    while (J.length > 0) {
                        var P = J.shift();
                        I = P.getParent();
                        if (!P.getPrevious()) P.remove().insertBefore(I);
                        else if (!P.getNext()) P.remove().insertAfter(I);
                        else {
                            P.breakParent(P.getParent());
                            O.push(P.getNext());
                        }
                        if (!I.getCustomData('blockquote_processed')) {
                            O.push(I);
                            h.setMarker(K, I, 'blockquote_processed', true);
                        }
                        N.push(P);
                    }
                    h.clearAllMarkers(K);
                    for (E = O.length - 1; E >= 0; E--) {
                        I = O[E];
                        if (n(I)) I.remove();
                    }
                    if (p.config.enterMode == 2) {
                        var Q = true;
                        while (N.length) {
                            P = N.shift();
                            if (P.getName() == 'div') {
                                H = new d.documentFragment(p.document);
                                var R = Q && P.getPrevious() && !(P.getPrevious().type == 1 && P.getPrevious().isBlockBoundary());
                                if (R) H.append(p.document.createElement('br'));
                                var S = P.getNext() && !(P.getNext().type == 1 && P.getNext().isBlockBoundary());
                                while (P.getFirst()) P.getFirst().remove().appendTo(H);
                                if (S) H.append(p.document.createElement('br'));
                                H.replace(P);
                                Q = false;
                            }
                        }
                    }
                }
                r.selectBookmarks(t);
                p.focus();
            }
        };
        j.add('blockquote', {
            init: function (p) {
                p.addCommand('blockquote', o);
                p.ui.addButton('Blockquote', {
                    label: p.lang.blockquote,
                    command: 'blockquote'
                });
                p.on('selectionChange', m);
            },
            requires: ['domiterator']
        });
    })();
    j.add('button', {
        beforeInit: function (l) {
            l.ui.addHandler(1, k.button.handler);
        }
    });
    a.UI_BUTTON = 1;
    k.button = function (l) {
        e.extend(this, l, {
            title: l.label,
            className: l.className || l.command && 'cke_button_' + l.command || '',
            click: l.click || (function (m) {
                m.execCommand(l.command);
            })
        });
        this._ = {};
    };
    k.button.handler = {
        create: function (l) {
            return new k.button(l);
        }
    };
    k.button.prototype = {
        canGroup: true,
        render: function (l, m) {
            var n = b,
                o = this._.id = 'cke_' + e.getNextNumber();
            this._.editor = l;
            var p = {
                id: o,
                button: this,
                editor: l,
                focus: function () {
                    var v = a.document.getById(o);
                    v.focus();
                },
                execute: function () {
                    this.button.click(l);
                }
            },
                q = e.addFunction(p.execute, p),
                r = k.button._.instances.push(p) - 1,
                s = '',
                t = this.command;
            if (this.modes) l.on('mode', function () {
                this.setState(this.modes[l.mode] ? 2 : 0);
            }, this);
            else if (t) {
                t = l.getCommand(t);
                if (t) {
                    t.on('state', function () {
                        this.setState(t.state);
                    }, this);
                    s += 'cke_' + (t.state == 1 ? 'on' : t.state == 0 ? 'disabled' : 'off');
                }
            }
            if (!t) s += 'cke_off';
            if (this.className) s += ' ' + this.className;
            m.push('<span class="cke_button">', '<a id="', o, '" class="', s, '"', n.gecko && n.version >= 10900 && !n.hc ? '' : '" href="javascript:void(\'' + (this.title || '').replace("'") + "')\"", ' title="', this.title, '" tabindex="-1" hidefocus="true" role="button" aria-labelledby="' + o + '_label"' + (this.hasArrow ? ' aria-haspopup="true"' : ''));
            if (n.opera || n.gecko && n.mac) m.push(' onkeypress="return false;"');
            if (n.gecko) m.push(' onblur="this.style.cssText = this.style.cssText;"');
            m.push(' onkeydown="return CKEDITOR.ui.button._.keydown(', r, ', event);" onfocus="return CKEDITOR.ui.button._.focus(', r, ', event);" onclick="CKEDITOR.tools.callFunction(', q, ', this); return false;"><span class="cke_icon"');
            if (this.icon) {
                var u = (this.iconOffset || 0) * -16;
                m.push(' style="background-image:url(', a.getUrl(this.icon), ');background-position:0 ' + u + 'px;"');
            }
            m.push('></span><span id="', o, '_label" class="cke_label">', this.label, '</span>');
            if (this.hasArrow) m.push('<span class="cke_buttonarrow"></span>');
            m.push('</a>', '</span>');
            if (this.onRender) this.onRender();
            return p;
        },
        setState: function (l) {
            if (this._.state == l) return false;
            this._.state = l;
            var m = a.document.getById(this._.id);
            if (m) {
                m.setState(l);
                l == 0 ? m.setAttribute('aria-disabled', true) : m.removeAttribute('aria-disabled');
                l == 1 ? m.setAttribute('aria-pressed', true) : m.removeAttribute('aria-pressed');
                return true;
            } else return false;
        }
    };
    k.button._ = {
        instances: [],
        keydown: function (l, m) {
            var n = k.button._.instances[l];
            if (n.onkey) {
                m = new d.event(m);
                return n.onkey(n, m.getKeystroke()) !== false;
            }
        },
        focus: function (l, m) {
            var n = k.button._.instances[l],
                o;
            if (n.onfocus) o = n.onfocus(n, new d.event(m)) !== false;
            if (b.gecko && b.version < 10900) m.preventBubble();
            return o;
        }
    };
    k.prototype.addButton = function (l, m) {
        this.add(l, 1, m);
    };
    (function () {
        var l = function (r, s) {
            var t = r.document,
                u = t.getBody(),
                v = false,
                w = function () {
                    v = true;
                };
            u.on(s, w);
            t.$.execCommand(s);
            u.removeListener(s, w);
            return v;
        },
            m = c ?
            function (r, s) {
                return l(r, s);
            } : function (r, s) {
                try {
                    return r.document.$.execCommand(s);
                } catch (t) {
                    return false;
                }
            },
            n = function (r) {
                this.type = r;
                this.canUndo = this.type == 'cut';
            };
        n.prototype = {
            exec: function (r, s) {
                var t = m(r, this.type);
                if (!t) alert(r.lang.clipboard[this.type + 'Error']);
                return t;
            }
        };
        var o = {
            canUndo: false,
            exec: c ?
            function (r) {
                r.focus();
                if (!r.document.getBody().fire('beforepaste') && !l(r, 'paste')) {
                    r.fire('pasteDialog');
                    return false;
                }
            } : function (r) {
                try {
                    if (!r.document.getBody().fire('beforepaste') && !r.document.$.execCommand('Paste', false, null)) throw 0;
                } catch (s) {
                    setTimeout(function () {
                        r.fire('pasteDialog');
                    }, 0);
                    return false;
                }
            }
        },
            p = function (r) {
                if (this.mode != 'wysiwyg') return;
                switch (r.data.keyCode) {
                case 1000 + 86:
                case 2000 + 45:
                    var s = this.document.getBody();
                    if (!c && s.fire('beforepaste')) r.cancel();
                    else if (b.opera || b.gecko && b.version < 10900) s.fire('paste');
                    return;
                case 1000 + 88:
                case 2000 + 46:
                    var t = this;
                    this.fire('saveSnapshot');
                    setTimeout(function () {
                        t.fire('saveSnapshot');
                    }, 0);
                }
            };

        function q(r, s, t) {
            var u = this.document;
            if (c && u.getById('cke_pastebin')) return;
            if (s == 'text' && r.data && r.data.$.clipboardData) {
                var v = r.data.$.clipboardData.getData('text/plain');
                if (v) {
                    r.data.preventDefault();
                    t(v);
                    return;
                }
            }
            var w = this.getSelection(),
                x = new d.range(u),
                y = new h(s == 'text' ? 'textarea' : 'div', u);
            y.setAttribute('id', 'cke_pastebin');
            b.webkit && y.append(u.createText('\xa0'));
            u.getBody().append(y);
            if (!c && s != 'html') y.setStyles({
                position: 'absolute',
                left: '-1000px',
                top: w.getStartElement().getDocumentPosition().y + 'px',
                width: '1px',
                height: '1px',
                overflow: 'hidden'
            });
            var z = w.createBookmarks();
            if (s == 'text') {
                if (c) {
                    var A = u.getBody().$.createTextRange();
                    A.moveToElementText(y.$);
                    A.execCommand('Paste');
                    r.data.preventDefault();
                } else {
                    u.$.designMode = 'off';
                    y.$.focus();
                }
            } else {
                x.setStartAt(y, 1);
                x.setEndAt(y, 2);
                x.select(true);
            }
            window.setTimeout(function () {
                s == 'text' && !c && (u.$.designMode = 'on');
                y.remove();
                var B;
                y = b.webkit && (B = y.getFirst()) && B.is && B.hasClass('Apple-style-span') ? B : y;
                w.selectBookmarks(z);
                t(y['get' + (s == 'text' ? 'Value' : 'Html')]());
            }, 0);
        };
        j.add('clipboard', {
            requires: ['dialog', 'htmldataprocessor'],
            init: function (r) {
                r.on('paste', function (w) {
                    var x = w.data;
                    if (x.html) r.insertHtml(x.html);
                    else if (x.text) r.insertText(x.text);
                }, null, null, 1000);
                r.on('pasteDialog', function (w) {
                    setTimeout(function () {
                        r.openDialog('paste');
                    }, 0);
                });

                function s(w, x, y, z) {
                    var A = r.lang[x];
                    r.addCommand(x, y);
                    r.ui.addButton(w, {
                        label: A,
                        command: x
                    });
                    if (r.addMenuItems) r.addMenuItem(x, {
                        label: A,
                        command: x,
                        group: 'clipboard',
                        order: z
                    });
                };
                s('Cut', 'cut', new n('cut'), 1);
                s('Copy', 'copy', new n('copy'), 4);
                s('Paste', 'paste', o, 8);
                a.dialog.add('paste', a.getUrl(this.path + 'dialogs/paste.js'));
                r.on('key', p, r);
                var t = r.config.forcePasteAsPlainText ? 'text' : 'html';
                r.on('contentDom', function () {
                    var w = r.document.getBody();
                    w.on(t == 'text' && c || b.webkit ? 'paste' : 'beforepaste', function (x) {
                        if (u) return;
                        q.call(r, x, t, function (y) {
                            if (!y) return;
                            var z = {};
                            z[t] = y;
                            r.fire('paste', z);
                        });
                    });
                });
                if (r.contextMenu) {
                    var u;

                    function v(w) {
                        c && w == 'Paste' && (u = 1);
                        var x = r.document.$.queryCommandEnabled(w) ? 2 : 0;
                        u = 0;
                        return x;
                    };
                    r.contextMenu.addListener(function () {
                        return {
                            cut: v('Cut'),
                            copy: v('Cut'),
                            paste: b.webkit ? 2 : v('Paste')
                        };
                    });
                }
            }
        });
    })();
    j.add('colorbutton', {
        requires: ['panelbutton', 'floatpanel', 'styles'],
        init: function (l) {
            var m = l.config,
                n = l.lang.colorButton,
                o;
            if (!b.hc) {
                p('TextColor', 'fore', n.textColorTitle);
                p('BGColor', 'back', n.bgColorTitle);
            }
            function p(r, s, t) {
                l.ui.add(r, 4, {
                    label: t,
                    title: t,
                    className: 'cke_button_' + r.toLowerCase(),
                    modes: {
                        wysiwyg: 1
                    },
                    panel: {
                        css: l.skin.editor.css,
                        attributes: {
                            role: 'listbox',
                            'aria-label': n.panelTitle
                        }
                    },
                    onBlock: function (u, v) {
                        v.autoSize = true;
                        v.element.addClass('cke_colorblock');
                        v.element.setHtml(q(u, s));
                        var w = v.keys;
                        w[39] = 'next';
                        w[40] = 'next';
                        w[9] = 'next';
                        w[37] = 'prev';
                        w[38] = 'prev';
                        w[2000 + 9] = 'prev';
                        w[32] = 'click';
                    }
                });
            };

            function q(r, s) {
                var t = [],
                    u = m.colorButton_colors.split(','),
                    v = u.length + (m.colorButton_enableMore ? 2 : 1),
                    w = e.addFunction(function (A, B) {
                        if (A == '?') {
                            var C = arguments.callee;

                            function D(F) {
                                this.removeListener('ok', D);
                                this.removeListener('cancel', D);
                                F.name == 'ok' && C(this.getContentElement('picker', 'selectedColor').getValue(), B);
                            };
                            l.openDialog('colordialog', function () {
                                this.on('ok', D);
                                this.on('cancel', D);
                            });
                            return;
                        }
                        l.focus();
                        r.hide();
                        var E = new a.style(m['colorButton_' + B + 'Style'], A && {
                            color: A
                        });
                        l.fire('saveSnapshot');
                        if (A) E.apply(l.document);
                        else E.remove(l.document);
                        l.fire('saveSnapshot');
                    });
                t.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="', n.auto, '" onclick="CKEDITOR.tools.callFunction(', w, ",null,'", s, "');return false;\" href=\"javascript:void('", n.auto, '\')" role="option" aria-posinset="1" aria-setsize="', v, '"><table role="presentation" cellspacing=0 cellpadding=0 width="100%"><tr><td><span class="cke_colorbox" style="background-color:#000"></span></td><td colspan=7 align=center>', n.auto, '</td></tr></table></a><table role="presentation" cellspacing=0 cellpadding=0 width="100%">');
                for (var x = 0; x < u.length; x++) {
                    if (x % 8 === 0) t.push('</tr><tr>');
                    var y = u[x],
                        z = l.lang.colors[y] || y;
                    t.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="', z, '" onclick="CKEDITOR.tools.callFunction(', w, ",'#", y, "','", s, "'); return false;\" href=\"javascript:void('", z, '\')" role="option" aria-posinset="', x + 2, '" aria-setsize="', v, '"><span class="cke_colorbox" style="background-color:#', y, '"></span></a></td>');
                }
                if (m.colorButton_enableMore) t.push('</tr><tr><td colspan=8 align=center><a class="cke_colormore" _cke_focus=1 hidefocus=true title="', n.more, '" onclick="CKEDITOR.tools.callFunction(', w, ",'?','", s, "');return false;\" href=\"javascript:void('", n.more, "')\"", ' role="option" aria-posinset="', v, '" aria-setsize="', v, '">', n.more, '</a></td>');
                t.push('</tr></table>');
                return t.join('');
            };
        }
    });
    i.colorButton_enableMore = true;
    i.colorButton_colors = '000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';
    i.colorButton_foreStyle = {
        element: 'span',
        styles: {
            color: '#(color)'
        },
        overrides: [{
            element: 'font',
            attributes: {
                color: null
            }
        }],
        childRule: function (l) {
            return l.getName() != 'a';
        }
    };
    i.colorButton_backStyle = {
        element: 'span',
        styles: {
            'background-color': '#(color)'
        }
    };
    (function () {
        j.colordialog = {
            init: function (l) {
                l.addCommand('colordialog', new a.dialogCommand('colordialog'));
                a.dialog.add('colordialog', this.path + 'dialogs/colordialog.js');
            }
        };
        j.add('colordialog', j.colordialog);
    })();
    j.add('contextmenu', {
        requires: ['menu'],
        beforeInit: function (l) {
            l.contextMenu = new j.contextMenu(l);
            l.addCommand('contextMenu', {
                exec: function () {
                    l.contextMenu.show(l.document.getBody());
                }
            });
        }
    });
    j.contextMenu = e.createClass({
        $: function (l) {
            this.id = 'cke_' + e.getNextNumber();
            this.editor = l;
            this._.listeners = [];
            this._.functionId = e.addFunction(function (m) {
                this._.panel.hide();
                l.focus();
                l.execCommand(m);
            }, this);
            this._.definiton = {
                panel: {
                    className: l.skinClass + ' cke_contextmenu',
                    attributes: {
                        'aria-label': l.lang.common.options
                    }
                }
            };
        },
        _: {
            onMenu: function (l, m, n, o) {
                var p = this._.menu,
                    q = this.editor;
                if (p) {
                    p.hide();
                    p.removeAll();
                } else {
                    p = this._.menu = new a.menu(q, this._.definiton);
                    p.onClick = e.bind(function (z) {
                        p.hide();
                        if (z.onClick) z.onClick();
                        else if (z.command) q.execCommand(z.command);
                    }, this);
                    p.onEscape = function (z) {
                        var A = this.parent;
                        if (A) {
                            A._.panel.hideChild();
                            var B = A._.panel._.panel._.currentBlock,
                                C = B._.focusIndex;
                            B._.markItem(C);
                        } else if (z == 27) {
                            this.hide();
                            q.focus();
                        }
                        return false;
                    };
                }
                var r = this._.listeners,
                    s = [],
                    t = this.editor.getSelection(),
                    u = t && t.getStartElement();
                p.onHide = e.bind(function () {
                    p.onHide = null;
                    if (c) {
                        var z = q.getSelection();
                        z && z.unlock();
                    }
                    this.onHide && this.onHide();
                }, this);
                for (var v = 0; v < r.length; v++) {
                    var w = r[v](u, t);
                    if (w) for (var x in w) {
                        var y = this.editor.getMenuItem(x);
                        if (y) {
                            y.state = w[x];
                            p.add(y);
                        }
                    }
                }
                p.items.length && p.show(l, m || (q.lang.dir == 'rtl' ? 2 : 1), n, o);
            }
        },
        proto: {
            addTarget: function (l, m) {
                if (b.opera) {
                    var n;
                    l.on('mousedown', function (r) {
                        r = r.data;
                        if (r.$.button != 2) {
                            if (r.getKeystroke() == 1000 + 1) l.fire('contextmenu', r);
                            return;
                        }
                        if (m && (r.$.ctrlKey || r.$.metaKey)) return;
                        var s = r.getTarget();
                        if (!n) {
                            var t = s.getDocument();
                            n = t.createElement('input');
                            n.$.type = 'button';
                            t.getBody().append(n);
                        }
                        n.setAttribute('style', 'position:absolute;top:' + (r.$.clientY - 2) + 'px;left:' + (r.$.clientX - 2) + 'px;width:5px;height:5px;opacity:0.01');
                    });
                    l.on('mouseup', function (r) {
                        if (n) {
                            n.remove();
                            n = undefined;
                            l.fire('contextmenu', r.data);
                        }
                    });
                }
                l.on('contextmenu', function (r) {
                    var s = r.data;
                    if (m && (b.webkit ? o : s.$.ctrlKey || s.$.metaKey)) return;
                    if (c) {
                        var t = this.editor.getSelection();
                        t && t.lock();
                    }
                    s.preventDefault();
                    var u = s.getTarget().getDocument().getDocumentElement(),
                        v = s.$.clientX,
                        w = s.$.clientY;
                    e.setTimeout(function () {
                        this.show(u, null, v, w);
                    }, 0, this);
                }, this);
                if (b.webkit) {
                    var o, p = function (r) {
                        o = r.data.$.ctrlKey || r.data.$.metaKey;
                    },
                        q = function () {
                            o = 0;
                        };
                    l.on('keydown', p);
                    l.on('keyup', q);
                    l.on('contextmenu', q);
                }
            },
            addListener: function (l) {
                this._.listeners.push(l);
            },
            show: function (l, m, n, o) {
                this.editor.focus();
                this._.onMenu(l || a.document.getDocumentElement(), m, n || 0, o || 0);
            }
        }
    });
    (function () {
        j.add('div', {
            requires: ['editingblock', 'domiterator', 'styles'],
            init: function (l) {
                var m = l.lang.div;
                l.addCommand('creatediv', new a.dialogCommand('creatediv'));
                l.addCommand('editdiv', new a.dialogCommand('editdiv'));
                l.addCommand('removediv', {
                    exec: function (n) {
                        var o = n.getSelection(),
                            p = o && o.getRanges(),
                            q, r = o.createBookmarks(),
                            s, t = [];

                        function u(w) {
                            var x = new d.elementPath(w),
                                y = x.blockLimit,
                                z = y.is('div') && y;
                            if (z && !z.getAttribute('_cke_div_added')) {
                                t.push(z);
                                z.setAttribute('_cke_div_added');
                            }
                        };
                        for (var v = 0; v < p.length; v++) {
                            q = p[v];
                            if (q.collapsed) u(o.getStartElement());
                            else {
                                s = new d.walker(q);
                                s.evaluator = u;
                                s.lastForward();
                            }
                        }
                        for (v = 0; v < t.length; v++) t[v].remove(true);
                        o.selectBookmarks(r);
                    }
                });
                l.ui.addButton('CreateDiv', {
                    label: m.toolbar,
                    command: 'creatediv'
                });
                if (l.addMenuItems) {
                    l.addMenuItems({
                        editdiv: {
                            label: m.edit,
                            command: 'editdiv',
                            group: 'div',
                            order: 1
                        },
                        removediv: {
                            label: m.remove,
                            command: 'removediv',
                            group: 'div',
                            order: 5
                        }
                    });
                    if (l.contextMenu) l.contextMenu.addListener(function (n, o) {
                        if (!n) return null;
                        var p = new d.elementPath(n),
                            q = p.blockLimit;
                        if (q && q.getAscendant('div', true)) return {
                            editdiv: 2,
                            removediv: 2
                        };
                        return null;
                    });
                }
                a.dialog.add('creatediv', this.path + 'dialogs/div.js');
                a.dialog.add('editdiv', this.path + 'dialogs/div.js');
            }
        });
    })();
    (function () {
        var l = {
            toolbarFocus: {
                exec: function (n) {
                    var o = n._.elementsPath.idBase,
                        p = a.document.getById(o + '0');
                    if (p) p.focus();
                }
            }
        },
            m = '<span class="cke_empty">&nbsp;</span>';
        j.add('elementspath', {
            requires: ['selection'],
            init: function (n) {
                var o = 'cke_path_' + n.name,
                    p, q = function () {
                        if (!p) p = a.document.getById(o);
                        return p;
                    },
                    r = 'cke_elementspath_' + e.getNextNumber() + '_';
                n._.elementsPath = {
                    idBase: r
                };
                n.on('themeSpace', function (s) {
                    if (s.data.space == 'bottom') s.data.html += '<span id="' + o + '_label" class="cke_voice_label">' + n.lang.elementsPath.eleLabel + '</span>' + '<div id="' + o + '" class="cke_path" role="group" aria-labelledby="' + o + '_label">' + m + '</div>';
                });
                n.on('selectionChange', function (s) {
                    var t = b,
                        u = s.data.selection,
                        v = u.getStartElement(),
                        w = [],
                        x = this._.elementsPath.list = [];
                    while (v) {
                        var y = x.push(v) - 1,
                            z;
                        if (v.getAttribute('_cke_real_element_type')) z = v.getAttribute('_cke_real_element_type');
                        else z = v.getName();
                        var A = '';
                        if (t.opera || t.gecko && t.mac) A += ' onkeypress="return false;"';
                        if (t.gecko) A += ' onblur="this.style.cssText = this.style.cssText;"';
                        var B = n.lang.elementsPath.eleTitle.replace(/%1/, z);
                        w.unshift('<a id="', r, y, '" href="javascript:void(\'', z, '\')" tabindex="-1" title="', B, '"' + (b.gecko && b.version < 10900 ? ' onfocus="event.preventBubble();"' : '') + ' hidefocus="true" ' + " onkeydown=\"return CKEDITOR._.elementsPath.keydown('", this.name, "',", y, ', event);"' + A, " onclick=\"return CKEDITOR._.elementsPath.click('", this.name, "',", y, ');"', ' role="button" aria-labelledby="' + r + y + '_label">', z, '<span id="', r, y, '_label" class="cke_label">' + B + '</span>', '</a>');
                        if (z == 'body') break;
                        v = v.getParent();
                    }
                    q().setHtml(w.join('') + m);
                });
                n.on('contentDomUnload', function () {
                    q().setHtml(m);
                });
                n.addCommand('elementsPathFocus', l.toolbarFocus);
            }
        });
    })();
    a._.elementsPath = {
        click: function (l, m) {
            var n = a.instances[l];
            n.focus();
            var o = n._.elementsPath.list[m];
            n.getSelection().selectElement(o);
            return false;
        },
        keydown: function (l, m, n) {
            var o = k.button._.instances[m],
                p = a.instances[l],
                q = p._.elementsPath.idBase,
                r;
            n = new d.event(n);
            switch (n.getKeystroke()) {
            case 37:
            case 9:
                r = a.document.getById(q + (m + 1));
                if (!r) r = a.document.getById(q + '0');
                r.focus();
                return false;
            case 39:
            case 2000 + 9:
                r = a.document.getById(q + (m - 1));
                if (!r) r = a.document.getById(q + (p._.elementsPath.list.length - 1));
                r.focus();
                return false;
            case 27:
                p.focus();
                return false;
            case 13:
            case 32:
                this.click(l, m);
                return false;
            }
            return true;
        }
    };
    (function () {
        j.add('enterkey', {
            requires: ['keystrokes', 'indent'],
            init: function (s) {
                var t = s.specialKeys;
                t[13] = q;
                t[2000 + 13] = p;
            }
        });
        j.enterkey = {
            enterBlock: function (s, t, u, v) {
                u = u || r(s);
                var w = u.document,
                    x = t == 3 ? 'div' : 'p',
                    y = u.splitBlock(x);
                if (!y) return;
                var z = y.previousBlock,
                    A = y.nextBlock,
                    B = y.wasStartOfBlock,
                    C = y.wasEndOfBlock,
                    D;
                if (A) {
                    D = A.getParent();
                    if (D.is('li')) {
                        A.breakParent(D);
                        A.move(A.getNext(), true);
                    }
                } else if (z && (D = z.getParent()) && D.is('li')) {
                    z.breakParent(D);
                    u.moveToElementEditStart(z.getNext());
                    z.move(z.getPrevious());
                }
                if (!B && !C) {
                    if (A.is('li') && (D = A.getFirst(d.walker.invisible(true))) && D.is && D.is('ul', 'ol'))(c ? w.createText('\xa0') : w.createElement('br')).insertBefore(D);
                    if (A) u.moveToElementEditStart(A);
                } else {
                    if (B && C && z.is('li')) {
                        s.execCommand('outdent');
                        return;
                    }
                    var E;
                    if (z) {
                        if (!v && !o.test(z.getName())) E = z.clone();
                    } else if (A) E = A.clone();
                    if (!E) E = w.createElement(x);
                    var F = y.elementPath;
                    if (F) for (var G = 0, H = F.elements.length; G < H; G++) {
                        var I = F.elements[G];
                        if (I.equals(F.block) || I.equals(F.blockLimit)) break;
                        if (f.$removeEmpty[I.getName()]) {
                            I = I.clone();
                            E.moveChildren(I);
                            E.append(I);
                        }
                    }
                    if (!c) E.appendBogus();
                    u.insertNode(E);
                    if (c && B && (!C || !z.getChildCount())) {
                        u.moveToElementEditStart(C ? z : E);
                        u.select();
                    }
                    u.moveToElementEditStart(B && !C ? A : E);
                }
                if (!c) if (A) {
                    var J = w.createElement('span');
                    J.setHtml('&nbsp;');
                    u.insertNode(J);
                    J.scrollIntoView();
                    u.deleteContents();
                } else E.scrollIntoView();
                u.select();
            },
            enterBr: function (s, t, u, v) {
                u = u || r(s);
                var w = u.document,
                    x = t == 3 ? 'div' : 'p',
                    y = u.checkEndOfBlock(),
                    z = new d.elementPath(s.getSelection().getStartElement()),
                    A = z.block,
                    B = A && z.block.getName(),
                    C = false;
                if (!v && B == 'li') {
                    n(s, t, u, v);
                    return;
                }
                if (!v && y && o.test(B)) {
                    w.createElement('br').insertAfter(A);
                    if (b.gecko) w.createText('').insertAfter(A);
                    u.setStartAt(A.getNext(), c ? 3 : 1);
                } else {
                    var D;
                    C = B == 'pre';
                    if (C) D = w.createText(c ? '\r' : '\n');
                    else D = w.createElement('br');
                    u.deleteContents();
                    u.insertNode(D);
                    if (!c) w.createText('﻿').insertAfter(D);
                    if (y && !c) D.getParent().appendBogus();
                    if (!c) D.getNext().$.nodeValue = '';
                    if (c) u.setStartAt(D, 4);
                    else u.setStartAt(D.getNext(), 1);
                    if (!c) {
                        var E = null;
                        if (!b.gecko) {
                            E = w.createElement('span');
                            E.setHtml('&nbsp;');
                        } else E = w.createElement('br');
                        E.insertBefore(D.getNext());
                        E.scrollIntoView();
                        E.remove();
                    }
                }
                u.collapse(true);
                u.select(C);
            }
        };
        var l = j.enterkey,
            m = l.enterBr,
            n = l.enterBlock,
            o = /^h[1-6]$/;

        function p(s) {
            return q(s, s.config.shiftEnterMode, true);
        };

        function q(s, t, u) {
            if (s.mode != 'wysiwyg') return false;
            if (!t) t = s.config.enterMode;
            setTimeout(function () {
                s.fire('saveSnapshot');
                if (t == 2 || s.getSelection().getStartElement().hasAscendant('pre', true)) m(s, t, null, u);
                else n(s, t, null, u);
            }, 0);
            return true;
        };

        function r(s) {
            var t = s.getSelection().getRanges();
            for (var u = t.length - 1; u > 0; u--) t[u].deleteContents();
            return t[0];
        };
    })();
    (function () {
        var l = 'nbsp,gt,lt,quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro',
            m = 'Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml',
            n = 'Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv';

        function o(p) {
            var q = {},
                r = [],
                s = {
                    nbsp: '\xa0',
                    shy: '­',
                    gt: '>',
                    lt: '<'
                };
            p = p.replace(/\b(nbsp|shy|gt|lt|amp)(?:,|$)/g, function (x, y) {
                q[s[y]] = '&' + y + ';';
                r.push(s[y]);
                return '';
            });
            p = p.split(',');
            var t = document.createElement('div'),
                u;
            t.innerHTML = '&' + p.join(';&') + ';';
            u = t.innerHTML;
            t = null;
            for (var v = 0; v < u.length; v++) {
                var w = u.charAt(v);
                q[w] = '&' + p[v] + ';';
                r.push(w);
            }
            q.regex = r.join('');
            return q;
        };
        j.add('entities', {
            afterInit: function (p) {
                var q = p.config;
                if (!q.entities) return;
                var r = p.dataProcessor,
                    s = r && r.htmlFilter;
                if (s) {
                    var t = l;
                    if (q.entities_latin) t += ',' + m;
                    if (q.entities_greek) t += ',' + n;
                    if (q.entities_additional) t += ',' + q.entities_additional;
                    var u = o(t),
                        v = '[' + u.regex + ']';
                    delete u.regex;
                    if (q.entities_processNumerical) v = '[^ -~]|' + v;
                    v = new RegExp(v, 'g');

                    function w(x) {
                        return u[x] || '&#' + x.charCodeAt(0) + ';';
                    };
                    s.addRules({
                        text: function (x) {
                            return x.replace(v, w);
                        }
                    });
                }
            }
        });
    })();
    i.entities = true;
    i.entities_latin = true;
    i.entities_greek = true;
    i.entities_processNumerical = false;
    i.entities_additional = '#39';
    (function () {
        function l(u, v) {
            var w = [];
            if (!v) return u;
            else for (var x in v) w.push(x + '=' + encodeURIComponent(v[x]));
            return u + (u.indexOf('?') != -1 ? '&' : '?') + w.join('&');
        };

        function m(u) {
            u += '';
            var v = u.charAt(0).toUpperCase();
            return v + u.substr(1);
        };

        function n(u) {
            var B = this;
            var v = B.getDialog(),
                w = v.getParentEditor();
            w._.filebrowserSe = B;
            var x = w.config['filebrowser' + m(v.getName()) + 'WindowWidth'] || w.config.filebrowserWindowWidth || '80%',
                y = w.config['filebrowser' + m(v.getName()) + 'WindowHeight'] || w.config.filebrowserWindowHeight || '70%',
                z = B.filebrowser.params || {};
            z.CKEditor = w.name;
            z.CKEditorFuncNum = w._.filebrowserFn;
            if (!z.langCode) z.langCode = w.langCode;
            var A = l(B.filebrowser.url, z);
            w.popup(A, x, y);
        };

        function o(u) {
            var x = this;
            var v = x.getDialog(),
                w = v.getParentEditor();
            w._.filebrowserSe = x;
            if (!v.getContentElement(x['for'][0], x['for'][1]).getInputElement().$.value) return false;
            if (!v.getContentElement(x['for'][0], x['for'][1]).getAction()) return false;
            return true;
        };

        function p(u, v, w) {
            var x = w.params || {};
            x.CKEditor = u.name;
            x.CKEditorFuncNum = u._.filebrowserFn;
            if (!x.langCode) x.langCode = u.langCode;
            v.action = l(w.url, x);
            v.filebrowser = w;
        };

        function q(u, v, w, x) {
            var y, z;
            for (var A in x) {
                y = x[A];
                if (y.type == 'hbox' || y.type == 'vbox') q(u, v, w, y.children);
                if (!y.filebrowser) continue;
                if (typeof y.filebrowser == 'string') {
                    var B = {
                        action: y.type == 'fileButton' ? 'QuickUpload' : 'Browse',
                        target: y.filebrowser
                    };
                    y.filebrowser = B;
                }
                if (y.filebrowser.action == 'Browse') {
                    var C = y.filebrowser.url || u.config['filebrowser' + m(v) + 'BrowseUrl'] || u.config.filebrowserBrowseUrl;
                    if (C) {
                        y.onClick = n;
                        y.filebrowser.url = C;
                        y.hidden = false;
                    }
                } else if (y.filebrowser.action == 'QuickUpload' && y['for']) {
                    C = y.filebrowser.url || u.config['filebrowser' + m(v) + 'UploadUrl'] || u.config.filebrowserUploadUrl;
                    if (C) {
                        var D = y.onClick;
                        y.onClick = function (E) {
                            var F = E.sender;
                            if (D && D.call(F, E) === false) return false;
                            return o.call(F, E);
                        };
                        y.filebrowser.url = C;
                        y.hidden = false;
                        p(u, w.getContents(y['for'][0]).get(y['for'][1]), y.filebrowser);
                    }
                }
            }
        };

        function r(u, v) {
            var w = v.getDialog(),
                x = v.filebrowser.target || null;
            u = u.replace(/#/g, '%23');
            if (x) {
                var y = x.split(':'),
                    z = w.getContentElement(y[0], y[1]);
                if (z) {
                    z.setValue(u);
                    w.selectPage(y[0]);
                }
            }
        };

        function s(u, v, w) {
            if (w.indexOf(';') !== -1) {
                var x = w.split(';');
                for (var y = 0; y < x.length; y++) {
                    if (s(u, v, x[y])) return true;
                }
                return false;
            }
            var z = u.getContents(v).get(w).filebrowser;
            return z && z.url;
        };

        function t(u, v) {
            var z = this;
            var w = z._.filebrowserSe.getDialog(),
                x = z._.filebrowserSe['for'],
                y = z._.filebrowserSe.filebrowser.onSelect;
            if (x) w.getContentElement(x[0], x[1]).reset();
            if (typeof v == 'function' && v.call(z._.filebrowserSe) === false) return;
            if (y && y.call(z._.filebrowserSe, u, v) === false) return;
            if (typeof v == 'string' && v) alert(v);
            if (u) r(u, z._.filebrowserSe);
        };
        j.add('filebrowser', {
            init: function (u, v) {
                u._.filebrowserFn = e.addFunction(t, u);
                a.on('dialogDefinition', function (w) {
                    var x = w.data.definition,
                        y;
                    for (var z in x.contents) {
                        y = x.contents[z];
                        q(w.editor, w.data.name, x, y.elements);
                        if (y.hidden && y.filebrowser) y.hidden = !s(x, y.id, y.filebrowser);
                    }
                });
            }
        });
    })();
    j.add('find', {
        init: function (l) {
            var m = j.find;
            l.ui.addButton('Find', {
                label: l.lang.findAndReplace.find,
                command: 'find'
            });
            var n = l.addCommand('find', new a.dialogCommand('find'));
            n.canUndo = false;
            l.ui.addButton('Replace', {
                label: l.lang.findAndReplace.replace,
                command: 'replace'
            });
            var o = l.addCommand('replace', new a.dialogCommand('replace'));
            o.canUndo = false;
            a.dialog.add('find', this.path + 'dialogs/find.js');
            a.dialog.add('replace', this.path + 'dialogs/find.js');
        },
        requires: ['styles']
    });
    i.find_highlight = {
        element: 'span',
        styles: {
            'background-color': '#004',
            color: '#fff'
        }
    };
    (function () {
        var l = /\.swf(?:$|\?)/i,
            m = /^\d+(?:\.\d+)?$/;

        function n(q) {
            if (m.test(q)) return q + 'px';
            return q;
        };

        function o(q) {
            var r = q.attributes;
            return r.type == 'application/x-shockwave-flash' || l.test(r.src || '');
        };

        function p(q, r) {
            var s = q.createFakeParserElement(r, 'cke_flash', 'flash', true),
                t = s.attributes.style || '',
                u = r.attributes.width,
                v = r.attributes.height;
            if (typeof u != 'undefined') t = s.attributes.style = t + 'width:' + n(u) + ';';
            if (typeof v != 'undefined') t = s.attributes.style = t + 'height:' + n(v) + ';';
            return s;
        };
        j.add('flash', {
            init: function (q) {
                q.addCommand('flash', new a.dialogCommand('flash'));
                q.ui.addButton('Flash', {
                    label: q.lang.common.flash,
                    command: 'flash'
                });
                a.dialog.add('flash', this.path + 'dialogs/flash.js');
                q.addCss('img.cke_flash{background-image: url(' + a.getUrl(this.path + 'images/placeholder.png') + ');' + 'background-position: center center;' + 'background-repeat: no-repeat;' + 'border: 1px solid #a9a9a9;' + 'width: 80px;' + 'height: 80px;' + '}');
                if (q.addMenuItems) q.addMenuItems({
                    flash: {
                        label: q.lang.flash.properties,
                        command: 'flash',
                        group: 'flash'
                    }
                });
                if (q.contextMenu) q.contextMenu.addListener(function (r, s) {
                    if (r && r.is('img') && r.getAttribute('_cke_real_element_type') == 'flash') return {
                        flash: 2
                    };
                });
            },
            afterInit: function (q) {
                var r = q.dataProcessor,
                    s = r && r.dataFilter;
                if (s) s.addRules({
                    elements: {
                        'cke:object': function (t) {
                            var u = t.attributes,
                                v = u.classid && String(u.classid).toLowerCase();
                            if (!v) {
                                for (var w = 0; w < t.children.length; w++) {
                                    if (t.children[w].name == 'cke:embed') {
                                        if (!o(t.children[w])) return null;
                                        return p(q, t);
                                    }
                                }
                                return null;
                            }
                            return p(q, t);
                        },
                        'cke:embed': function (t) {
                            if (!o(t)) return null;
                            return p(q, t);
                        }
                    }
                }, 5);
            },
            requires: ['fakeobjects']
        });
    })();
    e.extend(i, {
        flashEmbedTagOnly: false,
        flashAddEmbedTag: true,
        flashConvertOnEdit: false
    });
    (function () {
        function l(m, n, o, p, q, r, s) {
            var t = m.config,
                u = q.split(';'),
                v = [],
                w = {};
            for (var x = 0; x < u.length; x++) {
                var y = u[x];
                if (y) {
                    y = y.split('/');
                    var z = {},
                        A = u[x] = y[0];
                    z[o] = v[x] = y[1] || A;
                    w[A] = new a.style(s, z);
                } else u.splice(x--, 1);
            }
            m.ui.addRichCombo(n, {
                label: p.label,
                title: p.panelTitle,
                className: 'cke_' + (o == 'size' ? 'fontSize' : 'font'),
                panel: {
                    css: m.skin.editor.css.concat(t.contentsCss),
                    multiSelect: false,
                    attributes: {
                        'aria-label': p.panelTitle
                    }
                },
                init: function () {
                    this.startGroup(p.panelTitle);
                    for (var B = 0; B < u.length; B++) {
                        var C = u[B];
                        this.add(C, '<span style="font-' + o + ':' + v[B] + '">' + C + '</span>', C);
                    }
                },
                onClick: function (B) {
                    m.focus();
                    m.fire('saveSnapshot');
                    var C = w[B];
                    if (this.getValue() == B) C.remove(m.document);
                    else C.apply(m.document);
                    m.fire('saveSnapshot');
                },
                onRender: function () {
                    m.on('selectionChange', function (B) {
                        var C = this.getValue(),
                            D = B.data.path,
                            E = D.elements;
                        for (var F = 0, G; F < E.length; F++) {
                            G = E[F];
                            for (var H in w) {
                                if (w[H].checkElementRemovable(G, true)) {
                                    if (H != C) this.setValue(H);
                                    return;
                                }
                            }
                        }
                        this.setValue('', r);
                    }, this);
                }
            });
        };
        j.add('font', {
            requires: ['richcombo', 'styles'],
            init: function (m) {
                var n = m.config;
                l(m, 'Font', 'family', m.lang.font, n.font_names, n.font_defaultLabel, n.font_style);
                l(m, 'FontSize', 'size', m.lang.fontSize, n.fontSize_sizes, n.fontSize_defaultLabel, n.fontSize_style);
            }
        });
    })();
    i.font_names = 'Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif';
    i.font_defaultLabel = '';
    i.font_style = {
        element: 'span',
        styles: {
            'font-family': '#(family)'
        },
        overrides: [{
            element: 'font',
            attributes: {
                face: null
            }
        }]
    };
    i.fontSize_sizes = '8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';
    i.fontSize_defaultLabel = '';
    i.fontSize_style = {
        element: 'span',
        styles: {
            'font-size': '#(size)'
        },
        overrides: [{
            element: 'font',
            attributes: {
                size: null
            }
        }]
    };
    j.add('format', {
        requires: ['richcombo', 'styles'],
        init: function (l) {
            var m = l.config,
                n = l.lang.format,
                o = m.format_tags.split(';'),
                p = {};
            for (var q = 0; q < o.length; q++) {
                var r = o[q];
                p[r] = new a.style(m['format_' + r]);
            }
            l.ui.addRichCombo('Format', {
                label: n.label,
                title: n.panelTitle,
                className: 'cke_format',
                panel: {
                    css: l.skin.editor.css.concat(m.contentsCss),
                    multiSelect: false,
                    attributes: {
                        'aria-label': n.panelTitle
                    }
                },
                init: function () {
                    this.startGroup(n.panelTitle);
                    for (var s in p) {
                        var t = n['tag_' + s];
                        this.add(s, '<' + s + '>' + t + '</' + s + '>', t);
                    }
                },
                onClick: function (s) {
                    l.focus();
                    l.fire('saveSnapshot');
                    p[s].apply(l.document);
                    setTimeout(function () {
                        l.fire('saveSnapshot');
                    }, 0);
                },
                onRender: function () {
                    l.on('selectionChange', function (s) {
                        var t = this.getValue(),
                            u = s.data.path;
                        for (var v in p) {
                            if (p[v].checkActive(u)) {
                                if (v != t) this.setValue(v, l.lang.format['tag_' + v]);
                                return;
                            }
                        }
                        this.setValue('');
                    }, this);
                }
            });
        }
    });
    i.format_tags = 'p;h1;h2;h3;h4;h5;h6;pre;address;div';
    i.format_p = {
        element: 'p'
    };
    i.format_div = {
        element: 'div'
    };
    i.format_pre = {
        element: 'pre'
    };
    i.format_address = {
        element: 'address'
    };
    i.format_h1 = {
        element: 'h1'
    };
    i.format_h2 = {
        element: 'h2'
    };
    i.format_h3 = {
        element: 'h3'
    };
    i.format_h4 = {
        element: 'h4'
    };
    i.format_h5 = {
        element: 'h5'
    };
    i.format_h6 = {
        element: 'h6'
    };
    j.add('forms', {
        init: function (l) {
            var m = l.lang;
            l.addCss('form{border: 1px dotted #FF0000;padding: 2px;}');
            var n = function (p, q, r) {
                l.addCommand(q, new a.dialogCommand(q));
                l.ui.addButton(p, {
                    label: m.common[p.charAt(0).toLowerCase() + p.slice(1)],
                    command: q
                });
                a.dialog.add(q, r);
            },
                o = this.path + 'dialogs/';
            n('Form', 'form', o + 'form.js');
            n('Checkbox', 'checkbox', o + 'checkbox.js');
            n('Radio', 'radio', o + 'radio.js');
            n('TextField', 'textfield', o + 'textfield.js');
            n('Textarea', 'textarea', o + 'textarea.js');
            n('Select', 'select', o + 'select.js');
            n('Button', 'button', o + 'button.js');
            n('ImageButton', 'imagebutton', j.getPath('image') + 'dialogs/image.js');
            n('HiddenField', 'hiddenfield', o + 'hiddenfield.js');
            if (l.addMenuItems) l.addMenuItems({
                form: {
                    label: m.form.menu,
                    command: 'form',
                    group: 'form'
                },
                checkbox: {
                    label: m.checkboxAndRadio.checkboxTitle,
                    command: 'checkbox',
                    group: 'checkbox'
                },
                radio: {
                    label: m.checkboxAndRadio.radioTitle,
                    command: 'radio',
                    group: 'radio'
                },
                textfield: {
                    label: m.textfield.title,
                    command: 'textfield',
                    group: 'textfield'
                },
                hiddenfield: {
                    label: m.hidden.title,
                    command: 'hiddenfield',
                    group: 'hiddenfield'
                },
                imagebutton: {
                    label: m.image.titleButton,
                    command: 'imagebutton',
                    group: 'imagebutton'
                },
                button: {
                    label: m.button.title,
                    command: 'button',
                    group: 'button'
                },
                select: {
                    label: m.select.title,
                    command: 'select',
                    group: 'select'
                },
                textarea: {
                    label: m.textarea.title,
                    command: 'textarea',
                    group: 'textarea'
                }
            });
            if (l.contextMenu) {
                l.contextMenu.addListener(function (p) {
                    if (p && p.hasAscendant('form', true)) return {
                        form: 2
                    };
                });
                l.contextMenu.addListener(function (p) {
                    if (p) {
                        var q = p.getName();
                        if (q == 'select') return {
                            select: 2
                        };
                        if (q == 'textarea') return {
                            textarea: 2
                        };
                        if (q == 'input') {
                            var r = p.getAttribute('type');
                            if (r == 'text' || r == 'password') return {
                                textfield: 2
                            };
                            if (r == 'button' || r == 'submit' || r == 'reset') return {
                                button: 2
                            };
                            if (r == 'checkbox') return {
                                checkbox: 2
                            };
                            if (r == 'radio') return {
                                radio: 2
                            };
                            if (r == 'image') return {
                                imagebutton: 2
                            };
                        }
                        if (q == 'img' && p.getAttribute('_cke_real_element_type') == 'hiddenfield') return {
                            hiddenfield: 2
                        };
                    }
                });
            }
        },
        afterInit: function (l) {
            if (c) {
                var m = l.dataProcessor,
                    n = m && m.htmlFilter;
                n && n.addRules({
                    elements: {
                        input: function (o) {
                            var p = o.attributes,
                                q = p.type;
                            if (q == 'checkbox' || q == 'radio') p.value == 'on' && delete p.value;
                        }
                    }
                });
            }
        },
        requires: ['image']
    });
    if (c) h.prototype.hasAttribute = function (l) {
        var o = this;
        var m = o.$.attributes.getNamedItem(l);
        if (o.getName() == 'input') switch (l) {
        case 'class':
            return o.$.className.length > 0;
        case 'checked':
            return !!o.$.checked;
        case 'value':
            var n = o.getAttribute('type');
            if (n == 'checkbox' || n == 'radio') return o.$.value != 'on';
            break;
        default:
        }
        return !!(m && m.specified);
    };
    (function () {
        var l = {
            canUndo: false,
            exec: function (n) {
                n.insertElement(n.document.createElement('hr'));
            }
        },
            m = 'horizontalrule';
        j.add(m, {
            init: function (n) {
                n.addCommand(m, l);
                n.ui.addButton('HorizontalRule', {
                    label: n.lang.horizontalrule,
                    command: m
                });
            }
        });
    })();
    (function () {
        var l = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/,
            m = '{cke_protected}';

        function n(O) {
            var P = O.children.length,
                Q = O.children[P - 1];
            while (Q && Q.type == 3 && !e.trim(Q.value)) Q = O.children[--P];
            return Q;
        };

        function o(O, P) {
            var Q = O.children,
                R = n(O);
            if (R) {
                if ((P || !c) && R.type == 1 && R.name == 'br') Q.pop();
                if (R.type == 3 && l.test(R.value)) Q.pop();
            }
        };

        function p(O) {
            var P = n(O);
            return !P || P.type == 1 && P.name == 'br';
        };

        function q(O) {
            o(O, true);
            if (p(O)) if (c) O.add(new a.htmlParser.text('\xa0'));
            else O.add(new a.htmlParser.element('br', {}));
        };

        function r(O) {
            o(O);
            if (p(O)) O.add(new a.htmlParser.text('\xa0'));
        };
        var s = f,
            t = e.extend({}, s.$block, s.$listItem, s.$tableContent);
        for (var u in t) {
            if (!('br' in s[u])) delete t[u];
        }
        delete t.pre;
        var v = {
            attributeNames: [
                [/^on/, '_cke_pa_on']
            ]
        },
            w = {
                elements: {}
            };
        for (u in t) w.elements[u] = q;
        var x = {
            elementNames: [
                [/^cke:/, ''],
                [/^\?xml:namespace$/, '']
            ],
            attributeNames: [
                [/^_cke_(saved|pa)_/, ''],
                [/^_cke.*/, ''],
                ['hidefocus', '']
            ],
            elements: {
                $: function (O) {
                    var P = O.attributes;
                    if (P) {
                        if (P.cke_temp) return false;
                        var Q = ['name', 'href', 'src'],
                            R;
                        for (var S = 0; S < Q.length; S++) {
                            R = '_cke_saved_' + Q[S];
                            R in P && delete P[Q[S]];
                        }
                    }
                    return O;
                },
                embed: function (O) {
                    var P = O.parent;
                    if (P && P.name == 'object') {
                        var Q = P.attributes.width,
                            R = P.attributes.height;
                        Q && (O.attributes.width = Q);
                        R && (O.attributes.height = R);
                    }
                },
                param: function (O) {
                    O.children = [];
                    O.isEmpty = true;
                    return O;
                },
                a: function (O) {
                    if (!(O.children.length || O.attributes.name || O.attributes._cke_saved_name)) return false;
                },
                body: function (O) {
                    delete O.attributes.spellcheck;
                    delete O.attributes.contenteditable;
                },
                style: function (O) {
                    var P = O.children[0];
                    P && P.value && (P.value = e.trim(P.value));
                    if (!O.attributes.type) O.attributes.type = 'text/css';
                },
                title: function (O) {
                    O.children[0].value = O.attributes._cke_title;
                }
            },
            attributes: {
                'class': function (O, P) {
                    return e.ltrim(O.replace(/(?:^|\s+)cke_[^\s]*/g, '')) || false;
                }
            },
            comment: function (O) {
                if (O.substr(0, m.length) == m) {
                    if (O.substr(m.length, 3) == '{C}') O = O.substr(m.length + 3);
                    else O = O.substr(m.length);
                    return new a.htmlParser.cdata(decodeURIComponent(O));
                }
                return O;
            }
        },
            y = {
                elements: {}
            };
        for (u in t) y.elements[u] = r;
        if (c) x.attributes.style = function (O, P) {
            return O.toLowerCase();
        };
        var z = /<(?:a|area|img|input)[\s\S]*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi,
            A = /(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,
            B = /<cke:encoded>([^<]*)<\/cke:encoded>/gi,
            C = /(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,
            D = /(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,
            E = /<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi;

        function F(O) {
            return O.replace(z, '$& _cke_saved_$1');
        };

        function G(O) {
            return O.replace(A, function (P) {
                return '<cke:encoded>' + encodeURIComponent(P) + '</cke:encoded>';
            });
        };

        function H(O) {
            return O.replace(B, function (P, Q) {
                return decodeURIComponent(Q);
            });
        };

        function I(O) {
            return O.replace(C, '$1cke:$2');
        };

        function J(O) {
            return O.replace(D, '$1$2');
        };

        function K(O) {
            return O.replace(E, '<cke:$1$2></cke:$1>');
        };

        function L(O) {
            return O.replace(/<!--(?!{cke_protected})[\s\S]+?-->/g, function (P) {
                return '<!--' + m + '{C}' + encodeURIComponent(P).replace(/--/g, '%2D%2D') + '-->';
            });
        };

        function M(O) {
            return O.replace(/<!--\{cke_protected\}\{C\}([\s\S]+?)-->/g, function (P, Q) {
                return decodeURIComponent(Q);
            });
        };

        function N(O, P) {
            var Q = [],
                R = /<\!--\{cke_temp(comment)?\}(\d*?)-->/g,
                S = [/<script[\s\S]*?<\/script>/gi, /<noscript[\s\S]*?<\/noscript>/gi].concat(P);
            O = O.replace(/<!--[\s\S]*?-->/g, function (U) {
                return '<!--{cke_tempcomment}' + (Q.push(U) - 1) + '-->';
            });
            for (var T = 0; T < S.length; T++) O = O.replace(S[T], function (U) {
                U = U.replace(R, function (V, W, X) {
                    return Q[X];
                });
                return '<!--{cke_temp}' + (Q.push(U) - 1) + '-->';
            });
            O = O.replace(R, function (U, V, W) {
                return '<!--' + m + (V ? '{C}' : '') + encodeURIComponent(Q[W]).replace(/--/g, '%2D%2D') + '-->';
            });
            return O;
        };
        j.add('htmldataprocessor', {
            requires: ['htmlwriter'],
            init: function (O) {
                var P = O.dataProcessor = new a.htmlDataProcessor(O);
                P.writer.forceSimpleAmpersand = O.config.forceSimpleAmpersand;
                P.dataFilter.addRules(v);
                P.dataFilter.addRules(w);
                P.htmlFilter.addRules(x);
                P.htmlFilter.addRules(y);
            }
        });
        a.htmlDataProcessor = function (O) {
            var P = this;
            P.editor = O;
            P.writer = new a.htmlWriter();
            P.dataFilter = new a.htmlParser.filter();
            P.htmlFilter = new a.htmlParser.filter();
        };
        a.htmlDataProcessor.prototype = {
            toHtml: function (O, P) {
                O = N(O, this.editor.config.protectedSource);
                O = F(O);
                O = G(O);
                O = I(O);
                O = K(O);
                var Q = new h('div');
                Q.setHtml('a' + O);
                O = Q.getHtml().substr(1);
                O = J(O);
                O = H(O);
                O = M(O);
                var R = a.htmlParser.fragment.fromHtml(O, P),
                    S = new a.htmlParser.basicWriter();
                R.writeHtml(S, this.dataFilter);
                O = S.getHtml(true);
                O = L(O);
                return O;
            },
            toDataFormat: function (O, P) {
                var Q = this.writer,
                    R = a.htmlParser.fragment.fromHtml(O, P);
                Q.reset();
                R.writeHtml(Q, this.htmlFilter);
                return Q.getHtml(true);
            }
        };
    })();
    i.forceSimpleAmpersand = false;
    j.add('image', {
        init: function (l) {
            var m = 'image';
            a.dialog.add(m, this.path + 'dialogs/image.js');
            l.addCommand(m, new a.dialogCommand(m));
            l.ui.addButton('Image', {
                label: l.lang.common.image,
                command: m
            });
            if (l.addMenuItems) l.addMenuItems({
                image: {
                    label: l.lang.image.menu,
                    command: 'image',
                    group: 'image'
                }
            });
            if (l.contextMenu) l.contextMenu.addListener(function (n, o) {
                if (!n || !n.is('img') || n.getAttribute('_cke_realelement')) return null;
                return {
                    image: 2
                };
            });
        }
    });
    i.image_removeLinkByEmptyURL = true;
    (function () {
        var l = {
            ol: 1,
            ul: 1
        };

        function m(r, s) {
            r.getCommand(this.name).setState(s);
        };

        function n(r) {
            var C = this;
            var s = r.data.path.elements,
                t, u, v = r.editor;
            for (var w = 0; w < s.length; w++) {
                if (s[w].getName() == 'li') {
                    u = s[w];
                    continue;
                }
                if (l[s[w].getName()]) {
                    t = s[w];
                    break;
                }
            }
            if (t) if (C.name == 'outdent') return m.call(C, v, 2);
            else {
                while (u && (u = u.getPrevious(d.walker.whitespaces(true)))) {
                    if (u.getName && u.getName() == 'li') return m.call(C, v, 2);
                }
                return m.call(C, v, 0);
            }
            if (!C.useIndentClasses && C.name == 'indent') return m.call(C, v, 2);
            var x = r.data.path,
                y = x.block || x.blockLimit;
            if (!y) return m.call(C, v, 0);
            if (C.useIndentClasses) {
                var z = y.$.className.match(C.classNameRegex),
                    A = 0;
                if (z) {
                    z = z[1];
                    A = C.indentClassMap[z];
                }
                if (C.name == 'outdent' && !A || C.name == 'indent' && A == v.config.indentClasses.length) return m.call(C, v, 0);
                return m.call(C, v, 2);
            } else {
                var B = parseInt(y.getStyle(C.indentCssProperty), 10);
                if (isNaN(B)) B = 0;
                if (B <= 0) return m.call(C, v, 0);
                return m.call(C, v, 2);
            }
        };

        function o(r, s, t) {
            var u = s.startContainer,
                v = s.endContainer;
            while (u && !u.getParent().equals(t)) u = u.getParent();
            while (v && !v.getParent().equals(t)) v = v.getParent();
            if (!u || !v) return;
            var w = u,
                x = [],
                y = false;
            while (!y) {
                if (w.equals(v)) y = true;
                x.push(w);
                w = w.getNext();
            }
            if (x.length < 1) return;
            var z = t.getParents(true);
            for (var A = 0; A < z.length; A++) {
                if (z[A].getName && l[z[A].getName()]) {
                    t = z[A];
                    break;
                }
            }
            var B = this.name == 'indent' ? 1 : -1,
                C = x[0],
                D = x[x.length - 1],
                E = {},
                F = j.list.listToArray(t, E),
                G = F[D.getCustomData('listarray_index')].indent;
            for (A = C.getCustomData('listarray_index'); A <= D.getCustomData('listarray_index'); A++) F[A].indent += B;
            for (A = D.getCustomData('listarray_index') + 1; A < F.length && F[A].indent > G; A++) F[A].indent += B;
            var H = j.list.arrayToList(F, E, null, r.config.enterMode, 0);
            if (this.name == 'outdent') {
                var I;
                if ((I = t.getParent()) && I.is('li')) {
                    var J = H.listNode.getChildren(),
                        K = [],
                        L = J.count(),
                        M;
                    for (A = L - 1; A >= 0; A--) {
                        if ((M = J.getItem(A)) && M.is && M.is('li')) K.push(M);
                    }
                }
            }
            if (H) H.listNode.replace(t);
            if (K && K.length) for (A = 0; A < K.length; A++) {
                var N = K[A],
                    O = N;
                while ((O = O.getNext()) && O.is && O.getName() in l) N.append(O);
                N.insertAfter(I);
            }
            h.clearAllMarkers(E);
        };

        function p(r, s) {
            var A = this;
            var t = s.createIterator(),
                u = r.config.enterMode;
            t.enforceRealBlocks = true;
            t.enlargeBr = u != 2;
            var v;
            while (v = t.getNextParagraph()) {
                if (A.useIndentClasses) {
                    var w = v.$.className.match(A.classNameRegex),
                        x = 0;
                    if (w) {
                        w = w[1];
                        x = A.indentClassMap[w];
                    }
                    if (A.name == 'outdent') x--;
                    else x++;
                    x = Math.min(x, r.config.indentClasses.length);
                    x = Math.max(x, 0);
                    var y = e.ltrim(v.$.className.replace(A.classNameRegex, ''));
                    if (x < 1) v.$.className = y;
                    else v.addClass(r.config.indentClasses[x - 1]);
                } else {
                    var z = parseInt(v.getStyle(A.indentCssProperty), 10);
                    if (isNaN(z)) z = 0;
                    z += (A.name == 'indent' ? 1 : -1) * r.config.indentOffset;
                    z = Math.max(z, 0);
                    z = Math.ceil(z / r.config.indentOffset) * r.config.indentOffset;
                    v.setStyle(A.indentCssProperty, z ? z + r.config.indentUnit : '');
                    if (v.getAttribute('style') === '') v.removeAttribute('style');
                }
            }
        };

        function q(r, s) {
            var u = this;
            u.name = s;
            u.useIndentClasses = r.config.indentClasses && r.config.indentClasses.length > 0;
            if (u.useIndentClasses) {
                u.classNameRegex = new RegExp('(?:^|\\s+)(' + r.config.indentClasses.join('|') + ')(?=$|\\s)');
                u.indentClassMap = {};
                for (var t = 0; t < r.config.indentClasses.length; t++) u.indentClassMap[r.config.indentClasses[t]] = t + 1;
            } else u.indentCssProperty = r.config.contentsLangDirection == 'ltr' ? 'margin-left' : 'margin-right';
        };
        q.prototype = {
            exec: function (r) {
                var s = r.getSelection(),
                    t = s && s.getRanges()[0];
                if (!s || !t) return;
                var u = s.createBookmarks(true),
                    v = t.getCommonAncestor();
                while (v && !(v.type == 1 && l[v.getName()])) v = v.getParent();
                if (v) o.call(this, r, t, v);
                else p.call(this, r, t);
                r.focus();
                r.forceNextSelectionCheck();
                s.selectBookmarks(u);
            }
        };
        j.add('indent', {
            init: function (r) {
                var s = new q(r, 'indent'),
                    t = new q(r, 'outdent');
                r.addCommand('indent', s);
                r.addCommand('outdent', t);
                r.ui.addButton('Indent', {
                    label: r.lang.indent,
                    command: 'indent'
                });
                r.ui.addButton('Outdent', {
                    label: r.lang.outdent,
                    command: 'outdent'
                });
                r.on('selectionChange', e.bind(n, s));
                r.on('selectionChange', e.bind(n, t));
            },
            requires: ['domiterator', 'list']
        });
    })();
    e.extend(i, {
        indentOffset: 40,
        indentUnit: 'px',
        indentClasses: null
    });
    (function () {
        var l = /(-moz-|-webkit-|start|auto)/i;

        function m(p, q) {
            var r = q.block || q.blockLimit;
            if (!r || r.getName() == 'body') return 2;
            var s = r.getComputedStyle('text-align').replace(l, '');
            if (!s && this.isDefaultAlign || s == this.value) return 1;
            return 2;
        };

        function n(p) {
            var q = p.editor.getCommand(this.name);
            q.state = m.call(this, p.editor, p.data.path);
            q.fire('state');
        };

        function o(p, q, r) {
            var u = this;
            u.name = q;
            u.value = r;
            var s = p.config.contentsLangDirection;
            u.isDefaultAlign = r == 'left' && s == 'ltr' || r == 'right' && s == 'rtl';
            var t = p.config.justifyClasses;
            if (t) {
                switch (r) {
                case 'left':
                    u.cssClassName = t[0];
                    break;
                case 'center':
                    u.cssClassName = t[1];
                    break;
                case 'right':
                    u.cssClassName = t[2];
                    break;
                case 'justify':
                    u.cssClassName = t[3];
                    break;
                }
                u.cssClassRegex = new RegExp('(?:^|\\s+)(?:' + t.join('|') + ')(?=$|\\s)');
            }
        };
        o.prototype = {
            exec: function (p) {
                var z = this;
                var q = p.getSelection(),
                    r = p.config.enterMode;
                if (!q) return;
                var s = q.createBookmarks(),
                    t = q.getRanges(),
                    u = z.cssClassName,
                    v, w;
                for (var x = t.length - 1; x >= 0; x--) {
                    v = t[x].createIterator();
                    v.enlargeBr = r != 2;
                    while (w = v.getNextParagraph()) {
                        w.removeAttribute('align');
                        if (u) {
                            var y = w.$.className = e.ltrim(w.$.className.replace(z.cssClassRegex, ''));
                            if (z.state == 2 && !z.isDefaultAlign) w.addClass(u);
                            else if (!y) w.removeAttribute('class');
                        } else if (z.state == 2 && !z.isDefaultAlign) w.setStyle('text-align', z.value);
                        else w.removeStyle('text-align');
                    }
                }
                p.focus();
                p.forceNextSelectionCheck();
                q.selectBookmarks(s);
            }
        };
        j.add('justify', {
            init: function (p) {
                var q = new o(p, 'justifyleft', 'left'),
                    r = new o(p, 'justifycenter', 'center'),
                    s = new o(p, 'justifyright', 'right'),
                    t = new o(p, 'justifyblock', 'justify');
                p.addCommand('justifyleft', q);
                p.addCommand('justifycenter', r);
                p.addCommand('justifyright', s);
                p.addCommand('justifyblock', t);
                p.ui.addButton('JustifyLeft', {
                    label: p.lang.justify.left,
                    command: 'justifyleft'
                });
                p.ui.addButton('JustifyCenter', {
                    label: p.lang.justify.center,
                    command: 'justifycenter'
                });
                p.ui.addButton('JustifyRight', {
                    label: p.lang.justify.right,
                    command: 'justifyright'
                });
                p.ui.addButton('JustifyBlock', {
                    label: p.lang.justify.block,
                    command: 'justifyblock'
                });
                p.on('selectionChange', e.bind(n, q));
                p.on('selectionChange', e.bind(n, s));
                p.on('selectionChange', e.bind(n, r));
                p.on('selectionChange', e.bind(n, t));
            },
            requires: ['domiterator']
        });
    })();
    e.extend(i, {
        justifyClasses: null
    });
    j.add('keystrokes', {
        beforeInit: function (l) {
            l.keystrokeHandler = new a.keystrokeHandler(l);
            l.specialKeys = {};
        },
        init: function (l) {
            var m = l.config.keystrokes,
                n = l.config.blockedKeystrokes,
                o = l.keystrokeHandler.keystrokes,
                p = l.keystrokeHandler.blockedKeystrokes;
            for (var q = 0; q < m.length; q++) o[m[q][0]] = m[q][1];
            for (q = 0; q < n.length; q++) p[n[q]] = 1;
        }
    });
    a.keystrokeHandler = function (l) {
        var m = this;
        if (l.keystrokeHandler) return l.keystrokeHandler;
        m.keystrokes = {};
        m.blockedKeystrokes = {};
        m._ = {
            editor: l
        };
        return m;
    };
    (function () {
        var l, m = function (o) {
            o = o.data;
            var p = o.getKeystroke(),
                q = this.keystrokes[p],
                r = this._.editor;
            l = r.fire('key', {
                keyCode: p
            }) === true;
            if (!l) {
                if (q) {
                    var s = {
                        from: 'keystrokeHandler'
                    };
                    l = r.execCommand(q, s) !== false;
                }
                if (!l) {
                    var t = r.specialKeys[p];
                    l = t && t(r) === true;
                    if (!l) l = !! this.blockedKeystrokes[p];
                }
            }
            if (l) o.preventDefault(true);
            return !l;
        },
            n = function (o) {
                if (l) {
                    l = false;
                    o.data.preventDefault(true);
                }
            };
        a.keystrokeHandler.prototype = {
            attach: function (o) {
                o.on('keydown', m, this);
                if (b.opera || b.gecko && b.mac) o.on('keypress', n, this);
            }
        };
    })();
    i.blockedKeystrokes = [1000 + 66, 1000 + 73, 1000 + 85];
    i.keystrokes = [
        [4000 + 121, 'toolbarFocus'],
        [4000 + 122, 'elementsPathFocus'],
        [2000 + 121, 'contextMenu'],
        [1000 + 2000 + 121, 'contextMenu'],
        [1000 + 90, 'undo'],
        [1000 + 89, 'redo'],
        [1000 + 2000 + 90, 'redo'],
        [1000 + 76, 'link'],
        [1000 + 66, 'bold'],
        [1000 + 73, 'italic'],
        [1000 + 85, 'underline'],
        [4000 + 109, 'toolbarCollapse'],
        [4000 + 48, 'a11yHelp']
    ];
    j.add('link', {
        init: function (l) {
            l.addCommand('link', new a.dialogCommand('link'));
            l.addCommand('anchor', new a.dialogCommand('anchor'));
            l.addCommand('unlink', new a.unlinkCommand());
            l.ui.addButton('Link', {
                label: l.lang.link.toolbar,
                command: 'link'
            });
            l.ui.addButton('Unlink', {
                label: l.lang.unlink,
                command: 'unlink'
            });
            l.ui.addButton('Anchor', {
                label: l.lang.anchor.toolbar,
                command: 'anchor'
            });
            a.dialog.add('link', this.path + 'dialogs/link.js');
            a.dialog.add('anchor', this.path + 'dialogs/anchor.js');
            l.addCss('img.cke_anchor{background-image: url(' + a.getUrl(this.path + 'images/anchor.gif') + ');' + 'background-position: center center;' + 'background-repeat: no-repeat;' + 'border: 1px solid #a9a9a9;' + 'width: 18px;' + 'height: 18px;' + '}\n' + 'a.cke_anchor' + '{' + 'background-image: url(' + a.getUrl(this.path + 'images/anchor.gif') + ');' + 'background-position: 0 center;' + 'background-repeat: no-repeat;' + 'border: 1px solid #a9a9a9;' + 'padding-left: 18px;' + '}');
            l.on('selectionChange', function (m) {
                var n = l.getCommand('unlink'),
                    o = m.data.path.lastElement.getAscendant('a', true);
                if (o && o.getName() == 'a' && o.getAttribute('href')) n.setState(2);
                else n.setState(0);
            });
            if (l.addMenuItems) l.addMenuItems({
                anchor: {
                    label: l.lang.anchor.menu,
                    command: 'anchor',
                    group: 'anchor'
                },
                link: {
                    label: l.lang.link.menu,
                    command: 'link',
                    group: 'link',
                    order: 1
                },
                unlink: {
                    label: l.lang.unlink,
                    command: 'unlink',
                    group: 'link',
                    order: 5
                }
            });
            if (l.contextMenu) l.contextMenu.addListener(function (m, n) {
                if (!m) return null;
                var o = m.is('img') && m.getAttribute('_cke_real_element_type') == 'anchor';
                if (!o) {
                    if (!(m = m.getAscendant('a', true))) return null;
                    o = m.getAttribute('name') && !m.getAttribute('href');
                }
                return o ? {
                    anchor: 2
                } : {
                    link: 2,
                    unlink: 2
                };
            });
        },
        afterInit: function (l) {
            var m = l.dataProcessor,
                n = m && m.dataFilter;
            if (n) n.addRules({
                elements: {
                    a: function (o) {
                        var p = o.attributes;
                        if (p.name && !p.href) return l.createFakeParserElement(o, 'cke_anchor', 'anchor');
                    }
                }
            });
        },
        requires: ['fakeobjects']
    });
    a.unlinkCommand = function () {};
    a.unlinkCommand.prototype = {
        exec: function (l) {
            var m = l.getSelection(),
                n = m.createBookmarks(),
                o = m.getRanges(),
                p, q;
            for (var r = 0; r < o.length; r++) {
                p = o[r].getCommonAncestor(true);
                q = p.getAscendant('a', true);
                if (!q) continue;
                o[r].selectNodeContents(q);
            }
            m.selectRanges(o);
            l.document.$.execCommand('unlink', false, null);
            m.selectBookmarks(n);
        }
    };
    e.extend(i, {
        linkShowAdvancedTab: true,
        linkShowTargetTab: true
    });
    (function () {
        var l = {
            ol: 1,
            ul: 1
        },
            m = /^[\n\r\t ]*$/;
        j.list = {
            listToArray: function (A, B, C, D, E) {
                if (!l[A.getName()]) return [];
                if (!D) D = 0;
                if (!C) C = [];
                for (var F = 0, G = A.getChildCount(); F < G; F++) {
                    var H = A.getChild(F);
                    if (H.$.nodeName.toLowerCase() != 'li') continue;
                    var I = {
                        parent: A,
                        indent: D,
                        contents: []
                    };
                    if (!E) {
                        I.grandparent = A.getParent();
                        if (I.grandparent && I.grandparent.$.nodeName.toLowerCase() == 'li') I.grandparent = I.grandparent.getParent();
                    } else I.grandparent = E;
                    if (B) h.setMarker(B, H, 'listarray_index', C.length);
                    C.push(I);
                    for (var J = 0, K = H.getChildCount(); J < K; J++) {
                        var L = H.getChild(J);
                        if (L.type == 1 && l[L.getName()]) j.list.listToArray(L, B, C, D + 1, I.grandparent);
                        else I.contents.push(L);
                    }
                }
                return C;
            },
            arrayToList: function (A, B, C, D) {
                if (!C) C = 0;
                if (!A || A.length < C + 1) return null;
                var E = A[C].parent.getDocument(),
                    F = new d.documentFragment(E),
                    G = null,
                    H = C,
                    I = Math.max(A[C].indent, 0),
                    J = null,
                    K = D == 1 ? 'p' : 'div';
                for (;;) {
                    var L = A[H];
                    if (L.indent == I) {
                        if (!G || A[H].parent.getName() != G.getName()) {
                            G = A[H].parent.clone(false, true);
                            F.append(G);
                        }
                        J = G.append(E.createElement('li'));
                        for (var M = 0; M < L.contents.length; M++) J.append(L.contents[M].clone(true, true));
                        H++;
                    } else if (L.indent == Math.max(I, 0) + 1) {
                        var N = j.list.arrayToList(A, null, H, D);
                        J.append(N.listNode);
                        H = N.nextIndex;
                    } else if (L.indent == -1 && !C && L.grandparent) {
                        J;
                        if (l[L.grandparent.getName()]) J = E.createElement('li');
                        else if (D != 2 && L.grandparent.getName() != 'td') J = E.createElement(K);
                        else J = new d.documentFragment(E);
                        for (M = 0; M < L.contents.length; M++) J.append(L.contents[M].clone(true, true));
                        if (J.type == 11 && H != A.length - 1) {
                            if (J.getLast() && J.getLast().type == 1 && J.getLast().getAttribute('type') == '_moz') J.getLast().remove();
                            J.appendBogus();
                        }
                        if (J.type == 1 && J.getName() == K && J.$.firstChild) {
                            J.trim();
                            var O = J.getFirst();
                            if (O.type == 1 && O.isBlockBoundary()) {
                                var P = new d.documentFragment(E);
                                J.moveChildren(P);
                                J = P;
                            }
                        }
                        var Q = J.$.nodeName.toLowerCase();
                        if (!c && (Q == 'div' || Q == 'p')) J.appendBogus();
                        F.append(J);
                        G = null;
                        H++;
                    } else return null;
                    if (A.length <= H || Math.max(A[H].indent, 0) < I) break;
                }
                if (B) {
                    var R = F.getFirst();
                    while (R) {
                        if (R.type == 1) h.clearMarkers(B, R);
                        R = R.getNextSourceNode();
                    }
                }
                return {
                    listNode: F,
                    nextIndex: H
                };
            }
        };

        function n(A, B) {
            A.getCommand(this.name).setState(B);
        };

        function o(A) {
            var B = A.data.path,
                C = B.blockLimit,
                D = B.elements,
                E;
            for (var F = 0; F < D.length && (E = D[F]) && !E.equals(C); F++) {
                if (l[D[F].getName()]) return n.call(this, A.editor, this.type == D[F].getName() ? 1 : 2);
            }
            return n.call(this, A.editor, 2);
        };

        function p(A, B, C, D) {
            var E = j.list.listToArray(B.root, C),
                F = [];
            for (var G = 0; G < B.contents.length; G++) {
                var H = B.contents[G];
                H = H.getAscendant('li', true);
                if (!H || H.getCustomData('list_item_processed')) continue;
                F.push(H);
                h.setMarker(C, H, 'list_item_processed', true);
            }
            var I = B.root.getDocument().createElement(this.type);
            for (G = 0; G < F.length; G++) {
                var J = F[G].getCustomData('listarray_index');
                E[J].parent = I;
            }
            var K = j.list.arrayToList(E, C, null, A.config.enterMode),
                L, M = K.listNode.getChildCount();
            for (G = 0; G < M && (L = K.listNode.getChild(G)); G++) {
                if (L.getName() == this.type) D.push(L);
            }
            K.listNode.replace(B.root);
        };

        function q(A, B, C) {
            var D = B.contents,
                E = B.root.getDocument(),
                F = [];
            if (D.length == 1 && D[0].equals(B.root)) {
                var G = E.createElement('div');
                D[0].moveChildren && D[0].moveChildren(G);
                D[0].append(G);
                D[0] = G;
            }
            var H = B.contents[0].getParent();
            for (var I = 0; I < D.length; I++) H = H.getCommonAncestor(D[I].getParent());
            for (I = 0; I < D.length; I++) {
                var J = D[I],
                    K;
                while (K = J.getParent()) {
                    if (K.equals(H)) {
                        F.push(J);
                        break;
                    }
                    J = K;
                }
            }
            if (F.length < 1) return;
            var L = F[F.length - 1].getNext(),
                M = E.createElement(this.type);
            C.push(M);
            while (F.length) {
                var N = F.shift(),
                    O = E.createElement('li');
                N.moveChildren(O);
                N.remove();
                O.appendTo(M);
                if (!c) O.appendBogus();
            }
            if (L) M.insertBefore(L);
            else M.appendTo(H);
        };

        function r(A, B, C) {
            var D = j.list.listToArray(B.root, C),
                E = [];
            for (var F = 0; F < B.contents.length; F++) {
                var G = B.contents[F];
                G = G.getAscendant('li', true);
                if (!G || G.getCustomData('list_item_processed')) continue;
                E.push(G);
                h.setMarker(C, G, 'list_item_processed', true);
            }
            var H = null;
            for (F = 0; F < E.length; F++) {
                var I = E[F].getCustomData('listarray_index');
                D[I].indent = -1;
                H = I;
            }
            for (F = H + 1; F < D.length; F++) {
                if (D[F].indent > D[F - 1].indent + 1) {
                    var J = D[F - 1].indent + 1 - D[F].indent,
                        K = D[F].indent;
                    while (D[F] && D[F].indent >= K) {
                        D[F].indent += J;
                        F++;
                    }
                    F--;
                }
            }
            var L = j.list.arrayToList(D, C, null, A.config.enterMode),
                M = L.listNode,
                N, O;

            function P(Q) {
                if ((N = M[Q ? 'getFirst' : 'getLast']()) && !(N.is && N.isBlockBoundary()) && (O = B.root[Q ? 'getPrevious' : 'getNext'](d.walker.whitespaces(true))) && !(O.is && O.isBlockBoundary({
                    br: 1
                }))) A.document.createElement('br')[Q ? 'insertBefore' : 'insertAfter'](N);
            };
            P(true);
            P();
            M.replace(B.root);
        };

        function s(A, B) {
            this.name = A;
            this.type = B;
        };
        s.prototype = {
            exec: function (A) {
                A.focus();
                var B = A.document,
                    C = A.getSelection(),
                    D = C && C.getRanges();
                if (!D || D.length < 1) return;
                if (this.state == 2) {
                    var E = B.getBody();
                    E.trim();
                    if (!E.getFirst()) {
                        var F = B.createElement(A.config.enterMode == 1 ? 'p' : A.config.enterMode == 3 ? 'div' : 'br');
                        F.appendTo(E);
                        D = [new d.range(B)];
                        if (F.is('br')) {
                            D[0].setStartBefore(F);
                            D[0].setEndAfter(F);
                        } else D[0].selectNodeContents(F);
                        C.selectRanges(D);
                    } else {
                        var G = D.length == 1 && D[0],
                            H = G && G.getEnclosedNode();
                        if (H && H.is && this.type == H.getName()) n.call(this, A, 1);
                    }
                }
                var I = C.createBookmarks(true),
                    J = [],
                    K = {};
                while (D.length > 0) {
                    G = D.shift();
                    var L = G.getBoundaryNodes(),
                        M = L.startNode,
                        N = L.endNode;
                    if (M.type == 1 && M.getName() == 'td') G.setStartAt(L.startNode, 1);
                    if (N.type == 1 && N.getName() == 'td') G.setEndAt(L.endNode, 2);
                    var O = G.createIterator(),
                        P;
                    O.forceBrBreak = this.state == 2;
                    while (P = O.getNextParagraph()) {
                        var Q = new d.elementPath(P),
                            R = Q.elements,
                            S = R.length,
                            T = null,
                            U = false,
                            V = Q.blockLimit,
                            W;
                        for (var X = S - 1; X >= 0 && (W = R[X]); X--) {
                            if (l[W.getName()] && V.contains(W)) {
                                V.removeCustomData('list_group_object');
                                var Y = W.getCustomData('list_group_object');
                                if (Y) Y.contents.push(P);
                                else {
                                    Y = {
                                        root: W,
                                        contents: [P]
                                    };
                                    J.push(Y);
                                    h.setMarker(K, W, 'list_group_object', Y);
                                }
                                U = true;
                                break;
                            }
                        }
                        if (U) continue;
                        var Z = V;
                        if (Z.getCustomData('list_group_object')) Z.getCustomData('list_group_object').contents.push(P);
                        else {
                            Y = {
                                root: Z,
                                contents: [P]
                            };
                            h.setMarker(K, Z, 'list_group_object', Y);
                            J.push(Y);
                        }
                    }
                }
                var aa = [];
                while (J.length > 0) {
                    Y = J.shift();
                    if (this.state == 2) {
                        if (l[Y.root.getName()]) p.call(this, A, Y, K, aa);
                        else q.call(this, A, Y, aa);
                    } else if (this.state == 1 && l[Y.root.getName()]) r.call(this, A, Y, K);
                }
                for (X = 0; X < aa.length; X++) {
                    T = aa[X];
                    var ab, ac = this;
                    (ab = function (ad) {
                        var ae = T[ad ? 'getPrevious' : 'getNext'](d.walker.whitespaces(true));
                        if (ae && ae.getName && ae.getName() == ac.type) {
                            ae.remove();
                            ae.moveChildren(T, ad ? true : false);
                        }
                    })();
                    ab(true);
                }
                h.clearAllMarkers(K);
                C.selectBookmarks(I);
                A.focus();
            }
        };
        var t = f,
            u = /[\t\r\n ]*(?:&nbsp;|\xa0)$/;

        function v(A, B) {
            var C, D = A.children,
                E = D.length;
            for (var F = 0; F < E; F++) {
                C = D[F];
                if (C.name && C.name in B) return F;
            }
            return E;
        };

        function w(A) {
            return function (B) {
                var C = B.children,
                    D = v(B, t.$list),
                    E = C[D],
                    F = E && E.previous,
                    G;
                if (F && (F.name && F.name == 'br' || F.value && (G = F.value.match(u)))) {
                    var H = F;
                    if (!(G && G.index) && H == C[0]) C[0] = A || c ? new a.htmlParser.text('\xa0') : new a.htmlParser.element('br', {});
                    else if (H.name == 'br') C.splice(D - 1, 1);
                    else H.value = H.value.replace(u, '');
                }
            };
        };
        var x = {
            elements: {}
        };
        for (var y in t.$listItem) x.elements[y] = w();
        var z = {
            elements: {}
        };
        for (y in t.$listItem) z.elements[y] = w(true);
        j.add('list', {
            init: function (A) {
                var B = new s('numberedlist', 'ol'),
                    C = new s('bulletedlist', 'ul');
                A.addCommand('numberedlist', B);
                A.addCommand('bulletedlist', C);
                A.ui.addButton('NumberedList', {
                    label: A.lang.numberedlist,
                    command: 'numberedlist'
                });
                A.ui.addButton('BulletedList', {
                    label: A.lang.bulletedlist,
                    command: 'bulletedlist'
                });
                A.on('selectionChange', e.bind(o, B));
                A.on('selectionChange', e.bind(o, C));
            },
            afterInit: function (A) {
                var B = A.dataProcessor;
                if (B) {
                    B.dataFilter.addRules(x);
                    B.htmlFilter.addRules(z);
                }
            },
            requires: ['domiterator']
        });
    })();
    (function () {
        function l(q) {
            if (!q || q.type != 1 || q.getName() != 'form') return [];
            var r = [],
                s = ['style', 'className'];
            for (var t = 0; t < s.length; t++) {
                var u = s[t],
                    v = q.$.elements.namedItem(u);
                if (v) {
                    var w = new h(v);
                    r.push([w, w.nextSibling]);
                    w.remove();
                }
            }
            return r;
        };

        function m(q, r) {
            if (!q || q.type != 1 || q.getName() != 'form') return;
            if (r.length > 0) for (var s = r.length - 1; s >= 0; s--) {
                var t = r[s][0],
                    u = r[s][1];
                if (u) t.insertBefore(u);
                else t.appendTo(q);
            }
        };

        function n(q, r) {
            var s = l(q),
                t = {},
                u = q.$;
            if (!r) {
                t['class'] = u.className || '';
                u.className = '';
            }
            t.inline = u.style.cssText || '';
            if (!r) u.style.cssText = 'position: static; overflow: visible';
            m(s);
            return t;
        };

        function o(q, r) {
            var s = l(q),
                t = q.$;
            if ('class' in r) t.className = r['class'];
            if ('inline' in r) t.style.cssText = r.inline;
            m(s);
        };

        function p(q, r) {
            return function () {
                var s = q.getViewPaneSize();
                r.resize(s.width, s.height, null, true);
            };
        };
        j.add('maximize', {
            init: function (q) {
                var r = q.lang,
                    s = a.document,
                    t = s.getWindow(),
                    u, v, w, x = p(t, q),
                    y = 2;
                q.addCommand('maximize', {
                    modes: {
                        wysiwyg: 1,
                        source: 1
                    },
                    editorFocus: false,
                    exec: function () {
                        var z = q.container.getChild(1),
                            A = q.getThemeSpace('contents');
                        if (q.mode == 'wysiwyg') {
                            var B = q.getSelection();
                            u = B && B.getRanges();
                            v = t.getScrollPosition();
                        } else {
                            var C = q.textarea.$;
                            u = !c && [C.selectionStart, C.selectionEnd];
                            v = [C.scrollLeft, C.scrollTop];
                        }
                        if (this.state == 2) {
                            t.on('resize', x);
                            w = t.getScrollPosition();
                            var D = q.container;
                            while (D = D.getParent()) {
                                D.setCustomData('maximize_saved_styles', n(D));
                                D.setStyle('z-index', q.config.baseFloatZIndex - 1);
                            }
                            A.setCustomData('maximize_saved_styles', n(A, true));
                            z.setCustomData('maximize_saved_styles', n(z, true));
                            if (c) s.$.documentElement.style.overflow = s.getBody().$.style.overflow = 'hidden';
                            else s.getBody().setStyles({
                                overflow: 'hidden',
                                width: '0px',
                                height: '0px'
                            });
                            c ? setTimeout(function () {
                                t.$.scrollTo(0, 0);
                            }, 0) : t.$.scrollTo(0, 0);
                            var E = t.getViewPaneSize();
                            z.setStyle('position', 'absolute');
                            z.$.offsetLeft;
                            z.setStyles({
                                'z-index': q.config.baseFloatZIndex - 1,
                                left: '0px',
                                top: '0px'
                            });
                            q.resize(E.width, E.height, null, true);
                            var F = z.getDocumentPosition();
                            z.setStyles({
                                left: -1 * F.x + 'px',
                                top: -1 * F.y + 'px'
                            });
                            z.addClass('cke_maximized');
                        } else if (this.state == 1) {
                            t.removeListener('resize', x);
                            var G = [A, z];
                            for (var H = 0; H < G.length; H++) {
                                o(G[H], G[H].getCustomData('maximize_saved_styles'));
                                G[H].removeCustomData('maximize_saved_styles');
                            }
                            D = q.container;
                            while (D = D.getParent()) {
                                o(D, D.getCustomData('maximize_saved_styles'));
                                D.removeCustomData('maximize_saved_styles');
                            }
                            c ? setTimeout(function () {
                                t.$.scrollTo(w.x, w.y);
                            }, 0) : t.$.scrollTo(w.x, w.y);
                            z.removeClass('cke_maximized');
                            q.fire('resize');
                        }
                        this.toggleState();
                        var I = this.uiItems[0],
                            J = this.state == 2 ? r.maximize : r.minimize,
                            K = q.element.getDocument().getById(I._.id);
                        K.getChild(1).setHtml(J);
                        K.setAttribute('title', J);
                        K.setAttribute('href', 'javascript:void("' + J + '");');
                        if (q.mode == 'wysiwyg') {
                            if (u) {
                                q.getSelection().selectRanges(u);
                                var L = q.getSelection().getStartElement();
                                L && L.scrollIntoView(true);
                            } else t.$.scrollTo(v.x, v.y);
                        } else {
                            if (u) {
                                C.selectionStart = u[0];
                                C.selectionEnd = u[1];
                            }
                            C.scrollLeft = v[0];
                            C.scrollTop = v[1];
                        }
                        u = v = null;
                        y = this.state;
                    },
                    canUndo: false
                });
                q.ui.addButton('Maximize', {
                    label: r.maximize,
                    command: 'maximize'
                });
                q.on('mode', function () {
                    q.getCommand('maximize').setState(y);
                }, null, null, 100);
            }
        });
    })();
    j.add('newpage', {
        init: function (l) {
            l.addCommand('newpage', {
                modes: {
                    wysiwyg: 1,
                    source: 1
                },
                exec: function (m) {
                    var n = this;
                    m.setData(m.config.newpage_html, function () {
                        setTimeout(function () {
                            m.fire('afterCommandExec', {
                                name: n.name,
                                command: n
                            });
                        }, 200);
                    });
                    m.focus();
                },
                async: true
            });
            l.ui.addButton('NewPage', {
                label: l.lang.newPage,
                command: 'newpage'
            });
        }
    });
    i.newpage_html = '';
    j.add('pagebreak', {
        init: function (l) {
            l.addCommand('pagebreak', j.pagebreakCmd);
            l.ui.addButton('PageBreak', {
                label: l.lang.pagebreak,
                command: 'pagebreak'
            });
            l.addCss('img.cke_pagebreak{background-image: url(' + a.getUrl(this.path + 'images/pagebreak.gif') + ');' + 'background-position: center center;' + 'background-repeat: no-repeat;' + 'clear: both;' + 'display: block;' + 'float: none;' + 'width: 100%;' + 'border-top: #999999 1px dotted;' + 'border-bottom: #999999 1px dotted;' + 'height: 5px;' + 'page-break-after: always;' + '}');
        },
        afterInit: function (l) {
            var m = l.dataProcessor,
                n = m && m.dataFilter;
            if (n) n.addRules({
                elements: {
                    div: function (o) {
                        var p = o.attributes,
                            q = p && p.style,
                            r = q && o.children.length == 1 && o.children[0],
                            s = r && r.name == 'span' && r.attributes.style;
                        if (s && /page-break-after\s*:\s*always/i.test(q) && /display\s*:\s*none/i.test(s)) return l.createFakeParserElement(o, 'cke_pagebreak', 'div');
                    }
                }
            });
        },
        requires: ['fakeobjects']
    });
    j.pagebreakCmd = {
        exec: function (l) {
            var m = h.createFromHtml('<div style="page-break-after: always;"><span style="display: none;">&nbsp;</span></div>');
            m = l.createFakeElement(m, 'cke_pagebreak', 'div');
            var n = l.getSelection().getRanges();
            for (var o, p = 0; p < n.length; p++) {
                o = n[p];
                if (p > 0) m = m.clone(true);
                o.splitBlock('p');
                o.insertNode(m);
            }
        }
    };
    (function () {
        j.add('pastefromword', {
            init: function (l) {
                var m = 0,
                    n = function () {
                        setTimeout(function () {
                            m = 0;
                        }, 0);
                    };
                l.addCommand('pastefromword', {
                    canUndo: false,
                    exec: function () {
                        m = 1;
                        if (l.execCommand('paste') === false) l.on('dialogHide', function (o) {
                            o.removeListener();
                            n();
                        });
                    }
                });
                l.ui.addButton('PasteFromWord', {
                    label: l.lang.pastefromword.toolbar,
                    command: 'pastefromword'
                });
                l.on('paste', function (o) {
                    var p = o.data,
                        q;
                    if ((q = p.html) && (m || /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(q))) {
                        var r = this.loadFilterRules(function () {
                            if (r) l.fire('paste', p);
                            else if (!l.config.pasteFromWordPromptCleanup || m || confirm(l.lang.pastefromword.confirmCleanup)) p.html = a.cleanWord(q, l);
                        });
                        r && o.cancel();
                    }
                }, this);
            },
            loadFilterRules: function (l) {
                var m = a.cleanWord;
                if (m) l();
                else {
                    var n = a.getUrl(i.pasteFromWordCleanupFile || this.path + 'filter/default.js');
                    a.scriptLoader.load(n, l, null, false, true);
                }
                return !m;
            }
        });
    })();
    (function () {
        var l = {
            exec: function (o) {
                var p = e.tryThese(function () {
                    var q = window.clipboardData.getData('Text');
                    if (!q) throw 0;
                    return q;
                }, function () {
                    window.netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                    var q = window.Components.classes['@mozilla.org/widget/clipboard;1'].getService(window.Components.interfaces.nsIClipboard),
                        r = window.Components.classes['@mozilla.org/widget/transferable;1'].createInstance(window.Components.interfaces.nsITransferable);
                    r.addDataFlavor('text/unicode');
                    q.getData(r, q.kGlobalClipboard);
                    var s = {},
                        t = {},
                        u;
                    r.getTransferData('text/unicode', s, t);
                    s = s.value.QueryInterface(window.Components.interfaces.nsISupportsString);
                    u = s.data.substring(0, t.value / 2);
                    return u;
                });
                if (!p) {
                    o.openDialog('pastetext');
                    return false;
                } else o.fire('paste', {
                    text: p
                });
                return true;
            }
        };

        function m(o, p) {
            if (c) {
                var q = o.selection;
                if (q.type == 'Control') q.clear();
                q.createRange().pasteHTML(p);
            } else o.execCommand('inserthtml', false, p);
        };
        j.add('pastetext', {
            init: function (o) {
                var p = 'pastetext',
                    q = o.addCommand(p, l);
                o.ui.addButton('PasteText', {
                    label: o.lang.pasteText.button,
                    command: p
                });
                a.dialog.add(p, a.getUrl(this.path + 'dialogs/pastetext.js'));
                if (o.config.forcePasteAsPlainText) o.on('beforeCommandExec', function (r) {
                    if (r.data.name == 'paste') {
                        o.execCommand('pastetext');
                        r.cancel();
                    }
                }, null, null, 0);
            },
            requires: ['clipboard']
        });

        function n(o, p, q, r) {
            while (q--) j.enterkey[p == 2 ? 'enterBr' : 'enterBlock'](o, p, null, r);
        };
        a.editor.prototype.insertText = function (o) {
            this.focus();
            this.fire('saveSnapshot');
            var p = this.getSelection().getStartElement().hasAscendant('pre', true) ? 2 : this.config.enterMode,
                q = p == 2,
                r = this.document.$,
                s = this,
                t;
            o = e.htmlEncode(o.replace(/\r\n|\r/g, '\n'));
            var u = 0;
            o.replace(/\n+/g, function (v, w) {
                t = o.substring(u, w);
                u = w + v.length;
                t.length && m(r, t);
                var x = v.length,
                    y = q ? 0 : Math.floor(x / 2),
                    z = q ? x : x % 2;
                n(s, p, y);
                n(s, 2, z, q ? false : true);
            });
            t = o.substring(u, o.length);
            t.length && m(r, t);
            this.fire('saveSnapshot');
        };
    })();
    j.add('popup');
    e.extend(a.editor.prototype, {
        popup: function (l, m, n) {
            m = m || '80%';
            n = n || '70%';
            if (typeof m == 'string' && m.length > 1 && m.substr(m.length - 1, 1) == '%') m = parseInt(window.screen.width * parseInt(m, 10) / 100, 10);
            if (typeof n == 'string' && n.length > 1 && n.substr(n.length - 1, 1) == '%') n = parseInt(window.screen.height * parseInt(n, 10) / 100, 10);
            if (m < 640) m = 640;
            if (n < 420) n = 420;
            var o = parseInt((window.screen.height - n) / 2, 10),
                p = parseInt((window.screen.width - m) / 2, 10),
                q = 'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,width=' + m + ',height=' + n + ',top=' + o + ',left=' + p,
                r = window.open('', null, q, true);
            if (!r) return false;
            try {
                r.moveTo(p, o);
                r.resizeTo(m, n);
                r.focus();
                r.location.href = l;
            } catch (s) {
                r = window.open(l, null, q, true);
            }
            return true;
        }
    });
    (function () {
        var l = {
            modes: {
                wysiwyg: 1,
                source: 1
            },
            canUndo: false,
            exec: function (n) {
                var o, p = n.config,
                    q = p.baseHref ? '<base href="' + p.baseHref + '"/>' : '',
                    r = b.isCustomDomain();
                if (p.fullPage) o = n.getData().replace(/<head>/, '$&' + q).replace(/[^>]*(?=<\/title>)/, n.lang.preview);
                else {
                    var s = '<body ',
                        t = n.document && n.document.getBody();
                    if (t) {
                        if (t.getAttribute('id')) s += 'id="' + t.getAttribute('id') + '" ';
                        if (t.getAttribute('class')) s += 'class="' + t.getAttribute('class') + '" ';
                    }
                    s += '>';
                    o = n.config.docType + '<html dir="' + n.config.contentsLangDirection + '">' + '<head>' + q + '<title>' + n.lang.preview + '</title>' + e.buildStyleHtml(n.config.contentsCss) + '</head>' + s + n.getData() + '</body></html>';
                }
                var u = 640,
                    v = 420,
                    w = 80;
                try {
                    var x = window.screen;
                    u = Math.round(x.width * 0.8);
                    v = Math.round(x.height * 0.7);
                    w = Math.round(x.width * 0.1);
                } catch (A) {}
                var y = '';
                if (r) {
                    window._cke_htmlToLoad = o;
                    y = 'javascript:void( (function(){document.open();document.domain="' + document.domain + '";' + 'document.write( window.opener._cke_htmlToLoad );' + 'document.close();' + 'window.opener._cke_htmlToLoad = null;' + '})() )';
                }
                var z = window.open(y, null, 'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=' + u + ',height=' + v + ',left=' + w);
                if (!r) {
                    z.document.open();
                    z.document.write(o);
                    z.document.close();
                }
            }
        },
            m = 'preview';
        j.add(m, {
            init: function (n) {
                n.addCommand(m, l);
                n.ui.addButton('Preview', {
                    label: n.lang.preview,
                    command: m
                });
            }
        });
    })();
    j.add('print', {
        init: function (l) {
            var m = 'print',
                n = l.addCommand(m, j.print);
            l.ui.addButton('Print', {
                label: l.lang.print,
                command: m
            });
        }
    });
    j.print = {
        exec: function (l) {
            if (b.opera) return;
            else if (b.gecko) l.window.$.print();
            else l.document.$.execCommand('Print');
        },
        canUndo: false,
        modes: {
            wysiwyg: !b.opera
        }
    };
    j.add('removeformat', {
        requires: ['selection'],
        init: function (l) {
            l.addCommand('removeFormat', j.removeformat.commands.removeformat);
            l.ui.addButton('RemoveFormat', {
                label: l.lang.removeFormat,
                command: 'removeFormat'
            });
        }
    });
    j.removeformat = {
        commands: {
            removeformat: {
                exec: function (l) {
                    var m = l._.removeFormatRegex || (l._.removeFormatRegex = new RegExp('^(?:' + l.config.removeFormatTags.replace(/,/g, '|') + ')$', 'i')),
                        n = l._.removeAttributes || (l._.removeAttributes = l.config.removeFormatAttributes.split(',')),
                        o = l.getSelection().getRanges();
                    for (var p = 0, q; q = o[p]; p++) {
                        if (q.collapsed) continue;
                        q.enlarge(1);
                        var r = q.createBookmark(),
                            s = r.startNode,
                            t = r.endNode,
                            u = function (x) {
                                var y = new d.elementPath(x),
                                    z = y.elements;
                                for (var A = 1, B; B = z[A]; A++) {
                                    if (B.equals(y.block) || B.equals(y.blockLimit)) break;
                                    if (m.test(B.getName())) x.breakParent(B);
                                }
                            };
                        u(s);
                        u(t);
                        var v = s.getNextSourceNode(true, 1);
                        while (v) {
                            if (v.equals(t)) break;
                            var w = v.getNextSourceNode(false, 1);
                            if (!(v.getName() == 'img' && v.getAttribute('_cke_realelement'))) if (m.test(v.getName())) v.remove(true);
                            else v.removeAttributes(n);
                            v = w;
                        }
                        q.moveToBookmark(r);
                    }
                    l.getSelection().selectRanges(o);
                }
            }
        }
    };
    i.removeFormatTags = 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var';
    i.removeFormatAttributes = 'class,style,lang,width,height,align,hspace,valign';
    j.add('resize', {
        init: function (l) {
            var m = l.config;
            if (m.resize_enabled) {
                var n = null,
                    o, p;

                function q(t) {
                    var u = t.data.$.screenX - o.x,
                        v = t.data.$.screenY - o.y,
                        w = p.width + u * (l.lang.dir == 'rtl' ? -1 : 1),
                        x = p.height + v;
                    l.resize(Math.max(m.resize_minWidth, Math.min(w, m.resize_maxWidth)), Math.max(m.resize_minHeight, Math.min(x, m.resize_maxHeight)));
                };

                function r(t) {
                    a.document.removeListener('mousemove', q);
                    a.document.removeListener('mouseup', r);
                    if (l.document) {
                        l.document.removeListener('mousemove', q);
                        l.document.removeListener('mouseup', r);
                    }
                };
                var s = e.addFunction(function (t) {
                    if (!n) n = l.getResizable();
                    p = {
                        width: n.$.offsetWidth || 0,
                        height: n.$.offsetHeight || 0
                    };
                    o = {
                        x: t.screenX,
                        y: t.screenY
                    };
                    a.document.on('mousemove', q);
                    a.document.on('mouseup', r);
                    if (l.document) {
                        l.document.on('mousemove', q);
                        l.document.on('mouseup', r);
                    }
                });
                l.on('themeSpace', function (t) {
                    if (t.data.space == 'bottom') t.data.html += '<div class="cke_resizer" title="' + e.htmlEncode(l.lang.resize) + '"' + ' onmousedown="CKEDITOR.tools.callFunction(' + s + ', event)"' + '></div>';
                }, l, null, 100);
            }
        }
    });
    i.resize_minWidth = 750;
    i.resize_minHeight = 250;
    i.resize_maxWidth = 3000;
    i.resize_maxHeight = 3000;
    i.resize_enabled = true;
    (function () {
        var l = {
            modes: {
                wysiwyg: 1,
                source: 1
            },
            exec: function (n) {
                var o = n.element.$.form;
                if (o) try {
                    o.submit();
                } catch (p) {
                    if (o.submit.click) o.submit.click();
                }
            }
        },
            m = 'save';
        j.add(m, {
            init: function (n) {
                var o = n.addCommand(m, l);
                o.modes = {
                    wysiwyg: !! n.element.$.form
                };
                n.ui.addButton('Save', {
                    label: n.lang.save,
                    command: m
                });
            }
        });
    })();
    (function () {
        var l = 'scaytcheck',
            m = '',
            n = null;

        function o(t, u) {
            var v = false,
                w;
            for (w in u) {
                if (u[w] === t || u[w] == t) {
                    v = true;
                    break;
                }
            }
            return v;
        };
        var p = function () {
            var t = this,
                u = function () {
                    var x = {};
                    x.srcNodeRef = t.document.getWindow().$.frameElement;
                    x.assocApp = 'CKEDITOR.' + a.version + '@' + a.revision;
                    x.customerid = t.config.scayt_customerid || '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';
                    x.customDictionaryIds = t.config.scayt_customDictionaryIds;
                    x.userDictionaryName = t.config.scayt_userDictionaryName;
                    x.sLang = t.config.scayt_sLang || 'en_US';
                    if (a._scaytParams) for (var y in a._scaytParams) x[y] = a._scaytParams[y];
                    var z = new window.scayt(x),
                        A = q.instances[t.name];
                    if (A) {
                        z.sLang = A.sLang;
                        z.option(A.option());
                        z.paused = A.paused;
                    }
                    q.instances[t.name] = z;
                    var B = 'scaytButton',
                        C = window.scayt.uiTags,
                        D = [];
                    for (var E = 0, F = 4; E < F; E++) D.push(C[E] && q.uiTabs[E]);
                    q.uiTabs = D;
                    try {
                        z.setDisabled(n === false);
                    } catch (G) {}
                    t.fire('showScaytState');
                };
            t.on('contentDom', u);
            t.on('contentDomUnload', function () {
                var x = a.document.getElementsByTag('script'),
                    y = /^dojoIoScript(\d+)$/i,
                    z = /^https?:\/\/svc\.spellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i;
                for (var A = 0; A < x.count(); A++) {
                    var B = x.getItem(A),
                        C = B.getId(),
                        D = B.getAttribute('src');
                    if (C && D && C.match(y) && D.match(z)) B.remove();
                }
            });
            t.on('beforeCommandExec', function (x) {
                if ((x.data.name == 'source' || x.data.name == 'newpage') && t.mode == 'wysiwyg') {
                    var y = q.getScayt(t);
                    if (y) {
                        n = y.paused = !y.disabled;
                        y.destroy();
                        delete q.instances[t.name];
                    }
                }
            });
            t.on('destroy', function () {
                q.getScayt(t).destroy();
            });
            t.on('afterSetData', function () {
                if (q.isScaytEnabled(t)) q.getScayt(t).refresh();
            });
            t.on('insertElement', function () {
                var x = q.getScayt(t);
                if (q.isScaytEnabled(t)) {
                    if (c) t.getSelection().unlock(true);
                    try {
                        x.refresh();
                    } catch (y) {}
                }
            }, this, null, 50);
            t.on('insertHtml', function () {
                var x = q.getScayt(t);
                if (q.isScaytEnabled(t)) {
                    if (c) t.getSelection().unlock(true);
                    try {
                        x.refresh();
                    } catch (y) {}
                }
            }, this, null, 50);
            t.on('scaytDialog', function (x) {
                x.data.djConfig = window.djConfig;
                x.data.scayt_control = q.getScayt(t);
                x.data.tab = m;
                x.data.scayt = window.scayt;
            });
            var v = t.dataProcessor,
                w = v && v.htmlFilter;
            if (w) w.addRules({
                elements: {
                    span: function (x) {
                        if (x.attributes.scayt_word && x.attributes.scaytid) {
                            delete x.name;
                            return x;
                        }
                    }
                }
            });
            if (t.document) u();
        };
        j.scayt = {
            engineLoaded: false,
            instances: {},
            getScayt: function (t) {
                return this.instances[t.name];
            },
            isScaytReady: function (t) {
                return this.engineLoaded === true && 'undefined' !== typeof window.scayt && this.getScayt(t);
            },
            isScaytEnabled: function (t) {
                var u = this.getScayt(t);
                return u ? u.disabled === false : false;
            },
            loadEngine: function (t) {
                if (this.engineLoaded === true) return p.apply(t);
                else if (this.engineLoaded == -1) return a.on('scaytReady', function () {
                    p.apply(t);
                });
                a.on('scaytReady', p, t);
                a.on('scaytReady', function () {
                    this.engineLoaded = true;
                }, this, null, 0);
                this.engineLoaded = -1;
                var u = document.location.protocol;
                u = u.search(/https?:/) != -1 ? u : 'http:';
                var v = 'svc.spellchecker.net/spellcheck3/lf/scayt/scayt21.js',
                    w = t.config.scayt_srcUrl || u + '//' + v,
                    x = q.parseUrl(w).path + '/';
                a._djScaytConfig = {
                    baseUrl: x,
                    addOnLoad: [function () {
                        a.fireOnce('scaytReady');
                    }],
                    isDebug: false
                };
                a.document.getHead().append(a.document.createElement('script', {
                    attributes: {
                        type: 'text/javascript',
                        src: w
                    }
                }));
                return null;
            },
            parseUrl: function (t) {
                var u;
                if (t.match && (u = t.match(/(.*)[\/\\](.*?\.\w+)$/))) return {
                    path: u[1],
                    file: u[2]
                };
                else return t;
            }
        };
        var q = j.scayt,
            r = function (t, u, v, w, x, y, z) {
                t.addCommand(w, x);
                t.addMenuItem(w, {
                    label: v,
                    command: w,
                    group: y,
                    order: z
                });
            },
            s = {
                preserveState: true,
                editorFocus: false,
                exec: function (t) {
                    if (q.isScaytReady(t)) {
                        var u = q.isScaytEnabled(t);
                        this.setState(u ? 2 : 1);
                        var v = q.getScayt(t);
                        v.setDisabled(u);
                    } else if (!t.config.scayt_autoStartup && q.engineLoaded >= 0) {
                        this.setState(0);
                        t.on('showScaytState', function () {
                            this.removeListener();
                            this.setState(q.isScaytEnabled(t) ? 1 : 2);
                        }, this);
                        q.loadEngine(t);
                    }
                }
            };
        j.add('scayt', {
            requires: ['menubutton'],
            beforeInit: function (t) {
                t.config.menu_groups = 'scayt_suggest,scayt_moresuggest,scayt_control,' + t.config.menu_groups;
            },
            init: function (t) {
                var u = {},
                    v = {},
                    w = t.addCommand(l, s);
                a.dialog.add(l, a.getUrl(this.path + 'dialogs/options.js'));
                var x = t.config.scayt_uiTabs || '1,1,1',
                    y = [];
                x = x.split(',');
                for (var z = 0, A = 3; z < A; z++) {
                    var B = parseInt(x[z] || '1', 10);
                    y.push(B);
                }
                var C = 'scaytButton';
                t.addMenuGroup(C);
                var D = {};
                D.scaytToggle = {
                    label: t.lang.scayt.enable,
                    command: l,
                    group: C
                };
                if (y[0] == 1) D.scaytOptions = {
                    label: t.lang.scayt.options,
                    group: C,
                    onClick: function () {
                        m = 'options';
                        t.openDialog(l);
                    }
                };
                if (y[1] == 1) D.scaytLangs = {
                    label: t.lang.scayt.langs,
                    group: C,
                    onClick: function () {
                        m = 'langs';
                        t.openDialog(l);
                    }
                };
                if (y[2] == 1) D.scaytDict = {
                    label: t.lang.scayt.dictionariesTab,
                    group: C,
                    onClick: function () {
                        m = 'dictionaries';
                        t.openDialog(l);
                    }
                };
                D.scaytAbout = {
                    label: t.lang.scayt.about,
                    group: C,
                    onClick: function () {
                        m = 'about';
                        t.openDialog(l);
                    }
                };
                y[3] = 1;
                q.uiTabs = y;
                t.addMenuItems(D);
                t.ui.add('Scayt', 5, {
                    label: t.lang.scayt.title,
                    title: t.lang.scayt.title,
                    className: 'cke_button_scayt',
                    onRender: function () {
                        w.on('state', function () {
                            this.setState(w.state);
                        }, this);
                    },
                    onMenu: function () {
                        var F = q.isScaytEnabled(t);
                        t.getMenuItem('scaytToggle').label = t.lang.scayt[F ? 'disable' : 'enable'];
                        return {
                            scaytToggle: 2,
                            scaytOptions: F && q.uiTabs[0] ? 2 : 0,
                            scaytLangs: F && q.uiTabs[1] ? 2 : 0,
                            scaytDict: F && q.uiTabs[2] ? 2 : 0,
                            scaytAbout: F && q.uiTabs[3] ? 2 : 0
                        };
                    }
                });
                if (t.contextMenu && t.addMenuItems) t.contextMenu.addListener(function (F) {
                    if (!(q.isScaytEnabled(t) && F)) return null;
                    var G = q.getScayt(t),
                        H = G.getWord(F.$);
                    if (!H) return null;
                    var I = G.getLang(),
                        J = {},
                        K = window.scayt.getSuggestion(H, I);
                    if (!K || !K.length) return null;
                    for (z in u) {
                        delete t._.menuItems[z];
                        delete t._.commands[z];
                    }
                    for (z in v) {
                        delete t._.menuItems[z];
                        delete t._.commands[z];
                    }
                    u = {};
                    v = {};
                    var L = t.config.scayt_moreSuggestions || 'on',
                        M = false,
                        N = t.config.scayt_maxSuggestions;
                    typeof N != 'number' && (N = 5);
                    !N && (N = K.length);
                    var O = t.config.scayt_contextCommands || 'all';
                    O = O.split('|');
                    for (var P = 0, Q = K.length; P < Q; P += 1) {
                        var R = 'scayt_suggestion_' + K[P].replace(' ', '_'),
                            S = (function (W, X) {
                                return {
                                    exec: function () {
                                        G.replace(W, X);
                                    }
                                };
                            })(F.$, K[P]);
                        if (P < N) {
                            r(t, 'button_' + R, K[P], R, S, 'scayt_suggest', P + 1);
                            J[R] = 2;
                            v[R] = 2;
                        } else if (L == 'on') {
                            r(t, 'button_' + R, K[P], R, S, 'scayt_moresuggest', P + 1);
                            u[R] = 2;
                            M = true;
                        }
                    }
                    if (M) {
                        t.addMenuItem('scayt_moresuggest', {
                            label: t.lang.scayt.moreSuggestions,
                            group: 'scayt_moresuggest',
                            order: 10,
                            getItems: function () {
                                return u;
                            }
                        });
                        v.scayt_moresuggest = 2;
                    }
                    if (o('all', O) || o('ignore', O)) {
                        var T = {
                            exec: function () {
                                G.ignore(F.$);
                            }
                        };
                        r(t, 'ignore', t.lang.scayt.ignore, 'scayt_ignore', T, 'scayt_control', 1);
                        v.scayt_ignore = 2;
                    }
                    if (o('all', O) || o('ignoreall', O)) {
                        var U = {
                            exec: function () {
                                G.ignoreAll(F.$);
                            }
                        };
                        r(t, 'ignore_all', t.lang.scayt.ignoreAll, 'scayt_ignore_all', U, 'scayt_control', 2);
                        v.scayt_ignore_all = 2;
                    }
                    if (o('all', O) || o('add', O)) {
                        var V = {
                            exec: function () {
                                window.scayt.addWordToUserDictionary(F.$);
                            }
                        };
                        r(t, 'add_word', t.lang.scayt.addWord, 'scayt_add_word', V, 'scayt_control', 3);
                        v.scayt_add_word = 2;
                    }
                    if (G.fireOnContextMenu) G.fireOnContextMenu(t);
                    return v;
                });
                if (t.config.scayt_autoStartup) {
                    var E = function () {
                        t.removeListener('showScaytState', E);
                        w.setState(q.isScaytEnabled(t) ? 1 : 2);
                    };
                    t.on('showScaytState', E);
                    q.loadEngine(t);
                }
            }
        });
    })();
    j.add('smiley', {
        requires: ['dialog'],
        init: function (l) {
            l.addCommand('smiley', new a.dialogCommand('smiley'));
            l.ui.addButton('Smiley', {
                label: l.lang.smiley.toolbar,
                command: 'smiley'
            });
            a.dialog.add('smiley', this.path + 'dialogs/smiley.js');
        }
    });
    i.smiley_path = a.basePath + 'plugins/smiley/images/';
    i.smiley_images = ['regular_smile.gif', 'sad_smile.gif', 'wink_smile.gif', 'teeth_smile.gif', 'confused_smile.gif', 'tounge_smile.gif', 'embaressed_smile.gif', 'omg_smile.gif', 'whatchutalkingabout_smile.gif', 'angry_smile.gif', 'angel_smile.gif', 'shades_smile.gif', 'devil_smile.gif', 'cry_smile.gif', 'lightbulb.gif', 'thumbs_down.gif', 'thumbs_up.gif', 'heart.gif', 'broken_heart.gif', 'kiss.gif', 'envelope.gif'];
    i.smiley_descriptions = ['smiley', 'sad', 'wink', 'laugh', 'frown', 'cheeky', 'blush', 'surprise', 'indecision', 'angry', 'angle', 'cool', 'devil', 'crying', 'enlightened', 'no', 'yes', 'heart', 'broken heart', 'kiss', 'mail'];
    (function () {
        var l = '.%2 p,.%2 div,.%2 pre,.%2 address,.%2 blockquote,.%2 h1,.%2 h2,.%2 h3,.%2 h4,.%2 h5,.%2 h6{background-repeat: no-repeat;border: 1px dotted gray;padding-top: 8px;padding-left: 8px;}.%2 p{%1p.png);}.%2 div{%1div.png);}.%2 pre{%1pre.png);}.%2 address{%1address.png);}.%2 blockquote{%1blockquote.png);}.%2 h1{%1h1.png);}.%2 h2{%1h2.png);}.%2 h3{%1h3.png);}.%2 h4{%1h4.png);}.%2 h5{%1h5.png);}.%2 h6{%1h6.png);}',
            m = /%1/g,
            n = /%2/g,
            o = {
                preserveState: true,
                editorFocus: false,
                exec: function (p) {
                    this.toggleState();
                    this.refresh(p);
                },
                refresh: function (p) {
                    var q = this.state == 1 ? 'addClass' : 'removeClass';
                    p.document.getBody()[q]('cke_show_blocks');
                }
            };
        j.add('showblocks', {
            requires: ['wysiwygarea'],
            init: function (p) {
                var q = p.addCommand('showblocks', o);
                q.canUndo = false;
                if (p.config.startupOutlineBlocks) q.setState(1);
                p.addCss(l.replace(m, 'background-image: url(' + a.getUrl(this.path) + 'images/block_').replace(n, 'cke_show_blocks '));
                p.ui.addButton('ShowBlocks', {
                    label: p.lang.showBlocks,
                    command: 'showblocks'
                });
                p.on('mode', function () {
                    if (q.state != 0) q.refresh(p);
                });
                p.on('contentDom', function () {
                    if (q.state != 0) q.refresh(p);
                });
            }
        });
    })();
    i.startupOutlineBlocks = false;
    (function () {
        var l = 'cke_show_border',
            m, n = (b.ie6Compat ? ['.%1 table.%2,', '.%1 table.%2 td, .%1 table.%2 th,', '{', 'border : #d3d3d3 1px dotted', '}'] : ['.%1 table.%2,', '.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,', '.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,', '.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,', '.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th', '{', 'border : #d3d3d3 1px dotted', '}']).join('');
        m = n.replace(/%2/g, l).replace(/%1/g, 'cke_show_borders ');
        var o = {
            preserveState: true,
            editorFocus: false,
            exec: function (p) {
                this.toggleState();
                this.refresh(p);
            },
            refresh: function (p) {
                var q = this.state == 1 ? 'addClass' : 'removeClass';
                p.document.getBody()[q]('cke_show_borders');
            }
        };
        j.add('showborders', {
            requires: ['wysiwygarea'],
            modes: {
                wysiwyg: 1
            },
            init: function (p) {
                var q = p.addCommand('showborders', o);
                q.canUndo = false;
                if (p.config.startupShowBorders !== false) q.setState(1);
                p.addCss(m);
                p.on('mode', function () {
                    if (q.state != 0) q.refresh(p);
                }, null, null, 100);
                p.on('contentDom', function () {
                    if (q.state != 0) q.refresh(p);
                });
            },
            afterInit: function (p) {
                var q = p.dataProcessor,
                    r = q && q.dataFilter,
                    s = q && q.htmlFilter;
                if (r) r.addRules({
                    elements: {
                        table: function (t) {
                            var u = t.attributes,
                                v = u['class'],
                                w = parseInt(u.border, 10);
                            if (!w || w <= 0) u['class'] = (v || '') + ' ' + l;
                        }
                    }
                });
                if (s) s.addRules({
                    elements: {
                        table: function (t) {
                            var u = t.attributes,
                                v = u['class'];
                            v && (u['class'] = v.replace(l, '').replace(/\s{2}/, ' ').replace(/^\s+|\s+$/, ''));
                        }
                    }
                });
                a.on('dialogDefinition', function (t) {
                    if (t.editor != p) return;
                    var u = t.data.name;
                    if (u == 'table' || u == 'tableProperties') {
                        var v = t.data.definition,
                            w = v.getContents('info'),
                            x = w.get('txtBorder'),
                            y = x.commit;
                        x.commit = e.override(y, function (z) {
                            return function (A, B) {
                                z.apply(this, arguments);
                                var C = parseInt(this.getValue(), 10);
                                B[!C || C <= 0 ? 'addClass' : 'removeClass'](l);
                            };
                        });
                    }
                });
            }
        });
    })();
    j.add('sourcearea', {
        requires: ['editingblock'],
        init: function (l) {
            var m = j.sourcearea,
                n = a.document.getWindow();
            l.on('editingBlockReady', function () {
                var o, p;
                l.addMode('source', {
                    load: function (q, r) {
                        if (c && b.version < 8) q.setStyle('position', 'relative');
                        l.textarea = o = new h('textarea');
                        o.setAttributes({
                            dir: 'ltr',
                            tabIndex: l.tabIndex,
                            role: 'textbox',
                            'aria-label': l.lang.editorTitle.replace('%1', l.name)
                        });
                        o.addClass('cke_source');
                        o.addClass('cke_enable_context_menu');
                        var s = {
                            width: b.ie7Compat ? '99%' : '100%',
                            height: '100%',
                            resize: 'none',
                            outline: 'none',
                            'text-align': 'left'
                        };
                        if (c) {
                            p = function () {
                                o.hide();
                                o.setStyle('height', q.$.clientHeight + 'px');
                                o.setStyle('width', q.$.clientWidth + 'px');
                                o.show();
                            };
                            l.on('resize', p);
                            n.on('resize', p);
                            setTimeout(p, 0);
                        } else o.on('mousedown', function (u) {
                            u.data.stopPropagation();
                        });
                        q.setHtml('');
                        q.append(o);
                        o.setStyles(s);
                        l.fire('ariaWidget', o);
                        o.on('blur', function () {
                            l.focusManager.blur();
                        });
                        o.on('focus', function () {
                            l.focusManager.focus();
                        });
                        l.mayBeDirty = true;
                        this.loadData(r);
                        var t = l.keystrokeHandler;
                        if (t) t.attach(o);
                        setTimeout(function () {
                            l.mode = 'source';
                            l.fire('mode');
                        }, b.gecko || b.webkit ? 100 : 0);
                    },
                    loadData: function (q) {
                        o.setValue(q);
                        l.fire('dataReady');
                    },
                    getData: function () {
                        return o.getValue();
                    },
                    getSnapshotData: function () {
                        return o.getValue();
                    },
                    unload: function (q) {
                        l.textarea = o = null;
                        if (p) {
                            l.removeListener('resize', p);
                            n.removeListener('resize', p);
                        }
                        if (c && b.version < 8) q.removeStyle('position');
                    },
                    focus: function () {
                        o.focus();
                    }
                });
            });
            l.addCommand('source', m.commands.source);
            if (l.ui.addButton) l.ui.addButton('Source', {
                label: l.lang.source,
                command: 'source'
            });
            l.on('mode', function () {
                l.getCommand('source').setState(l.mode == 'source' ? 1 : 2);
            });
        }
    });
    j.sourcearea = {
        commands: {
            source: {
                modes: {
                    wysiwyg: 1,
                    source: 1
                },
                exec: function (l) {
                    if (l.mode == 'wysiwyg') l.fire('saveSnapshot');
                    l.getCommand('source').setState(0);
                    l.setMode(l.mode == 'source' ? 'wysiwyg' : 'source');
                },
                canUndo: false
            }
        }
    };
    (function () {
        var l;
        j.add('stylescombo', {
            requires: ['richcombo', 'styles'],
            init: function (o) {
                var p = o.config,
                    q = o.lang.stylesCombo,
                    r = this.path,
                    s;
                if (!l) l = a.stylesSet;
                var t = p.stylesCombo_stylesSet.split(':'),
                    u = t[0],
                    v = t[1];
                l.addExternal(u, v ? t.slice(1).join(':') : r + 'styles/' + u + '.js', '');
                o.ui.addRichCombo('Styles', {
                    label: q.label,
                    title: q.panelTitle,
                    className: 'cke_styles',
                    panel: {
                        css: o.skin.editor.css.concat(p.contentsCss),
                        multiSelect: true,
                        attributes: {
                            'aria-label': q.panelTitle
                        }
                    },
                    init: function () {
                        var w = this;
                        a.stylesSet.load(u, function (x) {
                            var y = x[u],
                                z, A, B = [];
                            s = {};
                            for (var C = 0; C < y.length; C++) {
                                var D = y[C];
                                A = D.name;
                                z = s[A] = new a.style(D);
                                z._name = A;
                                B.push(z);
                            }
                            B.sort(n);
                            var E;
                            for (C = 0; C < B.length; C++) {
                                z = B[C];
                                A = z._name;
                                var F = z.type;
                                if (F != E) {
                                    w.startGroup(q['panelTitle' + String(F)]);
                                    E = F;
                                }
                                w.add(A, z.type == 3 ? A : m(z._.definition), A);
                            }
                            w.commit();
                            w.onOpen();
                        });
                    },
                    onClick: function (w) {
                        o.focus();
                        o.fire('saveSnapshot');
                        var x = s[w],
                            y = o.getSelection();
                        if (x.type == 3) {
                            var z = y.getSelectedElement();
                            if (z) x.applyToObject(z);
                            return;
                        }
                        var A = new d.elementPath(y.getStartElement());
                        if (x.type == 2 && x.checkActive(A)) x.remove(o.document);
                        else x.apply(o.document);
                        o.fire('saveSnapshot');
                    },
                    onRender: function () {
                        o.on('selectionChange', function (w) {
                            var x = this.getValue(),
                                y = w.data.path,
                                z = y.elements;
                            for (var A = 0, B; A < z.length; A++) {
                                B = z[A];
                                for (var C in s) {
                                    if (s[C].checkElementRemovable(B, true)) {
                                        if (C != x) this.setValue(C);
                                        return;
                                    }
                                }
                            }
                            this.setValue('');
                        }, this);
                    },
                    onOpen: function () {
                        var E = this;
                        if (c) o.focus();
                        var w = o.getSelection(),
                            x = w.getSelectedElement(),
                            y = x && x.getName(),
                            z = new d.elementPath(x || w.getStartElement()),
                            A = [0, 0, 0, 0];
                        E.showAll();
                        E.unmarkAll();
                        for (var B in s) {
                            var C = s[B],
                                D = C.type;
                            if (D == 3) {
                                if (x && C.element == y) {
                                    if (C.checkElementRemovable(x, true)) E.mark(B);
                                    A[D]++;
                                } else E.hideItem(B);
                            } else {
                                if (C.checkActive(z)) E.mark(B);
                                A[D]++;
                            }
                        }
                        if (!A[1]) E.hideGroup(q['panelTitle' + String(1)]);
                        if (!A[2]) E.hideGroup(q['panelTitle' + String(2)]);
                        if (!A[3]) E.hideGroup(q['panelTitle' + String(3)]);
                    }
                });
            }
        });

        function m(o) {
            var p = [],
                q = o.element;
            if (q == 'bdo') q = 'span';
            p = ['<', q];
            var r = o.attributes;
            if (r) for (var s in r) p.push(' ', s, '="', r[s], '"');
            var t = a.style.getStyleText(o);
            if (t) p.push(' style="', t, '"');
            p.push('>', o.name, '</', q, '>');
            return p.join('');
        };

        function n(o, p) {
            var q = o.type,
                r = p.type;
            return q == r ? 0 : q == 3 ? -1 : r == 3 ? 1 : r == 1 ? 1 : -1;
        };
    })();
    i.stylesCombo_stylesSet = 'default';
    j.add('table', {
        init: function (l) {
            var m = j.table,
                n = l.lang.table;
            l.addCommand('table', new a.dialogCommand('table'));
            l.addCommand('tableProperties', new a.dialogCommand('tableProperties'));
            l.ui.addButton('Table', {
                label: n.toolbar,
                command: 'table'
            });
            a.dialog.add('table', this.path + 'dialogs/table.js');
            a.dialog.add('tableProperties', this.path + 'dialogs/table.js');
            if (l.addMenuItems) l.addMenuItems({
                table: {
                    label: n.menu,
                    command: 'tableProperties',
                    group: 'table',
                    order: 5
                },
                tabledelete: {
                    label: n.deleteTable,
                    command: 'tableDelete',
                    group: 'table',
                    order: 1
                }
            });
            if (l.contextMenu) l.contextMenu.addListener(function (o, p) {
                if (!o) return null;
                var q = o.is('table') || o.hasAscendant('table');
                if (q) return {
                    tabledelete: 2,
                    table: 2
                };
                return null;
            });
        }
    });
    (function () {
        function l(E, F) {
            if (c) E.removeAttribute(F);
            else delete E[F];
        };
        var m = /^(?:td|th)$/;

        function n(E) {
            var F = E.createBookmarks(),
                G = E.getRanges(),
                H = [],
                I = {};

            function J(R) {
                if (H.length > 0) return;
                if (R.type == 1 && m.test(R.getName()) && !R.getCustomData('selected_cell')) {
                    h.setMarker(I, R, 'selected_cell', true);
                    H.push(R);
                }
            };
            for (var K = 0; K < G.length; K++) {
                var L = G[K];
                if (L.collapsed) {
                    var M = L.getCommonAncestor(),
                        N = M.getAscendant('td', true) || M.getAscendant('th', true);
                    if (N) H.push(N);
                } else {
                    var O = new d.walker(L),
                        P;
                    O.guard = J;
                    while (P = O.next()) {
                        var Q = P.getParent();
                        if (Q && m.test(Q.getName()) && !Q.getCustomData('selected_cell')) {
                            h.setMarker(I, Q, 'selected_cell', true);
                            H.push(Q);
                        }
                    }
                }
            }
            h.clearAllMarkers(I);
            E.selectBookmarks(F);
            return H;
        };

        function o(E) {
            var F = E.cells;
            for (var G = 0; G < F.length; G++) {
                F[G].innerHTML = '';
                if (!c) new h(F[G]).appendBogus();
            }
        };

        function p(E, F) {
            var G = E.getStartElement().getAscendant('tr');
            if (!G) return;
            var H = G.clone(true);
            H.insertBefore(G);
            o(F ? H.$ : G.$);
        };

        function q(E) {
            if (E instanceof d.selection) {
                var F = n(E),
                    G = F.length,
                    H = [],
                    I, J, K;
                for (var L = 0; L < G; L++) {
                    var M = F[L].getParent(),
                        N = M.$.rowIndex;
                    !L && (J = N - 1);
                    H[N] = M;
                    L == G - 1 && (K = N + 1);
                }
                var O = M.getAscendant('table'),
                    P = O.$.rows,
                    Q = P.length;
                I = new h(K < Q && O.$.rows[K] || J > 0 && O.$.rows[J] || O.$.parentNode);
                for (L = H.length; L >= 0; L--) {
                    if (H[L]) q(H[L]);
                }
                return I;
            } else if (E instanceof h) {
                O = E.getAscendant('table');
                if (O.$.rows.length == 1) O.remove();
                else E.remove();
            }
            return 0;
        };

        function r(E, F) {
            var G = E.getStartElement(),
                H = G.getAscendant('td', true) || G.getAscendant('th', true);
            if (!H) return;
            var I = H.getAscendant('table'),
                J = H.$.cellIndex;
            for (var K = 0; K < I.$.rows.length; K++) {
                var L = I.$.rows[K];
                if (L.cells.length < J + 1) continue;
                H = new h(L.cells[J].cloneNode(false));
                if (!c) H.appendBogus();
                var M = new h(L.cells[J]);
                if (F) H.insertBefore(M);
                else H.insertAfter(M);
            }
        };

        function s(E) {
            if (E instanceof d.selection) {
                var F = n(E);
                for (var G = F.length; G >= 0; G--) {
                    if (F[G]) s(F[G]);
                }
            } else if (E instanceof h) {
                var H = E.getAscendant('table'),
                    I = E.$.cellIndex;
                for (G = H.$.rows.length - 1; G >= 0; G--) {
                    var J = new h(H.$.rows[G]);
                    if (!I && J.$.cells.length == 1) {
                        q(J);
                        continue;
                    }
                    if (J.$.cells[I]) J.$.removeChild(J.$.cells[I]);
                }
            }
        };

        function t(E, F) {
            var G = E.getStartElement(),
                H = G.getAscendant('td', true) || G.getAscendant('th', true);
            if (!H) return;
            var I = H.clone();
            if (!c) I.appendBogus();
            if (F) I.insertBefore(H);
            else I.insertAfter(H);
        };

        function u(E) {
            if (E instanceof d.selection) {
                var F = n(E);
                for (var G = F.length - 1; G >= 0; G--) u(F[G]);
            } else if (E instanceof h) if (E.getParent().getChildCount() == 1) E.getParent().remove();
            else E.remove();
        };

        function v(E) {
            var F = E.getBogus();
            F && F.remove();
            E.trim();
        };

        function w(E, F) {
            var G = new d.range(E.getDocument());
            if (!G['moveToElementEdit' + (F ? 'End' : 'Start')](E)) {
                G.selectNodeContents(E);
                G.collapse(F ? false : true);
            }
            G.select(true);
        };

        function x(E) {
            var F = E.$.rows,
                G = -1,
                H = [];
            for (var I = 0; I < F.length; I++) {
                G++;
                !H[G] && (H[G] = []);
                var J = -1;
                for (var K = 0; K < F[I].cells.length; K++) {
                    var L = F[I].cells[K];
                    J++;
                    while (H[G][J]) J++;
                    var M = isNaN(L.colSpan) ? 1 : L.colSpan,
                        N = isNaN(L.rowSpan) ? 1 : L.rowSpan;
                    for (var O = 0; O < N; O++) {
                        if (!H[G + O]) H[G + O] = [];
                        for (var P = 0; P < M; P++) H[G + O][J + P] = F[I].cells[K];
                    }
                    J += M - 1;
                }
            }
            return H;
        };

        function y(E, F, G) {
            var H = E[F];
            if (typeof G == 'undefined') return H;
            for (var I = 0; H && I < H.length; I++) {
                if (G.is && H[I] == G.$) return I;
                else if (I == G) return new h(H[I]);
            }
            return G.is ? -1 : null;
        };

        function z(E, F, G) {
            var H = [];
            for (var I = 0; I < E.length; I++) {
                var J = E[I];
                if (typeof G == 'undefined') H.push(J[F]);
                else if (G.is && J[F] == G.$) return I;
                else if (I == G) return new h(J[F]);
            }
            return typeof G == 'undefined' ? H : G.is ? -1 : null;
        };

        function A(E, F, G) {
            var H = n(E),
                I;
            if ((F ? H.length != 1 : H.length < 2) || (I = E.getCommonAncestor()) && I.type == 1 && I.is('table')) return false;
            var J, K = H[0],
                L = K.getAscendant('table'),
                M = x(L),
                N = M.length,
                O = M[0].length,
                P = K.getParent().$.rowIndex,
                Q = y(M, P, K);
            if (F) {
                var R;
                try {
                    R = M[F == 'up' ? P - 1 : F == 'down' ? P + 1 : P][F == 'left' ? Q - 1 : F == 'right' ? Q + 1 : Q];
                } catch (aj) {
                    return false;
                }
                if (!R || K.$ == R) return false;
                H[F == 'up' || F == 'left' ? 'unshift' : 'push'](new h(R));
            }
            var S = K.getDocument(),
                T = P,
                U = 0,
                V = 0,
                W = !G && new d.documentFragment(S),
                X = 0;
            for (var Y = 0; Y < H.length; Y++) {
                J = H[Y];
                var Z = J.getParent(),
                    aa = J.getFirst(),
                    ab = J.$.colSpan,
                    ac = J.$.rowSpan,
                    ad = Z.$.rowIndex,
                    ae = y(M, ad, J);
                X += ab * ac;
                V = Math.max(V, ae - Q + ab);
                U = Math.max(U, ad - P + ac);
                if (!G) {
                    if (v(J), J.getChildren().count()) {
                        if (ad != T && aa && !(aa.isBlockBoundary && aa.isBlockBoundary({
                            br: 1
                        }))) {
                            var af = W.getLast(d.walker.whitespaces(true));
                            if (af && !(af.is && af.is('br'))) W.append(new h('br'));
                        }
                        J.moveChildren(W);
                    }
                    Y ? J.remove() : J.setHtml('');
                }
                T = ad;
            }
            if (!G) {
                W.moveChildren(K);
                if (!c) K.appendBogus();
                if (V >= O) K.removeAttribute('rowSpan');
                else K.$.rowSpan = U;
                if (U >= N) K.removeAttribute('colSpan');
                else K.$.colSpan = V;
                var ag = new d.nodeList(L.$.rows),
                    ah = ag.count();
                for (Y = ah - 1; Y >= 0; Y--) {
                    var ai = ag.getItem(Y);
                    if (!ai.$.cells.length) {
                        ai.remove();
                        ah++;
                        continue;
                    }
                }
                return K;
            } else return U * V == X;
        };

        function B(E, F) {
            var G = n(E);
            if (G.length > 1) return false;
            else if (F) return true;
            var H = G[0],
                I = H.getParent(),
                J = I.getAscendant('table'),
                K = x(J),
                L = I.$.rowIndex,
                M = y(K, L, H),
                N = H.$.rowSpan,
                O, P, Q, R;
            if (N > 1) {
                P = Math.ceil(N / 2);
                Q = Math.floor(N / 2);
                R = L + P;
                var S = new h(J.$.rows[R]),
                    T = y(K, R),
                    U;
                O = H.clone();
                for (var V = 0; V < T.length; V++) {
                    U = T[V];
                    if (U.parentNode == S.$ && V > M) {
                        O.insertBefore(new h(U));
                        break;
                    } else U = null;
                }
                if (!U) S.append(O, true);
            } else {
                Q = P = 1;
                S = I.clone();
                S.insertAfter(I);
                S.append(O = H.clone());
                var W = y(K, L);
                for (var X = 0; X < W.length; X++) W[X].rowSpan++;
            }
            if (!c) O.appendBogus();
            H.$.rowSpan = P;
            O.$.rowSpan = Q;
            if (P == 1) H.removeAttribute('rowSpan');
            if (Q == 1) O.removeAttribute('rowSpan');
            return O;
        };

        function C(E, F) {
            var G = n(E);
            if (G.length > 1) return false;
            else if (F) return true;
            var H = G[0],
                I = H.getParent(),
                J = I.getAscendant('table'),
                K = x(J),
                L = I.$.rowIndex,
                M = y(K, L, H),
                N = H.$.colSpan,
                O, P, Q;
            if (N > 1) {
                P = Math.ceil(N / 2);
                Q = Math.floor(N / 2);
            } else {
                Q = P = 1;
                var R = z(K, M);
                for (var S = 0; S < R.length; S++) R[S].colSpan++;
            }
            O = H.clone();
            O.insertAfter(H);
            if (!c) O.appendBogus();
            H.$.colSpan = P;
            O.$.colSpan = Q;
            if (P == 1) H.removeAttribute('colSpan');
            if (Q == 1) O.removeAttribute('colSpan');
            return O;
        };
        var D = {
            thead: 1,
            tbody: 1,
            tfoot: 1,
            td: 1,
            tr: 1,
            th: 1
        };
        j.tabletools = {
            init: function (E) {
                var F = E.lang.table;
                E.addCommand('cellProperties', new a.dialogCommand('cellProperties'));
                a.dialog.add('cellProperties', this.path + 'dialogs/tableCell.js');
                E.addCommand('tableDelete', {
                    exec: function (G) {
                        var H = G.getSelection(),
                            I = H && H.getStartElement(),
                            J = I && I.getAscendant('table', true);
                        if (!J) return;
                        H.selectElement(J);
                        var K = H.getRanges()[0];
                        K.collapse();
                        H.selectRanges([K]);
                        if (J.getParent().getChildCount() == 1) J.getParent().remove();
                        else J.remove();
                    }
                });
                E.addCommand('rowDelete', {
                    exec: function (G) {
                        var H = G.getSelection();
                        w(q(H));
                    }
                });
                E.addCommand('rowInsertBefore', {
                    exec: function (G) {
                        var H = G.getSelection();
                        p(H, true);
                    }
                });
                E.addCommand('rowInsertAfter', {
                    exec: function (G) {
                        var H = G.getSelection();
                        p(H);
                    }
                });
                E.addCommand('columnDelete', {
                    exec: function (G) {
                        var H = G.getSelection();
                        s(H);
                    }
                });
                E.addCommand('columnInsertBefore', {
                    exec: function (G) {
                        var H = G.getSelection();
                        r(H, true);
                    }
                });
                E.addCommand('columnInsertAfter', {
                    exec: function (G) {
                        var H = G.getSelection();
                        r(H);
                    }
                });
                E.addCommand('cellDelete', {
                    exec: function (G) {
                        var H = G.getSelection();
                        u(H);
                    }
                });
                E.addCommand('cellMerge', {
                    exec: function (G) {
                        w(A(G.getSelection()), true);
                    }
                });
                E.addCommand('cellMergeRight', {
                    exec: function (G) {
                        w(A(G.getSelection(), 'right'), true);
                    }
                });
                E.addCommand('cellMergeDown', {
                    exec: function (G) {
                        w(A(G.getSelection(), 'down'), true);
                    }
                });
                E.addCommand('cellVerticalSplit', {
                    exec: function (G) {
                        w(B(G.getSelection()));
                    }
                });
                E.addCommand('cellHorizontalSplit', {
                    exec: function (G) {
                        w(C(G.getSelection()));
                    }
                });
                E.addCommand('cellInsertBefore', {
                    exec: function (G) {
                        var H = G.getSelection();
                        t(H, true);
                    }
                });
                E.addCommand('cellInsertAfter', {
                    exec: function (G) {
                        var H = G.getSelection();
                        t(H);
                    }
                });
                if (E.addMenuItems) E.addMenuItems({
                    tablecell: {
                        label: F.cell.menu,
                        group: 'tablecell',
                        order: 1,
                        getItems: function () {
                            var G = E.getSelection(),
                                H = n(G);
                            return {
                                tablecell_insertBefore: 2,
                                tablecell_insertAfter: 2,
                                tablecell_delete: 2,
                                tablecell_merge: A(G, null, true) ? 2 : 0,
                                tablecell_merge_right: A(G, 'right', true) ? 2 : 0,
                                tablecell_merge_down: A(G, 'down', true) ? 2 : 0,
                                tablecell_split_vertical: B(G, true) ? 2 : 0,
                                tablecell_split_horizontal: C(G, true) ? 2 : 0,
                                tablecell_properties: H.length > 0 ? 2 : 0
                            };
                        }
                    },
                    tablecell_insertBefore: {
                        label: F.cell.insertBefore,
                        group: 'tablecell',
                        command: 'cellInsertBefore',
                        order: 5
                    },
                    tablecell_insertAfter: {
                        label: F.cell.insertAfter,
                        group: 'tablecell',
                        command: 'cellInsertAfter',
                        order: 10
                    },
                    tablecell_delete: {
                        label: F.cell.deleteCell,
                        group: 'tablecell',
                        command: 'cellDelete',
                        order: 15
                    },
                    tablecell_merge: {
                        label: F.cell.merge,
                        group: 'tablecell',
                        command: 'cellMerge',
                        order: 16
                    },
                    tablecell_merge_right: {
                        label: F.cell.mergeRight,
                        group: 'tablecell',
                        command: 'cellMergeRight',
                        order: 17
                    },
                    tablecell_merge_down: {
                        label: F.cell.mergeDown,
                        group: 'tablecell',
                        command: 'cellMergeDown',
                        order: 18
                    },
                    tablecell_split_horizontal: {
                        label: F.cell.splitHorizontal,
                        group: 'tablecell',
                        command: 'cellHorizontalSplit',
                        order: 19
                    },
                    tablecell_split_vertical: {
                        label: F.cell.splitVertical,
                        group: 'tablecell',
                        command: 'cellVerticalSplit',
                        order: 20
                    },
                    tablecell_properties: {
                        label: F.cell.title,
                        group: 'tablecellproperties',
                        command: 'cellProperties',
                        order: 21
                    },
                    tablerow: {
                        label: F.row.menu,
                        group: 'tablerow',
                        order: 1,
                        getItems: function () {
                            return {
                                tablerow_insertBefore: 2,
                                tablerow_insertAfter: 2,
                                tablerow_delete: 2
                            };
                        }
                    },
                    tablerow_insertBefore: {
                        label: F.row.insertBefore,
                        group: 'tablerow',
                        command: 'rowInsertBefore',
                        order: 5
                    },
                    tablerow_insertAfter: {
                        label: F.row.insertAfter,
                        group: 'tablerow',
                        command: 'rowInsertAfter',
                        order: 10
                    },
                    tablerow_delete: {
                        label: F.row.deleteRow,
                        group: 'tablerow',
                        command: 'rowDelete',
                        order: 15
                    },
                    tablecolumn: {
                        label: F.column.menu,
                        group: 'tablecolumn',
                        order: 1,
                        getItems: function () {
                            return {
                                tablecolumn_insertBefore: 2,
                                tablecolumn_insertAfter: 2,
                                tablecolumn_delete: 2
                            };
                        }
                    },
                    tablecolumn_insertBefore: {
                        label: F.column.insertBefore,
                        group: 'tablecolumn',
                        command: 'columnInsertBefore',
                        order: 5
                    },
                    tablecolumn_insertAfter: {
                        label: F.column.insertAfter,
                        group: 'tablecolumn',
                        command: 'columnInsertAfter',
                        order: 10
                    },
                    tablecolumn_delete: {
                        label: F.column.deleteColumn,
                        group: 'tablecolumn',
                        command: 'columnDelete',
                        order: 15
                    }
                });
                if (E.contextMenu) E.contextMenu.addListener(function (G, H) {
                    if (!G) return null;
                    while (G) {
                        if (G.getName() in D) return {
                            tablecell: 2,
                            tablerow: 2,
                            tablecolumn: 2
                        };
                        G = G.getParent();
                    }
                    return null;
                });
            },
            getSelectedCells: n
        };
        j.add('tabletools', j.tabletools);
    })();
    j.add('specialchar', {
        init: function (l) {
            var m = 'specialchar';
            a.dialog.add(m, this.path + 'dialogs/specialchar.js');
            l.addCommand(m, new a.dialogCommand(m));
            l.ui.addButton('SpecialChar', {
                label: l.lang.specialChar.toolbar,
                command: m
            });
        }
    });
    (function () {
        var l = {
            editorFocus: false,
            modes: {
                wysiwyg: 1,
                source: 1
            }
        },
            m = {
                exec: function (o) {
                    o.container.focusNext(true, o.tabIndex);
                }
            },
            n = {
                exec: function (o) {
                    o.container.focusPrevious(true, o.tabIndex);
                }
            };
        j.add('tab', {
            requires: ['keystrokes'],
            init: function (o) {
                var p = o.config.tabSpaces || 0,
                    q = '';
                while (p--) q += '\xa0';
                if (q) o.on('key', function (r) {
                    if (r.data.keyCode == 9) {
                        o.insertHtml(q);
                        r.cancel();
                    }
                });
                if (b.webkit) o.on('key', function (r) {
                    var s = r.data.keyCode;
                    if (s == 9 && !q) {
                        r.cancel();
                        o.execCommand('blur');
                    }
                    if (s == 2000 + 9) {
                        o.execCommand('blurBack');
                        r.cancel();
                    }
                });
                o.addCommand('blur', e.extend(m, l));
                o.addCommand('blurBack', e.extend(n, l));
            }
        });
    })();
    h.prototype.focusNext = function (l, m) {
        var v = this;
        var n = v.$,
            o = m === undefined ? v.getTabIndex() : m,
            p, q, r, s, t, u;
        if (o <= 0) {
            t = v.getNextSourceNode(l, 1);
            while (t) {
                if (t.isVisible() && t.getTabIndex() === 0) {
                    r = t;
                    break;
                }
                t = t.getNextSourceNode(false, 1);
            }
        } else {
            t = v.getDocument().getBody().getFirst();
            while (t = t.getNextSourceNode(false, 1)) {
                if (!p) if (!q && t.equals(v)) {
                    q = true;
                    if (l) {
                        if (!(t = t.getNextSourceNode(true, 1))) break;
                        p = 1;
                    }
                } else if (q && !v.contains(t)) p = 1;
                if (!t.isVisible() || (u = t.getTabIndex()) < 0) continue;
                if (p && u == o) {
                    r = t;
                    break;
                }
                if (u > o && (!r || !s || u < s)) {
                    r = t;
                    s = u;
                } else if (!r && u === 0) {
                    r = t;
                    s = u;
                }
            }
        }
        if (r) r.focus();
    };
    h.prototype.focusPrevious = function (l, m) {
        var v = this;
        var n = v.$,
            o = m === undefined ? v.getTabIndex() : m,
            p, q, r, s = 0,
            t, u = v.getDocument().getBody().getLast();
        while (u = u.getPreviousSourceNode(false, 1)) {
            if (!p) if (!q && u.equals(v)) {
                q = true;
                if (l) {
                    if (!(u = u.getPreviousSourceNode(true, 1))) break;
                    p = 1;
                }
            } else if (q && !v.contains(u)) p = 1;
            if (!u.isVisible() || (t = u.getTabIndex()) < 0) continue;
            if (o <= 0) {
                if (p && t === 0) {
                    r = u;
                    break;
                }
                if (t > s) {
                    r = u;
                    s = t;
                }
            } else {
                if (p && t == o) {
                    r = u;
                    break;
                }
                if (t < o && (!r || t > s)) {
                    r = u;
                    s = t;
                }
            }
        }
        if (r) r.focus();
    };
    (function () {
        j.add('templates', {
            requires: ['dialog'],
            init: function (n) {
                a.dialog.add('templates', a.getUrl(this.path + 'dialogs/templates.js'));
                n.addCommand('templates', new a.dialogCommand('templates'));
                n.ui.addButton('Templates', {
                    label: n.lang.templates.button,
                    command: 'templates'
                });
            }
        });
        var l = {},
            m = {};
        a.addTemplates = function (n, o) {
            l[n] = o;
        };
        a.getTemplates = function (n) {
            return l[n];
        };
        a.loadTemplates = function (n, o) {
            var p = [];
            for (var q = 0; q < n.length; q++) {
                if (!m[n[q]]) {
                    p.push(n[q]);
                    m[n[q]] = 1;
                }
            }
            if (p.length > 0) a.scriptLoader.load(p, o);
            else setTimeout(o, 0);
        };
    })();
    i.templates = 'default';
    i.templates_files = [a.getUrl('plugins/templates/templates/default.js')];
    i.templates_replaceContent = true;
    (function () {
        var l = function () {
            this.toolbars = [];
            this.focusCommandExecuted = false;
        };
        l.prototype.focus = function () {
            for (var n = 0, o; o = this.toolbars[n++];) for (var p = 0, q; q = o.items[p++];) {
                if (q.focus) {
                    q.focus();
                    return;
                }
            }
        };
        var m = {
            toolbarFocus: {
                modes: {
                    wysiwyg: 1,
                    source: 1
                },
                exec: function (n) {
                    if (n.toolbox) {
                        n.toolbox.focusCommandExecuted = true;
                        if (c) setTimeout(function () {
                            n.toolbox.focus();
                        }, 100);
                        else n.toolbox.focus();
                    }
                }
            }
        };
        j.add('toolbar', {
            init: function (n) {
                var o = function (p, q) {
                    var r, s, t;
                    switch (q) {
                    case 39:
                    case 9:
                        do {
                            r = p.next;
                            if (!r) {
                                s = p.toolbar.next;
                                t = s && s.items.length;
                                while (t === 0) {
                                    s = s.next;
                                    t = s && s.items.length;
                                }
                                if (s) r = s.items[0];
                            }
                            p = r;
                        } while (p && !p.focus) if (p) p.focus();
                        else n.toolbox.focus();
                        return false;
                    case 37:
                    case 2000 + 9:
                        do {
                            r = p.previous;
                            if (!r) {
                                s = p.toolbar.previous;
                                t = s && s.items.length;
                                while (t === 0) {
                                    s = s.previous;
                                    t = s && s.items.length;
                                }
                                if (s) r = s.items[t - 1];
                            }
                            p = r;
                        } while (p && !p.focus) if (p) p.focus();
                        else {
                            var u = n.toolbox.toolbars[n.toolbox.toolbars.length - 1].items;
                            u[u.length - 1].focus();
                        }
                        return false;
                    case 27:
                        n.focus();
                        return false;
                    case 13:
                    case 32:
                        p.execute();
                        return false;
                    }
                    return true;
                };
                n.on('themeSpace', function (p) {
                    if (p.data.space == n.config.toolbarLocation) {
                        n.toolbox = new l();
                        var q = 'cke_' + e.getNextNumber(),
                            r = ['<div class="cke_toolbox" role="toolbar" aria-labelledby="', q, '"'],
                            s = n.config.toolbarStartupExpanded !== false,
                            t;
                        r.push(s ? '>' : ' style="display:none">');
                        r.push('<span id="', q, '" class="cke_voice_label">', n.lang.toolbar, '</span>');
                        var u = n.toolbox.toolbars,
                            v = n.config.toolbar instanceof Array ? n.config.toolbar : n.config['toolbar_' + n.config.toolbar];
                        for (var w = 0; w < v.length; w++) {
                            var x = v[w];
                            if (!x) continue;
                            var y = 'cke_' + e.getNextNumber(),
                                z = {
                                    id: y,
                                    items: []
                                };
                            if (t) {
                                r.push('</div>');
                                t = 0;
                            }
                            if (x === '/') {
                                r.push('<div class="cke_break"></div>');
                                continue;
                            }
                            r.push('<span id="', y, '" class="cke_toolbar" role="presentation"><span class="cke_toolbar_start"></span>');
                            var A = u.push(z) - 1;
                            if (A > 0) {
                                z.previous = u[A - 1];
                                z.previous.next = z;
                            }
                            for (var B = 0; B < x.length; B++) {
                                var C, D = x[B];
                                if (D == '-') C = k.separator;
                                else C = n.ui.create(D);
                                if (C) {
                                    if (C.canGroup) {
                                        if (!t) {
                                            r.push('<span class="cke_toolgroup" role="presentation">');
                                            t = 1;
                                        }
                                    } else if (t) {
                                        r.push('</span>');
                                        t = 0;
                                    }
                                    var E = C.render(n, r);
                                    A = z.items.push(E) - 1;
                                    if (A > 0) {
                                        E.previous = z.items[A - 1];
                                        E.previous.next = E;
                                    }
                                    E.toolbar = z;
                                    E.onkey = o;
                                    E.onfocus = function () {
                                        if (!n.toolbox.focusCommandExecuted) n.focus();
                                    };
                                }
                            }
                            if (t) {
                                r.push('</span>');
                                t = 0;
                            }
                            r.push('<span class="cke_toolbar_end"></span></span>');
                        }
                        r.push('</div>');
                        if (n.config.toolbarCanCollapse) {
                            var F = e.addFunction(function () {
                                n.execCommand('toolbarCollapse');
                            }),
                                G = 'cke_' + e.getNextNumber();
                            n.addCommand('toolbarCollapse', {
                                exec: function (H) {
                                    var I = a.document.getById(G),
                                        J = I.getPrevious(),
                                        K = H.getThemeSpace('contents'),
                                        L = J.getParent(),
                                        M = parseInt(K.$.style.height, 10),
                                        N = L.$.offsetHeight,
                                        O = !J.isVisible();
                                    if (!O) {
                                        J.hide();
                                        I.addClass('cke_toolbox_collapser_min');
                                        I.setAttribute('title', H.lang.toolbarExpand);
                                    } else {
                                        J.show();
                                        I.removeClass('cke_toolbox_collapser_min');
                                        I.setAttribute('title', H.lang.toolbarCollapse);
                                    }
                                    I.getFirst().setText(O ? '▲' : '◀');
                                    var P = L.$.offsetHeight - N;
                                    K.setStyle('height', M - P + 'px');
                                    H.fire('resize');
                                },
                                modes: {
                                    wysiwyg: 1,
                                    source: 1
                                }
                            });
                            r.push('<a title="' + (s ? n.lang.toolbarCollapse : n.lang.toolbarExpand) + '" id="' + G + '" tabIndex="-1" class="cke_toolbox_collapser');
                            if (!s) r.push(' cke_toolbox_collapser_min');
                            r.push('" onclick="CKEDITOR.tools.callFunction(' + F + ')">', '<span>&#9650;</span>', '</a>');
                        }
                        p.data.html += r.join('');
                    }
                });
                n.addCommand('toolbarFocus', m.toolbarFocus);
            }
        });
    })();
    k.separator = {
        render: function (l, m) {
            m.push('<span class="cke_separator" role="separator"></span>');
            return {};
        }
    };
    i.toolbarLocation = 'top';
    i.toolbar_Basic = [
        ['Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink', '-', 'About']
    ];
    i.toolbar_Full = [
        ['Source', '-', 'Save', 'NewPage', 'Preview', '-', 'Templates'],
        ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Print', 'SpellChecker', 'Scayt'],
        ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'],
        ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'], '/', ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript'],
        ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', 'Blockquote', 'CreateDiv'],
        ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
        ['Link', 'Unlink', 'Anchor'],
        ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak'], '/', ['Styles', 'Format', 'Font', 'FontSize'],
        ['TextColor', 'BGColor'],
        ['Maximize', 'ShowBlocks', '-', 'About']
    ];
    i.toolbar = 'Full';
    i.toolbarCanCollapse = true;
    (function () {
        j.add('undo', {
            requires: ['selection', 'wysiwygarea'],
            init: function (r) {
                var s = new n(r),
                    t = r.addCommand('undo', {
                        exec: function () {
                            if (s.undo()) {
                                r.selectionChange();
                                this.fire('afterUndo');
                            }
                        },
                        state: 0,
                        canUndo: false
                    }),
                    u = r.addCommand('redo', {
                        exec: function () {
                            if (s.redo()) {
                                r.selectionChange();
                                this.fire('afterRedo');
                            }
                        },
                        state: 0,
                        canUndo: false
                    });
                s.onChange = function () {
                    t.setState(s.undoable() ? 2 : 0);
                    u.setState(s.redoable() ? 2 : 0);
                };

                function v(w) {
                    if (s.enabled && w.data.command.canUndo !== false) s.save();
                };
                r.on('beforeCommandExec', v);
                r.on('afterCommandExec', v);
                r.on('saveSnapshot', function () {
                    s.save();
                });
                r.on('contentDom', function () {
                    r.document.on('keydown', function (w) {
                        if (!w.data.$.ctrlKey && !w.data.$.metaKey) s.type(w);
                    });
                });
                r.on('beforeModeUnload', function () {
                    r.mode == 'wysiwyg' && s.save(true);
                });
                r.on('mode', function () {
                    s.enabled = r.mode == 'wysiwyg';
                    s.onChange();
                });
                r.ui.addButton('Undo', {
                    label: r.lang.undo,
                    command: 'undo'
                });
                r.ui.addButton('Redo', {
                    label: r.lang.redo,
                    command: 'redo'
                });
                r.resetUndo = function () {
                    s.reset();
                    r.fire('saveSnapshot');
                };
            }
        });

        function l(r) {
            var s = r.getSnapshot(),
                t = s && r.getSelection();
            c && s && (s = s.replace(/\s+_cke_expando=".*?"/g, ''));
            this.contents = s;
            this.bookmarks = t && t.createBookmarks2(true);
        };
        var m = /\b(?:href|src|name)="[^"]*?"/gi;
        l.prototype = {
            equals: function (r, s) {
                var t = this.contents,
                    u = r.contents;
                if (c && (b.ie7Compat || b.ie6Compat)) {
                    t = t.replace(m, '');
                    u = u.replace(m, '');
                }
                if (t != u) return false;
                if (s) return true;
                var v = this.bookmarks,
                    w = r.bookmarks;
                if (v || w) {
                    if (!v || !w || v.length != w.length) return false;
                    for (var x = 0; x < v.length; x++) {
                        var y = v[x],
                            z = w[x];
                        if (y.startOffset != z.startOffset || y.endOffset != z.endOffset || !e.arrayCompare(y.start, z.start) || !e.arrayCompare(y.end, z.end)) return false;
                    }
                }
                return true;
            }
        };

        function n(r) {
            this.editor = r;
            this.reset();
        };
        var o = {
            8: 1,
            46: 1
        },
            p = {
                16: 1,
                17: 1,
                18: 1
            },
            q = {
                37: 1,
                38: 1,
                39: 1,
                40: 1
            };
        n.prototype = {
            type: function (r) {
                var s = r && r.data.getKey(),
                    t = s in p,
                    u = s in o,
                    v = this.lastKeystroke in o,
                    w = u && s == this.lastKeystroke,
                    x = s in q,
                    y = this.lastKeystroke in q,
                    z = !u && !x,
                    A = u && !w,
                    B = !(t || this.typing) || z && (v || y);
                if (B || A) {
                    var C = new l(this.editor);
                    e.setTimeout(function () {
                        var E = this;
                        var D = E.editor.getSnapshot();
                        if (c) D = D.replace(/\s+_cke_expando=".*?"/g, '');
                        if (C.contents != D) {
                            E.typing = true;
                            if (!E.save(false, C, false)) E.snapshots.splice(E.index + 1, E.snapshots.length - E.index - 1);
                            E.hasUndo = true;
                            E.hasRedo = false;
                            E.typesCount = 1;
                            E.modifiersCount = 1;
                            E.onChange();
                        }
                    }, 0, this);
                }
                this.lastKeystroke = s;
                if (u) {
                    this.typesCount = 0;
                    this.modifiersCount++;
                    if (this.modifiersCount > 25) {
                        this.save(false, null, false);
                        this.modifiersCount = 1;
                    }
                } else if (!x) {
                    this.modifiersCount = 0;
                    this.typesCount++;
                    if (this.typesCount > 25) {
                        this.save(false, null, false);
                        this.typesCount = 1;
                    }
                }
            },
            reset: function () {
                var r = this;
                r.lastKeystroke = 0;
                r.snapshots = [];
                r.index = -1;
                r.limit = r.editor.config.undoStackSize;
                r.currentImage = null;
                r.hasUndo = false;
                r.hasRedo = false;
                r.resetType();
            },
            resetType: function () {
                var r = this;
                r.typing = false;
                delete r.lastKeystroke;
                r.typesCount = 0;
                r.modifiersCount = 0;
            },
            fireChange: function () {
                var r = this;
                r.hasUndo = !! r.getNextImage(true);
                r.hasRedo = !! r.getNextImage(false);
                r.resetType();
                r.onChange();
            },
            save: function (r, s, t) {
                var v = this;
                var u = v.snapshots;
                if (!s) s = new l(v.editor);
                if (s.contents === false) return false;
                if (v.currentImage && s.equals(v.currentImage, r)) return false;
                u.splice(v.index + 1, u.length - v.index - 1);
                if (u.length == v.limit) u.shift();
                v.index = u.push(s) - 1;
                v.currentImage = s;
                if (t !== false) v.fireChange();
                return true;
            },
            restoreImage: function (r) {
                var t = this;
                t.editor.loadSnapshot(r.contents);
                if (r.bookmarks) t.editor.getSelection().selectBookmarks(r.bookmarks);
                else if (c) {
                    var s = t.editor.document.getBody().$.createTextRange();
                    s.collapse(true);
                    s.select();
                }
                t.index = r.index;
                t.snapshots.splice(t.index, 1, t.currentImage = new l(t.editor));
                t.fireChange();
            },
            getNextImage: function (r) {
                var w = this;
                var s = w.snapshots,
                    t = w.currentImage,
                    u, v;
                if (t) if (r) for (v = w.index - 1; v >= 0; v--) {
                    u = s[v];
                    if (!t.equals(u, true)) {
                        u.index = v;
                        return u;
                    }
                } else for (v = w.index + 1; v < s.length; v++) {
                    u = s[v];
                    if (!t.equals(u, true)) {
                        u.index = v;
                        return u;
                    }
                }
                return null;
            },
            redoable: function () {
                return this.enabled && this.hasRedo;
            },
            undoable: function () {
                return this.enabled && this.hasUndo;
            },
            undo: function () {
                var s = this;
                if (s.undoable()) {
                    s.save(true);
                    var r = s.getNextImage(true);
                    if (r) return s.restoreImage(r), true;
                }
                return false;
            },
            redo: function () {
                var s = this;
                if (s.redoable()) {
                    s.save(true);
                    if (s.redoable()) {
                        var r = s.getNextImage(false);
                        if (r) return s.restoreImage(r), true;
                    }
                }
                return false;
            }
        };
    })();
    i.undoStackSize = 20;
    (function () {
        var l = {
            table: 1,
            pre: 1
        },
            m = /\s*<(p|div|address|h\d|center)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\1>)?\s*(?=$|<\/body>)/gi;

        function n(v) {
            if (this.mode == 'wysiwyg') {
                this.focus();
                this.fire('saveSnapshot');
                var w = this.getSelection(),
                    x = v.data;
                if (this.dataProcessor) x = this.dataProcessor.toHtml(x);
                if (c) {
                    var y = w.isLocked;
                    if (y) w.unlock();
                    var z = w.getNative();
                    if (z.type == 'Control') z.clear();
                    z.createRange().pasteHTML(x);
                    if (y) this.getSelection().lock();
                } else this.document.$.execCommand('inserthtml', false, x);
                e.setTimeout(function () {
                    this.fire('saveSnapshot');
                }, 0, this);
            }
        };

        function o(v) {
            if (this.mode == 'wysiwyg') {
                this.focus();
                this.fire('saveSnapshot');
                var w = v.data,
                    x = w.getName(),
                    y = f.$block[x],
                    z = this.getSelection(),
                    A = z.getRanges(),
                    B = z.isLocked;
                if (B) z.unlock();
                var C, D, E, F;
                for (var G = A.length - 1; G >= 0; G--) {
                    C = A[G];
                    C.deleteContents();
                    D = !G && w || w.clone(true);
                    var H, I;
                    if (y) while ((H = C.getCommonAncestor(false, true)) && (I = f[H.getName()]) && !(I && I[x])) {
                        if (H.getName() in f.span) C.splitElement(H);
                        else if (C.checkStartOfBlock() && C.checkEndOfBlock()) {
                            C.setStartBefore(H);
                            C.collapse(true);
                            H.remove();
                        } else C.splitBlock();
                    }
                    C.insertNode(D);
                    if (!E) E = D;
                }
                C.moveToPosition(E, 4);
                var J = E.getNextSourceNode(true);
                if (J && J.type == 1) C.moveToElementEditStart(J);
                z.selectRanges([C]);
                if (B) this.getSelection().lock();
                e.setTimeout(function () {
                    this.fire('saveSnapshot');
                }, 0, this);
            }
        };

        function p(v) {
            if (!v.checkDirty()) setTimeout(function () {
                v.resetDirty();
            });
        };
        var q = d.walker.whitespaces(true),
            r = d.walker.bookmark(false, true);

        function s(v) {
            return q(v) && r(v);
        };

        function t(v) {
            return v.type == 3 && e.trim(v.getText()).match(/^(?:&nbsp;|\xa0)$/);
        };

        function u(v) {
            var w = v.editor,
                x = v.data.path,
                y = x.blockLimit,
                z = v.data.selection,
                A = z.getRanges()[0],
                B = w.document.getBody(),
                C = w.config.enterMode;
            if (C != 2 && A.collapsed && y.getName() == 'body' && !x.block) {
                p(w);
                var D = A.fixBlock(true, w.config.enterMode == 3 ? 'div' : 'p');
                if (c) {
                    var E = D.getFirst(s);
                    E && t(E) && E.remove();
                }
                if (D.getOuterHtml().match(m)) {
                    var F = D.getPrevious(q),
                        G = D.getNext(q);
                    if (F && F.getName && !(F.getName() in l) && A.moveToElementEditStart(F) || G && G.getName && !(G.getName() in l) && A.moveToElementEditStart(G)) D.remove();
                }
                A.select();
                if (!c) w.selectionChange();
            }
            var H = B.getLast(d.walker.whitespaces(true));
            if (H && H.getName && H.getName() in l) {
                p(w);
                if (!c) B.appendBogus();
                else B.append(w.document.createText('\xa0'));
            }
        };
        j.add('wysiwygarea', {
            requires: ['editingblock'],
            init: function (v) {
                var w = v.config.enterMode != 2 ? v.config.enterMode == 3 ? 'div' : 'p' : false,
                    x = v.lang.editorTitle.replace('%1', v.name);
                v.on('editingBlockReady', function () {
                    var A, B, C, D, E, F, G = b.isCustomDomain(),
                        H = function (K) {
                            if (B) B.remove();
                            E = 0;
                            var L = !b.gecko && e.addFunction(function (N) {
                                e.removeFunction(L);
                                N.write(K);
                            }),
                                M = 'document.open();' + (G ? 'document.domain="' + document.domain + '";' : '') + (b.gecko ? '' : 'parent.CKEDITOR.tools.callFunction(' + L + ',document);') + 'document.close();';
                            B = h.createFromHtml('<iframe style="width:100%;height:100%" frameBorder="0" src="javascript:void(function(){' + encodeURIComponent(M) + '}())"' + ' tabIndex="' + v.tabIndex + '"' + ' allowTransparency="true"' + '></iframe>');
                            b.gecko && B.on('load', function (N) {
                                N.removeListener();
                                var O = B.getFrameDocument().$;
                                O.open();
                                O.write(K);
                                O.close();
                            });
                            A.append(B);
                        },
                        I = '<script id="cke_actscrpt" type="text/javascript" cke_temp="1">' + (G ? 'document.domain="' + document.domain + '";' : '') + 'parent.CKEDITOR._["contentDomReady' + v.name + '"]( window );' + '</script>',
                        J = function (K) {
                            if (E) return;
                            E = 1;
                            v.fire('ariaWidget', B);
                            var L = K.document,
                                M = L.body,
                                N = L.getElementById('cke_actscrpt');
                            N.parentNode.removeChild(N);
                            delete a._['contentDomReady' + v.name];
                            M.spellcheck = !v.config.disableNativeSpellChecker;
                            if (c) {
                                M.hideFocus = true;
                                M.disabled = true;
                                M.contentEditable = true;
                                M.removeAttribute('disabled');
                            } else L.designMode = 'on';
                            try {
                                L.execCommand('enableObjectResizing', false, !v.config.disableObjectResizing);
                            } catch (S) {}
                            try {
                                L.execCommand('enableInlineTableEditing', false, !v.config.disableNativeTableHandles);
                            } catch (T) {}
                            K = v.window = new d.window(K);
                            L = v.document = new g(L);
                            if (!(c || b.opera)) L.on('mousedown', function (U) {
                                var V = U.data.getTarget();
                                if (V.is('img', 'hr', 'input', 'textarea', 'select')) v.getSelection().selectElement(V);
                            });
                            if (b.webkit) {
                                L.on('click', function (U) {
                                    if (U.data.getTarget().is('input', 'select')) U.data.preventDefault();
                                });
                                L.on('mouseup', function (U) {
                                    if (U.data.getTarget().is('input', 'textarea')) U.data.preventDefault();
                                });
                            }
                            if (c && L.$.compatMode == 'CSS1Compat') {
                                var O = L.getDocumentElement();
                                O.on('mousedown', function (U) {
                                    if (U.data.getTarget().equals(O)) z.focus();
                                });
                            }
                            var P = c || b.webkit ? K : L;
                            P.on('blur', function () {
                                v.focusManager.blur();
                            });
                            P.on('focus', function () {
                                if (b.gecko) {
                                    var U = M;
                                    while (U.firstChild) U = U.firstChild;
                                    if (!U.nextSibling && 'BR' == U.tagName && U.hasAttribute('_moz_editor_bogus_node')) {
                                        var V = L.$.createEvent('KeyEvents');
                                        V.initKeyEvent('keypress', true, true, K.$, false, false, false, false, 0, 32);
                                        L.$.dispatchEvent(V);
                                        var W = L.getBody().getFirst();
                                        if (v.config.enterMode == 2) L.createElement('br', {
                                            attributes: {
                                                _moz_dirty: ''
                                            }
                                        }).replace(W);
                                        else W.remove();
                                    }
                                }
                                v.focusManager.focus();
                            });
                            var Q = v.keystrokeHandler;
                            if (Q) Q.attach(L);
                            if (c) {
                                L.on('keydown', function (U) {
                                    var V = U.data.getKeystroke();
                                    if (V in {
                                        8: 1,
                                        46: 1
                                    }) {
                                        var W = v.getSelection(),
                                            X = W.getSelectedElement();
                                        if (X) {
                                            v.fire('saveSnapshot');
                                            var Y = W.getRanges()[0].createBookmark();
                                            X.remove();
                                            W.selectBookmarks([Y]);
                                            v.fire('saveSnapshot');
                                            U.data.preventDefault();
                                        }
                                    }
                                });
                                if (L.$.compatMode == 'CSS1Compat') {
                                    var R = {
                                        33: 1,
                                        34: 1
                                    };
                                    L.on('keydown', function (U) {
                                        if (U.data.getKeystroke() in R) setTimeout(function () {
                                            v.getSelection().scrollIntoView();
                                        }, 0);
                                    });
                                }
                            }
                            if (v.contextMenu) v.contextMenu.addTarget(L, v.config.browserContextMenuOnCtrl !== false);
                            setTimeout(function () {
                                v.fire('contentDom');
                                if (F) {
                                    v.mode = 'wysiwyg';
                                    v.fire('mode');
                                    F = false;
                                }
                                C = false;
                                if (D) {
                                    v.focus();
                                    D = false;
                                }
                                setTimeout(function () {
                                    v.fire('dataReady');
                                }, 0);
                                if (c) setTimeout(function () {
                                    if (v.document) {
                                        var U = v.document.$.body;
                                        U.runtimeStyle.marginBottom = '0px';
                                        U.runtimeStyle.marginBottom = '';
                                    }
                                }, 1000);
                            }, 0);
                        };
                    v.addMode('wysiwyg', {
                        load: function (K, L, M) {
                            A = K;
                            if (c && b.quirks) K.setStyle('position', 'relative');
                            v.mayBeDirty = true;
                            F = true;
                            if (M) this.loadSnapshotData(L);
                            else this.loadData(L);
                        },
                        loadData: function (K) {
                            C = true;
                            var L = v.config,
                                M = L.fullPage,
                                N = L.docType,
                                O = '<style type="text/css" cke_temp="1">' + v._.styles.join('\n') + '</style>';
                            !M && (O = e.buildStyleHtml(v.config.contentsCss) + O);
                            var P = L.baseHref ? '<base href="' + L.baseHref + '" cke_temp="1" />' : '';
                            if (M) K = K.replace(/<!DOCTYPE[^>]*>/i, function (Q) {
                                v.docType = N = Q;
                                return '';
                            });
                            if (v.dataProcessor) K = v.dataProcessor.toHtml(K, w);
                            if (M) {
                                if (!/<body[\s|>]/.test(K)) K = '<body>' + K;
                                if (!/<html[\s|>]/.test(K)) K = '<html>' + K + '</html>';
                                if (!/<head[\s|>]/.test(K)) K = K.replace(/<html[^>]*>/, '$&<head><title></title></head>');
                                P && (K = K.replace(/<head>/, '$&' + P));
                                K = K.replace(/<\/head\s*>/, O + '$&');
                                K = N + K;
                            } else K = L.docType + '<html dir="' + L.contentsLangDirection + '">' + '<title>' + x + '</title>' + '<head>' + P + O + '</head>' + '<body' + (L.bodyId ? ' id="' + L.bodyId + '"' : '') + (L.bodyClass ? ' class="' + L.bodyClass + '"' : '') + '>' + K + '</html>';
                            K += I;
                            a._['contentDomReady' + v.name] = J;
                            H(K);
                        },
                        getData: function () {
                            var K = v.config,
                                L = K.fullPage,
                                M = L && v.docType,
                                N = B.getFrameDocument(),
                                O = L ? N.getDocumentElement().getOuterHtml() : N.getBody().getHtml();
                            if (v.dataProcessor) O = v.dataProcessor.toDataFormat(O, w);
                            if (K.ignoreEmptyParagraph) O = O.replace(m, '');
                            if (M) O = M + '\n' + O;
                            return O;
                        },
                        getSnapshotData: function () {
                            return B.getFrameDocument().getBody().getHtml();
                        },
                        loadSnapshotData: function (K) {
                            B.getFrameDocument().getBody().setHtml(K);
                        },
                        unload: function (K) {
                            v.window = v.document = B = A = D = null;
                            v.fire('contentDomUnload');
                        },
                        focus: function () {
                            if (C) D = true;
                            else if (v.window) {
                                v.window.focus();
                                if (c) try {
                                    var K = v.getSelection();
                                    K = K && K.getNative();
                                    var L = K && K.type && K.createRange();
                                    if (L) {
                                        K.empty();
                                        L.select();
                                    }
                                } catch (M) {}
                                v.selectionChange();
                            }
                        }
                    });
                    v.on('insertHtml', n, null, null, 20);
                    v.on('insertElement', o, null, null, 20);
                    v.on('selectionChange', u, null, null, 1);
                });
                var y;
                v.on('contentDom', function () {
                    var A = v.document.getElementsByTag('title').getItem(0);
                    A.setAttribute('_cke_title', v.document.$.title);
                    v.document.$.title = x;
                });
                if (c) {
                    var z;
                    v.on('uiReady', function () {
                        z = v.container.append(h.createFromHtml('<span tabindex="-1" style="position:absolute; left:-10000" role="presentation"></span>'));
                        z.on('focus', function () {
                            v.focus();
                        });
                    });
                }
            }
        });
        if (b.gecko)(function () {
            var v = document.body;
            if (!v) window.addEventListener('load', arguments.callee, false);
            else v.setAttribute('onpageshow', v.getAttribute('onpageshow') + ';event.persisted && CKEDITOR.tools.callFunction(' + e.addFunction(function () {
                var w = a.instances,
                    x, y;
                for (var z in w) {
                    x = w[z];
                    y = x.document;
                    if (y) {
                        y.$.designMode = 'off';
                        y.$.designMode = 'on';
                    }
                }
            }) + ')');
        })();
    })();
    i.disableObjectResizing = false;
    i.disableNativeTableHandles = true;
    i.disableNativeSpellChecker = true;
    i.ignoreEmptyParagraph = true;
    j.add('wsc', {
        requires: ['dialog'],
        init: function (l) {
            var m = 'checkspell',
                n = l.addCommand(m, new a.dialogCommand(m));
            n.modes = {
                wysiwyg: !b.opera && document.domain == window.location.hostname
            };
            l.ui.addButton('SpellChecker', {
                label: l.lang.spellCheck.toolbar,
                command: m
            });
            a.dialog.add(m, this.path + 'dialogs/wsc.js');
        }
    });
    i.wsc_customerId = i.wsc_customerId || '1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk';
    i.wsc_customLoaderScript = i.wsc_customLoaderScript || null;
    a.DIALOG_RESIZE_NONE = 0;
    a.DIALOG_RESIZE_WIDTH = 1;
    a.DIALOG_RESIZE_HEIGHT = 2;
    a.DIALOG_RESIZE_BOTH = 3;
    (function () {
        function l(K) {
            return !!this._.tabs[K][0].$.offsetHeight;
        };

        function m() {
            var O = this;
            var K = O._.currentTabId,
                L = O._.tabIdList.length,
                M = e.indexOf(O._.tabIdList, K) + L;
            for (var N = M - 1; N > M - L; N--) {
                if (l.call(O, O._.tabIdList[N % L])) return O._.tabIdList[N % L];
            }
            return null;
        };

        function n() {
            var O = this;
            var K = O._.currentTabId,
                L = O._.tabIdList.length,
                M = e.indexOf(O._.tabIdList, K);
            for (var N = M + 1; N < M + L; N++) {
                if (l.call(O, O._.tabIdList[N % L])) return O._.tabIdList[N % L];
            }
            return null;
        };
        a.dialog = function (K, L) {
            var M = a.dialog._.dialogDefinitions[L];
            M = e.extend(M(K), p);
            M = e.clone(M);
            M = new t(this, M);
            var N = a.document,
                O = K.theme.buildDialog(K);
            this._ = {
                editor: K,
                element: O.element,
                name: L,
                contentSize: {
                    width: 0,
                    height: 0
                },
                size: {
                    width: 0,
                    height: 0
                },
                updateSize: false,
                contents: {},
                buttons: {},
                accessKeyMap: {},
                tabs: {},
                tabIdList: [],
                currentTabId: null,
                currentTabIndex: null,
                pageCount: 0,
                lastTab: null,
                tabBarMode: false,
                focusList: [],
                currentFocusIndex: 0,
                hasFocus: false
            };
            this.parts = O.parts;
            e.setTimeout(function () {
                K.fire('ariaWidget', this.parts.contents);
            }, 0, this);
            this.parts.dialog.setStyles({
                position: b.ie6Compat ? 'absolute' : 'fixed',
                top: 0,
                left: 0,
                visibility: 'hidden'
            });
            a.event.call(this);
            this.definition = M = a.fire('dialogDefinition', {
                name: L,
                definition: M
            }, K).definition;
            if (M.onLoad) this.on('load', M.onLoad);
            if (M.onShow) this.on('show', M.onShow);
            if (M.onHide) this.on('hide', M.onHide);
            if (M.onOk) this.on('ok', function (aa) {
                if (M.onOk.call(this, aa) === false) aa.data.hide = false;
            });
            if (M.onCancel) this.on('cancel', function (aa) {
                if (M.onCancel.call(this, aa) === false) aa.data.hide = false;
            });
            var P = this,
                Q = function (aa) {
                    var ab = P._.contents,
                        ac = false;
                    for (var ad in ab) for (var ae in ab[ad]) {
                        ac = aa.call(this, ab[ad][ae]);
                        if (ac) return;
                    }
                };
            this.on('ok', function (aa) {
                Q(function (ab) {
                    if (ab.validate) {
                        var ac = ab.validate(this);
                        if (typeof ac == 'string') {
                            alert(ac);
                            ac = false;
                        }
                        if (ac === false) {
                            if (ab.select) ab.select();
                            else ab.focus();
                            aa.data.hide = false;
                            aa.stop();
                            return true;
                        }
                    }
                });
            }, this, null, 0);
            this.on('cancel', function (aa) {
                Q(function (ab) {
                    if (ab.isChanged()) {
                        if (!confirm(K.lang.common.confirmCancel)) aa.data.hide = false;
                        return true;
                    }
                });
            }, this, null, 0);
            this.parts.close.on('click', function (aa) {
                if (this.fire('cancel', {
                    hide: true
                }).hide !== false) this.hide();
            }, this);

            function R() {
                var aa = P._.focusList;
                aa.sort(function (ad, ae) {
                    if (ad.tabIndex != ae.tabIndex) return ae.tabIndex - ad.tabIndex;
                    else return ad.focusIndex - ae.focusIndex;
                });
                var ab = aa.length;
                for (var ac = 0; ac < ab; ac++) aa[ac].focusIndex = ac;
            };

            function S(aa) {
                var ab = P._.focusList,
                    ac = aa ? 1 : -1;
                if (ab.length < 1) return;
                var ad = P._.currentFocusIndex;
                try {
                    ab[ad].getInputElement().$.blur();
                } catch (ag) {}
                var ae = (ad + ac + ab.length) % ab.length,
                    af = ae;
                while (!ab[af].isFocusable()) {
                    af = (af + ac + ab.length) % ab.length;
                    if (af == ae) break;
                }
                ab[af].focus();
                if (ab[af].type == 'text') ab[af].select();
            };
            this.changeFocus = S;
            var T;

            function U(aa) {
                var ae = this;
                if (P != a.dialog._.currentTop) return;
                var ab = aa.data.getKeystroke();
                T = 0;
                if (ab == 9 || ab == 2000 + 9) {
                    var ac = ab == 2000 + 9;
                    if (P._.tabBarMode) {
                        var ad = ac ? m.call(P) : n.call(P);
                        P.selectPage(ad);
                        P._.tabs[ad][0].focus();
                    } else S(!ac);
                    T = 1;
                } else if (ab == 4000 + 121 && !P._.tabBarMode) {
                    P._.tabBarMode = true;
                    P._.tabs[P._.currentTabId][0].focus();
                    T = 1;
                } else if ((ab == 37 || ab == 39) && P._.tabBarMode) {
                    ad = ab == 37 ? m.call(P) : n.call(P);
                    P.selectPage(ad);
                    P._.tabs[ad][0].focus();
                    T = 1;
                } else if ((ab == 13 || ab == 32) && P._.tabBarMode) {
                    ae.selectPage(ae._.currentTabId);
                    ae._.tabBarMode = false;
                    ae._.currentFocusIndex = -1;
                    S(true);
                    T = 1;
                }
                if (T) {
                    aa.stop();
                    aa.data.preventDefault();
                }
            };

            function V(aa) {
                T && aa.data.preventDefault();
            };
            var W = this._.element;
            this.on('show', function () {
                W.on('keydown', U, this, null, 0);
                if (b.opera || b.gecko && b.mac) W.on('keypress', V, this);
                if (b.ie6Compat) {
                    var aa = y.getChild(0).getFrameDocument();
                    aa.on('keydown', U, this, null, 0);
                }
            });
            this.on('hide', function () {
                W.removeListener('keydown', U);
                if (b.opera || b.gecko && b.mac) W.removeListener('keypress', V);
            });
            this.on('iframeAdded', function (aa) {
                var ab = new g(aa.data.iframe.$.contentWindow.document);
                ab.on('keydown', U, this, null, 0);
            });
            this.on('show', function () {
                var ae = this;
                R();
                if (K.config.dialog_startupFocusTab && P._.tabIdList.length > 1) {
                    P._.tabBarMode = true;
                    P._.tabs[P._.currentTabId][0].focus();
                } else if (!ae._.hasFocus) {
                    ae._.currentFocusIndex = -1;
                    if (M.onFocus) {
                        var aa = M.onFocus.call(ae);
                        aa && aa.focus();
                    } else S(true);
                    if (ae._.editor.mode == 'wysiwyg' && c) {
                        var ab = K.document.$.selection,
                            ac = ab.createRange();
                        if (ac) if (ac.parentElement && ac.parentElement().ownerDocument == K.document.$ || ac.item && ac.item(0).ownerDocument == K.document.$) {
                            var ad = document.body.createTextRange();
                            ad.moveToElementText(ae.getElement().getFirst().$);
                            ad.collapse(true);
                            ad.select();
                        }
                    }
                }
            }, this, null, 4294967295);
            if (b.ie6Compat) this.on('load', function (aa) {
                var ab = this.getElement(),
                    ac = ab.getFirst();
                ac.remove();
                ac.appendTo(ab);
            }, this);
            v(this);
            w(this);
            new d.text(M.title, a.document).appendTo(this.parts.title);
            for (var X = 0; X < M.contents.length; X++) this.addPage(M.contents[X]);
            this.parts.tabs.on('click', function (aa) {
                var ad = this;
                var ab = aa.data.getTarget();
                if (ab.hasClass('cke_dialog_tab')) {
                    var ac = ab.$.id;
                    ad.selectPage(ac.substr(0, ac.lastIndexOf('_')));
                    if (ad._.tabBarMode) {
                        ad._.tabBarMode = false;
                        ad._.currentFocusIndex = -1;
                        S(true);
                    }
                    aa.data.preventDefault();
                }
            }, this);
            var Y = [],
                Z = a.dialog._.uiElementBuilders.hbox.build(this, {
                    type: 'hbox',
                    className: 'cke_dialog_footer_buttons',
                    widths: [],
                    children: M.buttons
                }, Y).getChild();
            this.parts.footer.setHtml(Y.join(''));
            for (X = 0; X < Z.length; X++) this._.buttons[Z[X].id] = Z[X];
            a.skins.load(K, 'dialog');
        };

        function o(K, L, M) {
            this.element = L;
            this.focusIndex = M;
            this.tabIndex = 0;
            this.isFocusable = function () {
                return !L.getAttribute('disabled') && L.isVisible();
            };
            this.focus = function () {
                K._.currentFocusIndex = this.focusIndex;
                this.element.focus();
            };
            L.on('keydown', function (N) {
                if (N.data.getKeystroke() in {
                    32: 1,
                    13: 1
                }) this.fire('click');
            });
            L.on('focus', function () {
                this.fire('mouseover');
            });
            L.on('blur', function () {
                this.fire('mouseout');
            });
        };
        a.dialog.prototype = {
            resize: (function () {
                return function (K, L) {
                    var M = this;
                    if (M._.contentSize && M._.contentSize.width == K && M._.contentSize.height == L) return;
                    a.dialog.fire('resize', {
                        dialog: M,
                        skin: M._.editor.skinName,
                        width: K,
                        height: L
                    }, M._.editor);
                    M._.contentSize = {
                        width: K,
                        height: L
                    };
                    M._.updateSize = true;
                };
            })(),
            getSize: function () {
                var M = this;
                if (!M._.updateSize) return M._.size;
                var K = M._.element.getFirst(),
                    L = M._.size = {
                        width: K.$.offsetWidth || 0,
                        height: K.$.offsetHeight || 0
                    };
                M._.updateSize = !L.width || !L.height;
                return L;
            },
            move: (function () {
                var K;
                return function (L, M) {
                    var P = this;
                    var N = P._.element.getFirst();
                    if (K === undefined) K = N.getComputedStyle('position') == 'fixed';
                    if (K && P._.position && P._.position.x == L && P._.position.y == M) return;
                    P._.position = {
                        x: L,
                        y: M
                    };
                    if (!K) {
                        var O = a.document.getWindow().getScrollPosition();
                        L += O.x;
                        M += O.y;
                    }
                    N.setStyles({
                        left: (L > 0 ? L : 0) + 'px',
                        top: (M > 0 ? M : 0) + 'px'
                    });
                };
            })(),
            getPosition: function () {
                return e.extend({}, this._.position);
            },
            show: function () {
                var K = this._.editor;
                if (K.mode == 'wysiwyg' && c) {
                    var L = K.getSelection();
                    L && L.lock();
                }
                var M = this._.element,
                    N = this.definition;
                if (!(M.getParent() && M.getParent().equals(a.document.getBody()))) M.appendTo(a.document.getBody());
                else return;
                if (b.gecko && b.version < 10900) {
                    var O = this.parts.dialog;
                    O.setStyle('position', 'absolute');
                    setTimeout(function () {
                        O.setStyle('position', 'fixed');
                    }, 0);
                }
                this.resize(N.minWidth, N.minHeight);
                this.selectPage(this.definition.contents[0].id);
                this.reset();
                if (a.dialog._.currentZIndex === null) a.dialog._.currentZIndex = this._.editor.config.baseFloatZIndex;
                this._.element.getFirst().setStyle('z-index', a.dialog._.currentZIndex += 10);
                if (a.dialog._.currentTop === null) {
                    a.dialog._.currentTop = this;
                    this._.parentDialog = null;
                    z(this._.editor);
                    M.on('keydown', C);
                    M.on(b.opera ? 'keypress' : 'keyup', D);
                    for (var P in {
                        keyup: 1,
                        keydown: 1,
                        keypress: 1
                    }) M.on(P, J);
                } else {
                    this._.parentDialog = a.dialog._.currentTop;
                    var Q = this._.parentDialog.getElement().getFirst();
                    Q.$.style.zIndex -= Math.floor(this._.editor.config.baseFloatZIndex / 2);
                    a.dialog._.currentTop = this;
                }
                E(this, this, '\x1b', null, function () {
                    this.getButton('cancel') && this.getButton('cancel').click();
                });
                this._.hasFocus = false;
                e.setTimeout(function () {
                    var R = a.document.getWindow().getViewPaneSize(),
                        S = this.getSize();
                    this.move((R.width - N.minWidth) / 2, (R.height - S.height) / 2);
                    this.parts.dialog.setStyle('visibility', '');
                    this.fireOnce('load', {});
                    this.fire('show', {});
                    this._.editor.fire('dialogShow', this);
                    this.foreach(function (T) {
                        T.setInitValue && T.setInitValue();
                    });
                }, 100, this);
            },
            foreach: function (K) {
                var N = this;
                for (var L in N._.contents) for (var M in N._.contents[L]) K(N._.contents[L][M]);
                return N;
            },
            reset: (function () {
                var K = function (L) {
                    if (L.reset) L.reset();
                };
                return function () {
                    this.foreach(K);
                    return this;
                };
            })(),
            setupContent: function () {
                var K = arguments;
                this.foreach(function (L) {
                    if (L.setup) L.setup.apply(L, K);
                });
            },
            commitContent: function () {
                var K = arguments;
                this.foreach(function (L) {
                    if (L.commit) L.commit.apply(L, K);
                });
            },
            hide: function () {
                this.fire('hide', {});
                this._.editor.fire('dialogHide', this);
                var K = this._.element;
                if (!K.getParent()) return;
                K.remove();
                this.parts.dialog.setStyle('visibility', 'hidden');
                F(this);
                if (!this._.parentDialog) A();
                else {
                    var L = this._.parentDialog.getElement().getFirst();
                    L.setStyle('z-index', parseInt(L.$.style.zIndex, 10) + Math.floor(this._.editor.config.baseFloatZIndex / 2));
                }
                a.dialog._.currentTop = this._.parentDialog;
                if (!this._.parentDialog) {
                    a.dialog._.currentZIndex = null;
                    K.removeListener('keydown', C);
                    K.removeListener(b.opera ? 'keypress' : 'keyup', D);
                    for (var M in {
                        keyup: 1,
                        keydown: 1,
                        keypress: 1
                    }) K.removeListener(M, J);
                    var N = this._.editor;
                    N.focus();
                    if (N.mode == 'wysiwyg' && c) {
                        var O = N.getSelection();
                        O && O.unlock(true);
                    }
                } else a.dialog._.currentZIndex -= 10;
                this.foreach(function (P) {
                    P.resetInitValue && P.resetInitValue();
                });
            },
            addPage: function (K) {
                var W = this;
                var L = [],
                    M = K.label ? ' title="' + e.htmlEncode(K.label) + '"' : '',
                    N = K.elements,
                    O = a.dialog._.uiElementBuilders.vbox.build(W, {
                        type: 'vbox',
                        className: 'cke_dialog_page_contents',
                        children: K.elements,
                        expand: !! K.expand,
                        padding: K.padding,
                        style: K.style || 'width: 100%;' + (b.ie6Compat ? '' : 'height: 100%;')
                    }, L),
                    P = h.createFromHtml(L.join(''));
                P.setAttribute('role', 'tabpanel');
                var Q = b,
                    R = K.id + '_' + e.getNextNumber(),
                    S = h.createFromHtml(['<a class="cke_dialog_tab"', W._.pageCount > 0 ? ' cke_last' : 'cke_first', M, !! K.hidden ? ' style="display:none"' : '', ' id="', R, '"', Q.gecko && Q.version >= 10900 && !Q.hc ? '' : ' href="javascript:void(0)"', ' tabIndex="-1"', ' hidefocus="true"', ' role="tab">', K.label, '</a>'].join(''));
                P.setAttribute('aria-labelledby', R);
                if (W._.pageCount === 0) W.parts.dialog.addClass('cke_single_page');
                else W.parts.dialog.removeClass('cke_single_page');
                W._.tabs[K.id] = [S, P];
                W._.tabIdList.push(K.id);
                W._.pageCount++;
                W._.lastTab = S;
                var T = W._.contents[K.id] = {},
                    U, V = O.getChild();
                while (U = V.shift()) {
                    T[U.id] = U;
                    if (typeof U.getChild == 'function') V.push.apply(V, U.getChild());
                }
                P.setAttribute('name', K.id);
                P.appendTo(W.parts.contents);
                S.unselectable();
                W.parts.tabs.append(S);
                if (K.accessKey) {
                    E(W, W, 'CTRL+' + K.accessKey, H, G);
                    W._.accessKeyMap['CTRL+' + K.accessKey] = K.id;
                }
            },
            selectPage: function (K) {
                var P = this;
                for (var L in P._.tabs) {
                    var M = P._.tabs[L][0],
                        N = P._.tabs[L][1];
                    if (L != K) {
                        M.removeClass('cke_dialog_tab_selected');
                        N.hide();
                    }
                    N.setAttribute('aria-hidden', L != K);
                }
                var O = P._.tabs[K];
                O[0].addClass('cke_dialog_tab_selected');
                O[1].show();
                P._.currentTabId = K;
                P._.currentTabIndex = e.indexOf(P._.tabIdList, K);
            },
            hidePage: function (K) {
                var L = this._.tabs[K] && this._.tabs[K][0];
                if (!L) return;
                L.hide();
            },
            showPage: function (K) {
                var L = this._.tabs[K] && this._.tabs[K][0];
                if (!L) return;
                L.show();
            },
            getElement: function () {
                return this._.element;
            },
            getName: function () {
                return this._.name;
            },
            getContentElement: function (K, L) {
                var M = this._.contents[K];
                return M && M[L];
            },
            getValueOf: function (K, L) {
                return this.getContentElement(K, L).getValue();
            },
            setValueOf: function (K, L, M) {
                return this.getContentElement(K, L).setValue(M);
            },
            getButton: function (K) {
                return this._.buttons[K];
            },
            click: function (K) {
                return this._.buttons[K].click();
            },
            disableButton: function (K) {
                return this._.buttons[K].disable();
            },
            enableButton: function (K) {
                return this._.buttons[K].enable();
            },
            getPageCount: function () {
                return this._.pageCount;
            },
            getParentEditor: function () {
                return this._.editor;
            },
            getSelectedElement: function () {
                return this.getParentEditor().getSelection().getSelectedElement();
            },
            addFocusable: function (K, L) {
                var N = this;
                if (typeof L == 'undefined') {
                    L = N._.focusList.length;
                    N._.focusList.push(new o(N, K, L));
                } else {
                    N._.focusList.splice(L, 0, new o(N, K, L));
                    for (var M = L + 1; M < N._.focusList.length; M++) N._.focusList[M].focusIndex++;
                }
            }
        };
        e.extend(a.dialog, {
            add: function (K, L) {
                if (!this._.dialogDefinitions[K] || typeof L == 'function') this._.dialogDefinitions[K] = L;
            },
            exists: function (K) {
                return !!this._.dialogDefinitions[K];
            },
            getCurrent: function () {
                return a.dialog._.currentTop;
            },
            okButton: (function () {
                var K = function (L, M) {
                    M = M || {};
                    return e.extend({
                        id: 'ok',
                        type: 'button',
                        label: L.lang.common.ok,
                        'class': 'cke_dialog_ui_button_ok',
                        onClick: function (N) {
                            var O = N.data.dialog;
                            if (O.fire('ok', {
                                hide: true
                            }).hide !== false) O.hide();
                        }
                    }, M, true);
                };
                K.type = 'button';
                K.override = function (L) {
                    return e.extend(function (M) {
                        return K(M, L);
                    }, {
                        type: 'button'
                    }, true);
                };
                return K;
            })(),
            cancelButton: (function () {
                var K = function (L, M) {
                    M = M || {};
                    return e.extend({
                        id: 'cancel',
                        type: 'button',
                        label: L.lang.common.cancel,
                        'class': 'cke_dialog_ui_button_cancel',
                        onClick: function (N) {
                            var O = N.data.dialog;
                            if (O.fire('cancel', {
                                hide: true
                            }).hide !== false) O.hide();
                        }
                    }, M, true);
                };
                K.type = 'button';
                K.override = function (L) {
                    return e.extend(function (M) {
                        return K(M, L);
                    }, {
                        type: 'button'
                    }, true);
                };
                return K;
            })(),
            addUIElement: function (K, L) {
                this._.uiElementBuilders[K] = L;
            }
        });
        a.dialog._ = {
            uiElementBuilders: {},
            dialogDefinitions: {},
            currentTop: null,
            currentZIndex: null
        };
        a.event.implementOn(a.dialog);
        a.event.implementOn(a.dialog.prototype, true);
        var p = {
            resizable: 0,
            minWidth: 600,
            minHeight: 400,
            buttons: [a.dialog.okButton, a.dialog.cancelButton]
        },
            q = function (K, L, M) {
                for (var N = 0, O; O = K[N]; N++) {
                    if (O.id == L) return O;
                    if (M && O[M]) {
                        var P = q(O[M], L, M);
                        if (P) return P;
                    }
                }
                return null;
            },
            r = function (K, L, M, N, O) {
                if (M) {
                    for (var P = 0, Q; Q = K[P]; P++) {
                        if (Q.id == M) {
                            K.splice(P, 0, L);
                            return L;
                        }
                        if (N && Q[N]) {
                            var R = r(Q[N], L, M, N, true);
                            if (R) return R;
                        }
                    }
                    if (O) return null;
                }
                K.push(L);
                return L;
            },
            s = function (K, L, M) {
                for (var N = 0, O; O = K[N]; N++) {
                    if (O.id == L) return K.splice(N, 1);
                    if (M && O[M]) {
                        var P = s(O[M], L, M);
                        if (P) return P;
                    }
                }
                return null;
            },
            t = function (K, L) {
                this.dialog = K;
                var M = L.contents;
                for (var N = 0, O; O = M[N]; N++) M[N] = new u(K, O);
                e.extend(this, L);
            };
        t.prototype = {
            getContents: function (K) {
                return q(this.contents, K);
            },
            getButton: function (K) {
                return q(this.buttons, K);
            },
            addContents: function (K, L) {
                return r(this.contents, K, L);
            },
            addButton: function (K, L) {
                return r(this.buttons, K, L);
            },
            removeContents: function (K) {
                s(this.contents, K);
            },
            removeButton: function (K) {
                s(this.buttons, K);
            }
        };

        function u(K, L) {
            this._ = {
                dialog: K
            };
            e.extend(this, L);
        };
        u.prototype = {
            get: function (K) {
                return q(this.elements, K, 'children');
            },
            add: function (K, L) {
                return r(this.elements, K, L, 'children');
            },
            remove: function (K) {
                s(this.elements, K, 'children');
            }
        };

        function v(K) {
            var L = null,
                M = null,
                N = K.getElement().getFirst(),
                O = K.getParentEditor(),
                P = O.config.dialog_magnetDistance,
                Q = O.skin.margins || [0, 0, 0, 0];
            if (typeof P == 'undefined') P = 20;

            function R(T) {
                var U = K.getSize(),
                    V = a.document.getWindow().getViewPaneSize(),
                    W = T.data.$.screenX,
                    X = T.data.$.screenY,
                    Y = W - L.x,
                    Z = X - L.y,
                    aa, ab;
                L = {
                    x: W,
                    y: X
                };
                M.x += Y;
                M.y += Z;
                if (M.x + Q[3] < P) aa = -Q[3];
                else if (M.x - Q[1] > V.width - U.width - P) aa = V.width - U.width + Q[1];
                else aa = M.x;
                if (M.y + Q[0] < P) ab = -Q[0];
                else if (M.y - Q[2] > V.height - U.height - P) ab = V.height - U.height + Q[2];
                else ab = M.y;
                K.move(aa, ab);
                T.data.preventDefault();
            };

            function S(T) {
                a.document.removeListener('mousemove', R);
                a.document.removeListener('mouseup', S);
                if (b.ie6Compat) {
                    var U = y.getChild(0).getFrameDocument();
                    U.removeListener('mousemove', R);
                    U.removeListener('mouseup', S);
                }
            };
            K.parts.title.on('mousedown', function (T) {
                K._.updateSize = true;
                L = {
                    x: T.data.$.screenX,
                    y: T.data.$.screenY
                };
                a.document.on('mousemove', R);
                a.document.on('mouseup', S);
                M = K.getPosition();
                if (b.ie6Compat) {
                    var U = y.getChild(0).getFrameDocument();
                    U.on('mousemove', R);
                    U.on('mouseup', S);
                }
                T.data.preventDefault();
            }, K);
        };

        function w(K) {
            var L = K.definition,
                M = L.minWidth || 0,
                N = L.minHeight || 0,
                O = L.resizable,
                P = K.getParentEditor().skin.margins || [0, 0, 0, 0];

            function Q(ab, ac) {
                ab.y += ac;
            };

            function R(ab, ac) {
                ab.x2 += ac;
            };

            function S(ab, ac) {
                ab.y2 += ac;
            };

            function T(ab, ac) {
                ab.x += ac;
            };
            var U = null,
                V = null,
                W = K._.editor.config.magnetDistance,
                X = ['tl', 't', 'tr', 'l', 'r', 'bl', 'b', 'br'];

            function Y(ab) {
                var ac = ab.listenerData.part,
                    ad = K.getSize();
                V = K.getPosition();
                e.extend(V, {
                    x2: V.x + ad.width,
                    y2: V.y + ad.height
                });
                U = {
                    x: ab.data.$.screenX,
                    y: ab.data.$.screenY
                };
                a.document.on('mousemove', Z, K, {
                    part: ac
                });
                a.document.on('mouseup', aa, K, {
                    part: ac
                });
                if (b.ie6Compat) {
                    var ae = y.getChild(0).getFrameDocument();
                    ae.on('mousemove', Z, K, {
                        part: ac
                    });
                    ae.on('mouseup', aa, K, {
                        part: ac
                    });
                }
                ab.data.preventDefault();
            };

            function Z(ab) {
                var ac = ab.data.$.screenX,
                    ad = ab.data.$.screenY,
                    ae = ac - U.x,
                    af = ad - U.y,
                    ag = a.document.getWindow().getViewPaneSize(),
                    ah = ab.listenerData.part;
                if (ah.search('t') != -1) Q(V, af);
                if (ah.search('l') != -1) T(V, ae);
                if (ah.search('b') != -1) S(V, af);
                if (ah.search('r') != -1) R(V, ae);
                U = {
                    x: ac,
                    y: ad
                };
                var ai, aj, ak, al;
                if (V.x + P[3] < W) ai = -P[3];
                else if (ah.search('l') != -1 && V.x2 - V.x < M + W) ai = V.x2 - M;
                else ai = V.x;
                if (V.y + P[0] < W) aj = -P[0];
                else if (ah.search('t') != -1 && V.y2 - V.y < N + W) aj = V.y2 - N;
                else aj = V.y;
                if (V.x2 - P[1] > ag.width - W) ak = ag.width + P[1];
                else if (ah.search('r') != -1 && V.x2 - V.x < M + W) ak = V.x + M;
                else ak = V.x2;
                if (V.y2 - P[2] > ag.height - W) al = ag.height + P[2];
                else if (ah.search('b') != -1 && V.y2 - V.y < N + W) al = V.y + N;
                else al = V.y2;
                K.move(ai, aj);
                K.resize(ak - ai, al - aj);
                ab.data.preventDefault();
            };

            function aa(ab) {
                a.document.removeListener('mouseup', aa);
                a.document.removeListener('mousemove', Z);
                if (b.ie6Compat) {
                    var ac = y.getChild(0).getFrameDocument();
                    ac.removeListener('mouseup', aa);
                    ac.removeListener('mousemove', Z);
                }
            };
        };
        var x, y, z = function (K) {
            var L = a.document.getWindow();
            if (!y) {
                var M = K.config.dialog_backgroundCoverColor || 'white',
                    N = ['<div style="position: ', b.ie6Compat ? 'absolute' : 'fixed', '; z-index: ', K.config.baseFloatZIndex, '; top: 0px; left: 0px; ', !b.ie6Compat ? 'background-color: ' + M : '', '" id="cke_dialog_background_cover">'];
                if (b.ie6Compat) {
                    var O = b.isCustomDomain(),
                        P = "<html><body style=\\'background-color:" + M + ";\\'></body></html>";
                    N.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:');
                    N.push('void((function(){document.open();' + (O ? "document.domain='" + document.domain + "';" : '') + "document.write( '" + P + "' );" + 'document.close();' + '})())');
                    N.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>');
                }
                N.push('</div>');
                y = h.createFromHtml(N.join(''));
            }
            var Q = y,
                R = function () {
                    var V = L.getViewPaneSize();
                    Q.setStyles({
                        width: V.width + 'px',
                        height: V.height + 'px'
                    });
                },
                S = function () {
                    var V = L.getScrollPosition(),
                        W = a.dialog._.currentTop;
                    Q.setStyles({
                        left: V.x + 'px',
                        top: V.y + 'px'
                    });
                    do {
                        var X = W.getPosition();
                        W.move(X.x, X.y);
                    } while (W = W._.parentDialog)
                };
            x = R;
            L.on('resize', R);
            R();
            if (b.ie6Compat) {
                var T = function () {
                    S();
                    arguments.callee.prevScrollHandler.apply(this, arguments);
                };
                L.$.setTimeout(function () {
                    T.prevScrollHandler = window.onscroll || (function () {});
                    window.onscroll = T;
                }, 0);
                S();
            }
            var U = K.config.dialog_backgroundCoverOpacity;
            Q.setOpacity(typeof U != 'undefined' ? U : 0.5);
            Q.appendTo(a.document.getBody());
        },
            A = function () {
                if (!y) return;
                var K = a.document.getWindow();
                y.remove();
                K.removeListener('resize', x);
                if (b.ie6Compat) K.$.setTimeout(function () {
                    var L = window.onscroll && window.onscroll.prevScrollHandler;
                    window.onscroll = L || null;
                }, 0);
                x = null;
            },
            B = {},
            C = function (K) {
                var L = K.data.$.ctrlKey || K.data.$.metaKey,
                    M = K.data.$.altKey,
                    N = K.data.$.shiftKey,
                    O = String.fromCharCode(K.data.$.keyCode),
                    P = B[(L ? 'CTRL+' : '') + (M ? 'ALT+' : '') + (N ? 'SHIFT+' : '') + O];
                if (!P || !P.length) return;
                P = P[P.length - 1];
                P.keydown && P.keydown.call(P.uiElement, P.dialog, P.key);
                K.data.preventDefault();
            },
            D = function (K) {
                var L = K.data.$.ctrlKey || K.data.$.metaKey,
                    M = K.data.$.altKey,
                    N = K.data.$.shiftKey,
                    O = String.fromCharCode(K.data.$.keyCode),
                    P = B[(L ? 'CTRL+' : '') + (M ? 'ALT+' : '') + (N ? 'SHIFT+' : '') + O];
                if (!P || !P.length) return;
                P = P[P.length - 1];
                if (P.keyup) {
                    P.keyup.call(P.uiElement, P.dialog, P.key);
                    K.data.preventDefault();
                }
            },
            E = function (K, L, M, N, O) {
                var P = B[M] || (B[M] = []);
                P.push({
                    uiElement: K,
                    dialog: L,
                    key: M,
                    keyup: O || K.accessKeyUp,
                    keydown: N || K.accessKeyDown
                });
            },
            F = function (K) {
                for (var L in B) {
                    var M = B[L];
                    for (var N = M.length - 1; N >= 0; N--) {
                        if (M[N].dialog == K || M[N].uiElement == K) M.splice(N, 1);
                    }
                    if (M.length === 0) delete B[L];
                }
            },
            G = function (K, L) {
                if (K._.accessKeyMap[L]) K.selectPage(K._.accessKeyMap[L]);
            },
            H = function (K, L) {},
            I = {
                27: 1,
                13: 1
            },
            J = function (K) {
                if (K.data.getKeystroke() in I) K.data.stopPropagation();
            };
        (function () {
            k.dialog = {
                uiElement: function (K, L, M, N, O, P, Q) {
                    if (arguments.length < 4) return;
                    var R = (N.call ? N(L) : N) || 'div',
                        S = ['<', R, ' '],
                        T = (O && O.call ? O(L) : O) || {},
                        U = (P && P.call ? P(L) : P) || {},
                        V = (Q && Q.call ? Q.call(this, K, L) : Q) || '',
                        W = this.domId = U.id || e.getNextNumber() + '_uiElement',
                        X = this.id = L.id,
                        Y;
                    U.id = W;
                    var Z = {};
                    if (L.type) Z['cke_dialog_ui_' + L.type] = 1;
                    if (L.className) Z[L.className] = 1;
                    var aa = U['class'] && U['class'].split ? U['class'].split(' ') : [];
                    for (Y = 0; Y < aa.length; Y++) {
                        if (aa[Y]) Z[aa[Y]] = 1;
                    }
                    var ab = [];
                    for (Y in Z) ab.push(Y);
                    U['class'] = ab.join(' ');
                    if (L.title) U.title = L.title;
                    var ac = (L.style || '').split(';');
                    for (Y in T) ac.push(Y + ':' + T[Y]);
                    if (L.hidden) ac.push('display:none');
                    for (Y = ac.length - 1; Y >= 0; Y--) {
                        if (ac[Y] === '') ac.splice(Y, 1);
                    }
                    if (ac.length > 0) U.style = (U.style ? U.style + '; ' : '') + ac.join('; ');
                    for (Y in U) S.push(Y + '="' + e.htmlEncode(U[Y]) + '" ');
                    S.push('>', V, '</', R, '>');
                    M.push(S.join(''));
                    (this._ || (this._ = {})).dialog = K;
                    if (typeof L.isChanged == 'boolean') this.isChanged = function () {
                        return L.isChanged;
                    };
                    if (typeof L.isChanged == 'function') this.isChanged = L.isChanged;
                    a.event.implementOn(this);
                    this.registerEvents(L);
                    if (this.accessKeyUp && this.accessKeyDown && L.accessKey) E(this, K, 'CTRL+' + L.accessKey);
                    var ad = this;
                    K.on('load', function () {
                        if (ad.getInputElement()) ad.getInputElement().on('focus', function () {
                            K._.tabBarMode = false;
                            K._.hasFocus = true;
                            ad.fire('focus');
                        }, ad);
                    });
                    if (this.keyboardFocusable) {
                        this.tabIndex = L.tabIndex || 0;
                        this.focusIndex = K._.focusList.push(this) - 1;
                        this.on('focus', function () {
                            K._.currentFocusIndex = ad.focusIndex;
                        });
                    }
                    e.extend(this, L);
                },
                hbox: function (K, L, M, N, O) {
                    if (arguments.length < 4) return;
                    this._ || (this._ = {});
                    var P = this._.children = L,
                        Q = O && O.widths || null,
                        R = O && O.height || null,
                        S = {},
                        T, U = function () {
                            var W = ['<tbody><tr class="cke_dialog_ui_hbox">'];
                            for (T = 0; T < M.length; T++) {
                                var X = 'cke_dialog_ui_hbox_child',
                                    Y = [];
                                if (T === 0) X = 'cke_dialog_ui_hbox_first';
                                if (T == M.length - 1) X = 'cke_dialog_ui_hbox_last';
                                W.push('<td class="', X, '" role="presentation" ');
                                if (Q) {
                                    if (Q[T]) Y.push('width:' + e.cssLength(Q[T]));
                                } else Y.push('width:' + Math.floor(100 / M.length) + '%');
                                if (R) Y.push('height:' + e.cssLength(R));
                                if (O && O.padding != undefined) Y.push('padding:' + e.cssLength(O.padding));
                                if (Y.length > 0) W.push('style="' + Y.join('; ') + '" ');
                                W.push('>', M[T], '</td>');
                            }
                            W.push('</tr></tbody>');
                            return W.join('');
                        },
                        V = {
                            role: 'presentation'
                        };
                    O && O.align && (V.align = O.align);
                    k.dialog.uiElement.call(this, K, O || {
                        type: 'hbox'
                    }, N, 'table', S, V, U);
                },
                vbox: function (K, L, M, N, O) {
                    if (arguments.length < 3) return;
                    this._ || (this._ = {});
                    var P = this._.children = L,
                        Q = O && O.width || null,
                        R = O && O.heights || null,
                        S = function () {
                            var T = ['<table role="presentation" cellspacing="0" border="0" '];
                            T.push('style="');
                            if (O && O.expand) T.push('height:100%;');
                            T.push('width:' + e.cssLength(Q || '100%'), ';');
                            T.push('"');
                            T.push('align="', e.htmlEncode(O && O.align || (K.getParentEditor().lang.dir == 'ltr' ? 'left' : 'right')), '" ');
                            T.push('><tbody>');
                            for (var U = 0; U < M.length; U++) {
                                var V = [];
                                T.push('<tr><td role="presentation" ');
                                if (Q) V.push('width:' + e.cssLength(Q || '100%'));
                                if (R) V.push('height:' + e.cssLength(R[U]));
                                else if (O && O.expand) V.push('height:' + Math.floor(100 / M.length) + '%');
                                if (O && O.padding != undefined) V.push('padding:' + e.cssLength(O.padding));
                                if (V.length > 0) T.push('style="', V.join('; '), '" ');
                                T.push(' class="cke_dialog_ui_vbox_child">', M[U], '</td></tr>');
                            }
                            T.push('</tbody></table>');
                            return T.join('');
                        };
                    k.dialog.uiElement.call(this, K, O || {
                        type: 'vbox'
                    }, N, 'div', null, {
                        role: 'presentation'
                    }, S);
                }
            };
        })();
        k.dialog.uiElement.prototype = {
            getElement: function () {
                return a.document.getById(this.domId);
            },
            getInputElement: function () {
                return this.getElement();
            },
            getDialog: function () {
                return this._.dialog;
            },
            setValue: function (K) {
                this.getInputElement().setValue(K);
                this.fire('change', {
                    value: K
                });
                return this;
            },
            getValue: function () {
                return this.getInputElement().getValue();
            },
            isChanged: function () {
                return false;
            },
            selectParentTab: function () {
                var N = this;
                var K = N.getInputElement(),
                    L = K,
                    M;
                while ((L = L.getParent()) && L.$.className.search('cke_dialog_page_contents') == -1) {}
                if (!L) return N;
                M = L.getAttribute('name');
                if (N._.dialog._.currentTabId != M) N._.dialog.selectPage(M);
                return N;
            },
            focus: function () {
                this.selectParentTab().getInputElement().focus();
                return this;
            },
            registerEvents: function (K) {
                var L = /^on([A-Z]\w+)/,
                    M, N = function (P, Q, R, S) {
                        Q.on('load', function () {
                            P.getInputElement().on(R, S, P);
                        });
                    };
                for (var O in K) {
                    if (!(M = O.match(L))) continue;
                    if (this.eventProcessors[O]) this.eventProcessors[O].call(this, this._.dialog, K[O]);
                    else N(this, this._.dialog, M[1].toLowerCase(), K[O]);
                }
                return this;
            },
            eventProcessors: {
                onLoad: function (K, L) {
                    K.on('load', L, this);
                },
                onShow: function (K, L) {
                    K.on('show', L, this);
                },
                onHide: function (K, L) {
                    K.on('hide', L, this);
                }
            },
            accessKeyDown: function (K, L) {
                this.focus();
            },
            accessKeyUp: function (K, L) {},
            disable: function () {
                var K = this.getInputElement();
                K.setAttribute('disabled', 'true');
                K.addClass('cke_disabled');
            },
            enable: function () {
                var K = this.getInputElement();
                K.removeAttribute('disabled');
                K.removeClass('cke_disabled');
            },
            isEnabled: function () {
                return !this.getInputElement().getAttribute('disabled');
            },
            isVisible: function () {
                return this.getInputElement().isVisible();
            },
            isFocusable: function () {
                if (!this.isEnabled() || !this.isVisible()) return false;
                return true;
            }
        };
        k.dialog.hbox.prototype = e.extend(new k.dialog.uiElement(), {
            getChild: function (K) {
                var L = this;
                if (arguments.length < 1) return L._.children.concat();
                if (!K.splice) K = [K];
                if (K.length < 2) return L._.children[K[0]];
                else return L._.children[K[0]] && L._.children[K[0]].getChild ? L._.children[K[0]].getChild(K.slice(1, K.length)) : null;
            }
        }, true);
        k.dialog.vbox.prototype = new k.dialog.hbox();
        (function () {
            var K = {
                build: function (L, M, N) {
                    var O = M.children,
                        P, Q = [],
                        R = [];
                    for (var S = 0; S < O.length && (P = O[S]); S++) {
                        var T = [];
                        Q.push(T);
                        R.push(a.dialog._.uiElementBuilders[P.type].build(L, P, T));
                    }
                    return new k.dialog[M.type](L, R, Q, N, M);
                }
            };
            a.dialog.addUIElement('hbox', K);
            a.dialog.addUIElement('vbox', K);
        })();
        a.dialogCommand = function (K) {
            this.dialogName = K;
        };
        a.dialogCommand.prototype = {
            exec: function (K) {
                K.openDialog(this.dialogName);
            },
            canUndo: false,
            editorFocus: c
        };
        (function () {
            var K = /^([a]|[^a])+$/,
                L = /^\d*$/,
                M = /^\d*(?:\.\d+)?$/;
            a.VALIDATE_OR = 1;
            a.VALIDATE_AND = 2;
            a.dialog.validate = {
                functions: function () {
                    return function () {
                        var T = this;
                        var N = T && T.getValue ? T.getValue() : arguments[0],
                            O = undefined,
                            P = 2,
                            Q = [],
                            R;
                        for (R = 0; R < arguments.length; R++) {
                            if (typeof arguments[R] == 'function') Q.push(arguments[R]);
                            else break;
                        }
                        if (R < arguments.length && typeof arguments[R] == 'string') {
                            O = arguments[R];
                            R++;
                        }
                        if (R < arguments.length && typeof arguments[R] == 'number') P = arguments[R];
                        var S = P == 2 ? true : false;
                        for (R = 0; R < Q.length; R++) {
                            if (P == 2) S = S && Q[R](N);
                            else S = S || Q[R](N);
                        }
                        if (!S) {
                            if (O !== undefined) alert(O);
                            if (T && (T.select || T.focus)) T.select || T.focus();
                            return false;
                        }
                        return true;
                    };
                },
                regex: function (N, O) {
                    return function () {
                        var Q = this;
                        var P = Q && Q.getValue ? Q.getValue() : arguments[0];
                        if (!N.test(P)) {
                            if (O !== undefined) alert(O);
                            if (Q && (Q.select || Q.focus)) if (Q.select) Q.select();
                            else Q.focus();
                            return false;
                        }
                        return true;
                    };
                },
                notEmpty: function (N) {
                    return this.regex(K, N);
                },
                integer: function (N) {
                    return this.regex(L, N);
                },
                number: function (N) {
                    return this.regex(M, N);
                },
                equals: function (N, O) {
                    return this.functions(function (P) {
                        return P == N;
                    }, O);
                },
                notEqual: function (N, O) {
                    return this.functions(function (P) {
                        return P != N;
                    }, O);
                }
            };
        })();
    })();
    e.extend(a.editor.prototype, {
        openDialog: function (l, m) {
            var n = a.dialog._.dialogDefinitions[l];
            if (typeof n == 'function') {
                var o = this._.storedDialogs || (this._.storedDialogs = {}),
                    p = o[l] || (o[l] = new a.dialog(this, l));
                m && m.call(p, p);
                p.show();
                return p;
            } else if (n == 'failed') throw new Error('[CKEDITOR.dialog.openDialog] Dialog "' + l + '" failed when loading definition.');
            var q = a.document.getBody(),
                r = q.$.style.cursor,
                s = this;
            q.setStyle('cursor', 'wait');
            a.scriptLoader.load(a.getUrl(n), function () {
                if (typeof a.dialog._.dialogDefinitions[l] != 'function') a.dialog._.dialogDefinitions[l] = 'failed';
                s.openDialog(l, m);
                q.setStyle('cursor', r);
            });
            return null;
        }
    });
    j.add('dialog', {
        requires: ['dialogui']
    });
    j.add('styles', {
        requires: ['selection']
    });
    a.editor.prototype.attachStyleStateChange = function (l, m) {
        var n = this._.styleStateChangeCallbacks;
        if (!n) {
            n = this._.styleStateChangeCallbacks = [];
            this.on('selectionChange', function (o) {
                for (var p = 0; p < n.length; p++) {
                    var q = n[p],
                        r = q.style.checkActive(o.data.path) ? 1 : 2;
                    if (q.state !== r) {
                        q.fn.call(this, r);
                        q.state !== r;
                    }
                }
            });
        }
        n.push({
            style: l,
            fn: m
        });
    };
    a.STYLE_BLOCK = 1;
    a.STYLE_INLINE = 2;
    a.STYLE_OBJECT = 3;
    (function () {
        var l = {
            address: 1,
            div: 1,
            h1: 1,
            h2: 1,
            h3: 1,
            h4: 1,
            h5: 1,
            h6: 1,
            p: 1,
            pre: 1
        },
            m = {
                a: 1,
                embed: 1,
                hr: 1,
                img: 1,
                li: 1,
                object: 1,
                ol: 1,
                table: 1,
                td: 1,
                tr: 1,
                ul: 1
            },
            n = /\s*(?:;\s*|$)/;
        a.style = function (L, M) {
            if (M) {
                L = e.clone(L);
                G(L.attributes, M);
                G(L.styles, M);
            }
            var N = this.element = (L.element || '*').toLowerCase();
            this.type = N == '#' || l[N] ? 1 : m[N] ? 3 : 2;
            this._ = {
                definition: L
            };
        };
        a.style.prototype = {
            apply: function (L) {
                K.call(this, L, false);
            },
            remove: function (L) {
                K.call(this, L, true);
            },
            applyToRange: function (L) {
                var M = this;
                return (M.applyToRange = M.type == 2 ? o : M.type == 1 ? q : null).call(M, L);
            },
            removeFromRange: function (L) {
                return (this.removeFromRange = this.type == 2 ? p : null).call(this, L);
            },
            applyToObject: function (L) {
                E(L, this);
            },
            checkActive: function (L) {
                switch (this.type) {
                case 1:
                    return this.checkElementRemovable(L.block || L.blockLimit, true);
                case 2:
                    var M = L.elements;
                    for (var N = 0, O; N < M.length; N++) {
                        O = M[N];
                        if (O == L.block || O == L.blockLimit) continue;
                        if (this.checkElementRemovable(O, true)) return true;
                    }
                }
                return false;
            },
            checkElementRemovable: function (L, M) {
                if (!L) return false;
                var N = this._.definition,
                    O;
                if (L.getName() == this.element) {
                    if (!M && !L.hasAttributes()) return true;
                    O = H(N);
                    if (O._length) {
                        for (var P in O) {
                            if (P == '_length') continue;
                            var Q = L.getAttribute(P) || '';
                            if (O[P] == (P == 'style' ? J(Q, false) : Q)) {
                                if (!M) return true;
                            } else if (M) return false;
                        }
                        if (M) return true;
                    } else return true;
                }
                var R = I(this)[L.getName()];
                if (R) {
                    if (!(O = R.attributes)) return true;
                    for (var S = 0; S < O.length; S++) {
                        P = O[S][0];
                        var T = L.getAttribute(P);
                        if (T) {
                            var U = O[S][1];
                            if (U === null || typeof U == 'string' && T == U || U.test(T)) return true;
                        }
                    }
                }
                return false;
            }
        };
        a.style.getStyleText = function (L) {
            var M = L._ST;
            if (M) return M;
            M = L.styles;
            var N = L.attributes && L.attributes.style || '';
            if (N.length) N = N.replace(n, ';');
            for (var O in M) N += (O + ':' + M[O]).replace(n, ';');
            if (N.length) N = J(N);
            return L._ST = N;
        };

        function o(L) {
            var al = this;
            var M = L.document;
            if (L.collapsed) {
                var N = D(al, M);
                L.insertNode(N);
                L.moveToPosition(N, 2);
                return;
            }
            var O = al.element,
                P = al._.definition,
                Q, R = f[O] || (Q = true, f.span),
                S = L.createBookmark();
            L.enlarge(1);
            L.trim();
            var T = L.getBoundaryNodes(),
                U = T.startNode,
                V = T.endNode.getNextSourceNode(true);
            if (!V) {
                var W;
                V = W = M.createText('');
                V.insertAfter(L.endContainer);
            }
            var X = V.getParent();
            if (X && X.getAttribute('_fck_bookmark')) V = X;
            if (V.equals(U)) {
                V = V.getNextSourceNode(true);
                if (!V) {
                    V = W = M.createText('');
                    V.insertAfter(U);
                }
            }
            var Y = U,
                Z, aa;
            while (Y) {
                var ab = false;
                if (Y.equals(V)) {
                    Y = null;
                    ab = true;
                } else {
                    var ac = Y.type,
                        ad = ac == 1 ? Y.getName() : null;
                    if (ad && Y.getAttribute('_fck_bookmark')) {
                        Y = Y.getNextSourceNode(true);
                        continue;
                    }
                    if (!ad || R[ad] && (Y.getPosition(V) | 4 | 0 | 8) == 4 + 0 + 8 && (!P.childRule || P.childRule(Y))) {
                        var ae = Y.getParent();
                        if (ae && ((ae.getDtd() || f.span)[O] || Q) && (!P.parentRule || P.parentRule(ae))) {
                            if (!Z && (!ad || !f.$removeEmpty[ad] || (Y.getPosition(V) | 4 | 0 | 8) == 4 + 0 + 8)) {
                                Z = new d.range(M);
                                Z.setStartBefore(Y);
                            }
                            if (ac == 3 || ac == 1 && !Y.getChildCount()) {
                                var af = Y,
                                    ag;
                                while (!af.$.nextSibling && (ag = af.getParent(), R[ag.getName()]) && (ag.getPosition(U) | 2 | 0 | 8) == 2 + 0 + 8 && (!P.childRule || P.childRule(ag))) af = ag;
                                Z.setEndAfter(af);
                                if (!af.$.nextSibling) ab = true;
                                if (!aa) aa = ac != 3 || /[^\s\ufeff]/.test(Y.getText());
                            }
                        } else ab = true;
                    } else ab = true;
                    Y = Y.getNextSourceNode();
                }
                if (ab && aa && Z && !Z.collapsed) {
                    var ah = D(al, M),
                        ai = Z.getCommonAncestor();
                    while (ah && ai) {
                        if (ai.getName() == O) {
                            for (var aj in P.attributes) {
                                if (ah.getAttribute(aj) == ai.getAttribute(aj)) ah.removeAttribute(aj);
                            }
                            for (var ak in P.styles) {
                                if (ah.getStyle(ak) == ai.getStyle(ak)) ah.removeStyle(ak);
                            }
                            if (!ah.hasAttributes()) {
                                ah = null;
                                break;
                            }
                        }
                        ai = ai.getParent();
                    }
                    if (ah) {
                        Z.extractContents().appendTo(ah);
                        y(al, ah);
                        Z.insertNode(ah);
                        B(ah);
                        if (!c) ah.$.normalize();
                    }
                    Z = null;
                }
            }
            W && W.remove();
            L.moveToBookmark(S);
        };

        function p(L) {
            L.enlarge(1);
            var M = L.createBookmark(),
                N = M.startNode;
            if (L.collapsed) {
                var O = new d.elementPath(N.getParent()),
                    P;
                for (var Q = 0, R; Q < O.elements.length && (R = O.elements[Q]); Q++) {
                    if (R == O.block || R == O.blockLimit) break;
                    if (this.checkElementRemovable(R)) {
                        var S = L.checkBoundaryOfElement(R, 2),
                            T = !S && L.checkBoundaryOfElement(R, 1);
                        if (T || S) {
                            P = R;
                            P.match = T ? 'start' : 'end';
                        } else {
                            B(R);
                            x(this, R);
                        }
                    }
                }
                if (P) {
                    var U = N;
                    for (Q = 0; true; Q++) {
                        var V = O.elements[Q];
                        if (V.equals(P)) break;
                        else if (V.match) continue;
                        else V = V.clone();
                        V.append(U);
                        U = V;
                    }
                    U[P.match == 'start' ? 'insertBefore' : 'insertAfter'](P);
                }
            } else {
                var W = M.endNode,
                    X = this;

                function Y() {
                    var ab = new d.elementPath(N.getParent()),
                        ac = new d.elementPath(W.getParent()),
                        ad = null,
                        ae = null;
                    for (var af = 0; af < ab.elements.length; af++) {
                        var ag = ab.elements[af];
                        if (ag == ab.block || ag == ab.blockLimit) break;
                        if (X.checkElementRemovable(ag)) ad = ag;
                    }
                    for (af = 0; af < ac.elements.length; af++) {
                        ag = ac.elements[af];
                        if (ag == ac.block || ag == ac.blockLimit) break;
                        if (X.checkElementRemovable(ag)) ae = ag;
                    }
                    if (ae) W.breakParent(ae);
                    if (ad) N.breakParent(ad);
                };
                Y();
                var Z = N.getNext();
                while (!Z.equals(W)) {
                    var aa = Z.getNextSourceNode();
                    if (Z.type == 1 && this.checkElementRemovable(Z)) {
                        if (Z.getName() == this.element) x(this, Z);
                        else z(Z, I(this)[Z.getName()]);
                        if (aa.type == 1 && aa.contains(N)) {
                            Y();
                            aa = N.getNext();
                        }
                    }
                    Z = aa;
                }
            }
            L.moveToBookmark(M);
        };

        function q(L) {
            var M = L.createBookmark(true),
                N = L.createIterator();
            N.enforceRealBlocks = true;
            var O, P = L.document,
                Q;
            while (O = N.getNextParagraph()) {
                var R = D(this, P);
                r(O, R);
            }
            L.moveToBookmark(M);
        };

        function r(L, M) {
            var N = M.is('pre'),
                O = L.is('pre'),
                P = N && !O,
                Q = !N && O;
            if (P) M = w(L, M);
            else if (Q) M = v(t(L), M);
            else L.moveChildren(M);
            M.replace(L);
            if (N) s(M);
        };

        function s(L) {
            var M;
            if (!((M = L.getPreviousSourceNode(true, 1)) && M.is && M.is('pre'))) return;
            var N = u(M.getHtml(), /\n$/, '') + '\n\n' + u(L.getHtml(), /^\n/, '');
            if (c) L.$.outerHTML = '<pre>' + N + '</pre>';
            else L.setHtml(N);
            M.remove();
        };

        function t(L) {
            var M = /(\S\s*)\n(?:\s|(<span[^>]+_fck_bookmark.*?\/span>))*\n(?!$)/gi,
                N = L.getName(),
                O = u(L.getOuterHtml(), M, function (Q, R, S) {
                    return R + '</pre>' + S + '<pre>';
                }),
                P = [];
            O.replace(/<pre>([\s\S]*?)<\/pre>/gi, function (Q, R) {
                P.push(R);
            });
            return P;
        };

        function u(L, M, N) {
            var O = '',
                P = '';
            L = L.replace(/(^<span[^>]+_fck_bookmark.*?\/span>)|(<span[^>]+_fck_bookmark.*?\/span>$)/gi, function (Q, R, S) {
                R && (O = R);
                S && (P = S);
                return '';
            });
            return O + L.replace(M, N) + P;
        };

        function v(L, M) {
            var N = new d.documentFragment(M.getDocument());
            for (var O = 0; O < L.length; O++) {
                var P = L[O];
                P = P.replace(/(\r\n|\r)/g, '\n');
                P = u(P, /^[ \t]*\n/, '');
                P = u(P, /\n$/, '');
                P = u(P, /^[ \t]+|[ \t]+$/g, function (R, S, T) {
                    if (R.length == 1) return '&nbsp;';
                    else if (!S) return e.repeat('&nbsp;', R.length - 1) + ' ';
                    else return ' ' + e.repeat('&nbsp;', R.length - 1);
                });
                P = P.replace(/\n/g, '<br>');
                P = P.replace(/[ \t]{2,}/g, function (R) {
                    return e.repeat('&nbsp;', R.length - 1) + ' ';
                });
                var Q = M.clone();
                Q.setHtml(P);
                N.append(Q);
            }
            return N;
        };

        function w(L, M) {
            var N = L.getHtml();
            N = u(N, /(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '');
            N = N.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi, '$1');
            N = N.replace(/([ \t\n\r]+|&nbsp;)/g, ' ');
            N = N.replace(/<br\b[^>]*>/gi, '\n');
            if (c) {
                var O = L.getDocument().createElement('div');
                O.append(M);
                M.$.outerHTML = '<pre>' + N + '</pre>';
                M = O.getFirst().remove();
            } else M.setHtml(N);
            return M;
        };

        function x(L, M) {
            var N = L._.definition,
                O = N.attributes,
                P = N.styles,
                Q = I(L);

            function R() {
                for (var T in O) {
                    if (T == 'class' && M.getAttribute(T) != O[T]) continue;
                    M.removeAttribute(T);
                }
            };
            R();
            for (var S in P) M.removeStyle(S);
            O = Q[M.getName()];
            if (O) R();
            A(M);
        };

        function y(L, M) {
            var N = L._.definition,
                O = N.attributes,
                P = N.styles,
                Q = I(L),
                R = M.getElementsByTag(L.element);
            for (var S = R.count(); --S >= 0;) x(L, R.getItem(S));
            for (var T in Q) {
                if (T != L.element) {
                    R = M.getElementsByTag(T);
                    for (S = R.count() - 1; S >= 0; S--) {
                        var U = R.getItem(S);
                        z(U, Q[T]);
                    }
                }
            }
        };

        function z(L, M) {
            var N = M && M.attributes;
            if (N) for (var O = 0; O < N.length; O++) {
                var P = N[O][0],
                    Q;
                if (Q = L.getAttribute(P)) {
                    var R = N[O][1];
                    if (R === null || R.test && R.test(Q) || typeof R == 'string' && Q == R) L.removeAttribute(P);
                }
            }
            A(L);
        };

        function A(L) {
            if (!L.hasAttributes()) {
                var M = L.getFirst(),
                    N = L.getLast();
                L.remove(true);
                if (M) {
                    B(M);
                    if (N && !M.equals(N)) B(N);
                }
            }
        };

        function B(L) {
            if (!L || L.type != 1 || !f.$removeEmpty[L.getName()]) return;
            C(L, L.getNext(), true);
            C(L, L.getPrevious());
        };

        function C(L, M, N) {
            if (M && M.type == 1) {
                var O = M.getAttribute('_fck_bookmark');
                if (O) M = N ? M.getNext() : M.getPrevious();
                if (M && M.type == 1 && L.isIdentical(M)) {
                    var P = N ? L.getLast() : L.getFirst();
                    if (O)(N ? M.getPrevious() : M.getNext()).move(L, !N);
                    M.moveChildren(L, !N);
                    M.remove();
                    if (P) B(P);
                }
            }
        };

        function D(L, M) {
            var N, O = L._.definition,
                P = L.element;
            if (P == '*') P = 'span';
            N = new h(P, M);
            return E(N, L);
        };

        function E(L, M) {
            var N = M._.definition,
                O = N.attributes,
                P = a.style.getStyleText(N);
            if (O) for (var Q in O) L.setAttribute(Q, O[Q]);
            if (P) L.setAttribute('style', P);
            return L;
        };
        var F = /#\((.+?)\)/g;

        function G(L, M) {
            for (var N in L) L[N] = L[N].replace(F, function (O, P) {
                return M[P];
            });
        };

        function H(L) {
            var M = L._AC;
            if (M) return M;
            M = {};
            var N = 0,
                O = L.attributes;
            if (O) for (var P in O) {
                N++;
                M[P] = O[P];
            }
            var Q = a.style.getStyleText(L);
            if (Q) {
                if (!M.style) N++;
                M.style = Q;
            }
            M._length = N;
            return L._AC = M;
        };

        function I(L) {
            if (L._.overrides) return L._.overrides;
            var M = L._.overrides = {},
                N = L._.definition.overrides;
            if (N) {
                if (!e.isArray(N)) N = [N];
                for (var O = 0; O < N.length;
                O++) {
                    var P = N[O],
                        Q, R, S;
                    if (typeof P == 'string') Q = P.toLowerCase();
                    else {
                        Q = P.element ? P.element.toLowerCase() : L.element;
                        S = P.attributes;
                    }
                    R = M[Q] || (M[Q] = {});
                    if (S) {
                        var T = R.attributes = R.attributes || [];
                        for (var U in S) T.push([U.toLowerCase(), S[U]]);
                    }
                }
            }
            return M;
        };

        function J(L, M) {
            var N;
            if (M !== false) {
                var O = new h('span');
                O.setAttribute('style', L);
                N = O.getAttribute('style') || '';
            } else N = L;
            return N.replace(/\s*([;:])\s*/, '$1').replace(/([^\s;])$/, '$1;').replace(/,\s+/g, ',').toLowerCase();
        };

        function K(L, M) {
            var N = L.getSelection(),
                O = N.getRanges(),
                P = M ? this.removeFromRange : this.applyToRange;
            for (var Q = 0; Q < O.length; Q++) P.call(this, O[Q]);
            N.selectRanges(O);
        };
    })();
    a.styleCommand = function (l) {
        this.style = l;
    };
    a.styleCommand.prototype.exec = function (l) {
        var n = this;
        l.focus();
        var m = l.document;
        if (m) if (n.state == 2) n.style.apply(m);
        else if (n.state == 1) n.style.remove(m);
        return !!m;
    };
    a.stylesSet = new a.resourceManager('', 'stylesSet');
    a.addStylesSet = e.bind(a.stylesSet.add, a.stylesSet);
    a.loadStylesSet = function (l, m, n) {
        a.stylesSet.addExternal(l, m, '');
        a.stylesSet.load(l, n);
    };
    j.add('domiterator');
    (function () {
        function l(o) {
            var p = this;
            if (arguments.length < 1) return;
            p.range = o;
            p.forceBrBreak = false;
            p.enlargeBr = true;
            p.enforceRealBlocks = false;
            p._ || (p._ = {});
        };
        var m = /^[\r\n\t ]+$/,
            n = d.walker.bookmark();
        l.prototype = {
            getNextParagraph: function (o) {
                var O = this;
                var p, q, r, s, t;
                if (!O._.lastNode) {
                    q = O.range.clone();
                    q.enlarge(O.forceBrBreak || !O.enlargeBr ? 3 : 2);
                    var u = new d.walker(q),
                        v = d.walker.bookmark(true, true);
                    u.evaluator = v;
                    O._.nextNode = u.next();
                    u = new d.walker(q);
                    u.evaluator = v;
                    var w = u.previous();
                    O._.lastNode = w.getNextSourceNode(true);
                    if (O._.lastNode && O._.lastNode.type == 3 && !e.trim(O._.lastNode.getText()) && O._.lastNode.getParent().isBlockBoundary()) {
                        var x = new d.range(q.document);
                        x.moveToPosition(O._.lastNode, 4);
                        if (x.checkEndOfBlock()) {
                            var y = new d.elementPath(x.endContainer),
                                z = y.block || y.blockLimit;
                            O._.lastNode = z.getNextSourceNode(true);
                        }
                    }
                    if (!O._.lastNode) {
                        O._.lastNode = O._.docEndMarker = q.document.createText('');
                        O._.lastNode.insertAfter(w);
                    }
                    q = null;
                }
                var A = O._.nextNode;
                w = O._.lastNode;
                O._.nextNode = null;
                while (A) {
                    var B = false,
                        C = A.type != 1,
                        D = false;
                    if (!C) {
                        var E = A.getName();
                        if (A.isBlockBoundary(O.forceBrBreak && {
                            br: 1
                        })) {
                            if (E == 'br') C = true;
                            else if (!q && !A.getChildCount() && E != 'hr') {
                                p = A;
                                r = A.equals(w);
                                break;
                            }
                            if (q) {
                                q.setEndAt(A, 3);
                                if (E != 'br') O._.nextNode = A;
                            }
                            B = true;
                        } else {
                            if (A.getFirst()) {
                                if (!q) {
                                    q = new d.range(O.range.document);
                                    q.setStartAt(A, 3);
                                }
                                A = A.getFirst();
                                continue;
                            }
                            C = true;
                        }
                    } else if (A.type == 3) if (m.test(A.getText())) C = false;
                    if (C && !q) {
                        q = new d.range(O.range.document);
                        q.setStartAt(A, 3);
                    }
                    r = (!B || C) && A.equals(w);
                    if (q && !B) while (!A.getNext() && !r) {
                        var F = A.getParent();
                        if (F.isBlockBoundary(O.forceBrBreak && {
                            br: 1
                        })) {
                            B = true;
                            r = r || F.equals(w);
                            break;
                        }
                        A = F;
                        C = true;
                        r = A.equals(w);
                        D = true;
                    }
                    if (C) q.setEndAt(A, 4);
                    A = A.getNextSourceNode(D, null, w);
                    r = !A;
                    if ((B || r) && q) {
                        var G = q.getBoundaryNodes(),
                            H = new d.elementPath(q.startContainer);
                        if (G.startNode.getParent().equals(H.blockLimit) && n(G.startNode) && n(G.endNode)) {
                            q = null;
                            O._.nextNode = null;
                        } else break;
                    }
                    if (r) break;
                }
                if (!p) {
                    if (!q) {
                        O._.docEndMarker && O._.docEndMarker.remove();
                        O._.nextNode = null;
                        return null;
                    }
                    H = new d.elementPath(q.startContainer);
                    var I = H.blockLimit,
                        J = {
                            div: 1,
                            th: 1,
                            td: 1
                        };
                    p = H.block;
                    if (!p && !O.enforceRealBlocks && J[I.getName()] && q.checkStartOfBlock() && q.checkEndOfBlock()) p = I;
                    else if (!p || O.enforceRealBlocks && p.getName() == 'li') {
                        p = O.range.document.createElement(o || 'p');
                        q.extractContents().appendTo(p);
                        p.trim();
                        q.insertNode(p);
                        s = t = true;
                    } else if (p.getName() != 'li') {
                        if (!q.checkStartOfBlock() || !q.checkEndOfBlock()) {
                            p = p.clone(false);
                            q.extractContents().appendTo(p);
                            p.trim();
                            var K = q.splitBlock();
                            s = !K.wasStartOfBlock;
                            t = !K.wasEndOfBlock;
                            q.insertNode(p);
                        }
                    } else if (!r) O._.nextNode = p.equals(w) ? null : q.getBoundaryNodes().endNode.getNextSourceNode(true, null, w);
                }
                if (s) {
                    var L = p.getPrevious();
                    if (L && L.type == 1) if (L.getName() == 'br') L.remove();
                    else if (L.getLast() && L.getLast().$.nodeName.toLowerCase() == 'br') L.getLast().remove();
                }
                if (t) {
                    var M = d.walker.bookmark(false, true),
                        N = p.getLast();
                    if (N && N.type == 1 && N.getName() == 'br') if (c || N.getPrevious(M) || N.getNext(M)) N.remove();
                }
                if (!O._.nextNode) O._.nextNode = r || p.equals(w) ? null : p.getNextSourceNode(true, null, w);
                return p;
            }
        };
        d.range.prototype.createIterator = function () {
            return new l(this);
        };
    })();
    j.add('panelbutton', {
        requires: ['button'],
        beforeInit: function (l) {
            l.ui.addHandler(4, k.panelButton.handler);
        }
    });
    a.UI_PANELBUTTON = 4;
    (function () {
        var l = function (m) {
            var o = this;
            var n = o._;
            if (n.state == 0) return;
            o.createPanel(m);
            if (n.on) {
                n.panel.hide();
                return;
            }
            n.panel.showBlock(o._.id, o.document.getById(o._.id), 4);
        };
        k.panelButton = e.createClass({
            base: k.button,
            $: function (m) {
                var o = this;
                var n = m.panel;
                delete m.panel;
                o.base(m);
                o.document = n && n.parent && n.parent.getDocument() || a.document;
                n.block = {
                    attributes: n.attributes
                };
                o.hasArrow = true;
                o.click = l;
                o._ = {
                    panelDefinition: n
                };
            },
            statics: {
                handler: {
                    create: function (m) {
                        return new k.panelButton(m);
                    }
                }
            },
            proto: {
                createPanel: function (m) {
                    var n = this._;
                    if (n.panel) return;
                    var o = this._.panelDefinition || {},
                        p = this._.panelDefinition.block,
                        q = o.parent || a.document.getBody(),
                        r = this._.panel = new k.floatPanel(m, q, o),
                        s = r.addBlock(n.id, p),
                        t = this;
                    r.onShow = function () {
                        if (t.className) this.element.getFirst().addClass(t.className + '_panel');
                        n.oldState = t._.state;
                        t.setState(1);
                        n.on = 1;
                        if (t.onOpen) t.onOpen();
                    };
                    r.onHide = function () {
                        if (t.className) this.element.getFirst().removeClass(t.className + '_panel');
                        t.setState(n.oldState);
                        n.on = 0;
                        if (t.onClose) t.onClose();
                    };
                    r.onEscape = function () {
                        r.hide();
                        t.document.getById(n.id).focus();
                    };
                    if (this.onBlock) this.onBlock(r, s);
                    s.onHide = function () {
                        n.on = 0;
                        t.setState(2);
                    };
                }
            }
        });
    })();
    j.add('floatpanel', {
        requires: ['panel']
    });
    (function () {
        var l = {},
            m = false;

        function n(o, p, q, r, s) {
            var t = p.getUniqueId() + '-' + q.getUniqueId() + '-' + o.skinName + '-' + o.lang.dir + (o.uiColor && '-' + o.uiColor || '') + (r.css && '-' + r.css || '') + (s && '-' + s || ''),
                u = l[t];
            if (!u) {
                u = l[t] = new k.panel(p, r);
                u.element = q.append(h.createFromHtml(u.renderHtml(o), p));
                u.element.setStyles({
                    display: 'none',
                    position: 'absolute'
                });
            }
            return u;
        };
        k.floatPanel = e.createClass({
            $: function (o, p, q, r) {
                q.forceIFrame = true;
                var s = p.getDocument(),
                    t = n(o, s, p, q, r || 0),
                    u = t.element,
                    v = u.getFirst().getFirst();
                this.element = u;
                this._ = {
                    panel: t,
                    parentElement: p,
                    definition: q,
                    document: s,
                    iframe: v,
                    children: [],
                    dir: o.lang.dir
                };
            },
            proto: {
                addBlock: function (o, p) {
                    return this._.panel.addBlock(o, p);
                },
                addListBlock: function (o, p) {
                    return this._.panel.addListBlock(o, p);
                },
                getBlock: function (o) {
                    return this._.panel.getBlock(o);
                },
                showBlock: function (o, p, q, r, s) {
                    var t = this._.panel,
                        u = t.showBlock(o);
                    this.allowBlur(false);
                    m = true;
                    var v = this.element,
                        w = this._.iframe,
                        x = this._.definition,
                        y = p.getDocumentPosition(v.getDocument()),
                        z = this._.dir == 'rtl',
                        A = y.x + (r || 0),
                        B = y.y + (s || 0);
                    if (z && (q == 1 || q == 4)) A += p.$.offsetWidth;
                    else if (!z && (q == 2 || q == 3)) A += p.$.offsetWidth - 1;
                    if (q == 3 || q == 4) B += p.$.offsetHeight - 1;
                    this._.panel._.offsetParentId = p.getId();
                    v.setStyles({
                        top: B + 'px',
                        left: '-3000px',
                        opacity: '0',
                        display: ''
                    });
                    v.getFirst().removeStyle('width');
                    if (!this._.blurSet) {
                        var C = c ? w : new d.window(w.$.contentWindow);
                        a.event.useCapture = true;
                        C.on('blur', function (D) {
                            var F = this;
                            if (!F.allowBlur()) return;
                            var E;
                            if (c && !F.allowBlur() || (E = D.data.getTarget()) && E.getName && E.getName() != 'iframe') return;
                            if (F.visible && !F._.activeChild && !m) F.hide();
                        }, this);
                        C.on('focus', function () {
                            this._.focused = true;
                            this.hideChild();
                            this.allowBlur(true);
                        }, this);
                        a.event.useCapture = false;
                        this._.blurSet = 1;
                    }
                    t.onEscape = e.bind(function (D) {
                        if (this.onEscape && this.onEscape(D) === false) return false;
                    }, this);
                    e.setTimeout(function () {
                        if (z) A -= v.$.offsetWidth;
                        var D = e.bind(function () {
                            var E = v.getFirst();
                            if (u.autoSize) {
                                var F = u.element.$;
                                if (b.gecko || b.opera) F = F.parentNode;
                                if (c) F = F.document.body;
                                var G = F.scrollWidth;
                                if (c && b.quirks && G > 0) G += (E.$.offsetWidth || 0) - (E.$.clientWidth || 0);
                                G += 4;
                                E.setStyle('width', G + 'px');
                                u.element.addClass('cke_frameLoaded');
                                var H = u.element.$.scrollHeight;
                                if (c && b.quirks && H > 0) H += (E.$.offsetHeight || 0) - (E.$.clientHeight || 0);
                                E.setStyle('height', H + 'px');
                                t._.currentBlock.element.setStyle('display', 'none').removeStyle('display');
                            } else E.removeStyle('height');
                            var I = t.element,
                                J = I.getWindow(),
                                K = J.getScrollPosition(),
                                L = J.getViewPaneSize(),
                                M = {
                                    height: I.$.offsetHeight,
                                    width: I.$.offsetWidth
                                };
                            if (z ? A < 0 : A + M.width > L.width + K.x) A += M.width * (z ? 1 : -1);
                            if (B + M.height > L.height + K.y) B -= M.height;
                            v.setStyles({
                                top: B + 'px',
                                left: A + 'px',
                                opacity: '1'
                            });
                        }, this);
                        t.isLoaded ? D() : t.onLoad = D;
                        e.setTimeout(function () {
                            w.$.contentWindow.focus();
                            this.allowBlur(true);
                        }, 0, this);
                    }, 0, this);
                    this.visible = 1;
                    if (this.onShow) this.onShow.call(this);
                    m = false;
                },
                hide: function () {
                    var o = this;
                    if (o.visible && (!o.onHide || o.onHide.call(o) !== true)) {
                        o.hideChild();
                        o.element.setStyle('display', 'none');
                        o.visible = 0;
                    }
                },
                allowBlur: function (o) {
                    var p = this._.panel;
                    if (o != undefined) p.allowBlur = o;
                    return p.allowBlur;
                },
                showAsChild: function (o, p, q, r, s, t) {
                    if (this._.activeChild == o && o._.panel._.offsetParentId == q.getId()) return;
                    this.hideChild();
                    o.onHide = e.bind(function () {
                        e.setTimeout(function () {
                            if (!this._.focused) this.hide();
                        }, 0, this);
                    }, this);
                    this._.activeChild = o;
                    this._.focused = false;
                    o.showBlock(p, q, r, s, t);
                    if (b.ie7Compat || b.ie8 && b.ie6Compat) setTimeout(function () {
                        o.element.getChild(0).$.style.cssText += '';
                    }, 100);
                },
                hideChild: function () {
                    var o = this._.activeChild;
                    if (o) {
                        delete o.onHide;
                        delete this._.activeChild;
                        o.hide();
                    }
                }
            }
        });
        a.on('instanceDestroyed', function () {
            var o = e.isEmpty(a.instances);
            for (var p in l) {
                var q = l[p];
                if (o) q.destroy();
                else q.element.hide();
            }
            o && (l = {});
        });
    })();
    j.add('menu', {
        beforeInit: function (l) {
            var m = l.config.menu_groups.split(','),
                n = l._.menuGroups = {},
                o = l._.menuItems = {};
            for (var p = 0; p < m.length; p++) n[m[p]] = p + 1;
            l.addMenuGroup = function (q, r) {
                n[q] = r || 100;
            };
            l.addMenuItem = function (q, r) {
                if (n[r.group]) o[q] = new a.menuItem(this, q, r);
            };
            l.addMenuItems = function (q) {
                for (var r in q) this.addMenuItem(r, q[r]);
            };
            l.getMenuItem = function (q) {
                return o[q];
            };
        },
        requires: ['floatpanel']
    });
    (function () {
        a.menu = e.createClass({
            $: function (m, n) {
                var q = this;
                n = q._.definition = n || {};
                q.id = 'cke_' + e.getNextNumber();
                q.editor = m;
                q.items = [];
                q._.level = n.level || 1;
                var o = e.extend({}, n.panel, {
                    css: m.skin.editor.css,
                    level: q._.level - 1,
                    block: {}
                }),
                    p = o.block.attributes = o.attributes || {};
                !p.role && (p.role = 'menu');
                q._.panelDefinition = o;
            },
            _: {
                showSubMenu: function (m) {
                    var u = this;
                    var n = u._.subMenu,
                        o = u.items[m],
                        p = o.getItems && o.getItems();
                    if (!p) {
                        u._.panel.hideChild();
                        return;
                    }
                    var q = u._.panel.getBlock(u.id);
                    q._.focusIndex = m;
                    if (n) n.removeAll();
                    else {
                        n = u._.subMenu = new a.menu(u.editor, e.extend({}, u._.definition, {
                            level: u._.level + 1
                        }, true));
                        n.parent = u;
                        n.onClick = e.bind(u.onClick, u);
                        n.onEscape = u.onEscape;
                    }
                    for (var r in p) {
                        var s = u.editor.getMenuItem(r);
                        if (s) {
                            s.state = p[r];
                            n.add(s);
                        }
                    }
                    var t = u._.panel.getBlock(u.id).element.getDocument().getById(u.id + String(m));
                    n.show(t, 2);
                }
            },
            proto: {
                add: function (m) {
                    if (!m.order) m.order = this.items.length;
                    this.items.push(m);
                },
                removeAll: function () {
                    this.items = [];
                },
                show: function (m, n, o, p) {
                    var q = this.items,
                        r = this.editor,
                        s = this._.panel,
                        t = this._.element;
                    if (!s) {
                        s = this._.panel = new k.floatPanel(this.editor, a.document.getBody(), this._.panelDefinition, this._.level);
                        s.onEscape = e.bind(function (C) {
                            if (this.onEscape && this.onEscape(C) === false) return false;
                        }, this);
                        s.onHide = e.bind(function () {
                            this.onHide && this.onHide();
                        }, this);
                        var u = s.addBlock(this.id, this._.panelDefinition.block);
                        u.autoSize = true;
                        var v = u.keys;
                        v[40] = 'next';
                        v[9] = 'next';
                        v[38] = 'prev';
                        v[2000 + 9] = 'prev';
                        v[32] = 'click';
                        v[r.lang.dir == 'rtl' ? 37 : 39] = 'click';
                        t = this._.element = u.element;
                        t.addClass(r.skinClass);
                        var w = t.getDocument();
                        w.getBody().setStyle('overflow', 'hidden');
                        w.getElementsByTag('html').getItem(0).setStyle('overflow', 'hidden');
                        this._.itemOverFn = e.addFunction(function (C) {
                            var D = this;
                            clearTimeout(D._.showSubTimeout);
                            D._.showSubTimeout = e.setTimeout(D._.showSubMenu, r.config.menu_subMenuDelay, D, [C]);
                        }, this);
                        this._.itemOutFn = e.addFunction(function (C) {
                            clearTimeout(this._.showSubTimeout);
                        }, this);
                        this._.itemClickFn = e.addFunction(function (C) {
                            var E = this;
                            var D = E.items[C];
                            if (D.state == 0) {
                                E.hide();
                                return;
                            }
                            if (D.getItems) E._.showSubMenu(C);
                            else E.onClick && E.onClick(D);
                        }, this);
                    }
                    l(q);
                    var x = ['<div class="cke_menu" role="presentation">'],
                        y = q.length,
                        z = y && q[0].group;
                    for (var A = 0; A < y; A++) {
                        var B = q[A];
                        if (z != B.group) {
                            x.push('<div class="cke_menuseparator" role
