﻿/*
 Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or http://ckeditor.com/license
 */
(function () {
    function y(a) {
        for (var a = a.toUpperCase(), c = z.length, b = 0, f = 0; f < c; ++f)for (var d = z[f], e = d[1].length; a.substr(0, e) == d[1]; a = a.substr(e))b += d[0];
        return b
    }

    function A(a) {
        for (var a = a.toUpperCase(), c = B.length, b = 1, f = 1; 0 < a.length; f *= c)b += B.indexOf(a.charAt(a.length - 1)) * f, a = a.substr(0, a.length - 1);
        return b
    }

    var C = CKEDITOR.htmlParser.fragment.prototype, o = CKEDITOR.htmlParser.element.prototype;
    C.onlyChild = o.onlyChild = function () {
        var a = this.children;
        return 1 == a.length && a[0] || null
    };
    o.removeAnyChildWithName =
        function (a) {
            for (var c = this.children, b = [], f, d = 0; d < c.length; d++)f = c[d], f.name && (f.name == a && (b.push(f), c.splice(d--, 1)), b = b.concat(f.removeAnyChildWithName(a)));
            return b
        };
    o.getAncestor = function (a) {
        for (var c = this.parent; c && (!c.name || !c.name.match(a));)c = c.parent;
        return c
    };
    C.firstChild = o.firstChild = function (a) {
        for (var c, b = 0; b < this.children.length; b++)if (c = this.children[b], a(c) || c.name && (c = c.firstChild(a)))return c;
        return null
    };
    o.addStyle = function (a, c, b) {
        var f = "";
        if ("string" == typeof c)f += a + ":" + c + ";"; else {
            if ("object" == typeof a)for (var d in a)a.hasOwnProperty(d) && (f += d + ":" + a[d] + ";"); else f += a;
            b = c
        }
        this.attributes || (this.attributes = {});
        a = this.attributes.style || "";
        a = (b ? [f, a] : [a, f]).join(";");
        this.attributes.style = a.replace(/^;|;(?=;)/, "")
    };
    o.getStyle = function (a) {
        var c = this.attributes.style;
        if (c)return c = CKEDITOR.tools.parseCssText(c, 1), c[a]
    };
    CKEDITOR.dtd.parentOf = function (a) {
        var c = {}, b;
        for (b in this)-1 == b.indexOf("$") && this[b][a] && (c[b] = 1);
        return c
    };
    var H = /^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,
        D = /^(?:\b0[^\s]*\s*){1,4}$/, x = {ol: {decimal: /\d+/, "lower-roman": /^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/, "upper-roman": /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/, "lower-alpha": /^[a-z]+$/, "upper-alpha": /^[A-Z]+$/}, ul: {disc: /[l\u00B7\u2002]/, circle: /[\u006F\u00D8]/, square: /[\u006E\u25C6]/}}, z = [
            [1E3, "M"],
            [900, "CM"],
            [500, "D"],
            [400, "CD"],
            [100, "C"],
            [90, "XC"],
            [50, "L"],
            [40, "XL"],
            [10, "X"],
            [9, "IX"],
            [5, "V"],
            [4, "IV"],
            [1, "I"]
        ], B = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", s = 0, t = null, w, E = CKEDITOR.plugins.pastefromword =
        {utils: {createListBulletMarker: function (a, c) {
            var b = new CKEDITOR.htmlParser.element("cke:listbullet");
            b.attributes = {"cke:listsymbol": a[0]};
            b.add(new CKEDITOR.htmlParser.text(c));
            return b
        }, isListBulletIndicator: function (a) {
            if (/mso-list\s*:\s*Ignore/i.test(a.attributes && a.attributes.style))return!0
        }, isContainingOnlySpaces: function (a) {
            var c;
            return(c = a.onlyChild()) && /^(:?\s|&nbsp;)+$/.test(c.value)
        }, resolveList: function (a) {
            var c = a.attributes, b;
            if ((b = a.removeAnyChildWithName("cke:listbullet")) && b.length &&
                (b = b[0]))return a.name = "cke:li", c.style && (c.style = E.filters.stylesFilter([
                ["text-indent"],
                ["line-height"],
                [/^margin(:?-left)?$/, null, function (a) {
                    a = a.split(" ");
                    a = CKEDITOR.tools.convertToPx(a[3] || a[1] || a[0]);
                    !s && (null !== t && a > t) && (s = a - t);
                    t = a;
                    c["cke:indent"] = s && Math.ceil(a / s) + 1 || 1
                }],
                [/^mso-list$/, null, function (a) {
                    var a = a.split(" "), b = Number(a[0].match(/\d+/)), a = Number(a[1].match(/\d+/));
                    1 == a && (b !== w && (c["cke:reset"] = 1), w = b);
                    c["cke:indent"] = a
                }]
            ])(c.style, a) || ""), c["cke:indent"] || (t = 0, c["cke:indent"] =
                1), CKEDITOR.tools.extend(c, b.attributes), !0;
            w = t = s = null;
            return!1
        }, getStyleComponents: function () {
            var a = CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>', CKEDITOR.document);
            CKEDITOR.document.getBody().append(a);
            return function (c, b, f) {
                a.setStyle(c, b);
                for (var c = {}, b = f.length, d = 0; d < b; d++)c[f[d]] = a.getStyle(f[d]);
                return c
            }
        }(), listDtdParents: CKEDITOR.dtd.parentOf("ol")}, filters: {flattenList: function (a, c) {
            var c = "number" == typeof c ? c : 1, b = a.attributes, f;
            switch (b.type) {
                case "a":
                    f =
                        "lower-alpha";
                    break;
                case "1":
                    f = "decimal"
            }
            for (var d = a.children, e, h = 0; h < d.length; h++)if (e = d[h], e.name in CKEDITOR.dtd.$listItem) {
                var j = e.attributes, g = e.children, m = g[g.length - 1];
                m.name in CKEDITOR.dtd.$list && (a.add(m, h + 1), --g.length || d.splice(h--, 1));
                e.name = "cke:li";
                b.start && !h && (j.value = b.start);
                E.filters.stylesFilter([
                    ["tab-stops", null, function (a) {
                        (a = a.split(" ")[1].match(H)) && (t = CKEDITOR.tools.convertToPx(a[0]))
                    }],
                    1 == c ? ["mso-list", null, function (a) {
                        a = a.split(" ");
                        a = Number(a[0].match(/\d+/));
                        a !== w &&
                        (j["cke:reset"] = 1);
                        w = a
                    }] : null
                ])(j.style);
                j["cke:indent"] = c;
                j["cke:listtype"] = a.name;
                j["cke:list-style-type"] = f
            } else if (e.name in CKEDITOR.dtd.$list) {
                arguments.callee.apply(this, [e, c + 1]);
                d = d.slice(0, h).concat(e.children).concat(d.slice(h + 1));
                a.children = [];
                e = 0;
                for (g = d.length; e < g; e++)a.add(d[e]);
                d = a.children
            }
            delete a.name;
            b["cke:list"] = 1
        }, assembleList: function (a) {
            for (var c = a.children, b, f, d, e, h, j, a = [], g, m, i, l, k, p, n = 0; n < c.length; n++)if (b = c[n], "cke:li" == b.name)if (b.name = "li", f = b.attributes, i = (i = f["cke:listsymbol"]) &&
                i.match(/^(?:[(]?)([^\s]+?)([.)]?)$/), l = k = p = null, f["cke:ignored"])c.splice(n--, 1); else {
                f["cke:reset"] && (j = e = h = null);
                d = Number(f["cke:indent"]);
                d != e && (m = g = null);
                if (i) {
                    if (m && x[m][g].test(i[1]))l = m, k = g; else for (var q in x)for (var u in x[q])if (x[q][u].test(i[1]))if ("ol" == q && /alpha|roman/.test(u)) {
                        if (g = /roman/.test(u) ? y(i[1]) : A(i[1]), !p || g < p)p = g, l = q, k = u
                    } else {
                        l = q;
                        k = u;
                        break
                    }
                    !l && (l = i[2] ? "ol" : "ul")
                } else l = f["cke:listtype"] || "ol", k = f["cke:list-style-type"];
                m = l;
                g = k || ("ol" == l ? "decimal" : "disc");
                k && k != ("ol" == l ?
                    "decimal" : "disc") && b.addStyle("list-style-type", k);
                if ("ol" == l && i) {
                    switch (k) {
                        case "decimal":
                            p = Number(i[1]);
                            break;
                        case "lower-roman":
                        case "upper-roman":
                            p = y(i[1]);
                            break;
                        case "lower-alpha":
                        case "upper-alpha":
                            p = A(i[1])
                    }
                    b.attributes.value = p
                }
                if (j) {
                    if (d > e)a.push(j = new CKEDITOR.htmlParser.element(l)), j.add(b), h.add(j); else {
                        if (d < e) {
                            e -= d;
                            for (var r; e-- && (r = j.parent);)j = r.parent
                        }
                        j.add(b)
                    }
                    c.splice(n--, 1)
                } else a.push(j = new CKEDITOR.htmlParser.element(l)), j.add(b), c[n] = j;
                h = b;
                e = d
            } else j && (j = e = h = null);
            for (n = 0; n < a.length; n++)if (j =
                a[n], q = j.children, g = g = void 0, u = j.children.length, r = g = void 0, c = /list-style-type:(.*?)(?:;|$)/, e = CKEDITOR.plugins.pastefromword.filters.stylesFilter, g = j.attributes, !c.exec(g.style)) {
                for (h = 0; h < u; h++)if (g = q[h], g.attributes.value && Number(g.attributes.value) == h + 1 && delete g.attributes.value, g = c.exec(g.attributes.style))if (g[1] == r || !r)r = g[1]; else {
                    r = null;
                    break
                }
                if (r) {
                    for (h = 0; h < u; h++)g = q[h].attributes, g.style && (g.style = e([
                        ["list-style-type"]
                    ])(g.style) || "");
                    j.addStyle("list-style-type", r)
                }
            }
            w = t = s = null
        }, falsyFilter: function () {
            return!1
        },
            stylesFilter: function (a, c) {
                return function (b, f) {
                    var d = [];
                    (b || "").replace(/&quot;/g, '"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function (b, e, g) {
                        e = e.toLowerCase();
                        "font-family" == e && (g = g.replace(/["']/g, ""));
                        for (var m, i, l, k = 0; k < a.length; k++)if (a[k] && (b = a[k][0], m = a[k][1], i = a[k][2], l = a[k][3], e.match(b) && (!m || g.match(m)))) {
                            e = l || e;
                            c && (i = i || g);
                            "function" == typeof i && (i = i(g, f, e));
                            i && i.push && (e = i[0], i = i[1]);
                            "string" == typeof i && d.push([e, i]);
                            return
                        }
                        !c && d.push([e, g])
                    });
                    for (var e = 0; e < d.length; e++)d[e] =
                        d[e].join(":");
                    return d.length ? d.join(";") + ";" : !1
                }
            }, elementMigrateFilter: function (a, c) {
                return a ? function (b) {
                    var f = c ? (new CKEDITOR.style(a, c))._.definition : a;
                    b.name = f.element;
                    CKEDITOR.tools.extend(b.attributes, CKEDITOR.tools.clone(f.attributes));
                    b.addStyle(CKEDITOR.style.getStyleText(f))
                } : function () {
                }
            }, styleMigrateFilter: function (a, c) {
                var b = this.elementMigrateFilter;
                return a ? function (f, d) {
                    var e = new CKEDITOR.htmlParser.element(null), h = {};
                    h[c] = f;
                    b(a, h)(e);
                    e.children = d.children;
                    d.children = [e];
                    e.filter =
                        function () {
                        };
                    e.parent = d
                } : function () {
                }
            }, bogusAttrFilter: function (a, c) {
                if (-1 == c.name.indexOf("cke:"))return!1
            }, applyStyleFilter: null}, getRules: function (a, c) {
            var b = CKEDITOR.dtd, f = CKEDITOR.tools.extend({}, b.$block, b.$listItem, b.$tableContent), d = a.config, e = this.filters, h = e.falsyFilter, j = e.stylesFilter, g = e.elementMigrateFilter, m = CKEDITOR.tools.bind(this.filters.styleMigrateFilter, this.filters), i = this.utils.createListBulletMarker, l = e.flattenList, k = e.assembleList, p = this.utils.isListBulletIndicator, n = this.utils.isContainingOnlySpaces,
                q = this.utils.resolveList, u = function (a) {
                    a = CKEDITOR.tools.convertToPx(a);
                    return isNaN(a) ? a : a + "px"
                }, r = this.utils.getStyleComponents, t = this.utils.listDtdParents, o = !1 !== d.pasteFromWordRemoveFontStyles, s = !1 !== d.pasteFromWordRemoveStyles;
            return{elementNames: [
                [/meta|link|script/, ""]
            ], root: function (a) {
                a.filterChildren(c);
                k(a)
            }, elements: {"^": function (a) {
                var c;
                CKEDITOR.env.gecko && (c = e.applyStyleFilter) && c(a)
            }, $: function (a) {
                var v = a.name || "", e = a.attributes;
                v in f && e.style && (e.style = j([
                    [/^(:?width|height)$/, null,
                        u]
                ])(e.style) || "");
                if (v.match(/h\d/)) {
                    a.filterChildren(c);
                    if (q(a))return;
                    g(d["format_" + v])(a)
                } else if (v in b.$inline)a.filterChildren(c), n(a) && delete a.name; else if (-1 != v.indexOf(":") && -1 == v.indexOf("cke")) {
                    a.filterChildren(c);
                    if ("v:imagedata" == v) {
                        if (v = a.attributes["o:href"])a.attributes.src = v;
                        a.name = "img";
                        return
                    }
                    delete a.name
                }
                v in t && (a.filterChildren(c), k(a))
            }, style: function (a) {
                if (CKEDITOR.env.gecko) {
                    var a = (a = a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/)) && a[1], c = {};
                    a &&
                    (a.replace(/[\n\r]/g, "").replace(/(.+?)\{(.+?)\}/g, function (a, b, F) {
                        for (var b = b.split(","), a = b.length, d = 0; d < a; d++)CKEDITOR.tools.trim(b[d]).replace(/^(\w+)(\.[\w-]+)?$/g, function (a, b, d) {
                            b = b || "*";
                            d = d.substring(1, d.length);
                            d.match(/MsoNormal/) || (c[b] || (c[b] = {}), d ? c[b][d] = F : c[b] = F)
                        })
                    }), e.applyStyleFilter = function (a) {
                        var b = c["*"] ? "*" : a.name, d = a.attributes && a.attributes["class"];
                        b in c && (b = c[b], "object" == typeof b && (b = b[d]), b && a.addStyle(b, !0))
                    })
                }
                return!1
            }, p: function (a) {
                if (/MsoListParagraph/i.exec(a.attributes["class"]) ||
                    a.getStyle("mso-list")) {
                    var b = a.firstChild(function (a) {
                        return a.type == CKEDITOR.NODE_TEXT && !n(a.parent)
                    });
                    (b = b && b.parent) && b.addStyle("mso-list", "Ignore")
                }
                a.filterChildren(c);
                q(a) || (d.enterMode == CKEDITOR.ENTER_BR ? (delete a.name, a.add(new CKEDITOR.htmlParser.element("br"))) : g(d["format_" + (d.enterMode == CKEDITOR.ENTER_P ? "p" : "div")])(a))
            }, div: function (a) {
                var c = a.onlyChild();
                if (c && "table" == c.name) {
                    var b = a.attributes;
                    c.attributes = CKEDITOR.tools.extend(c.attributes, b);
                    b.style && c.addStyle(b.style);
                    c = new CKEDITOR.htmlParser.element("div");
                    c.addStyle("clear", "both");
                    a.add(c);
                    delete a.name
                }
            }, td: function (a) {
                a.getAncestor("thead") && (a.name = "th")
            }, ol: l, ul: l, dl: l, font: function (a) {
                if (p(a.parent))delete a.name; else {
                    a.filterChildren(c);
                    var b = a.attributes, d = b.style, e = a.parent;
                    "font" == e.name ? (CKEDITOR.tools.extend(e.attributes, a.attributes), d && e.addStyle(d), delete a.name) : (d = d || "", b.color && ("#000000" != b.color && (d += "color:" + b.color + ";"), delete b.color), b.face && (d += "font-family:" + b.face + ";", delete b.face), b.size && (d += "font-size:" + (3 < b.size ? "large" :
                        3 > b.size ? "small" : "medium") + ";", delete b.size), a.name = "span", a.addStyle(d))
                }
            }, span: function (a) {
                if (p(a.parent))return!1;
                a.filterChildren(c);
                if (n(a))return delete a.name, null;
                if (p(a)) {
                    var b = a.firstChild(function (a) {
                        return a.value || "img" == a.name
                    }), e = (b = b && (b.value || "l.")) && b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);
                    if (e)return b = i(e, b), (a = a.getAncestor("span")) && / mso-hide:\s*all|display:\s*none /.test(a.attributes.style) && (b.attributes["cke:ignored"] = 1), b
                }
                if (e = (b = a.attributes) && b.style)b.style = j([
                    ["line-height"],
                    [/^font-family$/, null, !o ? m(d.font_style, "family") : null],
                    [/^font-size$/, null, !o ? m(d.fontSize_style, "size") : null],
                    [/^color$/, null, !o ? m(d.colorButton_foreStyle, "color") : null],
                    [/^background-color$/, null, !o ? m(d.colorButton_backStyle, "color") : null]
                ])(e, a) || "";
                b.style || delete b.style;
                CKEDITOR.tools.isEmpty(b) && delete a.name;
                return null
            }, b: g(d.coreStyles_bold), i: g(d.coreStyles_italic), u: g(d.coreStyles_underline), s: g(d.coreStyles_strike), sup: g(d.coreStyles_superscript), sub: g(d.coreStyles_subscript), a: function (a) {
                a =
                    a.attributes;
                a.href && a.href.match(/^file:\/\/\/[\S]+#/i) && (a.href = a.href.replace(/^file:\/\/\/[^#]+/i, ""))
            }, "cke:listbullet": function (a) {
                a.getAncestor(/h\d/) && !d.pasteFromWordNumberedHeadingToList && delete a.name
            }}, attributeNames: [
                [/^onmouse(:?out|over)/, ""],
                [/^onload$/, ""],
                [/(?:v|o):\w+/, ""],
                [/^lang/, ""]
            ], attributes: {style: j(s ? [
                [/^list-style-type$/, null],
                [/^margin$|^margin-(?!bottom|top)/, null, function (a, b, c) {
                    if (b.name in{p: 1, div: 1}) {
                        b = "ltr" == d.contentsLangDirection ? "margin-left" : "margin-right";
                        if ("margin" ==
                            c)a = r(c, a, [b])[b]; else if (c != b)return null;
                        if (a && !D.test(a))return[b, a]
                    }
                    return null
                }],
                [/^clear$/],
                [/^border.*|margin.*|vertical-align|float$/, null, function (a, b) {
                    if ("img" == b.name)return a
                }],
                [/^width|height$/, null, function (a, b) {
                    if (b.name in{table: 1, td: 1, th: 1, img: 1})return a
                }]
            ] : [
                [/^mso-/],
                [/-color$/, null, function (a) {
                    if ("transparent" == a)return!1;
                    if (CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g, "transparent")
                }],
                [/^margin$/, D],
                ["text-indent", "0cm"],
                ["page-break-before"],
                ["tab-stops"],
                ["display",
                    "none"],
                o ? [/font-?/] : null
            ], s), width: function (a, c) {
                if (c.name in b.$tableContent)return!1
            }, border: function (a, c) {
                if (c.name in b.$tableContent)return!1
            }, "class": h, bgcolor: h, valign: s ? h : function (a, b) {
                b.addStyle("vertical-align", a);
                return!1
            }}, comment: !CKEDITOR.env.ie ? function (a, b) {
                var c = a.match(/<img.*?>/), d = a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);
                return d ? (d = (c = d[1] || c && "l.") && c.match(/>(?:[(]?)([^\s]+?)([.)]?)</), i(d, c)) : CKEDITOR.env.gecko && c ? (c = CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0],
                    (d = (d = (d = b.previous) && d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/)) && d[1]) && (c.attributes.src = d), c) : !1
            } : h}
        }}, G = function () {
            this.dataFilter = new CKEDITOR.htmlParser.filter
        };
    G.prototype = {toHtml: function (a) {
        var a = CKEDITOR.htmlParser.fragment.fromHtml(a), c = new CKEDITOR.htmlParser.basicWriter;
        a.writeHtml(c, this.dataFilter);
        return c.getHtml(!0)
    }};
    CKEDITOR.cleanWord = function (a, c) {
        CKEDITOR.env.gecko && (a = a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi, "$1$2$3"));
        CKEDITOR.env.webkit &&
        (a = a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi, "$1<span>$2</span>$3"));
        var b = new G, f = b.dataFilter;
        f.addRules(CKEDITOR.plugins.pastefromword.getRules(c, f));
        c.fire("beforeCleanWord", {filter: f});
        try {
            a = b.toHtml(a)
        } catch (d) {
            alert(c.lang.pastefromword.error)
        }
        a = a.replace(/cke:.*?".*?"/g, "");
        a = a.replace(/style=""/g, "");
        return a = a.replace(/<span>/g, "")
    }
})();