/*
Copyright (c) 2003-2009, 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: '9BIB',
            version: '3.0.2',
            revision: '4760',
            _: {},
            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) return f;
                g = new f.constructor();
                for (var i in f) {
                    var j = f[i];
                    g[i] = this.clone(j);
                }
                return g;
            },
            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();
                    });
                };
            })(),
            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;
            },
            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);
            }
        };
    })();
    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 = {
            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 {
            $block: x,
            $inline: r,
            $body: f({
                script: 1
            },
            x),
            $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
            },
            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);
        }
    },
    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 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_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;
            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 = k.parentNode;
        }
        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 j = this;
        var i = j.getLast();
        while (i && i.type == 3 && !e.rtrim(i.getText())) i = i.getPrevious();
        if (!i || !i.is || !i.is('br')) j.append(b.opera ? j.getDocument().createText('') : j.getDocument().createElement('br'));
    },
    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 () {
        return this.$.innerHTML;
    },
    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) {
        for (var j = 0; j < i.length; j++) this.removeAttribute(i[j]);
    },
    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: a.getUrl('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">',
    fullPage: false,
    height: 200,
    plugins: 'about,basicstyles,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,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,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
    extraPlugins: '',
    removePlugins: '',
    protectedSource: [],
    tabIndex: 0,
    theme: 'default',
    skin: 'v2',
    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.getFirst().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.getFirst().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,
            da: 1,
            de: 1,
            el: 1,
            'en-au': 1,
            'en-ca': 1,
            'en-uk': 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) {
            var p = typeof l == 'string';
            if (p) l = [l];
            if (!n) n = a;
            var q = l.length,
                r = [],
                s = [],
                t = function (y) {
                if (m) if (p) m.call(n, y);
                else m.call(n, r, s);
            };
            if (q === 0) {
                t(true);
                return;
            }
            var u = function (y, z) {
                (z ? r : s).push(y);
                if (--q <= 0) t(z);
            },
                v = function (y, z) {
                j[y] = 1;
                var A = k[y];
                delete k[y];
                for (var B = 0; B < A.length; B++) A[B](y, z);
            },
                w = function (y) {
                if (o !== true && j[y]) {
                    u(y, true);
                    return;
                }
                var z = k[y] || (k[y] = []);
                z.push(u);
                if (z.length > 1) return;
                var A = new h('script');
                A.setAttributes({
                    type: 'text/javascript',
                    src: y
                });
                if (m) if (c) A.$.onreadystatechange = function () {
                    if (A.$.readyState == 'loaded' || A.$.readyState == 'complete') {
                        A.$.onreadystatechange = null;
                        v(y, true);
                    }
                };
                else {
                    A.$.onload = function () {
                        setTimeout(function () {
                            v(y, true);
                        },
                        0);
                    };
                    A.$.onerror = function () {
                        v(y, false);
                    };
                }
                A.appendTo(a.document.getHead());
            };
            for (var x = 0; x < q; x++) w(l[x]);
        },
        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.';
        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 && 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);
    n.lang[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) {
        var r = k[o],
            s = function (A) {
            for (var B = 0; B < A.length; B++) A[B] = a.getUrl(m[o] + A[B]);
        };
        if (!l[o]) {
            var t = r.preload;
            if (t && t.length > 0) {
                s(t);
                a.imageCacher.load(t, function () {
                    l[o] = 1;
                    n(o, p, q);
                });
                return;
            }
            l[o] = 1;
        }
        p = r[p];
        var u = !p || !!p._isLoaded;
        if (u) q && q();
        else {
            var v = p._pending || (p._pending = []);
            v.push(q);
            if (v.length > 1) return;
            var w = !p.css || !p.css.length,
                x = !p.js || !p.js.length,
                y = function () {
                if (w && x) {
                    p._isLoaded = 1;
                    for (var A = 0; A < v.length; A++) {
                        if (v[A]) v[A]();
                    }
                }
            };
            if (!w) {
                s(p.css);
                for (var z = 0; z < p.css.length; z++) a.document.appendStyleSheet(p.css[z]);
                w = 1;
            }
            if (!x) {
                s(p.js);
                a.scriptLoader.load(p.js, function () {
                    x = 1;
                    y();
                });
            }
            y();
        }
    };
    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(r, p, q);
                var t = k[r];
                if (t.init) t.init(o);
            } else {
                m[r] = s;
                a.scriptLoader.load(s + 'skin.js', function () {
                    n(r, p, q);
                    var u = k[r];
                    if (u.init) u.init(o);
                });
            }
        }
    };
})();
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;
        var z = n[y] || (n[y] = {});
        if (z.fn) {
            z.fn.call(x, x.config);
            if (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.fireOnce('configLoaded');
        r(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');
                t(x);
            });
        });
    },
        t = function (x) {
        a.skins.load(x, 'editor', function () {
            u(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 m = this;
        var l = m.element;
        if (l && m.elementMode == 1) if (l.is('textarea')) l.setValue(m.getData());
        else l.setHtml(m.getData());
    }
});
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))) return;
            if (typeof n != 'string') {
                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 = t,
            w = false,
            x;

        function y(C) {
            if (u.length > 0) for (var D = 0; D < u.length; D++) {
                var E = u[D],
                    F = E.name,
                    G = f[F],
                    H = v.name && f[v.name];
                if ((!H || H[F]) && (!C || !G || G[C] || !f[C])) {
                    E = E.clone();
                    E.parent = v;
                    v = E;
                    u.splice(D, 1);
                    D--;
                }
            }
        };

        function z(C, D, E) {
            D = D || v || t;
            if (q && !D.type) {
                var F, G;
                if (C.attributes && (G = C.attributes._cke_real_element_type)) F = G;
                else F = C.name;
                if (! (F in f.$body)) {
                    var H = v;
                    v = D;
                    r.onTagOpen(q, {});
                    D = v;
                    if (E) v = H;
                }
            }
            if (C._.isBlockLike && C.name != 'pre') {
                var I = C.children.length,
                    J = C.children[I - 1],
                    K;
                if (J && J.type == 3) if (! (K = e.rtrim(J.value))) C.children.length = I - 1;
                else J.value = K;
            }
            D.add(C);
            if (C.returnPoint) {
                v = C.returnPoint;
                delete C.returnPoint;
            }
        };
        r.onTagOpen = function (C, D, E) {
            var F = new a.htmlParser.element(C, D);
            if (F.isUnknown && E) F.isEmpty = true;
            if (f.$removeEmpty[C]) {
                u.push(F);
                return;
            } else if (C == 'pre') w = true;
            else if (C == 'br' && w) {
                v.add(new a.htmlParser.text('\n'));
                return;
            }
            var G = v.name,
                H = G && f[G] || (v._.isBlockLike ? f.div : f.span);
            if (!F.isUnknown && !v.isUnknown && !H[C]) {
                if (!G) return;
                var I = false,
                    J;
                if (C in n && G in n) {
                    var K = v.children,
                        L = K[K.length - 1];
                    if (L && L.name in o) x = v,
                    J = L;
                    else z(v, v.parent);
                } else if (C == G) z(v, v.parent);
                else {
                    if (m[G]) {
                        if (!x) x = v;
                    } else {
                        z(v, v.parent, true);
                        if (!l[G]) u.unshift(v);
                    }
                    I = true;
                }
                if (J) v = J;
                else v = v.returnPoint || v.parent;
                if (I) {
                    r.onTagOpen.apply(this, arguments);
                    return;
                }
            }
            y(C);
            F.parent = v;
            F.returnPoint = x;
            x = 0;
            if (F.isEmpty) z(F);
            else v = F;
        };
        r.onTagClose = function (C) {
            for (var D = u.length - 1; D >= 0; D--) {
                if (C == u[D].name) {
                    u.splice(D, 1);
                    return;
                }
            }
            var E = [],
                F = v;
            while (F.type && F.name != C) {
                if (!F._.isBlockLike) u.unshift(F);
                E.push(F);
                F = F.parent;
            }
            if (F.type) {
                for (D = 0; D < E.length; D++) {
                    var G = E[D];
                    z(G, G.parent);
                }
                v = F;
                if (v.name == 'pre') w = false;
                z(F, F.parent);
                if (F == v) v = v.parent;
            }
        };

r.onText = function (C) {
    if (!v._.hasInlineStarted && !w) {
        C = e.ltrim(C);
        if (C.length === 0) return;
    }
    y();
    if (q && !v.type) this.onTagOpen(q, {});
    if (!w) C = C.replace(/[\t\r\n ]{2,}|[\t\r\n]/g, ' ');
    v.add(new a.htmlParser.text(C));
};
r.onCDATA = function (C) {
    v.add(new a.htmlParser.cdata(C));
};
r.onComment = function (C) {
    v.add(new a.htmlParser.comment(C));
};
r.parse(p);
while (v.type) {
    var A = v.parent,
        B = v;
    if (q && !A.type && !f.$body[B.name]) {
        v = A;
        r.onTagOpen(q, {});
        A = v;
    }
    A.add(B);
    v = A;
}
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) {
        for (var r = 0, s = this.children.length; r < s; r++) this.children[r].writeHtml(p, q);
    }
};
})();
a.htmlParser.element = function (l, m) {
    var q = this;
    q.name = l;
    q.attributes = m;
    q.children = [];
    var n = f,
        o = !!(n.$block[l] || n.$listItem[l] || n.$tableContent[l] || n.$nonEditable[l] || l == 'br'),
        p = !!n.$empty[l];
    q.isEmpty = p;
    q.isUnknown = !n[l];
    q._ = {
        isBlockLike: o,
        hasInlineStarted: p || !o
    };
};
(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;
            if (o._cke_replacedata) {
                m.write(o._cke_replacedata);
                return;
            }
            var p = this,
                q = p.name,
                r, s;
            if (n) {
                for (;;) {
                    if (! (q = n.onElementName(q))) return;
                    p.name = q;
                    if (! (p = n.onElement(p))) return;
                    if (p.name == q) break;
                    q = p.name;
                    if (!q) {
                        a.htmlParser.fragment.prototype.writeHtml.apply(p, arguments);
                        return;
                    }
                }
                o = p.attributes;
            }
            m.openTag(q, o);
            if (m.sortAttributes) {
                var t = [];
                for (r in o) {
                    s = o[r];
                    if (n && (!(r = n.onAttributeName(r)) || (s = n.onAttribute(p, r, s)) === false)) continue;
                    t.push([r, s]);
                }
                t.sort(l);
                for (var u = 0, v = t.length; u < v; u++) {
                    var w = t[u];
                    m.attribute(w[0], w[1]);
                }
            } else for (r in o) {
                s = o[r];
                if (n && (!(r = n.onAttributeName(r)) || (s = n.onAttribute(p, r, s)) === false)) continue;
                m.attribute(r, s);
            }
            m.openTagClose(q, p.isEmpty);
            if (!p.isEmpty) {
                a.htmlParser.fragment.prototype.writeHtml.apply(p, arguments);
                m.closeTag(q);
            }
        }
    };
})();
(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;
            },
            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) {
                var r = this._.comment;
                return r ? r.filter(q) : q;
            },
            onElement: function (q) {
                var v = this;
                var r = [v._.elements[q.name], v._.elements.$],
                    s, t;
                for (var u = 0; u < 2; u++) {
                    s = r[u];
                    if (s) {
                        t = s.filter(q, v);
                        if (t === false) return null;
                        if (t && t != q) return v.onElement(t);
                    }
                }
                return q;
            },
            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];
                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) {
            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 = [];
        },
        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;
(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(p, q) {
        if (this._.end) return null;
        var r, s = this.range,
            t, u = this.guard,
            v = this.type,
            w = p ? 'getPreviousSourceNode' : 'getNextSourceNode';
        if (!this._.start) {
            this._.start = 1;
            s.trim();
            if (s.collapsed) {
                this.end();
                return null;
            }
        }
        if (!p && !this._.guardLTR) {
            var x = s.endContainer,
                y = x.getChild(s.endOffset);
            this._.guardLTR = function (C, D) {
                return (!D || !x.equals(C)) && (!y || !C.equals(y)) && (C.type != 1 || !D || C.getName() != 'body');
            };
        }
        if (p && !this._.guardRTL) {
            var z = s.startContainer,
                A = s.startOffset > 0 && z.getChild(s.startOffset - 1);
            this._.guardRTL = function (C, D) {
                return (!D || !z.equals(C)) && (!A || !C.equals(A)) && (C.type != 1 || !D || C.getName() != 'body');
            };
        }
        var B = p ? this._.guardRTL : this._.guardLTR;
        if (u) t = function (C, D) {
            if (B(C, D) === false) return false;
            return u(C, D);
        };
        else t = B;
        if (this.current) r = this.current[w](false, v, t);
        else if (p) {
            r = s.endContainer;
            if (s.endOffset > 0) {
                r = r.getChild(s.endOffset - 1);
                if (t(r) === false) r = null;
            } else r = t(r) === false ? null : r.getPreviousSourceNode(true, v, t);
        } else {
            r = s.startContainer;
            r = r.getChild(s.startOffset);
            if (r) {
                if (t(r) === false) r = null;
            } else r = t(s.startContainer) === false ? null : s.startContainer.getNextSourceNode(true, v, t);
        }
        while (r && !this._.end) {
            this.current = r;
            if (!this.evaluator || this.evaluator(r) !== false) {
                if (!q) return r;
            } else if (q && this.evaluator) return false;
            r = r[w](false, v, t);
        }
        this.end();
        return this.current = null;
    };

    function m(p) {
        var q, r = null;
        while (q = l.call(this, p)) r = q;
        return r;
    };
    d.walker = e.createClass({
        $: function (p) {
            this.range = p;
            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 (p) {
        var q = e.extend({},
        o, p || {});
        return n[this.getComputedStyle('display')] || q[this.getName()];
    };
    d.walker.blockBoundary = function (p) {
        return function (q, r) {
            return ! (q.type == 1 && q.isBlockBoundary(p));
        };
    };
    d.walker.listItemBoundary = function () {
        return this.blockBoundary({
            br: 1
        });
    };
    d.walker.bookmarkContents = function (p) {},
    d.walker.bookmark = function (p, q) {
        function r(s) {
            return s && s.getName && s.getName() == 'span' && s.hasAttribute('_fck_bookmark');
        };
        return function (s) {
            var t, u;
            t = s && !s.getName && (u = s.getParent()) && r(u);
            t = p ? t : t || r(s);
            return q ^ t;
        };
    };
    d.walker.whitespaces = function (p) {
        return function (q) {
            var r = q && q.type == 3 && !e.trim(q.getText());
            return p ^ r;
        };
    };
    d.walker.invisible = function (p) {
        var q = d.walker.whitespaces();
        return function (r) {
            var s = q(r) || r.is && !r.$.offsetHeight;
            return p ^ s;
        };
    };
})();
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 (!x && B.startContainer.equals(B.endContainer)) B.setEnd(y, B.endOffset - B.startOffset);
                }
                B.setStart(v, w);
                if (x) B.collapse(true);
            }
            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();
        },
        moveToElementEditStart: function (t) {
            var u;
            while (t && t.type == 1) {
                u = t.isEditable();
                if (u) this.moveToPosition(t, 1);
                else if (f.$inline[t.getName()]) {
                    this.moveToPosition(t, 3);
                    return true;
                }
                if (f.$empty[t.getName()]) t = t.getNext(s);
                else t = t.getFirst(s);
                if (t && t.type == 3) {
                    this.moveToPosition(t, 3);
                    return true;
                }
            }
            return u;
        },
        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 ? a.basePath + 'images/spacer.gif' : 'about:blank',
    m = h.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;background-image:url(' + l + ')"></div>', a.document);
    m.appendTo(a.document.getHead());
    try {
        b.hc = m.getComputedStyle('background-image') == 'none';
    } catch(n) {
        b.hc = false;
    }
    if (b.hc) b.cssClass += ' cke_hc';
    m.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]);
    }
});
j.add('about', {
    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');
    }
});
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, '" href="javascript:void(\'', (this.title || '').replace("'", ''), '\')" title="', this.title, '" tabindex="-1" hidefocus="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 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) {
        var q = this;
        if (q._.state == l) return;
        var m = a.document.getById(q._.id);
        if (m) {
            m.setState(l);
            var n = q.title,
                o = q._.editor.lang.common.unavailable,
                p = m.getChild(1);
            if (l == 0) n = o.replace('%1', q.title);
            p.setHtml(n);
        }
        q._.state = l;
    }
};
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 (q, r) {
        var s = q.document,
            t = s.getBody(),
            u = false,
            v = function () {
            u = true;
        };
        t.on(r, v);
        s.$.execCommand(r);
        t.removeListener(r, v);
        return u;
    },
        m = c ?
    function (q, r) {
        return l(q, r);
    } : function (q, r) {
        try {
            return q.document.$.execCommand(r);
        } catch(s) {
            return false;
        }
    },
    n = function (q) {
        this.type = q;
        this.canUndo = this.type == 'cut';
    };
    n.prototype = {
        exec: function (q, r) {
            var s = m(q, this.type);
            if (!s) alert(q.lang.clipboard[this.type + 'Error']);
            return s;
        }
    };
    var o = c ? {
        exec: function (q, r) {
            q.focus();
            if (!q.fire('beforePaste') && !l(q, 'paste')) q.openDialog('paste');
        }
    } : {
        exec: function (q) {
            try {
                if (!q.fire('beforePaste') && !q.document.$.execCommand('Paste', false, null)) throw 0;
            } catch(r) {
                q.openDialog('paste');
            }
        }
    },
    p = function (q) {
        switch (q.data.keyCode) {
        case 1000 + 86:
        case 2000 + 45:
            var r = this;
            r.fire('saveSnapshot');
            if (r.fire('beforePaste')) q.cancel();
            setTimeout(function () {
                r.fire('saveSnapshot');
            },
            0);
            return;
        case 1000 + 88:
        case 2000 + 46:
            r = this;
            r.fire('saveSnapshot');
            setTimeout(function () {
                r.fire('saveSnapshot');
            },
            0);
        }
    };
    j.add('clipboard', {
        init: function (q) {
            function r(t, u, v, w) {
                var x = q.lang[u];
                q.addCommand(u, v);
                q.ui.addButton(t, {
                    label: x,
                    command: u
                });
                if (q.addMenuItems) q.addMenuItem(u, {
                    label: x,
                    command: u,
                    group: 'clipboard',
                    order: w
                });
            };
            r('Cut', 'cut', new n('cut'), 1);
            r('Copy', 'copy', new n('copy'), 4);
            r('Paste', 'paste', o, 8);
            a.dialog.add('paste', a.getUrl(this.path + 'dialogs/paste.js'));
            q.on('key', p, q);
            if (q.contextMenu) {
                function s(t) {
                    return q.document.$.queryCommandEnabled(t) ? 2 : 0;
                };
                q.contextMenu.addListener(function () {
                    return {
                        cut: s('Cut'),
                        copy: s('Cut'),
                        paste: b.webkit ? 2 : s('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: [a.getUrl(l.skinPath + 'editor.css')]
                },
                onBlock: function (u, v) {
                    var w = u.addBlock(v);
                    w.autoSize = true;
                    w.element.addClass('cke_colorblock');
                    w.element.setHtml(q(u, s));
                    var x = w.keys;
                    x[39] = 'next';
                    x[9] = 'next';
                    x[37] = 'prev';
                    x[2000 + 9] = 'prev';
                    x[32] = 'click';
                }
            });
        };

        function q(r, s) {
            var t = [],
                u = m.colorButton_colors.split(','),
                v = e.addFunction(function (z, A) {
                if (z == '?') return;
                l.focus();
                r.hide();
                var B = new a.style(m['colorButton_' + A + 'Style'], z && {
                    color: z
                });
                l.fire('saveSnapshot');
                if (z) B.apply(l.document);
                else B.remove(l.document);
                l.fire('saveSnapshot');
            });
            t.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="', n.auto, '" onclick="CKEDITOR.tools.callFunction(', v, ",null,'", s, "');return false;\" href=\"javascript:void('", n.auto, '\')"><table 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 cellspacing=0 cellpadding=0 width="100%">');
            for (var w = 0; w < u.length; w++) {
                if (w % 8 === 0) t.push('</tr><tr>');
                var x = u[w],
                    y = l.lang.colors[x] || x;
                t.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="', y, '" onclick="CKEDITOR.tools.callFunction(', v, ",'#", x, "','", s, "'); return false;\" href=\"javascript:void('", y, '\')"><span class="cke_colorbox" style="background-color:#', x, '"></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(', v, ",'?','", s, "');return false;\" href=\"javascript:void('", n.more, "')\">", n.more, '</a></td>');
            t.push('</tr></table>');
            return t.join('');
        };
    }
});
i.colorButton_enableMore = false;
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
        }
    }]
};
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);
    },
    _: {
        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);
                p.onClick = e.bind(function (z) {
                    var A = true;
                    p.hide();
                    if (c) p.onEscape();
                    if (z.onClick) z.onClick();
                    else if (z.command) q.execCommand(z.command);
                    A = false;
                },
                this);
                p.onEscape = function () {
                    q.focus();
                    if (c) q.getSelection().unlock(true);
                };
            }
            var r = this._.listeners,
                s = [],
                t = this.editor.getSelection(),
                u = t && t.getStartElement();
            if (c) t.lock();
            p.onHide = e.bind(function () {
                p.onHide = null;
                if (c) q.getSelection().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;
                s.preventDefault();
                var t = s.getTarget().getDocument().getDocumentElement(),
                    u = s.$.clientX,
                    v = s.$.clientY;
                e.setTimeout(function () {
                    this._.onMenu(t, null, u, v);
                },
                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 () {
    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 += '<div id="' + o + '" class="cke_path">' + 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;"';
                    w.unshift('<a id="', r, y, '" href="javascript:void(\'', z, '\')" tabindex="-1" title="', n.lang.elementsPath.eleTitle.replace(/%1/, z), '"' + (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, ');">', z, '</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] = o;
            t[2000 + 13] = n;
        }
    });
    var l, m = /^h[1-6]$/;

    function n(s) {
        l = 1;
        return o(s, s.config.shiftEnterMode);
    };

    function o(s, t) {
        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)) q(s, t);
            else p(s, t);
            l = 0;
        },
        0);
        return true;
    };

    function p(s, t, u) {
        u = u || r(s);
        var v = u.document,
            w = t == 3 ? 'div' : 'p',
        x = u.splitBlock(w);
        if (!x) return;
        var y = x.previousBlock,
            z = x.nextBlock,
            A = x.wasStartOfBlock,
            B = x.wasEndOfBlock,
            C;
        if (z) {
            C = z.getParent();
            if (C.is('li')) {
                z.breakParent(C);
                z.move(z.getNext(), true);
            }
        } else if (y && (C = y.getParent()) && C.is('li')) {
            y.breakParent(C);
            u.moveToElementEditStart(y.getNext());
            y.move(y.getPrevious());
        }
        if (!A && !B) {
            if (z.is('li') && (C = z.getFirst(d.walker.invisible(true))) && C.is && C.is('ul', 'ol'))(c ? v.createText('\xa0') : v.createElement('br')).insertBefore(C);
            if (z) u.moveToElementEditStart(z);
        } else {
            if (A && B && y.is('li')) {
                s.execCommand('outdent');
                return;
            }
            var D;
            if (y) {
                if (!l && !m.test(y.getName())) D = y.clone();
            } else if (z) D = z.clone();
            if (!D) D = v.createElement(w);
            var E = x.elementPath;
            if (E) for (var F = 0, G = E.elements.length; F < G; F++) {
                var H = E.elements[F];
                if (H.equals(E.block) || H.equals(E.blockLimit)) break;
                if (f.$removeEmpty[H.getName()]) {
                    H = H.clone();
                    D.moveChildren(H);
                    D.append(H);
                }
            }
            if (!c) D.appendBogus();
            u.insertNode(D);
            if (c && A && (!B || !y.getChildCount())) {
                u.moveToElementEditStart(B ? y : D);
                u.select();
            }
            u.moveToElementEditStart(A && !B ? z : D);
        }
        if (!c) if (z) {
            var I = v.createElement('span');
            I.setHtml('&nbsp;');
            u.insertNode(I);
            I.scrollIntoView();
            u.deleteContents();
        } else D.scrollIntoView();
        u.select();
    };

    function q(s, t) {
        var u = r(s),
            v = u.document,
            w = t == 3 ? 'div' : 'p',
        x = u.checkEndOfBlock(),
        y = new d.elementPath(s.getSelection().getStartElement()),
        z = y.block,
        A = z && y.block.getName(),
        B = false;
        if (!l && A == 'li') {
            p(s, t, u);
            return;
        }
        if (!l && x && m.test(A)) {
            v.createElement('br').insertAfter(z);
            if (b.gecko) v.createText('').insertAfter(z);
            u.setStartAt(z.getNext(), c ? 3 : 1);
        } else {
            var C;
            B = A == 'pre';
            if (B) C = v.createText(c ? '\r' : '\n');
            else C = v.createElement('br');
            u.deleteContents();
            u.insertNode(C);
            if (!c) v.createText('﻿').insertAfter(C);
            if (x && !c) C.getParent().appendBogus();
            if (!c) C.getNext().$.nodeValue = '';
            if (c) u.setStartAt(C, 4);
            else u.setStartAt(C.getNext(), 1);
            if (!c) {
                var D = null;
                if (!b.gecko) {
                    D = v.createElement('span');
                    D.setHtml('&nbsp;');
                } else D = v.createElement('br');
                D.insertBefore(C.getNext());
                D.scrollIntoView();
                D.remove();
            }
        }
        u.collapse(true);
        u.select(B);
    };

    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) {
                    y.onClick = o;
                    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;
        }
        return u.getContents(v).get(w).filebrowser && u.getContents(v).get(w).filebrowser.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 (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) {
                for (var x in w.data.definition.contents) {
                    q(w.editor, w.data.name, w.data.definition, w.data.definition.contents[x].elements);
                    if (w.data.definition.contents[x].hidden && w.data.definition.contents[x].filebrowser) w.data.definition.contents[x].hidden = !s(w.data.definition, w.data.definition.contents[x].id, w.data.definition.contents[x].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 == '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 = {},
                z = u[x].split('/'),
                A = u[x] = z[0];
            y[o] = v[x] = z[1] || A;
            w[A] = new a.style(s, y);
        }
        m.ui.addRichCombo(n, {
            label: p.label,
            title: p.panelTitle,
            voiceLabel: p.voiceLabel,
            className: 'cke_' + (o == 'size' ? 'fontSize' : 'font'),
            multiSelect: false,
            panel: {
                css: [a.getUrl(m.skinPath + 'editor.css')].concat(t.contentsCss),
                voiceLabel: p.panelVoiceLabel
            },
            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;Palatino Linotype;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,
            voiceLabel: n.voiceLabel,
            className: 'cke_format',
            multiSelect: false,
            panel: {
                css: [a.getUrl(l.skinPath + 'editor.css')].concat(m.contentsCss),
                voiceLabel: n.panelVoiceLabel
            },
            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);
                l.fire('saveSnapshot');
            },
            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(M) {
        var N = M.children.length,
            O = M.children[N - 1];
        while (O && O.type == 3 && !e.trim(O.value)) O = M.children[--N];
        return O;
    };

    function o(M, N) {
        var O = M.children,
            P = n(M);
        if (P) {
            if ((N || !c) && P.type == 1 && P.name == 'br') O.pop();
            if (P.type == 3 && l.test(P.value)) O.pop();
        }
    };

    function p(M) {
        var N = n(M);
        return !N || N.type == 1 && N.name == 'br';
    };

    function q(M) {
        o(M, true);
        if (p(M)) if (c) M.add(new a.htmlParser.text('\xa0'));
        else M.add(new a.htmlParser.element('br', {}));
    };

    function r(M) {
        o(M);
        if (p(M)) M.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.*/, '']],
        elements: {
            $: function (M) {
                var N = M.attributes;
                if (N) {
                    var O = ['name', 'href', 'src'],
                        P;
                    for (var Q = 0; Q < O.length; Q++) {
                        P = '_cke_saved_' + O[Q];
                        P in N && delete N[O[Q]];
                    }
                }
            },
            embed: function (M) {
                var N = M.parent;
                if (N && N.name == 'object') {
                    var O = N.attributes.width,
                        P = N.attributes.height;
                    O && (M.attributes.width = O);
                    P && (M.attributes.height = P);
                }
            },
            param: function (M) {
                M.children = [];
                M.isEmpty = true;
                return M;
            },
            a: function (M) {
                if (! (M.children.length || M.attributes.name || M.attributes._cke_saved_name)) return false;
            }
        },
        attributes: {
            'class': function (M, N) {
                return e.ltrim(M.replace(/(?:^|\s+)cke_[^\s]*/g, '')) || false;
            }
        },
        comment: function (M) {
            if (M.substr(0, m.length) == m) return new a.htmlParser.cdata(decodeURIComponent(M.substr(m.length)));
            return M;
        }
    },
        y = {
        elements: {}
    };

for (u in t) y.elements[u] = r;
if (c) x.attributes.style = function (M, N) {
    return M.toLowerCase();
};
var z = /<(?:a|area|img|input)[\s\S]*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi;

function A(M) {
    return M.replace(z, '$& _cke_saved_$1');
};
var B = /<(style)(?=[ >])[^>]*>[^<]*<\/\1>/gi,
    C = /<cke:encoded>([^<]*)<\/cke:encoded>/gi,
    D = /(<\/?)((?:object|embed|param)[\s\S]*?>)/gi,
    E = /<cke:(param|embed)([\s\S]*?)\/?>/gi;

function F(M) {
    return '<cke:encoded>' + encodeURIComponent(M) + '</cke:encoded>';
};

function G(M) {
    return M.replace(B, F);
};

function H(M) {
    return M.replace(D, '$1cke:$2');
};

function I(M) {
    return M.replace(E, '<cke:$1$2></cke:$1>');
};

function J(M, N) {
    return decodeURIComponent(N);
};

function K(M) {
    return M.replace(C, J);
};

function L(M, N) {
    var O = [],
        P = /<\!--\{cke_temp\}(\d*?)-->/g,
        Q = [/<!--[\s\S]*?-->/g, /<script[\s\S]*?<\/script>/gi, /<noscript[\s\S]*?<\/noscript>/gi].concat(N);
    for (var R = 0; R < Q.length; R++) M = M.replace(Q[R], function (S) {
        S = S.replace(P, function (T, U) {
            return O[U];
        });
        return '<!--{cke_temp}' + (O.push(S) - 1) + '-->';
    });
    M = M.replace(P, function (S, T) {
        return '<!--' + m + encodeURIComponent(O[T]).replace(/--/g, '%2D%2D') + '-->';
    });
    return M;
};
j.add('htmldataprocessor', {
    requires: ['htmlwriter'],
    init: function (M) {
        var N = M.dataProcessor = new a.htmlDataProcessor(M);
        N.writer.forceSimpleAmpersand = M.config.forceSimpleAmpersand;
        N.dataFilter.addRules(v);
        N.dataFilter.addRules(w);
        N.htmlFilter.addRules(x);
        N.htmlFilter.addRules(y);
    }
});
a.htmlDataProcessor = function (M) {
    var N = this;
    N.editor = M;
    N.writer = new a.htmlWriter();
    N.dataFilter = new a.htmlParser.filter();
    N.htmlFilter = new a.htmlParser.filter();
};
a.htmlDataProcessor.prototype = {
    toHtml: function (M, N) {
        M = L(M, this.editor.config.protectedSource);
        M = A(M);
        if (c) M = G(M);
        M = H(M);
        M = I(M);
        var O = document.createElement('div');
        O.innerHTML = 'a' + M;
        M = O.innerHTML.substr(1);
        if (c) M = K(M);
        var P = a.htmlParser.fragment.fromHtml(M, N),
            Q = new a.htmlParser.basicWriter();
        P.writeHtml(Q, this.dataFilter);
        return Q.getHtml(true);
    },
    toDataFormat: function (M, N) {
        var O = this.writer,
            P = a.htmlParser.fragment.fromHtml(M, N);
        O.reset();
        P.writeHtml(O, this.htmlFilter);
        return O.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 y = this;
            var q = p.getSelection();
            if (!q) return;
            var r = q.createBookmarks(),
                s = q.getRanges(),
                t = y.cssClassName,
                u, v;
            for (var w = s.length - 1; w >= 0; w--) {
                u = s[w].createIterator();
                while (v = u.getNextParagraph()) {
                    v.removeAttribute('align');
                    if (t) {
                        var x = v.$.className = e.ltrim(v.$.className.replace(y.cssClassRegex, ''));
                        if (y.state == 2 && !y.isDefaultAlign) v.addClass(t);
                        else if (!x) v.removeAttribute('class');
                    } else if (y.state == 2 && !y.isDefaultAlign) v.setStyle('text-align', y.value);
                    else v.removeStyle('text-align');
                }
            }
            p.focus();
            p.forceNextSelectionCheck();
            q.selectBookmarks(r);
        }
    };
    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']];
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 M = this;
                    var z = q.container.getChild([0, 0]),
                        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 (M.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'
                        });
                        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 (M.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');
                        }
                        t.$.scrollTo(w.x, w.y);
                        z.removeClass('cke_maximized');
                        q.fire('resize');
                    }
                    M.toggleState();
                    var I = M.uiItems[0],
                        J = M.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 = M.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 () {
                    m.fire('afterCommandExec', {
                        name: n.name,
                        command: n
                    });
                });
                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;' + '}');
    },
    afterInit: function (l) {
        var m = l.dataProcessor,
            n = m && m.dataFilter;
        if (n) n.addRules({
            elements: {
                div: function (o) {
                    var p = o.attributes.style,
                        q = p && o.children.length == 1 && o.children[0],
                        r = q && q.name == 'span' && q.attributes.style;
                    if (r && /page-break-after\s*:\s*always/i.test(p) && /display\s*:\s*none/i.test(r)) 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);
        }
    }
};
j.add('pastefromword', {
    init: function (l) {
        l.addCommand('pastefromword', new a.dialogCommand('pastefromword'));
        l.ui.addButton('PasteFromWord', {
            label: l.lang.pastefromword.toolbar,
            command: 'pastefromword'
        });
        a.dialog.add('pastefromword', this.path + 'dialogs/pastefromword.js');
    }
});
i.pasteFromWordIgnoreFontFace = true;
i.pasteFromWordRemoveStyle = false;
i.pasteFromWordKeepsStructure = false;
(function () {
    var l = {
        exec: function (n) {
            if (a.getClipboardData() === false || !window.clipboardData) {
                n.openDialog('pastetext');
                return;
            }
            n.insertText(window.clipboardData.getData('Text'));
        }
    };
    j.add('pastetext', {
        init: function (n) {
            var o = 'pastetext',
                p = n.addCommand(o, l);
            n.ui.addButton('PasteText', {
                label: n.lang.pasteText.button,
                command: o
            });
            a.dialog.add(o, a.getUrl(this.path + 'dialogs/pastetext.js'));
            if (n.config.forcePasteAsPlainText) n.on('beforePaste', function (q) {
                if (n.mode == 'wysiwyg') {
                    setTimeout(function () {
                        p.exec();
                    },
                    0);
                    q.cancel();
                }
            },
            null, null, 20);
        },
        requires: ['clipboard']
    });
    var m;
    a.getClipboardData = function () {
        if (!c) return false;
        var n = a.document,
            o = n.getBody();
        if (!m) {
            m = n.createElement('div', {
                attributes: {
                    id: 'cke_hiddenDiv'
                },
                styles: {
                    position: 'absolute',
                    visibility: 'hidden',
                    overflow: 'hidden',
                    width: '1px',
                    height: '1px'
                }
            });
            m.setHtml('');
            m.appendTo(o);
        }
        var p = false,
            q = function () {
            p = true;
        };
        o.on('paste', q);
        var r = o.$.createTextRange();
        r.moveToElementText(m.$);
        r.execCommand('Paste');
        var s = m.getHtml();
        m.setHtml('');
        o.removeListener('paste', q);
        return p && s;
    };
})();
a.editor.prototype.insertText = function (l) {
    l = e.htmlEncode(l);
    l = l.replace(/(?:\r\n)|\n|\r/g, '<br>');
    this.insertHtml(l);
};
i.forcePasteAsPlainText = false;
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 = b.isCustomDomain();
            if (n.config.fullPage) o = n.getData();
            else {
                var q = '<body ',
                    r = a.document.getBody(),
                    s = n.config.baseHref.length > 0 ? '<base href="' + n.config.baseHref + '" _cktemp="true"></base>' : '';
                if (r.getAttribute('id')) q += 'id="' + r.getAttribute('id') + '" ';
                if (r.getAttribute('class')) q += 'class="' + r.getAttribute('class') + '" ';
                q += '>';
                o = n.config.docType + '<html dir="' + n.config.contentsLangDirection + '">' + '<head>' + s + '<title>' + n.lang.preview + '</title>' + '<link type="text/css" rel="stylesheet" href="' + [].concat(n.config.contentsCss).join('"><link type="text/css" rel="stylesheet" href="') + '">' + '</head>' + q + n.getData() + '</body></html>';
            }
            var t = 640,
                u = 420,
                v = 80;
            try {
                var w = window.screen;
                t = Math.round(w.width * 0.8);
                u = Math.round(w.height * 0.7);
                v = Math.round(w.width * 0.1);
            } catch(z) {}
            var x = '';
            if (p) {
                window._cke_htmlToLoad = o;
                x = 'javascript:void( (function(){document.open();document.domain="' + document.domain + '";' + 'document.write( window.opener._cke_htmlToLoad );' + 'document.close();' + 'window.opener._cke_htmlToLoad = null;' + '})() )';
            }
            var y = window.open(x, null, 'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=' + t + ',height=' + u + ',left=' + v);
            if (!p) {
                y.document.open();
                y.document.write(o);
                y.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 = function () {
        var r = this,
            s = function () {
            var v = {};
            v.srcNodeRef = r.document.getWindow().$.frameElement;
            v.assocApp = 'CKEDITOR.' + a.version + '@' + a.revision;
            v.customerid = r.config.scayt_customerid || '1:11111111111111111111111111111111111111';
            v.customDictionaryName = r.config.scayt_customDictionaryName;
            v.userDictionaryName = r.config.scayt_userDictionaryName;
            v.defLang = r.scayt_defLang;
            if (a._scaytParams) for (var w in a._scaytParams) v[w] = a._scaytParams[w];
            var x = new window.scayt(v),
                y = o.instances[r.name];
            if (y) {
                x.sLang = y.sLang;
                x.option(y.option());
                x.paused = y.paused;
            }
            o.instances[r.name] = x;
            try {
                x.setDisabled(x.paused === false);
            } catch(z) {}
            r.fire('showScaytState');
        };
        r.on('contentDom', s);
        r.on('contentDomUnload', function () {
            var v = a.document.getElementsByTag('script'),
                w = /^dojoIoScript(\d+)$/i,
                x = /^https?:\/\/svc\.spellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i;
            for (var y = 0; y < v.count(); y++) {
                var z = v.getItem(y),
                    A = z.getId(),
                    B = z.getAttribute('src');
                if (A && B && A.match(w) && B.match(x)) z.remove();
            }
        });
        r.on('beforeCommandExec', function (v) {
            if ((v.data.name == 'source' || v.data.name == 'newpage') && r.mode == 'wysiwyg') {
                var w = o.getScayt(r);
                if (w) {
                    w.paused = !w.disabled;
                    w.destroy();
                    delete o.instances[r.name];
                }
            }
        });
        r.on('afterSetData', function () {
            if (o.isScaytEnabled(r)) o.getScayt(r).refresh();
        });
        r.on('insertElement', function () {
            var v = o.getScayt(r);
            if (o.isScaytEnabled(r)) {
                if (c) r.getSelection().unlock(true);
                try {
                    v.refresh();
                } catch(w) {}
            }
        },
        this, null, 50);
        r.on('scaytDialog', function (v) {
            v.data.djConfig = window.djConfig;
            v.data.scayt_control = o.getScayt(r);
            v.data.tab = m;
            v.data.scayt = window.scayt;
        });
        var t = r.dataProcessor,
            u = t && t.htmlFilter;
        if (u) u.addRules({
            elements: {
                span: function (v) {
                    if (v.attributes.scayt_word && v.attributes.scaytid) {
                        delete v.name;
                        return v;
                    }
                }
            }
        });
        if (r.document) s();
    };
    j.scayt = {
        engineLoaded: false,
        instances: {},
        getScayt: function (r) {
            return this.instances[r.name];
        },
        isScaytReady: function (r) {
            return this.engineLoaded === true && 'undefined' !== typeof window.scayt && this.getScayt(r);
        },
        isScaytEnabled: function (r) {
            var s = this.getScayt(r);
            return s ? s.disabled === false : false;
        },
        loadEngine: function (r) {
            if (this.engineLoaded === true) return n.apply(r);
            else if (this.engineLoaded == -1) return a.on('scaytReady', function () {
                n.apply(r);
            });
            a.on('scaytReady', n, r);
            a.on('scaytReady', function () {
                this.engineLoaded = true;
            },
            this, null, 0);
            this.engineLoaded = -1;
            var s = document.location.protocol;
            s = s.search(/https?:/) != -1 ? s : 'http:';
            var t = 'svc.spellchecker.net/spellcheck/lf/scayt/scayt1.js',
                u = r.config.scayt_srcUrl || s + '//' + t,
                v = o.parseUrl(u).path + '/';
            a._djScaytConfig = {
                baseUrl: v,
                addOnLoad: [function () {
                    a.fireOnce('scaytReady');
                }],
                isDebug: false
            };
            a.document.getHead().append(a.document.createElement('script', {
                attributes: {
                    type: 'text/javascript',
                    src: u
                }
            }));
            return null;
        },
        parseUrl: function (r) {
            var s;
            if (r.match && (s = r.match(/(.*)[\/\\](.*?\.\w+)$/))) return {
                path: s[1],
                file: s[2]
            };
            else return r;
        }
    };
    var o = j.scayt,
        p = function (r, s, t, u, v, w, x) {
        r.addCommand(u, v);
        r.addMenuItem(u, {
            label: t,
            command: u,
            group: w,
            order: x
        });
    },
        q = {
        preserveState: true,
        editorFocus: false,
        exec: function (r) {
            if (o.isScaytReady(r)) {
                var s = o.isScaytEnabled(r);
                this.setState(s ? 2 : 1);
                var t = o.getScayt(r);
                t.setDisabled(s);
            } else if (!r.config.scayt_autoStartup && o.engineLoaded >= 0) {
                this.setState(0);
                r.on('showScaytState', function () {
                    this.removeListener();
                    this.setState(o.isScaytEnabled(r) ? 1 : 2);
                },
                this);
                o.loadEngine(r);
            }
        }
    };
    j.add('scayt', {
        requires: ['menubutton'],
        beforeInit: function (r) {
            r.config.menu_groups = 'scayt_suggest,scayt_moresuggest,scayt_control,' + r.config.menu_groups;
        },
        init: function (r) {
            var s = {},
                t = {},
                u = r.addCommand(l, q);
            a.dialog.add(l, a.getUrl(this.path + 'dialogs/options.js'));
            var v = 'scaytButton';
            r.addMenuGroup(v);
            r.addMenuItems({
                scaytToggle: {
                    label: r.lang.scayt.enable,
                    command: l,
                    group: v
                },
                scaytOptions: {
                    label: r.lang.scayt.options,
                    group: v,
                    onClick: function () {
                        m = 'options';
                        r.openDialog(l);
                    }
                },
                scaytLangs: {
                    label: r.lang.scayt.langs,
                    group: v,
                    onClick: function () {
                        m = 'langs';
                        r.openDialog(l);
                    }
                },
                scaytAbout: {
                    label: r.lang.scayt.about,
                    group: v,
                    onClick: function () {
                        m = 'about';
                        r.openDialog(l);
                    }
                }
            });
            r.ui.add('Scayt', 5, {
                label: r.lang.scayt.title,
                title: r.lang.scayt.title,
                className: 'cke_button_scayt',
                onRender: function () {
                    u.on('state', function () {
                        this.setState(u.state);
                    },
                    this);
                },
                onMenu: function () {
                    var x = o.isScaytEnabled(r);
                    r.getMenuItem('scaytToggle').label = r.lang.scayt[x ? 'disable' : 'enable'];
                    return {
                        scaytToggle: 2,
                        scaytOptions: x ? 2 : 0,
                        scaytLangs: x ? 2 : 0,
                        scaytAbout: x ? 2 : 0
                    };
                }
            });
            if (r.contextMenu && r.addMenuItems) r.contextMenu.addListener(function (x) {
                if (! (o.isScaytEnabled(r) && x)) return null;
                var y = o.getScayt(r),
                    z = y.getWord(x.$);
                if (!z) return null;
                var A = y.getLang(),
                    B = {},
                    C = window.scayt.getSuggestion(z, A);
                if (!C || !C.length) return null;
                for (i in s) {
                    delete r._.menuItems[i];
                    delete r._.commands[i];
                }
                for (i in t) {
                    delete r._.menuItems[i];
                    delete r._.commands[i];
                }
                s = {};
                t = {};
                var D = false;
                for (var E = 0, F = C.length; E < F; E += 1) {
                    var G = 'scayt_suggestion_' + C[E].replace(' ', '_'),
                        H = (function (L, M) {
                        return {
                            exec: function () {
                                y.replace(L, M);
                            }
                        };
                    })(x.$, C[E]);
                    if (E < r.config.scayt_maxSuggestions) {
                        p(r, 'button_' + G, C[E], G, H, 'scayt_suggest', E + 1);
                        B[G] = 2;
                        t[G] = 2;
                    } else {
                        p(r, 'button_' + G, C[E], G, H, 'scayt_moresuggest', E + 1);
                        s[G] = 2;
                        D = true;
                    }
                }
                if (D) r.addMenuItem('scayt_moresuggest', {
                    label: r.lang.scayt.moreSuggestions,
                    group: 'scayt_moresuggest',
                    order: 10,
                    getItems: function () {
                        return s;
                    }
                });
                var I = {
                    exec: function () {
                        y.ignore(x.$);
                    }
                },
                    J = {
                    exec: function () {
                        y.ignoreAll(x.$);
                    }
                },
                    K = {
                    exec: function () {
                        window.scayt.addWordToUserDictionary(x.$);
                    }
                };
                p(r, 'ignore', r.lang.scayt.ignore, 'scayt_ignore', I, 'scayt_control', 1);
                p(r, 'ignore_all', r.lang.scayt.ignoreAll, 'scayt_ignore_all', J, 'scayt_control', 2);
                p(r, 'add_word', r.lang.scayt.addWord, 'scayt_add_word', K, 'scayt_control', 3);
                t.scayt_moresuggest = 2;
                t.scayt_ignore = 2;
                t.scayt_ignore_all = 2;
                t.scayt_add_word = 2;
                if (y.fireOnContextMenu) y.fireOnContextMenu(r);
                return t;
            });
            if (r.config.scayt_autoStartup) {
                var w = function () {
                    r.removeListener('showScaytState', w);
                    u.setState(o.isScaytEnabled(r) ? 1 : 2);
                };
                r.on('showScaytState', w);
                o.loadEngine(r);
            }
        }
    });
})();
i.scayt_maxSuggestions = 5;
i.scayt_autoStartup = false;
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 = ['1.gif','2.gif','3.gif','4.gif','5.gif','6.gif','7.gif','8.gif','9.gif','10.gif','11.gif','12.gif','13.gif','14.gif','15.gif','16.gif','17.gif','18.gif','19.gif','20.gif','21.gif','22.gif','23.gif','24.gif','25.gif','26.gif','27.gif','28.gif','29.gif','30.gif','31.gif','32.gif','33.gif','34.gif','35.gif','36.gif','37.gif','38.gif','39.gif','40.gif','41.gif','42.gif','43.gif','44.gif','45.gif','46.gif','47.gif','48.gif','49.gif','50.gif','51.gif','52.gif','53.gif','54.gif','55.gif','56.gif','57.gif','58.gif','59.gif','60.gif','61.gif','62.gif','63.gif','64.gif','65.gif','66.gif','67.gif','68.gif','69.gif','70.gif','71.gif','72.gif','73.gif','74.gif','75.gif','76.gif','77.gif','78.gif','79.gif','100.gif','101.gif','102.gif','103.gif','104.gif','105.gif','106.gif','107.gif','108.gif'];
i.smiley_descriptions = [':)', ':(', ';)', ':D', ';;)', '>:D<', ':-/', ':x', '', '', '', '', '', '', '', '', '', '', '', ':((', ''];
(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;
j.add('sourcearea', {
    requires: ['editingblock'],
    init: function (l) {
        var m = j.sourcearea;
        l.on('editingBlockReady', function () {
            var n, o;
            l.addMode('source', {
                load: function (p, q) {
                    if (c && b.version < 8) p.setStyle('position', 'relative');
                    l.textarea = n = new h('textarea');
                    n.setAttributes({
                        dir: 'ltr',
                        tabIndex: -1
                    });
                    n.addClass('cke_source');
                    n.addClass('cke_enable_context_menu');
                    var r = {
                        width: b.ie7Compat ? '99%' : '100%',
                        height: '100%',
                        resize: 'none',
                        outline: 'none',
                        'text-align': 'left'
                    };
                    if (c) {
                        if (!b.ie8Compat) {
                            o = function () {
                                n.hide();
                                n.setStyle('height', p.$.clientHeight + 'px');
                                n.show();
                            };
                            l.on('resize', o);
                            l.on('afterCommandExec', function (t) {
                                if (t.data.name == 'toolbarCollapse') o();
                            });
                            r.height = p.$.clientHeight + 'px';
                        }
                    } else n.on('mousedown', function (t) {
                        t.data.stopPropagation();
                    });
                    p.setHtml('');
                    p.append(n);
                    n.setStyles(r);
                    n.on('blur', function () {
                        l.focusManager.blur();
                    });
                    n.on('focus', function () {
                        l.focusManager.focus();
                    });
                    l.mayBeDirty = true;
                    this.loadData(q);
                    var s = l.keystrokeHandler;
                    if (s) s.attach(n);
                    setTimeout(function () {
                        l.mode = 'source';
                        l.fire('mode');
                    },
                    b.gecko || b.webkit ? 100 : 0);
                },
                loadData: function (p) {
                    n.setValue(p);
                    l.fire('dataReady');
                },
                getData: function () {
                    return n.getValue();
                },
                getSnapshotData: function () {
                    return n.getValue();
                },
                unload: function (p) {
                    l.textarea = n = null;
                    if (o) l.removeListener('resize', o);
                    if (c && b.version < 8) p.removeStyle('position');
                },
                focus: function () {
                    n.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 () {
    j.add('stylescombo', {
        requires: ['richcombo', 'styles'],
        init: function (o) {
            var p = o.config,
                q = o.lang.stylesCombo,
                r = this.path,
                s;
            o.ui.addRichCombo('Styles', {
                label: q.label,
                title: q.panelTitle,
                voiceLabel: q.voiceLabel,
                className: 'cke_styles',
                multiSelect: true,
                panel: {
                    css: [a.getUrl(o.skinPath + 'editor.css')].concat(p.contentsCss),
                    voiceLabel: q.panelVoiceLabel
                },
                init: function () {
                    var t = this,
                        u = p.stylesCombo_stylesSet.split(':'),
                        v = u[1] ? u.slice(1).join(':') : a.getUrl(r + 'styles/' + u[0] + '.js');
                    u = u[0];
                    a.loadStylesSet(u, v, function (w) {
                        var x, y, z = [];
                        s = {};
                        for (var A = 0; A < w.length; A++) {
                            var B = w[A];
                            y = B.name;
                            x = s[y] = new a.style(B);
                            x._name = y;
                            z.push(x);
                        }
                        z.sort(n);
                        var C;
                        for (A = 0; A < z.length; A++) {
                            x = z[A];
                            y = x._name;
                            var D = x.type;
                            if (D != C) {
                                t.startGroup(q['panelTitle' + String(D)]);
                                C = D;
                            }
                            t.add(y, x.type == 3 ? y : m(x._.definition), y);
                        }
                        t.commit();
                        t.onOpen();
                    });
                },
                onClick: function (t) {
                    o.focus();
                    o.fire('saveSnapshot');
                    var u = s[t],
                        v = o.getSelection();
                    if (u.type == 3) {
                        var w = v.getSelectedElement();
                        if (w) u.applyToObject(w);
                        return;
                    }
                    var x = new d.elementPath(v.getStartElement());
                    if (u.type == 2 && u.checkActive(x)) u.remove(o.document);
                    else u.apply(o.document);
                    o.fire('saveSnapshot');
                },
                onRender: function () {
                    o.on('selectionChange', function (t) {
                        var u = this.getValue(),
                            v = t.data.path,
                            w = v.elements;
                        for (var x = 0, y; x < w.length; x++) {
                            y = w[x];
                            for (var z in s) {
                                if (s[z].checkElementRemovable(y, true)) {
                                    if (z != u) this.setValue(z);
                                    return;
                                }
                            }
                        }
                        this.setValue('');
                    },
                    this);
                },
                onOpen: function () {
                    var B = this;
                    if (c) o.focus();
                    var t = o.getSelection(),
                        u = t.getSelectedElement(),
                        v = u && u.getName(),
                        w = new d.elementPath(u || t.getStartElement()),
                        x = [0, 0, 0, 0];
                    B.showAll();
                    B.unmarkAll();
                    for (var y in s) {
                        var z = s[y],
                            A = z.type;
                        if (A == 3) {
                            if (u && z.element == v) {
                                if (z.checkElementRemovable(u, true)) B.mark(y);
                                x[A]++;
                            } else B.hideItem(y);
                        } else {
                            if (z.checkActive(w)) B.mark(y);
                            x[A]++;
                        }
                    }
                    if (!x[1]) B.hideGroup(q['panelTitle' + String(1)]);
                    if (!x[2]) B.hideGroup(q['panelTitle' + String(2)]);
                    if (!x[3]) B.hideGroup(q['panelTitle' + String(3)]);
                }
            });
        }
    });
    var l = {};
    a.addStylesSet = function (o, p) {
        l[o] = p;
    };
    a.loadStylesSet = function (o, p, q) {
        var r = l[o];
        if (r) {
            q(r);
            return;
        }
        a.scriptLoader.load(p, function () {
            q(l[o]);
        });
    };

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(y, z) {
        if (c) y.removeAttribute(z);
        else delete y[z];
    };
    var m = /^(?:td|th)$/;

    function n(y) {
        var z = y.createBookmarks(),
            A = y.getRanges(),
            B = [],
            C = {};

        function D(L) {
            if (B.length > 0) return;
            if (L.type == 1 && m.test(L.getName()) && !L.getCustomData('selected_cell')) {
                h.setMarker(C, L, 'selected_cell', true);
                B.push(L);
            }
        };
        for (var E = 0; E < A.length; E++) {
            var F = A[E];
            if (F.collapsed) {
                var G = F.getCommonAncestor(),
                    H = G.getAscendant('td', true) || G.getAscendant('th', true);
                if (H) B.push(H);
            } else {
                var I = new d.walker(F),
                    J;
                I.guard = D;
                while (J = I.next()) {
                    var K = J.getParent();
                    if (K && m.test(K.getName()) && !K.getCustomData('selected_cell')) {
                        h.setMarker(C, K, 'selected_cell', true);
                        B.push(K);
                    }
                }
            }
        }
        h.clearAllMarkers(C);
        y.selectBookmarks(z);
        return B;
    };

    function o(y) {
        var z = new h(y),
            A = (z.getName() == 'table' ? y : z.getAscendant('table')).$,
            B = A.rows,
            C = -1,
            D = [];
        for (var E = 0; E < B.length; E++) {
            C++;
            if (!D[C]) D[C] = [];
            var F = -1;
            for (var G = 0; G < B[E].cells.length; G++) {
                var H = B[E].cells[G];
                F++;
                while (D[C][F]) F++;
                var I = isNaN(H.colSpan) ? 1 : H.colSpan,
                J = isNaN(H.rowSpan) ? 1 : H.rowSpan;
                for (var K = 0; K < J; K++) {
                    if (!D[C + K]) D[C + K] = [];
                    for (var L = 0; L < I; L++) D[C + K][F + L] = B[E].cells[G];
                }
                F += I - 1;
            }
        }
        return D;
    };

    function p(y, z) {
        var A = c ? '_cke_rowspan' : 'rowSpan';
        for (var B = 0; B < y.length; B++) for (var C = 0; C < y[B].length; C++) {
            var D = y[B][C];
            if (D.parentNode) D.parentNode.removeChild(D);
            D.colSpan = D[A] = 1;
        }
        var E = 0;
        for (B = 0; B < y.length; B++) for (C = 0; C < y[B].length; C++) {
            D = y[B][C];
            if (!D) continue;
            if (C > E) E = C;
            if (D._cke_colScanned) continue;
            if (y[B][C - 1] == D) D.colSpan++;
            if (y[B][C + 1] != D) D._cke_colScanned = 1;
        }
        for (B = 0; B <= E; B++) for (C = 0; C < y.length; C++) {
            if (!y[C]) continue;
            D = y[C][B];
            if (!D || D._cke_rowScanned) continue;
            if (y[C - 1] && y[C - 1][B] == D) D[A]++;
            if (!y[C + 1] || y[C + 1][B] != D) D._cke_rowScanned = 1;
        }
        for (B = 0; B < y.length; B++) for (C = 0; C < y[B].length; C++) {
            D = y[B][C];
            l(D, '_cke_colScanned');
            l(D, '_cke_rowScanned');
        }
        for (B = 0; B < y.length; B++) {
            var F = z.ownerDocument.createElement('tr');
            for (C = 0; C < y[B].length;) {
                D = y[B][C];
                if (y[B - 1] && y[B - 1][C] == D) {
                    C += D.colSpan;
                    continue;
                }
                F.appendChild(D);
                if (A != 'rowSpan') {
                    D.rowSpan = D[A];
                    D.removeAttribute(A);
                }
                C += D.colSpan;
                if (D.colSpan == 1) D.removeAttribute('colSpan');
                if (D.rowSpan == 1) D.removeAttribute('rowSpan');
            }
            if (c) z.rows[B].replaceNode(F);
            else {
                var G = new h(z.rows[B]),
                    H = new h(F);
                G.setHtml('');
                H.moveChildren(G);
            }
        }
    };

    function q(y) {
        var z = y.cells;
        for (var A = 0; A < z.length; A++) {
            z[A].innerHTML = '';
            if (!c) new h(z[A]).appendBogus();
        }
    };

    function r(y, z) {
        var A = y.getStartElement().getAscendant('tr');
        if (!A) return;
        var B = A.clone(true);
        B.insertBefore(A);
        q(z ? B.$ : A.$);
    };

    function s(y) {
        if (y instanceof d.selection) {
            var z = n(y),
                A = [];
            for (var B = 0; B < z.length; B++) {
                var C = z[B].getParent();
                A[C.$.rowIndex] = C;
            }
            for (B = A.length; B >= 0; B--) {
                if (A[B]) s(A[B]);
            }
        } else if (y instanceof h) {
            var D = y.getAscendant('table');
            if (D.$.rows.length == 1) D.remove();
            else y.remove();
        }
    };

    function t(y, z) {
        var A = y.getStartElement(),
            B = A.getAscendant('td', true) || A.getAscendant('th', true);
        if (!B) return;
        var C = B.getAscendant('table'),
            D = B.$.cellIndex;
        for (var E = 0; E < C.$.rows.length; E++) {
            var F = C.$.rows[E];
            if (F.cells.length < D + 1) continue;
            B = new h(F.cells[D].cloneNode(false));
            if (!c) B.appendBogus();
            var G = new h(F.cells[D]);
            if (z) B.insertBefore(G);
            else B.insertAfter(G);
        }
    };

    function u(y) {
        if (y instanceof d.selection) {
            var z = n(y);
            for (var A = z.length; A >= 0; A--) {
                if (z[A]) u(z[A]);
            }
        } else if (y instanceof h) {
            var B = y.getAscendant('table'),
                C = y.$.cellIndex;
            for (A = B.$.rows.length - 1; A >= 0; A--) {
                var D = new h(B.$.rows[A]);
                if (!C && D.$.cells.length == 1) {
                    s(D);
                    continue;
                }
                if (D.$.cells[C]) D.$.removeChild(D.$.cells[C]);
            }
        }
    };

    function v(y, z) {
        var A = y.getStartElement(),
            B = A.getAscendant('td', true) || A.getAscendant('th', true);
        if (!B) return;
        var C = B.clone();
        if (!c) C.appendBogus();
        if (z) C.insertBefore(B);
        else C.insertAfter(B);
    };

    function w(y) {
        if (y instanceof d.selection) {
            var z = n(y);
            for (var A = z.length - 1; A >= 0; A--) w(z[A]);
        } else if (y instanceof h) if (y.getParent().getChildCount() == 1) y.getParent().remove();
        else y.remove();
    };
    var x = {
        thead: 1,
        tbody: 1,
        tfoot: 1,
        td: 1,
        tr: 1,
        th: 1
    };
    j.tabletools = {
        init: function (y) {
            var z = y.lang.table;
            y.addCommand('cellProperties', new a.dialogCommand('cellProperties'));
            a.dialog.add('cellProperties', this.path + 'dialogs/tableCell.js');
            y.addCommand('tableDelete', {
                exec: function (A) {
                    var B = A.getSelection(),
                        C = B && B.getStartElement(),
                        D = C && C.getAscendant('table', true);
                    if (!D) return;
                    B.selectElement(D);
                    var E = B.getRanges()[0];
                    E.collapse();
                    B.selectRanges([E]);
                    if (D.getParent().getChildCount() == 1) D.getParent().remove();
                    else D.remove();
                }
            });
            y.addCommand('rowDelete', {
                exec: function (A) {
                    var B = A.getSelection();
                    s(B);
                }
            });
            y.addCommand('rowInsertBefore', {
                exec: function (A) {
                    var B = A.getSelection();
                    r(B, true);
                }
            });
            y.addCommand('rowInsertAfter', {
                exec: function (A) {
                    var B = A.getSelection();
                    r(B);
                }
            });
            y.addCommand('columnDelete', {
                exec: function (A) {
                    var B = A.getSelection();
                    u(B);
                }
            });
            y.addCommand('columnInsertBefore', {
                exec: function (A) {
                    var B = A.getSelection();
                    t(B, true);
                }
            });
            y.addCommand('columnInsertAfter', {
                exec: function (A) {
                    var B = A.getSelection();
                    t(B);
                }
            });
            y.addCommand('cellDelete', {
                exec: function (A) {
                    var B = A.getSelection();
                    w(B);
                }
            });
            y.addCommand('cellInsertBefore', {
                exec: function (A) {
                    var B = A.getSelection();
                    v(B, true);
                }
            });
            y.addCommand('cellInsertAfter', {
                exec: function (A) {
                    var B = A.getSelection();
                    v(B);
                }
            });
            if (y.addMenuItems) y.addMenuItems({
                tablecell: {
                    label: z.cell.menu,
                    group: 'tablecell',
                    order: 1,
                    getItems: function () {
                        var A = n(y.getSelection());
                        return {
                            tablecell_insertBefore: 2,
                            tablecell_insertAfter: 2,
                            tablecell_delete: 2,
                            tablecell_properties: A.length > 0 ? 2 : 0
                        };
                    }
                },
                tablecell_insertBefore: {
                    label: z.cell.insertBefore,
                    group: 'tablecell',
                    command: 'cellInsertBefore',
                    order: 5
                },
                tablecell_insertAfter: {
                    label: z.cell.insertAfter,
                    group: 'tablecell',
                    command: 'cellInsertAfter',
                    order: 10
                },
                tablecell_delete: {
                    label: z.cell.deleteCell,
                    group: 'tablecell',
                    command: 'cellDelete',
                    order: 15
                },
                tablecell_properties: {
                    label: z.cell.title,
                    group: 'tablecellproperties',
                    command: 'cellProperties',
                    order: 20
                },
                tablerow: {
                    label: z.row.menu,
                    group: 'tablerow',
                    order: 1,
                    getItems: function () {
                        return {
                            tablerow_insertBefore: 2,
                            tablerow_insertAfter: 2,
                            tablerow_delete: 2
                        };
                    }
                },
                tablerow_insertBefore: {
                    label: z.row.insertBefore,
                    group: 'tablerow',
                    command: 'rowInsertBefore',
                    order: 5
                },
                tablerow_insertAfter: {
                    label: z.row.insertAfter,
                    group: 'tablerow',
                    command: 'rowInsertAfter',
                    order: 10
                },
                tablerow_delete: {
                    label: z.row.deleteRow,
                    group: 'tablerow',
                    command: 'rowDelete',
                    order: 15
                },
                tablecolumn: {
                    label: z.column.menu,
                    group: 'tablecolumn',
                    order: 1,
                    getItems: function () {
                        return {
                            tablecolumn_insertBefore: 2,
                            tablecolumn_insertAfter: 2,
                            tablecolumn_delete: 2
                        };
                    }
                },
                tablecolumn_insertBefore: {
                    label: z.column.insertBefore,
                    group: 'tablecolumn',
                    command: 'columnInsertBefore',
                    order: 5
                },
                tablecolumn_insertAfter: {
                    label: z.column.insertAfter,
                    group: 'tablecolumn',
                    command: 'columnInsertAfter',
                    order: 10
                },
                tablecolumn_delete: {
                    label: z.column.deleteColumn,
                    group: 'tablecolumn',
                    command: 'columnDelete',
                    order: 15
                }
            });
            if (y.contextMenu) y.contextMenu.addListener(function (A, B) {
                if (!A) return null;
                while (A) {
                    if (A.getName() in x) return {
                        tablecell: 2,
                        tablerow: 2,
                        tablecolumn: 2
                    };
                    A = A.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 = {
        exec: function (n) {
            n.container.focusNext(true);
        }
    },
        m = {
        exec: function (n) {
            n.container.focusPrevious(true);
        }
    };
    j.add('tab', {
        requires: ['keystrokes'],
        init: function (n) {
            var o = n.keystrokeHandler.keystrokes;
            o[9] = 'tab';
            o[2000 + 9] = 'shiftTab';
            var p = n.config.tabSpaces,
                q = '';
            while (p--) q += '\xa0';
            n.addCommand('tab', {
                exec: function (r) {
                    if (!r.fire('tab')) if (q.length > 0) r.insertHtml(q);
                    else return r.execCommand('blur');
                    return true;
                }
            });
            n.addCommand('shiftTab', {
                exec: function (r) {
                    if (!r.fire('shiftTab')) return r.execCommand('blurBack');
                    return true;
                }
            });
            n.addCommand('blur', l);
            n.addCommand('blurBack', m);
        }
    });
})();
h.prototype.focusNext = function (l) {
    var u = this;
    var m = u.$,
        n = u.getTabIndex(),
        o, p, q, r, s, t;
    if (n <= 0) {
        s = u.getNextSourceNode(l, 1);
        while (s) {
            if (s.isVisible() && s.getTabIndex() === 0) {
                q = s;
                break;
            }
            s = s.getNextSourceNode(false, 1);
        }
    } else {
        s = u.getDocument().getBody().getFirst();
        while (s = s.getNextSourceNode(false, 1)) {
            if (!o) if (!p && s.equals(u)) {
                p = true;
                if (l) {
                    if (! (s = s.getNextSourceNode(true, 1))) break;
                    o = 1;
                }
            } else if (p && !u.contains(s)) o = 1;
            if (!s.isVisible() || (t = s.getTabIndex()) < 0) continue;
            if (o && t == n) {
                q = s;
                break;
            }
            if (t > n && (!q || !r || t < r)) {
                q = s;
                r = t;
            } else if (!q && t === 0) {
                q = s;
                r = t;
            }
        }
    }
    if (q) q.focus();
};
h.prototype.focusPrevious = function (l) {
    var u = this;
    var m = u.$,
        n = u.getTabIndex(),
        o, p, q, r = 0,
        s, t = u.getDocument().getBody().getLast();
    while (t = t.getPreviousSourceNode(false, 1)) {
        if (!o) if (!p && t.equals(u)) {
            p = true;
            if (l) {
                if (! (t = t.getPreviousSourceNode(true, 1))) break;
                o = 1;
            }
        } else if (p && !u.contains(t)) o = 1;
        if (!t.isVisible() || (s = t.getTabIndex()) < 0) continue;
        if (n <= 0) {
            if (o && s === 0) {
                q = t;
                break;
            }
            if (s > r) {
                q = t;
                r = s;
            }
        } else {
            if (o && s == n) {
                q = t;
                break;
            }
            if (s < n && (!q || s > r)) {
                q = t;
                r = s;
            }
        }
    }
    if (q) q.focus();
};
i.tabSpaces = 0;
(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) {
                switch (q) {
                case 39:
                case 9:
                    while ((p = p.next || p.toolbar.next && p.toolbar.next.items[0]) && !p.focus) {}
                    if (p) p.focus();
                    else n.toolbox.focus();
                    return false;
                case 37:
                case 2000 + 9:
                    while ((p = p.previous || p.toolbar.previous && p.toolbar.previous.items[p.toolbar.previous.items.length - 1]) && !p.focus) {}
                    if (p) p.focus();
                    else {
                        var r = n.toolbox.toolbars[n.toolbox.toolbars.length - 1].items;
                        r[r.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 = ['<div class="cke_toolbox"'],
                        r = n.config.toolbarStartupExpanded !== false,
                        s;
                    q.push(r ? '>' : ' style="display:none">');
                    var t = n.toolbox.toolbars,
                        u = n.config.toolbar instanceof Array ? n.config.toolbar : n.config['toolbar_' + n.config.toolbar];
                    for (var v = 0; v < u.length; v++) {
                        var w = u[v];
                        if (!w) continue;
                        var x = 'cke_' + e.getNextNumber(),
                            y = {
                            id: x,
                            items: []
                        };
                        if (s) {
                            q.push('</div>');
                            s = 0;
                        }
                        if (w === '/') {
                            q.push('<div class="cke_break"></div>');
                            continue;
                        }
                        q.push('<span id="', x, '" class="cke_toolbar"><span class="cke_toolbar_start"></span>');
                        var z = t.push(y) - 1;
                        if (z > 0) {
                            y.previous = t[z - 1];
                            y.previous.next = y;
                        }
                        for (var A = 0; A < w.length; A++) {
                            var B, C = w[A];
                            if (C == '-') B = k.separator;
                            else B = n.ui.create(C);
                            if (B) {
                                if (B.canGroup) {
                                    if (!s) {
                                        q.push('<span class="cke_toolgroup">');
                                        s = 1;
                                    }
                                } else if (s) {
                                    q.push('</span>');
                                    s = 0;
                                }
                                var D = B.render(n, q);
                                z = y.items.push(D) - 1;
                                if (z > 0) {
                                    D.previous = y.items[z - 1];
                                    D.previous.next = D;
                                }
                                D.toolbar = y;
                                D.onkey = o;
                                D.onfocus = function () {
                                    if (!n.toolbox.focusCommandExecuted) n.focus();
                                };
                            }
                        }
                        if (s) {
                            q.push('</span>');
                            s = 0;
                        }
                        q.push('<span class="cke_toolbar_end"></span></span>');
                    }
                    q.push('</div>');
                    if (n.config.toolbarCanCollapse) {
                        var E = e.addFunction(function () {
                            n.execCommand('toolbarCollapse');
                        }),
                            F = 'cke_' + e.getNextNumber();
                        n.addCommand('toolbarCollapse', {
                            exec: function (G) {
                                var H = a.document.getById(F),
                                    I = H.getPrevious(),
                                    J = G.getThemeSpace('contents'),
                                    K = I.getParent(),
                                    L = parseInt(J.$.style.height, 10),
                                    M = K.$.offsetHeight;
                                if (I.isVisible()) {
                                    I.hide();
                                    H.addClass('cke_toolbox_collapser_min');
                                    H.setAttribute('title', G.lang.toolbarExpand);
                                } else {
                                    I.show();
                                    H.removeClass('cke_toolbox_collapser_min');
                                    H.setAttribute('title', G.lang.toolbarCollapse);
                                }
                                var N = K.$.offsetHeight - M;
                                J.setStyle('height', L - N + 'px');
                            },
                            modes: {
                                wysiwyg: 1,
                                source: 1
                            }
                        });
                        q.push('<a title="' + (r ? n.lang.toolbarCollapse : n.lang.toolbarExpand) + '" id="' + F + '" class="cke_toolbox_collapser');
                        if (!r) q.push(' cke_toolbox_collapser_min');
                        q.push('" onclick="CKEDITOR.tools.callFunction(' + E + ')"></a>');
                    }
                    p.data.html += q.join('');
                }
            });
            n.addCommand('toolbarFocus', m.toolbarFocus);
        }
    });
})();
k.separator = {
    render: function (l, m) {
        m.push('<span class="cke_separator"></span>');
        return {};
    }
};
i.toolbarLocation = 'top';
i.toolbar_Basic = [
    ['Bold', 'Italic','Underline','Subscript', 'Superscript','-','JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock','-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink','-','Smiley']];
i.toolbar_Full = [
    ['Source','Templates','-','Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'],
    ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'],'/', ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript'],
    ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', 'Blockquote'],
    ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
    ['Link', 'Unlink', 'Anchor'],
    ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak'], '/', ['Styles', 'Format', 'Font', 'FontSize'],
    ['TextColor', 'BGColor']];
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 t = this;
    var s = r.getSelection();
    t.contents = r.getSnapshot();
    t.bookmarks = s && s.createBookmarks2(true);
    if (c) t.contents = t.contents.replace(/\s+_cke_expando=".*?"/g, '');
};
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) {
                    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 (t) return;
        if (u) {
            this.typesCount = 0;
            this.modifiersCount++;
            if (this.modifiersCount > 25) {
                this.save();
                this.modifiersCount = 1;
            }
        } else if (!x) {
            this.modifiersCount = 0;
            this.typesCount++;
            if (this.typesCount > 25) {
                this.save();
                this.typesCount = 1;
            }
        }
        this.typing = true;
    },
    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 (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.currentImage = r;
        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*$/gi;

    function n(w) {
        var B = this;
        if (B.mode == 'wysiwyg') {
            B.focus();
            var x = B.getSelection(),
                y = w.data;
            if (B.dataProcessor) y = B.dataProcessor.toHtml(y);
            if (c) {
                var z = x.isLocked;
                if (z) x.unlock();
                var A = x.getNative();
                if (A.type == 'Control') A.clear();
                A.createRange().pasteHTML(y);
                if (z) B.getSelection().lock();
            } else B.document.$.execCommand('inserthtml', false, y);
        }
    };

    function o(w) {
        if (this.mode == 'wysiwyg') {
            this.focus();
            this.fire('saveSnapshot');
            var x = w.data,
                y = x.getName(),
                z = f.$block[y],
                A = this.getSelection(),
                B = A.getRanges(),
                C = A.isLocked;
            if (C) A.unlock();
            var D, E, F, G;
            for (var H = B.length - 1; H >= 0; H--) {
                D = B[H];
                D.deleteContents();
                E = !H && x || x.clone(true);
                var I, J;
                if (z) while ((I = D.getCommonAncestor(false, true)) && (J = f[I.getName()]) && !(J && J[y])) {
                    if (I.getName() in f.span) D.splitElement(I);
                    else if (D.checkStartOfBlock() && D.checkEndOfBlock()) {
                        D.setStartBefore(I);
                        D.collapse(true);
                        I.remove();
                    } else D.splitBlock();
                }
                D.insertNode(E);
                if (!F) F = E;
            }
            D.moveToPosition(F, 4);
            var K = F.getNextSourceNode(true);
            if (K && K.type == 1) D.moveToElementEditStart(K);
            A.selectRanges([D]);
            if (C) this.getSelection().lock();
            e.setTimeout(function () {
                this.fire('saveSnapshot');
            },
            0, this);
        }
    };

    function p(w) {
        if (!w.checkDirty()) setTimeout(function () {
            w.resetDirty();
        });
    };
    var q = d.walker.whitespaces(true),
        r = d.walker.bookmark(false, true);

    function s(w) {
        return q(w) && r(w);
    };

    function t(w) {
        return w.type == 3 && e.trim(w.getText()).match(/^(?:&nbsp;|\xa0)$/);
    };

    function u(w) {
        var x = w.editor,
            y = w.data.path,
            z = y.blockLimit,
            A = w.data.selection,
            B = A.getRanges()[0],
            C = x.document.getBody(),
            D = x.config.enterMode;
        if (D != 2 && B.collapsed && z.getName() == 'body' && !y.block) {
            p(x);
            var E = B.fixBlock(true, x.config.enterMode == 3 ? 'div' : 'p');
            if (c) {
                var F = E.getFirst(s);
                F && t(F) && F.remove();
            }
            if (E.getOuterHtml().match(m)) {
                var G = E.getPrevious(q),
                    H = E.getNext(q);
                if (G && G.getName && !(G.getName() in l) && B.moveToElementEditStart(G) || H && H.getName && !(H.getName() in l) && B.moveToElementEditStart(H)) E.remove();
            }
            B.select();
            if (!c) x.selectionChange();
        }
        var I = C.getLast(d.walker.whitespaces(true));
        if (I && I.getName && I.getName() in l) {
            p(x);
            if (!c) C.appendBogus();
            else C.append(x.document.createText('\xa0'));
        }
    };
    j.add('wysiwygarea', {
        requires: ['editingblock'],
        init: function (w) {
            var x = w.config.enterMode != 2 ? w.config.enterMode == 3 ? 'div' : 'p' : false;
            w.on('editingBlockReady', function () {
                var z, A, B, C, D, E, F, G = b.isCustomDomain(),
                    H = function () {
                    if (B) B.remove();
                    if (A) A.remove();
                    E = 0;
                    var K = 'void( ' + (b.gecko ? 'setTimeout' : '') + '( function(){' + 'document.open();' + (c && G ? 'document.domain="' + document.domain + '";' : '') + 'document.write( window.parent[ "_cke_htmlToLoad_' + w.name + '" ] );' + 'document.close();' + 'window.parent[ "_cke_htmlToLoad_' + w.name + '" ] = null;' + '}' + (b.gecko ? ', 0 )' : ')()') + ' )';
                    if (b.opera) K = 'void(0);';
                    B = h.createFromHtml('<iframe style="width:100%;height:100%" frameBorder="0" tabIndex="-1" allowTransparency="true" src="javascript:' + encodeURIComponent(K) + '"' + '></iframe>');
                    var L = w.lang.editorTitle.replace('%1', w.name);
                    if (b.gecko) {
                        B.on('load', function (M) {
                            M.removeListener();
                            J(B.$.contentWindow);
                        });
                        z.setAttributes({
                            role: 'region',
                            title: L
                        });
                        B.setAttributes({
                            role: 'region',
                            title: ' '
                        });
                    } else if (b.webkit) {
                        B.setAttribute('title', L);
                        B.setAttribute('name', L);
                    } else if (c) {
                        A = h.createFromHtml('<fieldset style="height:100%' + (c && b.quirks ? ';position:relative' : '') + '">' + '<legend style="display:block;width:0;height:0;overflow:hidden;' + (c && b.quirks ? 'position:absolute' : '') + '">' + e.htmlEncode(L) + '</legend>' + '</fieldset>', a.document);
                        B.appendTo(A);
                        A.appendTo(z);
                    }
                    if (!c) z.append(B);
                },
                    I = '<script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR._["contentDomReady' + w.name + '"]( window );' + '</script>',
                    J = function (K) {
                    if (E) return;
                    E = 1;
                    var L = K.document,
                        M = L.body,
                        N = L.getElementById('cke_actscrpt');
                    N.parentNode.removeChild(N);
                    delete a._['contentDomReady' + w.name];
                    M.spellcheck = !w.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, !w.config.disableObjectResizing);
                    } catch(S) {}
                    try {
                        L.execCommand('enableInlineTableEditing', false, !w.config.disableNativeTableHandles);
                    } catch(T) {}
                    K = w.window = new d.window(K);
                    L = w.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')) w.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)) y.focus();
                        });
                    }
                    var P = c || b.webkit ? K : L;
                    P.on('blur', function () {
                        w.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 (w.config.enterMode == 2) L.createElement('br', {
                                    attributes: {
                                        _moz_dirty: ''
                                    }
                                }).replace(W);
                                else W.remove();
                            }
                        }
                        w.focusManager.focus();
                    });
                    var Q = w.keystrokeHandler;
                    if (Q) Q.attach(L);
                    if (c) {
                        L.on('keydown', function (U) {
                            var V = U.data.getKeystroke() == 8 && w.getSelection().getSelectedElement();
                            if (V) {
                                w.fire('saveSnapshot');
                                V.remove();
                                w.fire('saveSnapshot');
                                U.cancel();
                            }
                        });
                        if (L.$.compatMode == 'CSS1Compat') {
                            var R = {
                                33: 1,
                                34: 1
                            };
                            L.on('keydown', function (U) {
                                if (U.data.getKeystroke() in R) setTimeout(function () {
                                    w.getSelection().scrollIntoView();
                                },
                                0);
                            });
                        }
                    }
                    if (w.contextMenu) w.contextMenu.addTarget(L, w.config.browserContextMenuOnCtrl !== false);
                    setTimeout(function () {
                        w.fire('contentDom');
                        if (F) {
                            w.mode = 'wysiwyg';
                            w.fire('mode');
                            F = false;
                        }
                        C = false;
                        if (D) {
                            w.focus();
                            D = false;
                        }
                        setTimeout(function () {
                            w.fire('dataReady');
                        },
                        0);
                        if (c) setTimeout(function () {
                            if (w.document) {
                                var U = w.document.$.body;
                                U.runtimeStyle.marginBottom = '0px';
                                U.runtimeStyle.marginBottom = '';
                            }
                        },
                        1000);
                    },
                    0);
                };
                w.addMode('wysiwyg', {
                    load: function (K, L, M) {
                        z = K;
                        if (c && b.quirks) K.setStyle('position', 'relative');
                        w.mayBeDirty = true;
                        F = true;
                        if (M) this.loadSnapshotData(L);
                        else this.loadData(L);
                    },
                    loadData: function (K) {
                        C = true;
                        if (w.dataProcessor) K = w.dataProcessor.toHtml(K, x);
                        K = w.config.docType + '<html dir="' + w.config.contentsLangDirection + '">' + '<head>' + '<link type="text/css" rel="stylesheet" href="' + [].concat(w.config.contentsCss).join('"><link type="text/css" rel="stylesheet" href="') + '">' + '<style type="text/css" _fcktemp="true">' + w._.styles.join('\n') + '</style>' + '</head>' + '<body>' + K + '</body>' + '</html>' + I;
                        window['_cke_htmlToLoad_' + w.name] = K;
                        a._['contentDomReady' + w.name] = J;
                        H();
                        if (b.opera) {
                            var L = B.$.contentWindow.document;
                            L.open();
                            L.write(K);
                            L.close();
                        }
                    },
                    getData: function () {
                        var K = B.getFrameDocument().getBody().getHtml();
                        if (w.dataProcessor) K = w.dataProcessor.toDataFormat(K, x);
                        if (w.config.ignoreEmptyParagraph) K = K.replace(m, '');
                        return K;
                    },
                    getSnapshotData: function () {
                        return B.getFrameDocument().getBody().getHtml();
                    },
                    loadSnapshotData: function (K) {
                        B.getFrameDocument().getBody().setHtml(K);
                    },
                    unload: function (K) {
                        w.window = w.document = B = z = D = null;
                        w.fire('contentDomUnload');
                    },
                    focus: function () {
                        if (C) D = true;
                        else if (w.window) {
                            w.window.focus();
                            if (c) try {
                                var K = w.getSelection();
                                K = K && K.getNative();
                                var L = K && K.type && K.createRange();
                                if (L) {
                                    K.empty();
                                    L.select();
                                }
                            } catch(M) {}
                            w.selectionChange();
                        }
                    }
                });
                w.on('insertHtml', n, null, null, 20);
                w.on('insertElement', o, null, null, 20);
                w.on('selectionChange', u, null, null, 1);
            });
            if (c) {
                var y;
                w.on('uiReady', function () {
                    y = w.container.append(h.createFromHtml('<input tabindex="-1" style="position:absolute; left:-10000">'));
                    y.on('focus', function () {
                        w.focus();
                    });
                });
            }
        }
    });
    if (b.gecko) {
        var v = window.top;
        (function () {
            var w = v.document.body;
            if (!w) v.addEventListener('load', arguments.callee, false);
            else w.setAttribute('onpageshow', w.getAttribute('onpageshow') + ';event.persisted && CKEDITOR.tools.callFunction(' + e.addFunction(function () {
                var x = a.instances,
                    y, z;
                for (var A in x) {
                    y = x[A];
                    z = y.document;
                    if (z) {
                        z.$.designMode = 'off';
                        z.$.designMode = 'on';
                    }
                }
            }) + ')');
        })();
    }
})();
i.disableObjectResizing = false;
i.disableNativeTableHandles = true;
i.disableNativeSpellChecker = true;
i.ignoreEmptyParagraph = true;
j.add('wsc', {
    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;
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) {
                    var ae = Y.getParent();
                    if (ae && ((ae.getDtd() || f.span)[O] || Q)) {
                        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) 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;
};
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;
        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 = o.parent || a.document.getBody(),
                q = this._.panel = new k.floatPanel(m, p, o),
                r = this;
            q.onShow = function () {
                if (r.className) this.element.getFirst().addClass(r.className + '_panel');
                n.oldState = r._.state;
                r.setState(1);
                n.on = 1;
                if (r.onOpen) r.onOpen();
            };
            q.onHide = function () {
                if (r.className) this.element.getFirst().removeClass(r.className + '_panel');
                r.setState(n.oldState);
                n.on = 0;
                if (r.onClose) r.onClose();
            };
            q.onEscape = function () {
                q.hide();
                r.document.getById(n.id).focus();
            };
            if (this.onBlock) this.onBlock(q, n.id);
            q.getBlock(n.id).onHide = function () {
                n.on = 0;
                r.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: ''
                });
                if (!this._.blurSet) {
                    var C = c ? w : new d.window(w.$.contentWindow);
                    a.event.useCapture = true;
                    C.on('blur', function (D) {
                        var G = this;
                        if (!G.allowBlur()) return;
                        var E = D.data.getTarget(),
                            F = E.getWindow && E.getWindow();
                        if (F && F.equals(C)) return;
                        if (G.visible && !G._.activeChild && !m) G.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 () {
                    this.onEscape && this.onEscape();
                },
                this);
                e.setTimeout(function () {
                    if (z) A -= v.$.offsetWidth;
                    var D = e.bind(function () {
                        if (u.autoSize) {
                            var E = v.getFirst(),
                                F = u.element.$.scrollHeight;
                            if (c && b.quirks && F > 0) F += (E.$.offsetHeight || 0) - (E.$.clientHeight || 0);
                            E.setStyle('height', F + 'px');
                            t._.currentBlock.element.setStyle('display', 'none').removeStyle('display');
                        } else v.getFirst().removeStyle('height');
                        var G = t.element,
                            H = G.getWindow(),
                            I = H.getScrollPosition(),
                            J = H.getViewPaneSize(),
                            K = {
                            height: G.$.offsetHeight,
                            width: G.$.offsetWidth
                        };
                        if (z ? A < 0 : A + K.width > J.width + I.x) A += K.width * (z ? 1 : -1);
                        if (B + K.height > J.height + I.y) B -= K.height;
                        v.setStyles({
                            top: B + 'px',
                            left: A + 'px',
                            opacity: '1'
                        });
                    },
                    this);
                    t.isLoaded ? D() : t.onLoad = D;
                    e.setTimeout(function () {
                        if (x.voiceLabel) if (b.gecko) {
                            var E = w.getParent();
                            E.setAttribute('role', 'region');
                            E.setAttribute('title', x.voiceLabel);
                            w.setAttribute('role', 'region');
                            w.setAttribute('title', ' ');
                        }
                        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 = {};
        for (var o = 0; o < m.length; o++) n[m[o]] = o + 1;
        l._.menuGroups = n;
        l._.menuItems = {};
    },
    requires: ['floatpanel']
});
e.extend(a.editor.prototype, {
    addMenuGroup: function (l, m) {
        this._.menuGroups[l] = m || 100;
    },
    addMenuItem: function (l, m) {
        if (this._.menuGroups[m.group]) this._.menuItems[l] = new a.menuItem(this, l, m);
    },
    addMenuItems: function (l) {
        for (var m in l) this.addMenuItem(m, l[m]);
    },
    getMenuItem: function (l) {
        return this._.menuItems[l];
    }
});
(function () {
    a.menu = e.createClass({
        $: function (m, n) {
            var o = this;
            o.id = 'cke_' + e.getNextNumber();
            o.editor = m;
            o.items = [];
            o._.level = n || 1;
        },
        _: {
            showSubMenu: function (m) {
                var t = this;
                var n = t._.subMenu,
                    o = t.items[m],
                    p = o.getItems && o.getItems();
                if (!p) {
                    t._.panel.hideChild();
                    return;
                }
                if (n) n.removeAll();
                else {
                    n = t._.subMenu = new a.menu(t.editor, t._.level + 1);
                    n.parent = t;
                    n.onClick = e.bind(t.onClick, t);
                }
                for (var q in p) {
                    var r = t.editor.getMenuItem(q);
                    if (r) {
                        r.state = p[q];
                        n.add(r);
                    }
                }
                var s = t._.panel.getBlock(t.id).element.getDocument().getById(t.id + String(m));
                n.show(s, 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(), {
                        css: [a.getUrl(r.skinPath + 'editor.css')],
                        level: this._.level - 1,
                        className: r.skinClass + ' cke_contextmenu'
                    },
                    this._.level);
                    s.onEscape = e.bind(function () {
                        this.onEscape && this.onEscape();
                        this.hide();
                    },
                    this);
                    s.onHide = e.bind(function () {
                        this.onHide && this.onHide();
                    },
                    this);
                    var u = s.addBlock(this.id);
                    u.autoSize = true;
                    var v = u.keys;
                    v[40] = 'next';
                    v[9] = 'next';
                    v[38] = 'prev';
                    v[2000 + 9] = 'prev';
                    v[32] = 'click';
                    v[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">'],
                    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"></div>');
                        z = B.group;
                    }
                    B.render(this, A, x);
                }
                x.push('</div>');
                t.setHtml(x.join(''));
                if (this.parent) this.parent._.panel.showAsChild(s, this.id, m, n, o, p);
                else s.showBlock(this.id, m, n, o, p);
                r.fire('menuShow', [s]);
            },
            hide: function () {
                this._.panel && this._.panel.hide();
            }
        }
    });

    function l(m) {
        m.sort(function (n, o) {
            if (n.group < o.group) return -1;
            else if (n.group > o.group) return 1;
            return n.order < o.order ? -1 : n.order > o.order ? 1 : 0;
        });
    };
})();
a.menuItem = e.createClass({
    $: function (l, m, n) {
        var o = this;
        e.extend(o, n, {
            order: 0,
            className: 'cke_button_' + m
        });
        o.group = l._.menuGroups[o.group];
        o.editor = l;
        o.name = m;
    },
    proto: {
        render: function (l, m, n) {
            var t = this;
            var o = l.id + String(m),
                p = typeof t.state == 'undefined' ? 2 : t.state,
            q = ' cke_' + (p == 1 ? 'on' : p == 0 ? 'disabled' : 'off'),
            r = t.label;
            if (p == 0) r = t.editor.lang.common.unavailable.replace('%1', r);
            if (t.className) q += ' ' + t.className;
            n.push('<span class="cke_menuitem"><a id="', o, '" class="', q, '" href="javascript:void(\'', (t.label || '').replace("'", ''), '\')" title="', t.label, '" tabindex="-1"_cke_focus=1 hidefocus="true"');
            if (b.opera || b.gecko && b.mac) n.push(' onkeypress="return false;"');
            if (b.gecko) n.push(' onblur="this.style.cssText = this.style.cssText;"');
            var s = (t.iconOffset || 0) * -16;
            n.push(' onmouseover="CKEDITOR.tools.callFunction(', l._.itemOverFn, ',', m, ');" onmouseout="CKEDITOR.tools.callFunction(', l._.itemOutFn, ',', m, ');" onclick="CKEDITOR.tools.callFunction(', l._.itemClickFn, ',', m, '); return false;"><span class="cke_icon_wrapper"><span class="cke_icon"' + (t.icon ? ' style="background-image:url(' + a.getUrl(t.icon) + ');background-position:0 ' + s + 'px;"' : '') + '></span></span>' + '<span class="cke_label">');
            if (t.getItems) n.push('<span class="cke_menuarrow"></span>');
            n.push(r, '</span></a></span>');
        }
    }
});
i.menu_subMenuDelay = 400;
i.menu_groups = 'clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea';
(function () {
    function l() {
        var v = this;
        try {
            var s = v.getSelection();
            if (!s) return;
            var t = s.getStartElement(),
                u = new d.elementPath(t);
            if (!u.compare(v._.selectionPreviousPath)) {
                v._.selectionPreviousPath = u;
                v.fire('selectionChange', {
                    selection: s,
                    path: u,
                    element: t
                });
            }
        } catch(w) {}
    };
    var m, n;

    function o() {
        n = true;
        if (m) return;
        p.call(this);
        m = e.setTimeout(p, 200, this);
    };

    function p() {
        m = null;
        if (n) {
            e.setTimeout(l, 0, this);
            n = false;
        }
    };
    var q = {
        exec: function (s) {
            switch (s.mode) {
            case 'wysiwyg':
                s.document.$.execCommand('SelectAll', false, null);
                break;
            case 'source':
            }
        },
        canUndo: false
    };
    j.add('selection', {
        init: function (s) {
            s.on('contentDom', function () {
                var t = s.document,
                    u = t.getBody();
                if (c) {
                    var v, w;
                    u.on('focusin', function () {
                        if (v) {
                            try {
                                v.select();
                            } catch(z) {}
                            v = null;
                        }
                    });
                    s.window.on('focus', function () {
                        w = true;
                        y();
                    });
                    u.on('beforedeactivate', function () {
                        w = false;
                    });
                    u.on('mousedown', x);
                    u.on('mouseup', function (z) {
                        z = z.data;
                        if (z.$.button == 2 && z.getTarget().hasAscendant('table')) return;
                        w = true;
                        setTimeout(function () {
                            y(true);
                        },
                        0);
                    });
                    u.on('keydown', x);
                    u.on('keyup', function () {
                        w = true;
                        y();
                    });
                    t.on('selectionchange', y);

                    function x() {
                        w = false;
                    };

                    function y(z) {
                        if (w) {
                            var A = s.document,
                                B = A && A.$.selection;
                            if (z && B && B.type == 'None') if (!A.$.queryCommandEnabled('InsertImage')) {
                                e.setTimeout(y, 50, this, true);
                                return;
                            }
                            v = B && B.createRange();
                            o.call(s);
                        }
                    };
                } else {
                    t.on('mouseup', o, s);
                    t.on('keyup', o, s);
                }
            });
            s.addCommand('selectAll', q);
            s.ui.addButton('SelectAll', {
                label: s.lang.selectAll,
                command: 'selectAll'
            });
            s.selectionChange = o;
        }
    });
    a.editor.prototype.getSelection = function () {
        return this.document && this.document.getSelection();
    };
    a.editor.prototype.forceNextSelectionCheck = function () {
        delete this._.selectionPreviousPath;
    };
    g.prototype.getSelection = function () {
        var s = new d.selection(this);
        return !s || s.isInvalid ? null : s;
    };
    a.SELECTION_NONE = 1;
    a.SELECTION_TEXT = 2;
    a.SELECTION_ELEMENT = 3;
    d.selection = function (s) {
        var v = this;
        var t = s.getCustomData('cke_locked_selection');
        if (t) return t;
        v.document = s;
        v.isLocked = false;
        v._ = {
            cache: {}
        };
        if (c) {
            var u = v.getNative().createRange();
            if (!u || u.item && u.item(0).ownerDocument != v.document.$ || u.parentElement && u.parentElement().ownerDocument != v.document.$) v.isInvalid = true;
        }
        return v;
    };
    var r = {
        img: 1,
        hr: 1,
        li: 1,
        table: 1,
        tr: 1,
        td: 1,
        th: 1,
        embed: 1,
        object: 1,
        ol: 1,
        ul: 1,
        a: 1,
        input: 1,
        form: 1,
        select: 1,
        textarea: 1,
        button: 1,
        fieldset: 1,
        th: 1,
        thead: 1,
        tfoot: 1
    };
    d.selection.prototype = {
        getNative: c ?
        function () {
            return this._.cache.nativeSel || (this._.cache.nativeSel = this.document.$.selection);
        } : function () {
            return this._.cache.nativeSel || (this._.cache.nativeSel = this.document.getWindow().$.getSelection());
        },
        getType: c ?
        function () {
            var s = this._.cache;
            if (s.type) return s.type;
            var t = 1;
            try {
                var u = this.getNative(),
                    v = u.type;
                if (v == 'Text') t = 2;
                if (v == 'Control') t = 3;
                if (u.createRange().parentElement) t = 2;
            } catch(w) {}
            return s.type = t;
        } : function () {
            var s = this._.cache;
            if (s.type) return s.type;
            var t = 2,
                u = this.getNative();
            if (!u) t = 1;
            else if (u.rangeCount == 1) {
                var v = u.getRangeAt(0),
                    w = v.startContainer;
                if (w == v.endContainer && w.nodeType == 1 && v.endOffset - v.startOffset == 1 && r[w.childNodes[v.startOffset].nodeName.toLowerCase()]) t = 3;
            }
            return s.type = t;
        },
        getRanges: c ? (function () {
            var s = function (t, u) {
                t = t.duplicate();
                t.collapse(u);
                var v = t.parentElement(),
                    w = v.childNodes,
                    x;
                for (var y = 0; y < w.length; y++) {
                    var z = w[y];
                    if (z.nodeType == 1) {
                        x = t.duplicate();
                        x.moveToElementText(z);
                        x.collapse();
                        var A = x.compareEndPoints('StartToStart', t);
                        if (A > 0) break;
                        else if (A === 0) return {
                            container: v,
                            offset: y
                        };
                        x = null;
                    }
                }
                if (!x) {
                    x = t.duplicate();
                    x.moveToElementText(v);
                    x.collapse(false);
                }
                x.setEndPoint('StartToStart', t);
                var B = x.text.replace(/(\r\n|\r)/g, '\n').length;
                while (B > 0) B -= w[--y].nodeValue.length;
                if (B === 0) return {
                    container: v,
                    offset: y
                };
                else return {
                    container: w[y],
                    offset: -B
                };
            };
            return function () {
                var E = this;
                var t = E._.cache;
                if (t.ranges) return t.ranges;
                var u = E.getNative(),
                    v = u && u.createRange(),
                    w = E.getType(),
                    x;
                if (!u) return [];
                if (w == 2) {
                    x = new d.range(E.document);
                    var y = s(v, true);
                    x.setStart(new d.node(y.container), y.offset);
                    y = s(v);
                    x.setEnd(new d.node(y.container), y.offset);
                    return t.ranges = [x];
                } else if (w == 3) {
                    var z = E._.cache.ranges = [];
                    for (var A = 0; A < v.length; A++) {
                        var B = v.item(A),
                            C = B.parentNode,
                            D = 0;
                        x = new d.range(E.document);
                        for (; D < C.childNodes.length && C.childNodes[D] != B; D++) {}
                        x.setStart(new d.node(C), D);
                        x.setEnd(new d.node(C), D + 1);
                        z.push(x);
                    }
                    return z;
                }
                return t.ranges = [];
            };
        })() : function () {
            var s = this._.cache;
            if (s.ranges) return s.ranges;
            var t = [],
                u = this.getNative();
            if (!u) return [];
            for (var v = 0; v < u.rangeCount; v++) {
                var w = u.getRangeAt(v),
                    x = new d.range(this.document);
                x.setStart(new d.node(w.startContainer), w.startOffset);
                x.setEnd(new d.node(w.endContainer), w.endOffset);
                t.push(x);
            }
            return s.ranges = t;
        },
        getStartElement: function () {
            var z = this;
            var s = z._.cache;
            if (s.startElement !== undefined) return s.startElement;
            var t, u = z.getNative();
            switch (z.getType()) {
            case 3:
                return z.getSelectedElement();
            case 2:
                var v = z.getRanges()[0];
                if (v) if (!v.collapsed) {
                    v.optimize();
                    for (;;) {
                        var w = v.startContainer,
                            x = v.startOffset;
                        if (x == (w.getChildCount ? w.getChildCount() : w.getLength()) && !w.isBlockBoundary()) v.setStartAfter(w);
                        else break;
                    }
                    t = v.startContainer;
                    if (t.type != 1) return t.getParent();
                    t = t.getChild(v.startOffset);
                    if (!t || t.type != 1) return v.startContainer;
                    var y = t.getFirst();
                    while (y && y.type == 1) {
                        t = y;
                        y = y.getFirst();
                    }
                    return t;
                }
                if (c) {
                    v = u.createRange();
                    v.collapse(true);
                    t = v.parentElement();
                } else {
                    t = u.anchorNode;
                    if (t && t.nodeType != 1) t = t.parentNode;
                }
            }
            return s.startElement = t ? new h(t) : null;
        },
        getSelectedElement: function () {
            var s = this._.cache;
            if (s.selectedElement !== undefined) return s.selectedElement;
            var t;
            if (this.getType() == 3) {
                var u = this.getNative();
                if (c) try {
                    t = u.createRange().item(0);
                } catch(w) {} else {
                    var v = u.getRangeAt(0);
                    t = v.startContainer.childNodes[v.startOffset];
                }
            }
            return s.selectedElement = t ? new h(t) : null;
        },
        lock: function () {
            var s = this;
            s.getRanges();
            s.getStartElement();
            s.getSelectedElement();
            s._.cache.nativeSel = {};
            s.isLocked = true;
            s.document.setCustomData('cke_locked_selection', s);
        },
        unlock: function (s) {
            var x = this;
            var t = x.document,
                u = t.getCustomData('cke_locked_selection');
            if (u) {
                t.setCustomData('cke_locked_selection', null);
                if (s) {
                    var v = u.getSelectedElement(),
                        w = !v && u.getRanges();
                    x.isLocked = false;
                    x.reset();
                    t.getBody().focus();
                    if (v) x.selectElement(v);
                    else x.selectRanges(w);
                }
            }
            if (!u || !s) {
                x.isLocked = false;
                x.reset();
            }
        },
        reset: function () {
            this._.cache = {};
        },
        selectElement: function (s) {
            var v = this;
            if (v.isLocked) {
                var t = new d.range(v.document);
                t.setStartBefore(s);
                t.setEndAfter(s);
                v._.cache.selectedElement = s;
                v._.cache.startElement = s;
                v._.cache.ranges = [t];
                v._.cache.type = 3;
                return;
            }
            if (c) {
                v.getNative().empty();
                try {
                    t = v.document.$.body.createControlRange();
                    t.addElement(s.$);
                    t.select();
                } catch(w) {
                    t = v.document.$.body.createTextRange();
                    t.moveToElementText(s.$);
                    t.select();
                }
                v.reset();
            } else {
                t = v.document.$.createRange();
                t.selectNode(s.$);
                var u = v.getNative();
                u.removeAllRanges();
                u.addRange(t);
                v.reset();
            }
        },
        selectRanges: function (s) {
            var y = this;
            if (y.isLocked) {
                y._.cache.selectedElement = null;
                y._.cache.startElement = s[0].getTouchedStartNode();
                y._.cache.ranges = s;
                y._.cache.type = 2;
                return;
            }
            if (c) {
                if (s[0]) s[0].select();
                y.reset();
            } else {
                var t = y.getNative();
                t.removeAllRanges();
                for (var u = 0; u < s.length; u++) {
                    var v = s[u],
                        w = y.document.$.createRange(),
                        x = v.startContainer;
                    if (v.collapsed && b.gecko && b.version < 10900 && x.type == 1 && !x.getChildCount()) x.appendText('');
                    w.setStart(x.$, v.startOffset);
                    w.setEnd(v.endContainer.$, v.endOffset);
                    t.addRange(w);
                }
                y.reset();
            }
        },
        createBookmarks: function (s) {
            var t = [],
                u = this.getRanges(),
                v = u.length,
                w;
            for (var x = 0; x < v; x++) {
                t.push(w = u[x].createBookmark(s, true));
                s = w.serializable;
                var y = s ? this.document.getById(w.startNode) : w.startNode,
                z = s ? this.document.getById(w.endNode) : w.endNode;
                for (var A = x + 1; A < v; A++) {
                    var B = u[A],
                        C = B.startContainer,
                        D = B.endContainer;
                    C.equals(y.getParent()) && B.startOffset++;
                    C.equals(z.getParent()) && B.startOffset++;
                    D.equals(y.getParent()) && B.endOffset++;
                    D.equals(z.getParent()) && B.endOffset++;
                }
            }
            return t;
        },
        createBookmarks2: function (s) {
            var t = [],
                u = this.getRanges();
            for (var v = 0; v < u.length; v++) t.push(u[v].createBookmark2(s));
            return t;
        },
        selectBookmarks: function (s) {
            var t = [];
            for (var u = 0; u < s.length; u++) {
                var v = new d.range(this.document);
                v.moveToBookmark(s[u]);
                t.push(v);
            }
            this.selectRanges(t);
            return this;
        },
        scrollIntoView: function () {
            var s = this.getStartElement();
            s.scrollIntoView();
        }
    };
})();
(function () {
    var l = d.walker.whitespaces(true),
        m = /\ufeff|\u00a0/;
    d.range.prototype.select = c ?
    function (n) {
        var x = this;
        var o = x.collapsed,
            p, q, r = x.createBookmark(),
            s = r.startNode,
            t;
        if (!o) t = r.endNode;
        var u = x.document.$.body.createTextRange();
        u.moveToElementText(s.$);
        u.moveStart('character', 1);
        if (t) {
            var v = x.document.$.body.createTextRange();
            v.moveToElementText(t.$);
            u.setEndPoint('EndToEnd', v);
            u.moveEnd('character', -1);
        } else {
            var w = s.getNext(l);
            p = !(w && w.getText && w.getText().match(m)) && (n || !s.hasPrevious() || s.getPrevious().is && s.getPrevious().is('br'));
            q = x.document.createElement('span');
            q.setHtml('&#65279;');
            q.insertBefore(s);
            if (p) x.document.createText('﻿').insertBefore(s);
        }
        x.setStartBefore(s);
        s.remove();
        if (o) {
            if (p) {
                u.moveStart('character', -1);
                u.select();
                x.document.$.selection.clear();
            } else u.select();
            q.remove();
        } else {
            x.setEndBefore(t);
            t.remove();
            u.select();
        }
    } : function () {
        var q = this;
        var n = q.startContainer;
        if (q.collapsed && n.type == 1 && !n.getChildCount()) n.append(new d.text(''));
        var o = q.document.$.createRange();
        o.setStart(n.$, q.startOffset);
        try {
            o.setEnd(q.endContainer.$, q.endOffset);
        } catch(r) {
            if (r.toString().indexOf('NS_ERROR_ILLEGAL_VALUE') >= 0) {
                q.collapse(true);
                o.setEnd(q.endContainer.$, q.endOffset);
            } else throw r;
        }
        var p = q.document.getSelection().getNative();
        p.removeAllRanges();
        p.addRange(o);
    };
})();
(function () {
    var l = {
        elements: {
            $: function (m) {
                var n = m.attributes._cke_realelement,
                    o = n && new a.htmlParser.fragment.fromHtml(decodeURIComponent(n)),
                    p = o && o.children[0];
                if (p) {
                    var q = m.attributes.style;
                    if (q) {
                        var r = /(?:^|\s)width\s*:\s*(\d+)/i.exec(q),
                            s = r && r[1];
                        r = /(?:^|\s)height\s*:\s*(\d+)/i.exec(q);
                        var t = r && r[1];
                        if (s) p.attributes.width = s;
                        if (t) p.attributes.height = t;
                    }
                }
                return p;
            }
        }
    };
    j.add('fakeobjects', {
        requires: ['htmlwriter'],
        afterInit: function (m) {
            var n = m.dataProcessor,
                o = n && n.htmlFilter;
            if (o) o.addRules(l);
        }
    });
})();
a.editor.prototype.createFakeElement = function (l, m, n, o) {
    var p = this.lang.fakeobjects,
        q = {
        'class': m,
        src: a.getUrl('images/spacer.gif'),
        _cke_realelement: encodeURIComponent(l.getOuterHtml()),
        alt: p[n] || p.unknown
    };
    if (n) q._cke_real_element_type = n;
    if (o) q._cke_resizable = o;
    return this.document.createElement('img', {
        attributes: q
    });
};
a.editor.prototype.createFakeParserElement = function (l, m, n, o) {
    var p = new a.htmlParser.basicWriter();
    l.writeHtml(p);
    var q = p.getHtml(),
        r = this.lang.fakeobjects,
        s = {
        'class': m,
        src: a.getUrl('images/spacer.gif'),
        _cke_realelement: encodeURIComponent(q),
        alt: r[n] || r.unknown
    };
    if (n) s._cke_real_element_type = n;
    if (o) s._cke_resizable = o;
    return new a.htmlParser.element('img', s);
};
a.editor.prototype.restoreRealElement = function (l) {
    var m = decodeURIComponent(l.getAttribute('_cke_realelement'));
    return h.createFromHtml(m, this.document);
};
j.add('richcombo', {
    requires: ['floatpanel', 'listblock', 'button'],
    beforeInit: function (l) {
        l.ui.addHandler(3, k.richCombo.handler);
    }
});
a.UI_RICHCOMBO = 3;
k.richCombo = e.createClass({
    $: function (l) {
        var n = this;
        e.extend(n, l, {
            title: l.label,
            modes: {
                wysiwyg: 1
            }
        });
        var m = n.panel || {};
        delete n.panel;
        n.id = e.getNextNumber();
        n.document = m && m.parent && m.parent.getDocument() || a.document;
        m.className = (m.className || '') + ' cke_rcombopanel';
        n._ = {
            panelDefinition: m,
            items: {},
            state: 2
        };
    },
    statics: {
        handler: {
            create: function (l) {
                return new k.richCombo(l);
            }
        }
    },
    proto: {
        renderHtml: function (l) {
            var m = [];
            this.render(l, m);
            return m.join('');
        },
        render: function (l, m) {
            var n = 'cke_' + this.id,
                o = e.addFunction(function (r) {
                var u = this;
                var s = u._;
                if (s.state == 0) return;
                u.createPanel(l);
                if (s.on) {
                    s.panel.hide();
                    return;
                }
                if (!s.committed) {
                    s.list.commit();
                    s.committed = 1;
                }
                var t = u.getValue();
                if (t) s.list.mark(t);
                else s.list.unmarkAll();
                s.panel.showBlock(u.id, new h(r), 4);
            },
            this),
                p = {
                id: n,
                combo: this,
                focus: function () {
                    var r = a.document.getById(n).getChild(1);
                    r.focus();
                },
                execute: o
            };
            l.on('mode', function () {
                this.setState(this.modes[l.mode] ? 2 : 0);
            },
            this);
            var q = e.addFunction(function (r, s) {
                r = new d.event(r);
                var t = r.getKeystroke();
                switch (t) {
                case 13:
                case 32:
                case 40:
                    e.callFunction(o, s);
                    break;
                default:
                    p.onkey(p, t);
                }
                r.preventDefault();
            });
            m.push('<span class="cke_rcombo">', '<span id=', n);
            if (this.className) m.push(' class="', this.className, ' cke_off"');
            m.push('><span class=cke_label>', this.label, '</span><a hidefocus=true title="', this.title, '" tabindex="-1" href="javascript:void(\'', this.label, "')\"");
            if (b.opera || b.gecko && b.mac) m.push(' onkeypress="return false;"');
            if (b.gecko) m.push(' onblur="this.style.cssText = this.style.cssText;"');
            m.push(' onkeydown="CKEDITOR.tools.callFunction( ', q, ', event, this );" onclick="CKEDITOR.tools.callFunction(', o, ', this); return false;"><span><span class="cke_accessibility">' + (this.voiceLabel ? this.voiceLabel + ' ' : '') + '</span>' + '<span id="' + n + '_text" class="cke_text cke_inline_label">' + this.label + '</span>' + '</span>' + '<span class=cke_openbutton></span>' + '</a>' + '</span>' + '</span>');
            if (this.onRender) this.onRender();
            return p;
        },
        createPanel: function (l) {
            if (this._.panel) return;
            var m = this._.panelDefinition,
                n = m.parent || a.document.getBody(),
                o = new k.floatPanel(l, n, m),
                p = o.addListBlock(this.id, this.multiSelect),
                q = this;
            o.onShow = function () {
                if (q.className) this.element.getFirst().addClass(q.className + '_panel');
                q.setState(1);
                p.focus(!q.multiSelect && q.getValue());
                q._.on = 1;
                if (q.onOpen) q.onOpen();
            };
            o.onHide = function () {
                if (q.className) this.element.getFirst().removeClass(q.className + '_panel');
                q.setState(2);
                q._.on = 0;
                if (q.onClose) q.onClose();
            };
            o.onEscape = function () {
                o.hide();
                q.document.getById('cke_' + q.id).getFirst().getNext().focus();
            };
            p.onClick = function (r, s) {
                q.document.getWindow().focus();
                if (q.onClick) q.onClick.call(q, r, s);
                if (s) q.setValue(r, q._.items[r]);
                else q.setValue('');
                o.hide();
            };
            this._.panel = o;
            this._.list = p;
            o.getBlock(this.id).onHide = function () {
                q._.on = 0;
                q.setState(2);
            };
            if (this.init) this.init();
        },
        setValue: function (l, m) {
            var o = this;
            o._.value = l;
            var n = o.document.getById('cke_' + o.id + '_text');
            if (! (l || m)) {
                m = o.label;
                n.addClass('cke_inline_label');
            } else n.removeClass('cke_inline_label');
            n.setHtml(typeof m != 'undefined' ? m : l);
        },
        getValue: function () {
            return this._.value || '';
        },
        unmarkAll: function () {
            this._.list.unmarkAll();
        },
        mark: function (l) {
            this._.list.mark(l);
        },
        hideItem: function (l) {
            this._.list.hideItem(l);
        },
        hideGroup: function (l) {
            this._.list.hideGroup(l);
        },
        showAll: function () {
            this._.list.showAll();
        },
        add: function (l, m, n) {
            this._.items[l] = n || l;
            this._.list.add(l, m, n);
        },
        startGroup: function (l) {
            this._.list.startGroup(l);
        },
        commit: function () {
            this._.list.commit();
        },
        setState: function (l) {
            var m = this;
            if (m._.state == l) return;
            m.document.getById('cke_' + m.id).setState(l);
            m._.state = l;
        }
    }
});
k.prototype.addRichCombo = function (l, m) {
    this.add(l, 3, m);
};

j.add('htmlwriter');
a.htmlWriter = e.createClass({
    base: a.htmlParser.basicWriter,
    $: function () {
        var n = this;
        n.base();
        n.indentationChars = '\t';
        n.selfClosingEnd = ' />';
        n.lineBreakChars = '\n';
        n.forceSimpleAmpersand = false;
        n.sortAttributes = true;
        n._.indent = false;
        n._.indentation = '';
        n._.rules = {};
        var l = f;
        for (var m in e.extend({},
        l.$block, l.$listItem, l.$tableContent)) n.setRules(m, {
            indent: true,
            breakBeforeOpen: true,
            breakAfterOpen: true,
            breakBeforeClose: !l[m]['#'],
            breakAfterClose: true
        });
        n.setRules('br', {
            breakAfterOpen: true
        });
        n.setRules('pre', {
            indent: false
        });
    },
    proto: {
        openTag: function (l, m) {
            var o = this;
            var n = o._.rules[l];
            if (o._.indent) o.indentation();
            else if (n && n.breakBeforeOpen) {
                o.lineBreak();
                o.indentation();
            }
            o._.output.push('<', l);
        },
        openTagClose: function (l, m) {
            var o = this;
            var n = o._.rules[l];
            if (m) o._.output.push(o.selfClosingEnd);
            else {
                o._.output.push('>');
                if (n && n.indent) o._.indentation += o.indentationChars;
            }
            if (n && n.breakAfterOpen) o.lineBreak();
        },
        attribute: function (l, m) {
            if (this.forceSimpleAmpersand) m = m.replace(/&amp;/, '&');
            this._.output.push(' ', l, '="', m, '"');
        },
        closeTag: function (l) {
            var n = this;
            var m = n._.rules[l];
            if (m && m.indent) n._.indentation = n._.indentation.substr(n.indentationChars.length);
            if (n._.indent) n.indentation();
            else if (m && m.breakBeforeClose) {
                n.lineBreak();
                n.indentation();
            }
            n._.output.push('</', l, '>');
            if (m && m.breakAfterClose) n.lineBreak();
        },
        text: function (l) {
            if (this._.indent) {
                this.indentation();
                l = e.ltrim(l);
            }
            this._.output.push(l);
        },
        comment: function (l) {
            if (this._.indent) this.indentation();
            this._.output.push('<!--', l, '-->');
        },
        lineBreak: function () {
            var l = this;
            if (l._.output.length > 0) l._.output.push(l.lineBreakChars);
            l._.indent = true;
        },
        indentation: function () {
            this._.output.push(this._.indentation);
            this._.indent = false;
        },
        setRules: function (l, m) {
            this._.rules[l] = m;
        }
    }
});
j.add('menubutton', {
    requires: ['button', 'contextmenu'],
    beforeInit: function (l) {
        l.ui.addHandler(5, k.menuButton.handler);
    }
});
a.UI_MENUBUTTON = 5;
(function () {
    var l = function (m) {
        var n = this._;
        if (n.state === 0) return;
        n.previousState = n.state;
        var o = n.menu;
        if (!o) {
            o = n.menu = new j.contextMenu(m);
            o.onHide = e.bind(function () {
                this.setState(n.previousState);
            },
            this);
            if (this.onMenu) o.addListener(this.onMenu);
        }
        if (n.on) {
            o.hide();
            return;
        }
        this.setState(1);
        o.show(a.document.getById(this._.id), 4);
    };
    k.menuButton = e.createClass({
        base: k.button,
        $: function (m) {
            var n = m.panel;
            delete m.panel;
            this.base(m);
            this.hasArrow = true;
            this.click = l;
        },
        statics: {
            handler: {
                create: function (m) {
                    return new k.menuButton(m);
                }
            }
        }
    });
})();
j.add('dialog', {
    requires: ['dialogui']
});
a.DIALOG_RESIZE_NONE = 0;
a.DIALOG_RESIZE_WIDTH = 1;
a.DIALOG_RESIZE_HEIGHT = 2;
a.DIALOG_RESIZE_BOTH = 3;
(function () {
    function l(L) {
        return !!this._.tabs[L][0].$.offsetHeight;
    };

    function m() {
        var P = this;
        var L = P._.currentTabId,
            M = P._.tabIdList.length,
            N = e.indexOf(P._.tabIdList, L) + M;
        for (var O = N - 1; O > N - M; O--) {
            if (l.call(P, P._.tabIdList[O % M])) return P._.tabIdList[O % M];
        }
        return null;
    };

    function n() {
        var P = this;
        var L = P._.currentTabId,
            M = P._.tabIdList.length,
            N = e.indexOf(P._.tabIdList, L);
        for (var O = N + 1; O < N + M; O++) {
            if (l.call(P, P._.tabIdList[O % M])) return P._.tabIdList[O % M];
        }
        return null;
    };
    var o = {};
    a.dialog = function (L, M) {
        var N = a.dialog._.dialogDefinitions[M];
        N = e.extend(N(L), q);
        N = e.clone(N);
        N = new u(this, N);
        this.definition = N = a.fire('dialogDefinition', {
            name: M,
            definition: N
        },
        L).definition;
        var O = a.document,
            P = L.theme.buildDialog(L);
        this._ = {
            editor: L,
            element: P.element,
            name: M,
            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 = P.parts;
        this.parts.dialog.setStyles({
            position: b.ie6Compat ? 'absolute' : 'fixed',
            top: 0,
            left: 0,
            visibility: 'hidden'
        });
        a.event.call(this);
        if (N.onLoad) this.on('load', N.onLoad);
        if (N.onShow) this.on('show', N.onShow);
        if (N.onHide) this.on('hide', N.onHide);
        if (N.onOk) this.on('ok', function (ab) {
            if (N.onOk.call(this, ab) === false) ab.data.hide = false;
        });
        if (N.onCancel) this.on('cancel', function (ab) {
            if (N.onCancel.call(this, ab) === false) ab.data.hide = false;
        });
        var Q = this,
            R = function (ab) {
            var ac = Q._.contents,
                ad = false;
            for (var ae in ac) for (var af in ac[ae]) {
                ad = ab.call(this, ac[ae][af]);
                if (ad) return;
            }
        };
        this.on('ok', function (ab) {
            R(function (ac) {
                if (ac.validate) {
                    var ad = ac.validate(this);
                    if (typeof ad == 'string') {
                        alert(ad);
                        ad = false;
                    }
                    if (ad === false) {
                        if (ac.select) ac.select();
                        else ac.focus();
                        ab.data.hide = false;
                        ab.stop();
                        return true;
                    }
                }
            });
        },
        this, null, 0);
        this.on('cancel', function (ab) {
            R(function (ac) {
                if (ac.isChanged()) {
                    if (!confirm(L.lang.common.confirmCancel)) ab.data.hide = false;
                    return true;
                }
            });
        },
        this, null, 0);
        this.parts.close.on('click', function (ab) {
            if (this.fire('cancel', {
                hide: true
            }).hide !== false) this.hide();
        },
        this);

        function S(ab) {
            var ac = Q._.focusList,
                ad = ab ? 1 : -1;
            if (ac.length < 1) return;
            var ae = (Q._.currentFocusIndex + ad + ac.length) % ac.length,
                af = ae;
            while (!ac[af].isFocusable()) {
                af = (af + ad + ac.length) % ac.length;
                if (af == ae) break;
            }
            ac[af].focus();
            if (ac[af].type == 'text') ac[af].select();
        };
        var T;

        function U(ab) {
            if (Q != a.dialog._.currentTop) return;
            var ac = ab.data.getKeystroke();
            T = 0;
            if (ac == 9 || ac == 2000 + 9) {
                var ad = ac == 2000 + 9;
                if (Q._.tabBarMode) {
                    var ae = ad ? m.call(Q) : n.call(Q);
                    Q.selectPage(ae);
                    Q._.tabs[ae][0].focus();
                } else S(!ad);
                T = 1;
            } else if (ac == 4000 + 121 && !Q._.tabBarMode) {
                Q._.tabBarMode = true;
                Q._.tabs[Q._.currentTabId][0].focus();
                T = 1;
            } else if ((ac == 37 || ac == 39) && Q._.tabBarMode) {
                ae = ac == 37 ? m.call(Q) : n.call(Q);
                Q.selectPage(ae);
                Q._.tabs[ae][0].focus();
                T = 1;
            }
            if (T) {
                ab.stop();
                ab.data.preventDefault();
            }
        };

        function V(ab) {
            T && ab.data.preventDefault();
        };
        this.on('show', function () {
            a.document.on('keydown', U, this, null, 0);
            if (b.opera || b.gecko && b.mac) a.document.on('keypress', V, this);
            if (b.ie6Compat) {
                var ab = z.getChild(0).getFrameDocument();
                ab.on('keydown', U, this, null, 0);
            }
        });
        this.on('hide', function () {
            a.document.removeListener('keydown', U);
            if (b.opera || b.gecko && b.mac) a.document.removeListener('keypress', V);
        });
        this.on('iframeAdded', function (ab) {
            var ac = new g(ab.data.iframe.$.contentWindow.document);
            ac.on('keydown', U, this, null, 0);
        });
        this.on('show', function () {
            var ae = this;
            if (!ae._.hasFocus) {
                ae._.currentFocusIndex = -1;
                S(true);
                if (ae._.editor.mode == 'wysiwyg' && c) {
                    var ab = L.document.$.selection,
                        ac = ab.createRange();
                    if (ac) if (ac.parentElement && ac.parentElement().ownerDocument == L.document.$ || ac.item && ac.item(0).ownerDocument == L.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 (ab) {
            var ac = this.getElement(),
                ad = ac.getFirst();
            ad.remove();
            ad.appendTo(ac);
        },
        this);
        w(this);
        x(this);
        new d.text(N.title, a.document).appendTo(this.parts.title);
        for (var W = 0; W < N.contents.length; W++) this.addPage(N.contents[W]);
        var X = /cke_dialog_tab(\s|$|_)/,
            Y = /cke_dialog_tab(\s|$)/;
        this.parts.tabs.on('click', function (ab) {
            var ag = this;
            var ac = ab.data.getTarget(),
                ad = ac,
                ae, af;
            if (! (X.test(ac.$.className) || ac.getName() == 'a')) return;
            ae = ac.$.id.substr(0, ac.$.id.lastIndexOf('_'));
            ag.selectPage(ae);
            if (ag._.tabBarMode) {
                ag._.tabBarMode = false;
                ag._.currentFocusIndex = -1;
                S(true);
            }
            ab.data.preventDefault();
        },
        this);
        var Z = [],
            aa = a.dialog._.uiElementBuilders.hbox.build(this, {
            type: 'hbox',
            className: 'cke_dialog_footer_buttons',
            widths: [],
            children: N.buttons
        },
        Z).getChild();
        this.parts.footer.setHtml(Z.join(''));
        for (W = 0; W < aa.length; W++) this._.buttons[aa[W].id] = aa[W];
        a.skins.load(L, 'dialog');
    };

    function p(L, M, N) {
        this.element = M;
        this.focusIndex = N;
        this.isFocusable = function () {
            return !M.getAttribute('disabled') && M.isVisible();
        };
        this.focus = function () {
            L._.currentFocusIndex = this.focusIndex;
            this.element.focus();
        };
        M.on('keydown', function (O) {
            if (O.data.getKeystroke() in {
                32: 1,
                13: 1
            }) this.fire('click');
        });
        M.on('focus', function () {
            this.fire('mouseover');
        });
        M.on('blur', function () {
            this.fire('mouseout');
        });
    };
    a.dialog.prototype = {
        resize: (function () {
            return function (L, M) {
                var N = this;
                if (N._.contentSize && N._.contentSize.width == L && N._.contentSize.height == M) return;
                a.dialog.fire('resize', {
                    dialog: N,
                    skin: N._.editor.skinName,
                    width: L,
                    height: M
                },
                N._.editor);
                N._.contentSize = {
                    width: L,
                    height: M
                };
                N._.updateSize = true;
            };
        })(),
        getSize: function () {
            var N = this;
            if (!N._.updateSize) return N._.size;
            var L = N._.element.getFirst(),
                M = N._.size = {
                width: L.$.offsetWidth || 0,
                height: L.$.offsetHeight || 0
            };
            N._.updateSize = !M.width || !M.height;
            return M;
        },
        move: (function () {
            var L;
            return function (M, N) {
                var Q = this;
                var O = Q._.element.getFirst();
                if (L === undefined) L = O.getComputedStyle('position') == 'fixed';
                if (L && Q._.position && Q._.position.x == M && Q._.position.y == N) return;
                Q._.position = {
                    x: M,
                    y: N
                };
                if (!L) {
                    var P = a.document.getWindow().getScrollPosition();
                    M += P.x;
                    N += P.y;
                }
                O.setStyles({
                    left: (M > 0 ? M : 0) + 'px',
                    top: (N > 0 ? N : 0) + 'px'
                });
            };
        })(),
        getPosition: function () {
            return e.extend({},
            this._.position);
        },
        show: function () {
            var L = this._.editor;
            if (L.mode == 'wysiwyg' && c) {
                var M = L.getSelection();
                M && M.lock();
            }
            var N = this._.element,
                O = this.definition;
            if (! (N.getParent() && N.getParent().equals(a.document.getBody()))) N.appendTo(a.document.getBody());
            else return;
            if (b.gecko && b.version < 10900) {
                var P = this.parts.dialog;
                P.setStyle('position', 'absolute');
                setTimeout(function () {
                    P.setStyle('position', 'fixed');
                },
                0);
            }
            this.resize(O.minWidth, O.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;
                A(this._.editor);
                N.on('keydown', D);
                N.on(b.opera ? 'keypress' : 'keyup', E);
                for (var Q in {
                    keyup: 1,
                    keydown: 1,
                    keypress: 1
                }) N.on(Q, K);
            } else {
                this._.parentDialog = a.dialog._.currentTop;
                var R = this._.parentDialog.getElement().getFirst();
                R.$.style.zIndex -= Math.floor(this._.editor.config.baseFloatZIndex / 2);
                a.dialog._.currentTop = this;
            }
            F(this, this, '\x1b', null, function () {
                this.getButton('cancel') && this.getButton('cancel').click();
            });
            this._.hasFocus = false;
            e.setTimeout(function () {
                var S = a.document.getWindow().getViewPaneSize(),
                    T = this.getSize();
                this.move((S.width - O.minWidth) / 2, (S.height - T.height) / 2);
                this.parts.dialog.setStyle('visibility', '');
                this.fireOnce('load', {});
                this.fire('show', {});
                this.foreach(function (U) {
                    U.setInitValue && U.setInitValue();
                });
            },
            100, this);
        },
        foreach: function (L) {
            var O = this;
            for (var M in O._.contents) for (var N in O._.contents[M]) L(O._.contents[M][N]);
            return O;
        },
        reset: (function () {
            var L = function (M) {
                if (M.reset) M.reset();
            };
            return function () {
                this.foreach(L);
                return this;
            };
        })(),
        setupContent: function () {
            var L = arguments;
            this.foreach(function (M) {
                if (M.setup) M.setup.apply(M, L);
            });
        },
        commitContent: function () {
            var L = arguments;
            this.foreach(function (M) {
                if (M.commit) M.commit.apply(M, L);
            });
        },
        hide: function () {
            this.fire('hide', {});
            var L = this._.element;
            if (!L.getParent()) return;
            L.remove();
            this.parts.dialog.setStyle('visibility', 'hidden');
            G(this);
            if (!this._.parentDialog) B();
            else {
                var M = this._.parentDialog.getElement().getFirst();
                M.setStyle('z-index', parseInt(M.$.style.zIndex, 10) + Math.floor(this._.editor.config.baseFloatZIndex / 2));
            }
            a.dialog._.currentTop = this._.parentDialog;
            if (!this._.parentDialog) {
                a.dialog._.currentZIndex = null;
                L.removeListener('keydown', D);
                L.removeListener(b.opera ? 'keypress' : 'keyup', E);
                for (var N in {
                    keyup: 1,
                    keydown: 1,
                    keypress: 1
                }) L.removeListener(N, K);
                var O = this._.editor;
                O.focus();
                if (O.mode == 'wysiwyg' && c) {
                    var P = O.getSelection();
                    P && P.unlock(true);
                }
            } else a.dialog._.currentZIndex -= 10;
            this.foreach(function (Q) {
                Q.resetInitValue && Q.resetInitValue();
            });
        },
        addPage: function (L) {
            var V = this;
            var M = [],
                N = L.label ? ' title="' + e.htmlEncode(L.label) + '"' : '',
            O = L.elements,
            P = a.dialog._.uiElementBuilders.vbox.build(V, {
                type: 'vbox',
                className: 'cke_dialog_page_contents',
                children: L.elements,
                expand: !!L.expand,
                padding: L.padding,
                style: L.style || 'width: 100%;'
            },
            M),
            Q = h.createFromHtml(M.join('')),
            R = h.createFromHtml(['<a class="cke_dialog_tab"', V._.pageCount > 0 ? ' cke_last' : 'cke_first', N, !!L.hidden ? ' style="display:none"' : '', ' id="', L.id + '_', e.getNextNumber(), '" href="javascript:void(0)"', ' hidefocus="true">', L.label, '</a>'].join(''));
            if (V._.pageCount === 0) V.parts.dialog.addClass('cke_single_page');
            else V.parts.dialog.removeClass('cke_single_page');
            V._.tabs[L.id] = [R, Q];
            V._.tabIdList.push(L.id);
            V._.pageCount++;
            V._.lastTab = R;
            var S = V._.contents[L.id] = {},
                T, U = P.getChild();
            while (T = U.shift()) {
                S[T.id] = T;
                if (typeof T.getChild == 'function') U.push.apply(U, T.getChild());
            }
            Q.setAttribute('name', L.id);
            Q.appendTo(V.parts.contents);
            R.unselectable();
            V.parts.tabs.append(R);
            if (L.accessKey) {
                F(V, V, 'CTRL+' + L.accessKey, I, H);
                V._.accessKeyMap['CTRL+' + L.accessKey] = L.id;
            }
        },
        selectPage: function (L) {
            var Q = this;
            for (var M in Q._.tabs) {
                var N = Q._.tabs[M][0],
                    O = Q._.tabs[M][1];
                if (M != L) {
                    N.removeClass('cke_dialog_tab_selected');
                    O.hide();
                }
            }
            var P = Q._.tabs[L];
            P[0].addClass('cke_dialog_tab_selected');
            P[1].show();
            Q._.currentTabId = L;
            Q._.currentTabIndex = e.indexOf(Q._.tabIdList, L);
        },
        hidePage: function (L) {
            var M = this._.tabs[L] && this._.tabs[L][0];
            if (!M) return;
            M.hide();
        },
        showPage: function (L) {
            var M = this._.tabs[L] && this._.tabs[L][0];
            if (!M) return;
            M.show();
        },
        getElement: function () {
            return this._.element;
        },
        getName: function () {
            return this._.name;
        },
        getContentElement: function (L, M) {
            return this._.contents[L][M];
        },
        getValueOf: function (L, M) {
            return this.getContentElement(L, M).getValue();
        },
        setValueOf: function (L, M, N) {
            return this.getContentElement(L, M).setValue(N);
        },
        getButton: function (L) {
            return this._.buttons[L];
        },
        click: function (L) {
            return this._.buttons[L].click();
        },
        disableButton: function (L) {
            return this._.buttons[L].disable();
        },
        enableButton: function (L) {
            return this._.buttons[L].enable();
        },
        getPageCount: function () {
            return this._.pageCount;
        },
        getParentEditor: function () {
            return this._.editor;
        },
        getSelectedElement: function () {
            return this.getParentEditor().getSelection().getSelectedElement();
        },
        addFocusable: function (L, M) {
            var O = this;
            if (typeof M == 'undefined') {
                M = O._.focusList.length;
                O._.focusList.push(new p(O, L, M));
            } else {
                O._.focusList.splice(M, 0, new p(O, L, M));
                for (var N = M + 1; N < O._.focusList.length; N++) O._.focusList[N].focusIndex++;
            }
        }
    };
    e.extend(a.dialog, {
        add: function (L, M) {
            if (!this._.dialogDefinitions[L] || typeof M == 'function') this._.dialogDefinitions[L] = M;
        },
        exists: function (L) {
            return !!this._.dialogDefinitions[L];
        },
        getCurrent: function () {
            return a.dialog._.currentTop;
        },
        okButton: (function () {
            var L = function (M, N) {
                N = N || {};
                return e.extend({
                    id: 'ok',
                    type: 'button',
                    label: M.lang.common.ok,
                    'class': 'cke_dialog_ui_button_ok',
                    onClick: function (O) {
                        var P = O.data.dialog;
                        if (P.fire('ok', {
                            hide: true
                        }).hide !== false) P.hide();
                    }
                },
                N, true);
            };
            L.type = 'button';
            L.override = function (M) {
                return e.extend(function (N) {
                    return L(N, M);
                },
                {
                    type: 'button'
                },
                true);
            };
            return L;
        })(),
        cancelButton: (function () {
            var L = function (M, N) {
                N = N || {};
                return e.extend({
                    id: 'cancel',
                    type: 'button',
                    label: M.lang.common.cancel,
                    'class': 'cke_dialog_ui_button_cancel',
                    onClick: function (O) {
                        var P = O.data.dialog;
                        if (P.fire('cancel', {
                            hide: true
                        }).hide !== false) P.hide();
                    }
                },
                N, true);
            };
            L.type = 'button';
            L.override = function (M) {
                return e.extend(function (N) {
                    return L(N, M);
                },
                {
                    type: 'button'
                },
                true);
            };
            return L;
        })(),
        addUIElement: function (L, M) {
            this._.uiElementBuilders[L] = M;
        }
    });
    a.dialog._ = {
        uiElementBuilders: {},
        dialogDefinitions: {},
        currentTop: null,
        currentZIndex: null
    };
    a.event.implementOn(a.dialog);
    a.event.implementOn(a.dialog.prototype, true);
    var q = {
        resizable: 0,
        minWidth: 600,
        minHeight: 400,
        buttons: [a.dialog.okButton, a.dialog.cancelButton]
    },
        r = function (L, M, N) {
        for (var O = 0, P; P = L[O]; O++) {
            if (P.id == M) return P;
            if (N && P[N]) {
                var Q = r(P[N], M, N);
                if (Q) return Q;
            }
        }
        return null;
    },
        s = function (L, M, N, O, P) {
        if (N) {
            for (var Q = 0, R; R = L[Q]; Q++) {
                if (R.id == N) {
                    L.splice(Q, 0, M);
                    return M;
                }
                if (O && R[O]) {
                    var S = s(R[O], M, N, O, true);
                    if (S) return S;
                }
            }
            if (P) return null;
        }
        L.push(M);
        return M;
    },
        t = function (L, M, N) {
        for (var O = 0, P; P = L[O]; O++) {
            if (P.id == M) return L.splice(O, 1);
            if (N && P[N]) {
                var Q = t(P[N], M, N);
                if (Q) return Q;
            }
        }
        return null;
    },
        u = function (L, M) {
        this.dialog = L;
        var N = M.contents;
        for (var O = 0, P; P = N[O]; O++) N[O] = new v(L, P);
        e.extend(this, M);
    };
    u.prototype = {
        getContents: function (L) {
            return r(this.contents, L);
        },
        getButton: function (L) {
            return r(this.buttons, L);
        },
        addContents: function (L, M) {
            return s(this.contents, L, M);
        },
        addButton: function (L, M) {
            return s(this.buttons, L, M);
        },
        removeContents: function (L) {
            t(this.contents, L);
        },
        removeButton: function (L) {
            t(this.buttons, L);
        }
    };

    function v(L, M) {
        this._ = {
            dialog: L
        };
        e.extend(this, M);
    };
    v.prototype = {
        get: function (L) {
            return r(this.elements, L, 'children');
        },
        add: function (L, M) {
            return s(this.elements, L, M, 'children');
        },
        remove: function (L) {
            t(this.elements, L, 'children');
        }
    };

    function w(L) {
        var M = null,
            N = null,
            O = L.getElement().getFirst(),
            P = L.getParentEditor(),
            Q = P.config.dialog_magnetDistance,
            R = o[P.skinName].margins || [0, 0, 0, 0];
        if (typeof Q == 'undefined') Q = 20;

        function S(U) {
            var V = L.getSize(),
                W = a.document.getWindow().getViewPaneSize(),
                X = U.data.$.screenX,
                Y = U.data.$.screenY,
                Z = X - M.x,
                aa = Y - M.y,
                ab, ac;
            M = {
                x: X,
                y: Y
            };
            N.x += Z;
            N.y += aa;
            if (N.x + R[3] < Q) ab = -R[3];
            else if (N.x - R[1] > W.width - V.width - Q) ab = W.width - V.width + R[1];
            else ab = N.x;
            if (N.y + R[0] < Q) ac = -R[0];
            else if (N.y - R[2] > W.height - V.height - Q) ac = W.height - V.height + R[2];
            else ac = N.y;
            L.move(ab, ac);
            U.data.preventDefault();
        };

        function T(U) {
            a.document.removeListener('mousemove', S);
            a.document.removeListener('mouseup', T);
            if (b.ie6Compat) {
                var V = z.getChild(0).getFrameDocument();
                V.removeListener('mousemove', S);
                V.removeListener('mouseup', T);
            }
        };
        L.parts.title.on('mousedown', function (U) {
            L._.updateSize = true;
            M = {
                x: U.data.$.screenX,
                y: U.data.$.screenY
            };
            a.document.on('mousemove', S);
            a.document.on('mouseup', T);
            N = L.getPosition();
            if (b.ie6Compat) {
                var V = z.getChild(0).getFrameDocument();
                V.on('mousemove', S);
                V.on('mouseup', T);
            }
            U.data.preventDefault();
        },
        L);
    };

    function x(L) {
        var M = L.definition,
            N = M.minWidth || 0,
            O = M.minHeight || 0,
            P = M.resizable,
            Q = o[L.getParentEditor().skinName].margins || [0, 0, 0, 0];

        function R(ac, ad) {
            ac.y += ad;
        };

        function S(ac, ad) {
            ac.x2 += ad;
        };

        function T(ac, ad) {
            ac.y2 += ad;
        };

        function U(ac, ad) {
            ac.x += ad;
        };
        var V = null,
            W = null,
            X = L._.editor.config.magnetDistance,
            Y = ['tl', 't', 'tr', 'l', 'r', 'bl', 'b', 'br'];

        function Z(ac) {
            var ad = ac.listenerData.part,
                ae = L.getSize();
            W = L.getPosition();
            e.extend(W, {
                x2: W.x + ae.width,
                y2: W.y + ae.height
            });
            V = {
                x: ac.data.$.screenX,
                y: ac.data.$.screenY
            };
            a.document.on('mousemove', aa, L, {
                part: ad
            });
            a.document.on('mouseup', ab, L, {
                part: ad
            });
            if (b.ie6Compat) {
                var af = z.getChild(0).getFrameDocument();
                af.on('mousemove', aa, L, {
                    part: ad
                });
                af.on('mouseup', ab, L, {
                    part: ad
                });
            }
            ac.data.preventDefault();
        };

        function aa(ac) {
            var ad = ac.data.$.screenX,
                ae = ac.data.$.screenY,
                af = ad - V.x,
                ag = ae - V.y,
                ah = a.document.getWindow().getViewPaneSize(),
                ai = ac.listenerData.part;
            if (ai.search('t') != -1) R(W, ag);
            if (ai.search('l') != -1) U(W, af);
            if (ai.search('b') != -1) T(W, ag);
            if (ai.search('r') != -1) S(W, af);
            V = {
                x: ad,
                y: ae
            };
            var aj, ak, al, am;
            if (W.x + Q[3] < X) aj = -Q[3];
            else if (ai.search('l') != -1 && W.x2 - W.x < N + X) aj = W.x2 - N;
            else aj = W.x;
            if (W.y + Q[0] < X) ak = -Q[0];
            else if (ai.search('t') != -1 && W.y2 - W.y < O + X) ak = W.y2 - O;
            else ak = W.y;
            if (W.x2 - Q[1] > ah.width - X) al = ah.width + Q[1];
            else if (ai.search('r') != -1 && W.x2 - W.x < N + X) al = W.x + N;
            else al = W.x2;
            if (W.y2 - Q[2] > ah.height - X) am = ah.height + Q[2];
            else if (ai.search('b') != -1 && W.y2 - W.y < O + X) am = W.y + O;
            else am = W.y2;
            L.move(aj, ak);
            L.resize(al - aj, am - ak);
            ac.data.preventDefault();
        };

        function ab(ac) {
            a.document.removeListener('mouseup', ab);
            a.document.removeListener('mousemove', aa);
            if (b.ie6Compat) {
                var ad = z.getChild(0).getFrameDocument();
                ad.removeListener('mouseup', ab);
                ad.removeListener('mousemove', aa);
            }
        };
    };
    var y, z, A = function (L) {
        var M = a.document.getWindow();
        if (!z) {
            var N = L.config.dialog_backgroundCoverColor || 'white',
                O = ['<div style="position: ', b.ie6Compat ? 'absolute' : 'fixed', '; z-index: ', L.config.baseFloatZIndex, '; top: 0px; left: 0px; ', !b.ie6Compat ? 'background-color: ' + N : '', '" id="cke_dialog_background_cover">'];
            if (b.ie6Compat) {
                var P = b.isCustomDomain(),
                    Q = "<html><body style=\\'background-color:" + N + ";\\'></body></html>";
                O.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:');
                O.push('void((function(){document.open();' + (P ? "document.domain='" + document.domain + "';" : '') + "document.write( '" + Q + "' );" + 'document.close();' + '})())');
                O.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>');
            }
            O.push('</div>');
            z = h.createFromHtml(O.join(''));
        }
        var R = z,
            S = function () {
            var W = M.getViewPaneSize();
            R.setStyles({
                width: W.width + 'px',
                height: W.height + 'px'
            });
        },
            T = function () {
            var W = M.getScrollPosition(),
                X = a.dialog._.currentTop;
            R.setStyles({
                left: W.x + 'px',
                top: W.y + 'px'
            });
            do {
                var Y = X.getPosition();
                X.move(Y.x, Y.y);
            } while (X = X._.parentDialog)
        };
        y = S;
        M.on('resize', S);
        S();
        if (b.ie6Compat) {
            var U = function () {
                T();
                arguments.callee.prevScrollHandler.apply(this, arguments);
            };
            M.$.setTimeout(function () {
                U.prevScrollHandler = window.onscroll || (function () {});
                window.onscroll = U;
            },
            0);
            T();
        }
        var V = L.config.dialog_backgroundCoverOpacity;
        R.setOpacity(typeof V != 'undefined' ? V : 0.5);
        R.appendTo(a.document.getBody());
    },
        B = function () {
        if (!z) return;
        var L = a.document.getWindow();
        z.remove();
        L.removeListener('resize', y);
        if (b.ie6Compat) L.$.setTimeout(function () {
            var M = window.onscroll && window.onscroll.prevScrollHandler;
            window.onscroll = M || null;
        },
        0);
        y = null;
    },
        C = {},
        D = function (L) {
        var M = L.data.$.ctrlKey || L.data.$.metaKey,
            N = L.data.$.altKey,
            O = L.data.$.shiftKey,
            P = String.fromCharCode(L.data.$.keyCode),
            Q = C[(M ? 'CTRL+' : '') + (N ? 'ALT+' : '') + (O ? 'SHIFT+' : '') + P];
        if (!Q || !Q.length) return;
        Q = Q[Q.length - 1];
        Q.keydown && Q.keydown.call(Q.uiElement, Q.dialog, Q.key);
        L.data.preventDefault();
    },
        E = function (L) {
        var M = L.data.$.ctrlKey || L.data.$.metaKey,
            N = L.data.$.altKey,
            O = L.data.$.shiftKey,
            P = String.fromCharCode(L.data.$.keyCode),
            Q = C[(M ? 'CTRL+' : '') + (N ? 'ALT+' : '') + (O ? 'SHIFT+' : '') + P];
        if (!Q || !Q.length) return;
        Q = Q[Q.length - 1];
        if (Q.keyup) {
            Q.keyup.call(Q.uiElement, Q.dialog, Q.key);
            L.data.preventDefault();
        }
    },
        F = function (L, M, N, O, P) {
        var Q = C[N] || (C[N] = []);
        Q.push({
            uiElement: L,
            dialog: M,
            key: N,
            keyup: P || L.accessKeyUp,
            keydown: O || L.accessKeyDown
        });
    },
        G = function (L) {
        for (var M in C) {
            var N = C[M];
            for (var O = N.length - 1; O >= 0; O--) {
                if (N[O].dialog == L || N[O].uiElement == L) N.splice(O, 1);
            }
            if (N.length === 0) delete C[M];
        }
    },
        H = function (L, M) {
        if (L._.accessKeyMap[M]) L.selectPage(L._.accessKeyMap[M]);
    },
        I = function (L, M) {},
        J = {
        27: 1,
        13: 1
    },
        K = function (L) {
        if (L.data.getKeystroke() in J) L.data.stopPropagation();
    };
    (function () {
        k.dialog = {
            uiElement: function (L, M, N, O, P, Q, R) {
                if (arguments.length < 4) return;
                var S = (O.call ? O(M) : O) || 'div',
                    T = ['<', S, ' '],
                    U = (P && P.call ? P(M) : P) || {},
                    V = (Q && Q.call ? Q(M) : Q) || {},
                    W = (R && R.call ? R(L, M) : R) || '',
                    X = this.domId = V.id || e.getNextNumber() + '_uiElement',
                    Y = this.id = M.id,
                    Z;
                V.id = X;
                var aa = {};
                if (M.type) aa['cke_dialog_ui_' + M.type] = 1;
                if (M.className) aa[M.className] = 1;
                var ab = V['class'] && V['class'].split ? V['class'].split(' ') : [];
                for (Z = 0; Z < ab.length; Z++) {
                    if (ab[Z]) aa[ab[Z]] = 1;
                }
                var ac = [];
                for (Z in aa) ac.push(Z);
                V['class'] = ac.join(' ');
                if (M.title) V.title = M.title;
                var ad = (M.style || '').split(';');
                for (Z in U) ad.push(Z + ':' + U[Z]);
                if (M.hidden) ad.push('display:none');
                for (Z = ad.length - 1; Z >= 0; Z--) {
                    if (ad[Z] === '') ad.splice(Z, 1);
                }
                if (ad.length > 0) V.style = (V.style ? V.style + '; ' : '') + ad.join('; ');
                for (Z in V) T.push(Z + '="' + e.htmlEncode(V[Z]) + '" ');
                T.push('>', W, '</', S, '>');
                N.push(T.join(''));
                (this._ || (this._ = {})).dialog = L;
                if (typeof M.isChanged == 'boolean') this.isChanged = function () {
                    return M.isChanged;
                };
                if (typeof M.isChanged == 'function') this.isChanged = M.isChanged;
                a.event.implementOn(this);
                this.registerEvents(M);
                if (this.accessKeyUp && this.accessKeyDown && M.accessKey) F(this, L, 'CTRL+' + M.accessKey);
                var ae = this;
                L.on('load', function () {
                    if (ae.getInputElement()) ae.getInputElement().on('focus', function () {
                        L._.tabBarMode = false;
                        L._.hasFocus = true;
                        ae.fire('focus');
                    },
                    ae);
                });
                if (this.keyboardFocusable) {
                    this.focusIndex = L._.focusList.push(this) - 1;
                    this.on('focus', function () {
                        L._.currentFocusIndex = ae.focusIndex;
                    });
                }
                e.extend(this, M);
            },
            hbox: function (L, M, N, O, P) {
                if (arguments.length < 4) return;
                this._ || (this._ = {});
                var Q = this._.children = M,
                    R = P && P.widths || null,
                    S = P && P.height || null,
                    T = {},
                    U, V = function () {
                    var W = ['<tbody><tr class="cke_dialog_ui_hbox">'];
                    for (U = 0; U < N.length; U++) {
                        var X = 'cke_dialog_ui_hbox_child',
                            Y = [];
                        if (U === 0) X = 'cke_dialog_ui_hbox_first';
                        if (U == N.length - 1) X = 'cke_dialog_ui_hbox_last';
                        W.push('<td class="', X, '" ');
                        if (R) {
                            if (R[U]) Y.push('width:' + e.cssLength(R[U]));
                        } else Y.push('width:' + Math.floor(100 / N.length) + '%');
                        if (S) Y.push('height:' + e.cssLength(S));
                        if (P && P.padding != undefined) Y.push('padding:' + e.cssLength(P.padding));
                        if (Y.length > 0) W.push('style="' + Y.join('; ') + '" ');
                        W.push('>', N[U], '</td>');
                    }
                    W.push('</tr></tbody>');
                    return W.join('');
                };
                k.dialog.uiElement.call(this, L, P || {
                    type: 'hbox'
                },
                O, 'table', T, P && P.align && {
                    align: P.align
                } || null, V);
            },
            vbox: function (L, M, N, O, P) {
                if (arguments.length < 3) return;
                this._ || (this._ = {});
                var Q = this._.children = M,
                    R = P && P.width || null,
                    S = P && P.heights || null,
                    T = function () {
                    var U = ['<table cellspacing="0" border="0" '];
                    U.push('style="');
                    if (P && P.expand) U.push('height:100%;');
                    U.push('width:' + e.cssLength(R || '100%'), ';');
                    U.push('"');
                    U.push('align="', e.htmlEncode(P && P.align || (L.getParentEditor().lang.dir == 'ltr' ? 'left' : 'right')), '" ');
                    U.push('><tbody>');
                    for (var V = 0; V < N.length; V++) {
                        var W = [];
                        U.push('<tr><td ');
                        if (R) W.push('width:' + e.cssLength(R || '100%'));
                        if (S) W.push('height:' + e.cssLength(S[V]));
                        else if (P && P.expand) W.push('height:' + Math.floor(100 / N.length) + '%');
                        if (P && P.padding != undefined) W.push('padding:' + e.cssLength(P.padding));
                        if (W.length > 0) U.push('style="', W.join('; '), '" ');
                        U.push(' class="cke_dialog_ui_vbox_child">', N[V], '</td></tr>');
                    }
                    U.push('</tbody></table>');
                    return U.join('');
                };

k.dialog.uiElement.call(this, L, P || {
    type: 'vbox'
},
O, 'div', null, null, T);
}
};
})();
k.dialog.uiElement.prototype = {
    getElement: function () {
        return a.document.getById(this.domId);
    },
    getInputElement: function () {
        return this.getElement();
    },
    getDialog: function () {
        return this._.dialog;
    },
    setValue: function (L) {
        this.getInputElement().setValue(L);
        this.fire('change', {
            value: L
        });
        return this;
    },
    getValue: function () {
        return this.getInputElement().getValue();
    },
    isChanged: function () {
        return false;
    },
    selectParentTab: function () {
        var O = this;
        var L = O.getInputElement(),
            M = L,
            N;
        while ((M = M.getParent()) && M.$.className.search('cke_dialog_page_contents') == -1) {}
        if (!M) return O;
        N = M.getAttribute('name');
        if (O._.dialog._.currentTabId != N) O._.dialog.selectPage(N);
        return O;
    },
    focus: function () {
        this.selectParentTab().getInputElement().focus();
        return this;
    },
    registerEvents: function (L) {
        var M = /^on([A-Z]\w+)/,
            N, O = function (Q, R, S, T) {
            R.on('load', function () {
                Q.getInputElement().on(S, T, Q);
            });
        };
        for (var P in L) {
            if (! (N = P.match(M))) continue;
            if (this.eventProcessors[P]) this.eventProcessors[P].call(this, this._.dialog, L[P]);
            else O(this, this._.dialog, N[1].toLowerCase(), L[P]);
        }
        return this;
    },
    eventProcessors: {
        onLoad: function (L, M) {
            L.on('load', M, this);
        },
        onShow: function (L, M) {
            L.on('show', M, this);
        },
        onHide: function (L, M) {
            L.on('hide', M, this);
        }
    },
    accessKeyDown: function (L, M) {
        this.focus();
    },
    accessKeyUp: function (L, M) {},
    disable: function () {
        var L = this.getInputElement();
        L.setAttribute('disabled', 'true');
        L.addClass('cke_disabled');
    },
    enable: function () {
        var L = this.getInputElement();
        L.removeAttribute('disabled');
        L.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 (L) {
        var M = this;
        if (arguments.length < 1) return M._.children.concat();
        if (!L.splice) L = [L];
        if (L.length < 2) return M._.children[L[0]];
        else return M._.children[L[0]] && M._.children[L[0]].getChild ? M._.children[L[0]].getChild(L.slice(1, L.length)) : null;
    }
},
true);
k.dialog.vbox.prototype = new k.dialog.hbox();
(function () {
    var L = {
        build: function (M, N, O) {
            var P = N.children,
                Q, R = [],
                S = [];
            for (var T = 0; T < P.length && (Q = P[T]); T++) {
                var U = [];
                R.push(U);
                S.push(a.dialog._.uiElementBuilders[Q.type].build(M, Q, U));
            }
            return new k.dialog[N.type](M, S, R, O, N);
        }
    };
    a.dialog.addUIElement('hbox', L);
    a.dialog.addUIElement('vbox', L);
})();
a.dialogCommand = function (L) {
    this.dialogName = L;
};
a.dialogCommand.prototype = {
    exec: function (L) {
        L.openDialog(this.dialogName);
    },
    canUndo: false
};
(function () {
    var L = /^([a]|[^a])+$/,
        M = /^\d*$/,
        N = /^\d*(?:\.\d+)?$/;
    a.VALIDATE_OR = 1;
    a.VALIDATE_AND = 2;
    a.dialog.validate = {
        functions: function () {
            return function () {
                var U = this;
                var O = U && U.getValue ? U.getValue() : arguments[0],
                P = undefined,
                Q = 2,
                R = [],
                S;
                for (S = 0; S < arguments.length; S++) {
                    if (typeof arguments[S] == 'function') R.push(arguments[S]);
                    else break;
                }
                if (S < arguments.length && typeof arguments[S] == 'string') {
                    P = arguments[S];
                    S++;
                }
                if (S < arguments.length && typeof arguments[S] == 'number') Q = arguments[S];
                var T = Q == 2 ? true : false;
                for (S = 0; S < R.length; S++) {
                    if (Q == 2) T = T && R[S](O);
                    else T = T || R[S](O);
                }
                if (!T) {
                    if (P !== undefined) alert(P);
                    if (U && (U.select || U.focus)) U.select || U.focus();
                    return false;
                }
                return true;
            };
        },
        regex: function (O, P) {
            return function () {
                var R = this;
                var Q = R && R.getValue ? R.getValue() : arguments[0];
                if (!O.test(Q)) {
                    if (P !== undefined) alert(P);
                    if (R && (R.select || R.focus)) if (R.select) R.select();
                    else R.focus();
                    return false;
                }
                return true;
            };
        },
        notEmpty: function (O) {
            return this.regex(L, O);
        },
        integer: function (O) {
            return this.regex(M, O);
        },
        number: function (O) {
            return this.regex(N, O);
        },
        equals: function (O, P) {
            return this.functions(function (Q) {
                return Q == O;
            },
            P);
        },
        notEqual: function (O, P) {
            return this.functions(function (Q) {
                return Q != O;
            },
            P);
        }
    };
})();
a.skins.add = (function () {
    var L = a.skins.add;
    return function (M, N) {
        o[M] = {
            margins: N.margins
        };
        return L.apply(this, arguments);
    };
})();
})();
e.extend(a.editor.prototype, {
    openDialog: function (l) {
        var m = a.dialog._.dialogDefinitions[l];
        if (typeof m == 'function') {
            var n = this._.storedDialogs || (this._.storedDialogs = {}),
                o = n[l] || (n[l] = new a.dialog(this, l));
            o.show();
            return o;
        } else if (m == 'failed') throw new Error('[CKEDITOR.dialog.openDialog] Dialog "' + l + '" failed when loading definition.');
        var p = a.document.getBody(),
            q = p.$.style.cursor,
            r = this;
        p.setStyle('cursor', 'wait');
        a.scriptLoader.load(a.getUrl(m), function () {
            if (typeof a.dialog._.dialogDefinitions[l] != 'function') a.dialog._.dialogDefinitions[l] = 'failed';
            r.openDialog(l);
            p.setStyle('cursor', q);
        });
        return null;
    }
});
(function () {
    var l = function (n, o) {
        return n._.modes && n._.modes[o || n.mode];
    },
        m;
    j.add('editingblock', {
        init: function (n) {
            if (!n.config.editingBlock) return;
            n.on('themeSpace', function (o) {
                if (o.data.space == 'contents') o.data.html += '<br>';
            });
            n.on('themeLoaded', function () {
                n.fireOnce('editingBlockReady');
            });
            n.on('uiReady', function () {
                n.setMode(n.config.startupMode);
            });
            n.on('afterSetData', function () {
                if (!m) {
                    function o() {
                        m = true;
                        l(n).loadData(n.getData());
                        m = false;
                    };
                    if (n.mode) o();
                    else n.on('mode', function () {
                        o();
                        n.removeListener('mode', arguments.callee);
                    });
                }
            });
            n.on('beforeGetData', function () {
                if (!m && n.mode) {
                    m = true;
                    n.setData(l(n).getData());
                    m = false;
                }
            });
            n.on('getSnapshot', function (o) {
                if (n.mode) o.data = l(n).getSnapshotData();
            });
            n.on('loadSnapshot', function (o) {
                if (n.mode) l(n).loadSnapshotData(o.data);
            });
            n.on('mode', function (o) {
                o.removeListener();
                var p = n.container;
                if (b.webkit && b.version < 528) {
                    var q = n.config.tabIndex || n.element.getAttribute('tabindex') || 0;
                    p = p.append(h.createFromHtml('<input tabindex="' + q + '"' + ' style="position:absolute; left:-10000">'));
                }
                p.on('focus', function () {
                    n.focus();
                });
                if (n.config.startupFocus) n.focus();
                setTimeout(function () {
                    n.fireOnce('instanceReady');
                    a.fire('instanceReady', null, n);
                });
            });
        }
    });
    a.editor.prototype.mode = '';
    a.editor.prototype.addMode = function (n, o) {
        o.name = n;
        (this._.modes || (this._.modes = {}))[n] = o;
    };
    a.editor.prototype.setMode = function (n) {
        var o, p = this.getThemeSpace('contents'),
            q = this.checkDirty();
        if (this.mode) {
            if (n == this.mode) return;
            this.fire('beforeModeUnload');
            var r = l(this);
            o = r.getData();
            r.unload(p);
            this.mode = '';
        }
        p.setHtml('');
        var s = l(this, n);
        if (!s) throw '[CKEDITOR.editor.setMode] Unknown mode "' + n + '".';
        if (!q) this.on('mode', function () {
            this.resetDirty();
            this.removeListener('mode', arguments.callee);
        });
        s.load(p, typeof o != 'string' ? this.getData() : o);
    };
    a.editor.prototype.focus = function () {
        var n = l(this);
        if (n) n.focus();
    };
})();
i.startupMode = 'wysiwyg';
i.startupFocus = false;
i.editingBlock = true;
j.add('panel', {
    beforeInit: function (l) {
        l.ui.addHandler(2, k.panel.handler);
    }
});
a.UI_PANEL = 2;
k.panel = function (l, m) {
    var n = this;
    if (m) e.extend(n, m);
    e.extend(n, {
        className: '',
        css: []
    });
    n.id = e.getNextNumber();
    n.document = l;
    n._ = {
        blocks: {}
    };
};
k.panel.handler = {
    create: function (l) {
        return new k.panel(l);
    }
};
k.panel.prototype = {
    renderHtml: function (l) {
        var m = [];
        this.render(l, m);
        return m.join('');
    },
    render: function (l, m) {
        var o = this;
        var n = 'cke_' + o.id;
        m.push('<div class="', l.skinClass, '" lang="', l.langCode, '" style="display:none;z-index:' + (l.config.baseFloatZIndex + 1) + '">' + '<div' + ' id=', n, ' dir=', l.lang.dir, ' class="cke_panel cke_', l.lang.dir);
        if (o.className) m.push(' ', o.className);
        m.push('">');
        if (o.forceIFrame || o.css.length) {
            m.push('<iframe id="', n, '_frame" frameborder="0" src="javascript:void(');
            m.push(b.isCustomDomain() ? "(function(){document.open();document.domain='" + document.domain + "';" + 'document.close();' + '})()' : '0');
            m.push(')"></iframe>');
        }
        m.push('</div></div>');
        return n;
    },
    getHolderElement: function () {
        var l = this._.holder;
        if (!l) {
            if (this.forceIFrame || this.css.length) {
                var m = this.document.getById('cke_' + this.id + '_frame'),
                    n = m.getParent(),
                    o = n.getAttribute('dir'),
                    p = n.getParent().getAttribute('class'),
                    q = n.getParent().getAttribute('lang'),
                    r = m.getFrameDocument();
                r.$.open();
                if (b.isCustomDomain()) r.$.domain = document.domain;
                var s = e.addFunction(e.bind(function (u) {
                    this.isLoaded = true;
                    if (this.onLoad) this.onLoad();
                },
                this));
                r.$.write('<!DOCTYPE html><html dir="' + o + '" class="' + p + '_container" lang="' + q + '">' + '<head>' + '<style>.' + p + '_container{visibility:hidden}</style>' + '</head>' + '<body class="cke_' + o + ' cke_panel_frame ' + b.cssClass + '" style="margin:0;padding:0"' + ' onload="( window.CKEDITOR || window.parent.CKEDITOR ).tools.callFunction(' + s + ');">' + '</body>' + '<link type="text/css" rel=stylesheet href="' + this.css.join('"><link type="text/css" rel="stylesheet" href="') + '">' + '</html>');
                r.$.close();
                var t = r.getWindow();
                t.$.CKEDITOR = a;
                r.on('keydown', function (u) {
                    var w = this;
                    var v = u.data.getKeystroke();
                    if (w._.onKeyDown && w._.onKeyDown(v) === false) {
                        u.data.preventDefault();
                        return;
                    }
                    if (v == 27) w.onEscape && w.onEscape();
                },
                this);
                l = r.getBody();
            } else l = this.document.getById('cke_' + this.id);
            this._.holder = l;
        }
        return l;
    },
    addBlock: function (l, m) {
        var n = this;
        m = n._.blocks[l] = m || new k.panel.block(n.getHolderElement());
        if (!n._.currentBlock) n.showBlock(l);
        return m;
    },
    getBlock: function (l) {
        return this._.blocks[l];
    },
    showBlock: function (l) {
        var p = this;
        var m = p._.blocks,
            n = m[l],
            o = p._.currentBlock;
        if (o) o.hide();
        p._.currentBlock = n;
        n._.focusIndex = -1;
        p._.onKeyDown = n.onKeyDown && e.bind(n.onKeyDown, n);
        n.show();
        return n;
    },
    destroy: function () {
        this.element && this.element.remove();
    }
};
k.panel.block = e.createClass({
    $: function (l) {
        var m = this;
        m.element = l.append(l.getDocument().createElement('div', {
            attributes: {
                'class': 'cke_panel_block'
            },
            styles: {
                display: 'none'
            }
        }));
        m.keys = {};
        m._.focusIndex = -1;
        m.element.disableContextMenu();
    },
    _: {},
    proto: {
        show: function () {
            this.element.setStyle('display', '');
        },
        hide: function () {
            var l = this;
            if (!l.onHide || l.onHide.call(l) !== true) l.element.setStyle('display', 'none');
        },
        onKeyDown: function (l) {
            var q = this;
            var m = q.keys[l];
            switch (m) {
            case 'next':
                var n = q._.focusIndex,
                    o = q.element.getElementsByTag('a'),
                    p;
                while (p = o.getItem(++n)) {
                    if (p.getAttribute('_cke_focus') && p.$.offsetWidth) {
                        q._.focusIndex = n;
                        p.focus();
                        break;
                    }
                }
                return false;
            case 'prev':
                n = q._.focusIndex;
                o = q.element.getElementsByTag('a');
                while (n > 0 && (p = o.getItem(--n))) {
                    if (p.getAttribute('_cke_focus') && p.$.offsetWidth) {
                        q._.focusIndex = n;
                        p.focus();
                        break;
                    }
                }
                return false;
            case 'click':
                n = q._.focusIndex;
                p = n >= 0 && q.element.getElementsByTag('a').getItem(n);
                if (p) p.$.click ? p.$.click() : p.$.onclick();
                return false;
            }
            return true;
        }
    }
});
j.add('listblock', {
    requires: ['panel'],
    onLoad: function () {
        k.panel.prototype.addListBlock = function (l, m) {
            return this.addBlock(l, new k.listBlock(this.getHolderElement(), m));
        };
        k.listBlock = e.createClass({
            base: k.panel.block,
            $: function (l, m) {
                var o = this;
                o.base(l);
                o.multiSelect = !!m;
                var n = o.keys;
                n[40] = 'next';
                n[9] = 'next';
                n[38] = 'prev';
                n[2000 + 9] = 'prev';
                n[32] = 'click';
                o._.pendingHtml = [];
                o._.items = {};
                o._.groups = {};
            },
            _: {
                close: function () {
                    if (this._.started) {
                        this._.pendingHtml.push('</ul>');
                        delete this._.started;
                    }
                },
                getClick: function () {
                    if (!this._.click) this._.click = e.addFunction(function (l) {
                        var n = this;
                        var m = true;
                        if (n.multiSelect) m = n.toggle(l);
                        else n.mark(l);
                        if (n.onClick) n.onClick(l, m);
                    },
                    this);
                    return this._.click;
                }
            },
            proto: {
                add: function (l, m, n) {
                    var q = this;
                    var o = q._.pendingHtml,
                        p = 'cke_' + e.getNextNumber();
                    if (!q._.started) {
                        o.push('<ul class=cke_panel_list>');
                        q._.started = 1;
                    }
                    q._.items[l] = p;
                    o.push('<li id=', p, ' class=cke_panel_listItem><a _cke_focus=1 hidefocus=true title="', n || l, '" href="javascript:void(\'', l, '\')" onclick="CKEDITOR.tools.callFunction(', q._.getClick(), ",'", l, "'); return false;\">", m || l, '</a></li>');
                },
                startGroup: function (l) {
                    this._.close();
                    var m = 'cke_' + e.getNextNumber();
                    this._.groups[l] = m;
                    this._.pendingHtml.push('<h1 id=', m, ' class=cke_panel_grouptitle>', l, '</h1>');
                },
                commit: function () {
                    var l = this;
                    l._.close();
                    l.element.appendHtml(l._.pendingHtml.join(''));
                    l._.pendingHtml = [];
                },
                toggle: function (l) {
                    var m = this.isMarked(l);
                    if (m) this.unmark(l);
                    else this.mark(l);
                    return !m;
                },
                hideGroup: function (l) {
                    var m = this.element.getDocument().getById(this._.groups[l]),
                        n = m && m.getNext();
                    if (m) {
                        m.setStyle('display', 'none');
                        if (n && n.getName() == 'ul') n.setStyle('display', 'none');
                    }
                },
                hideItem: function (l) {
                    this.element.getDocument().getById(this._.items[l]).setStyle('display', 'none');
                },
                showAll: function () {
                    var l = this._.items,
                        m = this._.groups,
                        n = this.element.getDocument();
                    for (var o in l) n.getById(l[o]).setStyle('display', '');
                    for (var p in m) {
                        var q = n.getById(m[p]),
                            r = q.getNext();
                        q.setStyle('display', '');
                        if (r && r.getName() == 'ul') r.setStyle('display', '');
                    }
                },
                mark: function (l) {
                    var m = this;
                    if (!m.multiSelect) m.unmarkAll();
                    m.element.getDocument().getById(m._.items[l]).addClass('cke_selected');
                },
                unmark: function (l) {
                    this.element.getDocument().getById(this._.items[l]).removeClass('cke_selected');
                },
                unmarkAll: function () {
                    var l = this._.items,
                        m = this.element.getDocument();
                    for (var n in l) m.getById(l[n]).removeClass('cke_selected');
                },
                isMarked: function (l) {
                    return this.element.getDocument().getById(this._.items[l]).hasClass('cke_selected');
                },
                focus: function (l) {
                    this._.focusIndex = -1;
                    if (l) {
                        var m = this.element.getDocument().getById(this._.items[l]).getFirst(),
                            n = this.element.getElementsByTag('a'),
                            o, p = -1;
                        while (o = n.getItem(++p)) {
                            if (o.equals(m)) {
                                this._.focusIndex = p;
                                break;
                            }
                        }
                        setTimeout(function () {
                            m.focus();
                        },
                        0);
                    }
                }
            }
        });
    }
});
j.add('dialogui');
(function () {
    var l = function (s) {
        var v = this;
        v._ || (v._ = {});
        v._['default'] = v._.initValue = s['default'] || '';
        var t = [v._];
        for (var u = 1; u < arguments.length; u++) t.push(arguments[u]);
        t.push(true);
        e.extend.apply(e, t);
        return v._;
    },
        m = {
        build: function (s, t, u) {
            return new k.dialog.textInput(s, t, u);
        }
    },
        n = {
        build: function (s, t, u) {
            return new k.dialog[t.type](s, t, u);
        }
    },
        o = {
        isChanged: function () {
            return this.getValue() != this.getInitValue();
        },
        reset: function () {
            this.setValue(this.getInitValue());
        },
        setInitValue: function () {
            this._.initValue = this.getValue();
        },
        resetInitValue: function () {
            this._.initValue = this._['default'];
        },
        getInitValue: function () {
            return this._.initValue;
        }
    },
        p = e.extend({},
    k.dialog.uiElement.prototype.eventProcessors, {
        onChange: function (s, t) {
            if (!this._.domOnChangeRegistered) {
                s.on('load', function () {
                    this.getInputElement().on('change', function () {
                        this.fire('change', {
                            value: this.getValue()
                        });
                    },
                    this);
                },
                this);
                this._.domOnChangeRegistered = true;
            }
            this.on('change', t);
        }
    },
    true),
        q = /^on([A-Z]\w+)/,
        r = function (s) {
        for (var t in s) {
            if (q.test(t) || t == 'title' || t == 'type') delete s[t];
        }
        return s;
    };
    e.extend(k.dialog, {
        labeledElement: function (s, t, u, v) {
            if (arguments.length < 4) return;
            var w = l.call(this, t);
            w.labelId = e.getNextNumber() + '_label';
            var x = this._.children = [],
                y = function () {
                var z = [];
                if (t.labelLayout != 'horizontal') z.push('<div class="cke_dialog_ui_labeled_label" id="', w.labelId, '" >', t.label, '</div>', '<div class="cke_dialog_ui_labeled_content">', v(s, t), '</div>');
                else {
                    var A = {
                        type: 'hbox',
                        widths: t.widths,
                        padding: 0,
                        children: [{
                            type: 'html',
                            html: '<span class="cke_dialog_ui_labeled_label" id="' + w.labelId + '">' + e.htmlEncode(t.label) + '</span>'
                        },
                        {
                            type: 'html',
                            html: '<span class="cke_dialog_ui_labeled_content">' + v(s, t) + '</span>'
                        }]
                    };
                    a.dialog._.uiElementBuilders.hbox.build(s, A, z);
                }
                return z.join('');
            };
            k.dialog.uiElement.call(this, s, t, u, 'div', null, null, y);
        },
        textInput: function (s, t, u) {
            if (arguments.length < 3) return;
            l.call(this, t);
            var v = this._.inputId = e.getNextNumber() + '_textInput',
                w = {
                'class': 'cke_dialog_ui_input_' + t.type,
                id: v,
                type: 'text'
            },
                x;
            if (t.validate) this.validate = t.validate;
            if (t.maxLength) w.maxlength = t.maxLength;
            if (t.size) w.size = t.size;
            var y = this,
                z = false;
            s.on('load', function () {
                y.getInputElement().on('keydown', function (B) {
                    if (B.data.getKeystroke() == 13) z = true;
                });
                y.getInputElement().on('keyup', function (B) {
                    if (B.data.getKeystroke() == 13 && z) {
                        s.getButton('ok') && setTimeout(function () {
                            s.getButton('ok').click();
                        },
                        0);
                        z = false;
                    }
                },
                null, null, 1000);
            });
            var A = function () {
                var B = ['<div class="cke_dialog_ui_input_', t.type, '"'];
                if (t.width) B.push('style="width:' + t.width + '" ');
                B.push('><input ');
                for (var C in w) B.push(C + '="' + w[C] + '" ');
                B.push(' /></div>');
                return B.join('');
            };
            k.dialog.labeledElement.call(this, s, t, u, A);
        },
        textarea: function (s, t, u) {
            if (arguments.length < 3) return;
            l.call(this, t);
            var v = this,
                w = this._.inputId = e.getNextNumber() + '_textarea',
                x = {};
            if (t.validate) this.validate = t.validate;
            x.rows = t.rows || 5;
            x.cols = t.cols || 20;
            var y = function () {
                var z = ['<div class="cke_dialog_ui_input_textarea"><textarea class="cke_dialog_ui_input_textarea" id="', w, '" '];
                for (var A in x) z.push(A + '="' + e.htmlEncode(x[A]) + '" ');
                z.push('>', e.htmlEncode(v._['default']), '</textarea></div>');
                return z.join('');
            };
            k.dialog.labeledElement.call(this, s, t, u, y);
        },
        checkbox: function (s, t, u) {
            if (arguments.length < 3) return;
            var v = l.call(this, t, {
                'default': !!t['default']
            });
            if (t.validate) this.validate = t.validate;
            var w = function () {
                var x = e.extend({},
                t, {
                    id: t.id ? t.id + '_checkbox' : e.getNextNumber() + '_checkbox'
                },
                true),
                    y = [],
                    z = {
                    'class': 'cke_dialog_ui_checkbox_input',
                    type: 'checkbox'
                };
                r(x);
                if (t['default']) z.checked = 'checked';
                v.checkbox = new k.dialog.uiElement(s, x, y, 'input', null, z);
                y.push(' <label for="', z.id, '">', e.htmlEncode(t.label), '</label>');
                return y.join('');
            };
            k.dialog.uiElement.call(this, s, t, u, 'span', null, null, w);
        },
        radio: function (s, t, u) {
            if (arguments.length < 3) return;
            l.call(this, t);
            if (!this._['default']) this._['default'] = this._.initValue = t.items[0][1];
            if (t.validate) this.validate = t.valdiate;
            var v = [],
                w = this,
                x = function () {
                var y = [],
                    z = [],
                    A = {
                    'class': 'cke_dialog_ui_radio_item'
                },
                    B = t.id ? t.id + '_radio' : e.getNextNumber() + '_radio';
                for (var C = 0; C < t.items.length; C++) {
                    var D = t.items[C],
                        E = D[2] !== undefined ? D[2] : D[0],
                    F = D[1] !== undefined ? D[1] : D[0],
                    G = e.extend({},
                    t, {
                        id: e.getNextNumber() + '_radio_input',
                        title: null,
                        type: null
                    },
                    true),
                    H = e.extend({},
                    G, {
                        id: null,
                        title: E
                    },
                    true),
                    I = {
                        type: 'radio',
                        'class': 'cke_dialog_ui_radio_input',
                        name: B,
                        value: F
                    },
                    J = [];
                    if (w._['default'] == F) I.checked = 'checked';
                    r(G);
                    r(H);
                    v.push(new k.dialog.uiElement(s, G, J, 'input', null, I));
                    J.push(' ');
                    new k.dialog.uiElement(s, H, J, 'label', null, {
                        'for': I.id
                    },
                    D[0]);
                    y.push(J.join(''));
                }
                new k.dialog.hbox(s, [], y, z);
                return z.join('');
            };
            k.dialog.labeledElement.call(this, s, t, u, x);
            this._.children = v;
        },
        button: function (s, t, u) {
            if (!arguments.length) return;
            if (typeof t == 'function') t = t(s.getParentEditor());
            l.call(this, t, {
                disabled: t.disabled || false
            });
            a.event.implementOn(this);
            var v = this;
            s.on('load', function (x) {
                var y = this.getElement();
                (function () {
                    y.on('click', function (z) {
                        v.fire('click', {
                            dialog: v.getDialog()
                        });
                        z.data.preventDefault();
                    });
                })();
                y.unselectable();
            },
            this);
            var w = e.extend({},
            t);
            delete w.style;
            k.dialog.uiElement.call(this, s, w, u, 'a', null, {
                style: t.style,
                href: 'javascript:void(0)',
                title: t.label,
                hidefocus: 'true',
                'class': t['class']
            },
            '<span class="cke_dialog_ui_button">' + e.htmlEncode(t.label) + '</span>');
        },
        select: function (s, t, u) {
            if (arguments.length < 3) return;
            var v = l.call(this, t);
            if (t.validate) this.validate = t.validate;
            var w = function () {
                var x = e.extend({},
                t, {
                    id: t.id ? t.id + '_select' : e.getNextNumber() + '_select'
                },
                true),
                    y = [],
                    z = [],
                    A = {
                    'class': 'cke_dialog_ui_input_select'
                };
                if (t.size != undefined) A.size = t.size;
                if (t.multiple != undefined) A.multiple = t.multiple;
                r(x);
                for (var B = 0, C; B < t.items.length && (C = t.items[B]); B++) z.push('<option value="', e.htmlEncode(C[1] !== undefined ? C[1] : C[0]), '" /> ', e.htmlEncode(C[0]));
                v.select = new k.dialog.uiElement(s, x, y, 'select', null, A, z.join(''));
                return y.join('');
            };
            k.dialog.labeledElement.call(this, s, t, u, w);
        },
        file: function (s, t, u) {
            if (arguments.length < 3) return;
            if (t['default'] === undefined) t['default'] = '';
            var v = e.extend(l.call(this, t), {
                definition: t,
                buttons: []
            });
            if (t.validate) this.validate = t.validate;
            var w = function () {
                v.frameId = e.getNextNumber() + '_fileInput';
                var x = b.isCustomDomain(),
                    y = ['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" id="', v.frameId, '" title="', t.label, '" src="javascript:void('];
                y.push(x ? "(function(){document.open();document.domain='" + document.domain + "';" + 'document.close();' + '})()' : '0');
                y.push(')"></iframe>');
                return y.join('');
            };
            s.on('load', function () {
                var x = a.document.getById(v.frameId),
                    y = x.getParent();
                y.addClass('cke_dialog_ui_input_file');
            });
            k.dialog.labeledElement.call(this, s, t, u, w);
        },
        fileButton: function (s, t, u) {
            if (arguments.length < 3) return;
            var v = l.call(this, t),
                w = this;
            if (t.validate) this.validate = t.validate;
            var x = e.extend({},
            t),
                y = x.onClick;
            x.className = (x.className ? x.className + ' ' : '') + 'cke_dialog_ui_button';
            x.onClick = function (z) {
                var A = t['for'];
                if (!y || y.call(this, z) !== false) {
                    s.getContentElement(A[0], A[1]).submit();
                    this.disable();
                }
            };
            s.on('load', function () {
                s.getContentElement(t['for'][0], t['for'][1])._.buttons.push(w);
            });
            k.dialog.button.call(this, s, x, u);
        },
        html: (function () {
            var s = /^\s*<[\w:]+\s+([^>]*)?>/,
                t = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,
                u = /\/$/;
            return function (v, w, x) {
                if (arguments.length < 3) return;
                var y = [],
                    z, A = w.html,
                    B, C;
                if (A.charAt(0) != '<') A = '<span>' + A + '</span>';
                if (w.focus) {
                    var D = this.focus;
                    this.focus = function () {
                        D.call(this);
                        w.focus.call(this);
                        this.fire('focus');
                    };
                    if (w.isFocusable) {
                        var E = this.isFocusable;
                        this.isFocusable = E;
                    }
                    this.keyboardFocusable = true;
                }
                k.dialog.uiElement.call(this, v, w, y, 'span', null, null, '');
                z = y.join('');
                B = z.match(s);
                C = A.match(t) || ['', '', ''];
                if (u.test(C[1])) {
                    C[1] = C[1].slice(0, -1);
                    C[2] = '/' + C[2];
                }
                x.push([C[1], ' ', B[1] || '', C[2]].join(''));
            };
        })()
    },
    true);
    k.dialog.html.prototype = new k.dialog.uiElement();
    k.dialog.labeledElement.prototype = e.extend(new k.dialog.uiElement(), {
        setLabel: function (s) {
            var t = a.document.getById(this._.labelId);
            if (t.getChildCount() < 1) new d.text(s, a.document).appendTo(t);
            else t.getChild(0).$.nodeValue = s;
            return this;
        },
        getLabel: function () {
            var s = a.document.getById(this._.labelId);
            if (!s || s.getChildCount() < 1) return '';
            else return s.getChild(0).getText();
        },
        eventProcessors: p
    },
    true);
    k.dialog.button.prototype = e.extend(new k.dialog.uiElement(), {
        click: function () {
            var s = this;
            if (!s._.disabled) return s.fire('click', {
                dialog: s._.dialog
            });
            s.getElement().$.blur();
            return false;
        },
        enable: function () {
            this._.disabled = false;
            var s = this.getElement();
            s && s.removeClass('disabled');
        },
        disable: function () {
            this._.disabled = true;
            this.getElement().addClass('disabled');
        },
        isVisible: function () {
            return this.getElement().getFirst().isVisible();
        },
        isEnabled: function () {
            return !this._.disabled;
        },
        eventProcessors: e.extend({},
        k.dialog.uiElement.prototype.eventProcessors, {
            onClick: function (s, t) {
                this.on('click', t);
            }
        },
        true),
        accessKeyUp: function () {
            this.click();
        },
        accessKeyDown: function () {
            this.focus();
        },
        keyboardFocusable: true
    },
    true);
    k.dialog.textInput.prototype = e.extend(new k.dialog.labeledElement(), {
        getInputElement: function () {
            return a.document.getById(this._.inputId);
        },
        focus: function () {
            var s = this.selectParentTab();
            setTimeout(function () {
                var t = s.getInputElement();
                t && t.$.focus();
            },
            0);
        },
        select: function () {
            var s = this.selectParentTab();
            setTimeout(function () {
                var t = s.getInputElement();
                if (t) {
                    t.$.focus();
                    t.$.select();
                }
            },
            0);
        },
        accessKeyUp: function () {
            this.select();
        },
        setValue: function (s) {
            s = s || '';
            return k.dialog.uiElement.prototype.setValue.call(this, s);
        },
        keyboardFocusable: true
    },
    o, true);
    k.dialog.textarea.prototype = new k.dialog.textInput();
    k.dialog.select.prototype = e.extend(new k.dialog.labeledElement(), {
        getInputElement: function () {
            return this._.select.getElement();
        },
        add: function (s, t, u) {
            var v = new h('option', this.getDialog().getParentEditor().document),
                w = this.getInputElement().$;
            v.$.text = s;
            v.$.value = t === undefined || t === null ? s : t;
            if (u === undefined || u === null) {
                if (c) w.add(v.$);
                else w.add(v.$, null);
            } else w.add(v.$, u);
            return this;
        },
        remove: function (s) {
            var t = this.getInputElement().$;
            t.remove(s);
            return this;
        },
        clear: function () {
            var s = this.getInputElement().$;
            while (s.length > 0) s.remove(0);
            return this;
        },
        keyboardFocusable: true
    },
    o, true);
    k.dialog.checkbox.prototype = e.extend(new k.dialog.uiElement(), {
        getInputElement: function () {
            return this._.checkbox.getElement();
        },
        setValue: function (s) {
            this.getInputElement().$.checked = s;
            this.fire('change', {
                value: s
            });
        },
        getValue: function () {
            return this.getInputElement().$.checked;
        },
        accessKeyUp: function () {
            this.setValue(!this.getValue());
        },
        eventProcessors: {
            onChange: function (s, t) {
                if (!c) return p.onChange.apply(this, arguments);
                else {
                    s.on('load', function () {
                        var u = this._.checkbox.getElement();
                        u.on('propertychange', function (v) {
                            v = v.data.$;
                            if (v.propertyName == 'checked') this.fire('change', {
                                value: u.$.checked
                            });
                        },
                        this);
                    },
                    this);
                    this.on('change', t);
                }
                return null;
            }
        },
        keyboardFocusable: true
    },
    o, true);
    k.dialog.radio.prototype = e.extend(new k.dialog.uiElement(), {
        setValue: function (s) {
            var t = this._.children,
                u;
            for (var v = 0; v < t.length && (u = t[v]); v++) u.getElement().$.checked = u.getValue() == s;
            this.fire('change', {
                value: s
            });
        },
        getValue: function () {
            var s = this._.children;
            for (var t = 0; t < s.length; t++) {
                if (s[t].getElement().$.checked) return s[t].getValue();
            }
            return null;
        },
        accessKeyUp: function () {
            var s = this._.children,
                t;
            for (t = 0; t < s.length; t++) {
                if (s[t].getElement().$.checked) {
                    s[t].getElement().focus();
                    return;
                }
            }
            s[0].getElement().focus();
        },
        eventProcessors: {
            onChange: function (s, t) {
                if (!c) return p.onChange.apply(this, arguments);
                else {
                    s.on('load', function () {
                        var u = this._.children,
                            v = this;
                        for (var w = 0; w < u.length; w++) {
                            var x = u[w].getElement();
                            x.on('propertychange', function (y) {
                                y = y.data.$;
                                if (y.propertyName == 'checked' && this.$.checked) v.fire('change', {
                                    value: this.getAttribute('value')
                                });
                            });
                        }
                    },
                    this);
                    this.on('change', t);
                }
                return null;
            }
        },
        keyboardFocusable: true
    },
    o, true);
    k.dialog.file.prototype = e.extend(new k.dialog.labeledElement(), o, {
        getInputElement: function () {
            var s = a.document.getById(this._.frameId).getFrameDocument();
            return s.$.forms.length > 0 ? new h(s.$.forms[0].elements[0]) : this.getElement();
        },
        submit: function () {
            this.getInputElement().getParent().$.submit();
            return this;
        },
        getAction: function (s) {
            return this.getInputElement().getParent().$.action;
        },
        reset: function () {
            var s = a.document.getById(this._.frameId),
                t = s.getFrameDocument(),
                u = this._.definition,
                v = this._.buttons;

            function w() {
                t.$.open();
                if (b.isCustomDomain()) t.$.domain = document.domain;
                var x = '';
                if (u.size) x = u.size - (c ? 7 : 0);
                t.$.write(['<html><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">', '<form enctype="multipart/form-data" method="POST" action="', e.htmlEncode(u.action), '">', '<input type="file" name="', e.htmlEncode(u.id || 'cke_upload'), '" size="', e.htmlEncode(x > 0 ? x : ''), '" />', '</form>', '</body></html>'].join(''));
                t.$.close();
                for (var y = 0; y < v.length; y++) v[y].enable();
            };
            if (b.gecko) setTimeout(w, 500);
            else w();
        },
        getValue: function () {
            return '';
        },
        eventProcessors: p,
        keyboardFocusable: true
    },
    true);
    k.dialog.fileButton.prototype = new k.dialog.button();
    a.dialog.addUIElement('text', m);
    a.dialog.addUIElement('password', m);
    a.dialog.addUIElement('textarea', n);
    a.dialog.addUIElement('checkbox', n);
    a.dialog.addUIElement('radio', n);
    a.dialog.addUIElement('button', n);
    a.dialog.addUIElement('select', n);
    a.dialog.addUIElement('file', n);
    a.dialog.addUIElement('fileButton', n);
    a.dialog.addUIElement('html', n);
})();
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_' + 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);
        }
    };
})());
if (a.dialog) a.dialog.on('resize', function (l) {
    var m = l.data,
        n = m.width,
        o = m.height,
        p = m.dialog,
        q = p.parts.contents;
    if (m.skin != 'kama') return;
    q.setStyles({
        width: n + 'px',
        height: o + 'px'
    });
    setTimeout(function () {
        var r = p.parts.dialog.getChild([0, 0, 0]),
            s = r.getChild(0),
            t = r.getChild(2);
        t.setStyle('width', s.$.offsetWidth + 'px');
        t = r.getChild(7);
        t.setStyle('width', s.$.offsetWidth - 28 + 'px');
        t = r.getChild(4);
        t.setStyle('height', s.$.offsetHeight - 31 - 14 + 'px');
        t = r.getChild(5);
        t.setStyle('height', s.$.offsetHeight - 31 - 14 + 'px');
    },
    100);
});
a.themes.add('default', (function () {
    return {
        build: function (l, m) {
            var n = l.name,
                o = l.element,
                p = l.elementMode;
            if (!o || p == 0) return;
            if (p == 1) o.hide();
            var q = l.fire('themeSpace', {
                space: 'top',
                html: ''
            }).html,
                r = l.fire('themeSpace', {
                space: 'contents',
                html: ''
            }).html,
                s = l.fireOnce('themeSpace', {
                space: 'bottom',
                html: ''
            }).html,
                t = r && l.config.height,
                u = l.config.tabIndex || l.element.getAttribute('tabindex') || 0;
            if (!r) t = 'auto';
            else if (!isNaN(t)) t += 'px';
            var v = '',
                w = l.config.width;
            if (w) {
                if (!isNaN(w)) w += 'px';
                v += 'width: ' + w + ';';
            }
            var x = h.createFromHtml(['<span id="cke_', n, '" onmousedown="return false;" class="', l.skinClass, '" dir="', l.lang.dir, '" title="', b.gecko ? ' ' : '', '" lang="', l.langCode, '" tabindex="' + u + '"' + (v ? ' style="' + v + '"' : '') + '>' + '<span class="', b.cssClass, '"><span class="cke_wrapper cke_', l.lang.dir, '"><table class="cke_editor" border="0" cellspacing="0" cellpadding="0"><tbody><tr', q ? '' : ' style="display:none"', '><td id="cke_top_', n, '" class="cke_top">', q, '</td></tr><tr', r ? '' : ' style="display:none"', '><td id="cke_contents_', n, '" class="cke_contents" style="height:', t, '">', r, '</td></tr><tr', s ? '' : ' style="display:none"', '><td id="cke_bottom_', n, '" class="cke_bottom">', s, '</td></tr></tbody></table><style>.', l.skinClass, '{visibility:hidden;}</style></span></span></span>'].join(''));
            x.getChild([0, 0, 0, 0, 0]).unselectable();
            x.getChild([0, 0, 0, 0, 2]).unselectable();
            if (p == 1) x.insertAfter(o);
            else o.append(x);
            l.container = x;
            x.disableContextMenu();
            l.fireOnce('themeLoaded');
            l.fireOnce('uiReady');
        },
        buildDialog: function (l) {
            var m = e.getNextNumber(),
                n = h.createFromHtml(['<div id="cke_' + l.name.replace('.', '\\.') + '_dialog" class="cke_skin_', l.skinName, '" dir="', l.lang.dir, '" lang="', l.langCode, '"><table class="cke_dialog', ' ' + b.cssClass, ' cke_', l.lang.dir, '" style="position:absolute"><tr><td><div class="%body"><div id="%title#" class="%title"></div><div id="%close_button#" class="%close_button"><span>X</span></div><div id="%tabs#" class="%tabs"></div><table class="%contents"><tr><td id="%contents#" class="%contents"></td></tr></table><div id="%footer#" class="%footer"></div></div><div id="%tl#" class="%tl"></div><div id="%tc#" class="%tc"></div><div id="%tr#" class="%tr"></div><div id="%ml#" class="%ml"></div><div id="%mr#" class="%mr"></div><div id="%bl#" class="%bl"></div><div id="%bc#" class="%bc"></div><div id="%br#" class="%br"></div></td></tr></table>', c ? '' : '<style>.cke_dialog{visibility:hidden;}</style>', '</div>'].join('').replace(/#/g, '_' + m).replace(/%/g, 'cke_dialog_')),
                o = n.getChild([0, 0, 0, 0, 0]),
                p = o.getChild(0),
                q = o.getChild(1);
            p.unselectable();
            q.unselectable();
            return {
                element: n,
                parts: {
                    dialog: n.getChild(0),
                    title: p,
                    close: q,
                    tabs: o.getChild(2),
                    contents: o.getChild([3, 0, 0, 0]),
                    footer: o.getChild(4)
                }
            };
        },
        destroy: function (l) {
            var m = l.container;
            if (c) {
                m.setStyle('display', 'none');
                var n = document.body.createTextRange();
                n.moveToElementText(m.$);
                try {
                    n.select();
                } catch(o) {}
            }
            if (m) m.remove();
            if (l.elementMode == 1) {
                l.element.show();
                delete l.element;
            }
        }
    };
})());
a.editor.prototype.getThemeSpace = function (l) {
    var m = 'cke_' + l,
        n = this._[m] || (this._[m] = a.document.getById(m + '_' + this.name));
    return n;
};
a.editor.prototype.resize = function (l, m, n, o) {
    var p = /^\d+$/;
    if (p.test(l)) l += 'px';
    var q = a.document.getById('cke_contents_' + this.name),
        r = o ? q.getAscendant('table').getParent() : q.getAscendant('table').getParent().getParent().getParent();
    b.webkit && r.setStyle('display', 'none');
    r.setStyle('width', l);
    if (b.webkit) {
        r.$.offsetWidth;
        r.setStyle('display', '');
    }
    var s = n ? 0 : (r.$.offsetHeight || 0) - (q.$.clientHeight || 0);
    q.setStyle('height', Math.max(m - s, 0) + 'px');
    this.fire('resize');
};
a.editor.prototype.getResizable = function () {
    return this.container.getChild([0, 0]);
};
})();
