/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */

(function () {
    var a = {ol:1, ul:1}, b = /^[\n\r\t ]*$/;
    CKEDITOR.plugins.list = {listToArray:function (i, j, k, l, m) {
        if (!a[i.getName()])return[];
        if (!l)l = 0;
        if (!k)k = [];
        for (var n = 0, o = i.getChildCount(); n < o; n++) {
            var p = i.getChild(n);
            if (p.$.nodeName.toLowerCase() != 'li')continue;
            var q = {parent:i, indent:l, contents:[]};
            if (!m) {
                q.grandparent = i.getParent();
                if (q.grandparent && q.grandparent.$.nodeName.toLowerCase() == 'li')q.grandparent = q.grandparent.getParent();
            } else q.grandparent = m;
            if (j)CKEDITOR.dom.element.setMarker(j, p, 'listarray_index', k.length);
            k.push(q);
            for (var r = 0, s = p.getChildCount(); r < s; r++) {
                var t = p.getChild(r);
                if (t.type == CKEDITOR.NODE_ELEMENT && a[t.getName()])CKEDITOR.plugins.list.listToArray(t, j, k, l + 1, q.grandparent); else q.contents.push(t);
            }
        }
        return k;
    }, arrayToList:function (i, j, k, l) {
        if (!k)k = 0;
        if (!i || i.length < k + 1)return null;
        var m = i[k].parent.getDocument(), n = new CKEDITOR.dom.documentFragment(m), o = null, p = k, q = Math.max(i[k].indent, 0), r = null, s = l == CKEDITOR.ENTER_P ? 'p' : 'div';
        for (; ;) {
            var t = i[p];
            if (t.indent == q) {
                if (!o || i[p].parent.getName() != o.getName()) {
                    o = i[p].parent.clone(false, true);
                    n.append(o);
                }
                r = o.append(m.createElement('li'));
                for (var u = 0; u < t.contents.length; u++)r.append(t.contents[u].clone(true, true));
                p++;
            } else if (t.indent == Math.max(q, 0) + 1) {
                var v = CKEDITOR.plugins.list.arrayToList(i, null, p, l);
                r.append(v.listNode);
                p = v.nextIndex;
            } else if (t.indent == -1 && !k && t.grandparent) {
                r;
                if (a[t.grandparent.getName()])r = m.createElement('li'); else if (l != CKEDITOR.ENTER_BR && t.grandparent.getName() != 'td')r = m.createElement(s); else r = new CKEDITOR.dom.documentFragment(m);
                for (u = 0; u < t.contents.length; u++)r.append(t.contents[u].clone(true, true));
                if (r.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT && p != i.length - 1) {
                    if (r.getLast() && r.getLast().type == CKEDITOR.NODE_ELEMENT && r.getLast().getAttribute('type') == '_moz')r.getLast().remove();
                    r.appendBogus();
                }
                if (r.type == CKEDITOR.NODE_ELEMENT && r.getName() == s && r.$.firstChild) {
                    r.trim();
                    var w = r.getFirst();
                    if (w.type == CKEDITOR.NODE_ELEMENT && w.isBlockBoundary()) {
                        var x = new CKEDITOR.dom.documentFragment(m);
                        r.moveChildren(x);
                        r = x;
                    }
                }
                var y = r.$.nodeName.toLowerCase();
                if (!CKEDITOR.env.ie && (y == 'div' || y == 'p'))r.appendBogus();
                n.append(r);
                o = null;
                p++;
            } else return null;
            if (i.length <= p || Math.max(i[p].indent, 0) < q)break;
        }
        if (j) {
            var z = n.getFirst();
            while (z) {
                if (z.type == CKEDITOR.NODE_ELEMENT)CKEDITOR.dom.element.clearMarkers(j, z);
                z = z.getNextSourceNode();
            }
        }
        return{listNode:n, nextIndex:p};
    }};
    function c(i, j) {
        i.getCommand(this.name).setState(j);
    }

    ;
    function d(i) {
        var j = i.data.path, k = j.blockLimit, l = j.elements, m;
        for (var n = 0; n < l.length && (m = l[n]) && (!m.equals(k));
             n++)if (a[l[n].getName()])return c.call(this, i.editor, this.type == l[n].getName() ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF);
        return c.call(this, i.editor, CKEDITOR.TRISTATE_OFF);
    }

    ;
    function e(i, j, k, l) {
        var m = CKEDITOR.plugins.list.listToArray(j.root, k), n = [];
        for (var o = 0; o < j.contents.length; o++) {
            var p = j.contents[o];
            p = p.getAscendant('li', true);
            if (!p || p.getCustomData('list_item_processed'))continue;
            n.push(p);
            CKEDITOR.dom.element.setMarker(k, p, 'list_item_processed', true);
        }
        var q = j.root.getDocument().createElement(this.type);
        for (o = 0; o < n.length; o++) {
            var r = n[o].getCustomData('listarray_index');
            m[r].parent = q;
        }
        var s = CKEDITOR.plugins.list.arrayToList(m, k, null, i.config.enterMode), t, u = s.listNode.getChildCount();
        for (o = 0; o < u && (t = s.listNode.getChild(o)); o++)if (t.getName() == this.type)l.push(t);
        s.listNode.replace(j.root);
    }

    ;
    function f(i, j, k) {
        var l = j.contents, m = j.root.getDocument(), n = [];
        if (l.length == 1 && l[0].equals(j.root)) {
            var o = m.createElement('div');
            l[0].moveChildren && l[0].moveChildren(o);
            l[0].append(o);
            l[0] = o;
        }
        var p = j.contents[0].getParent();
        for (var q = 0; q < l.length; q++)p = p.getCommonAncestor(l[q].getParent());
        for (q = 0; q < l.length; q++) {
            var r = l[q], s;
            while (s = r.getParent()) {
                if (s.equals(p)) {
                    n.push(r);
                    break;
                }
                r = s;
            }
        }
        if (n.length < 1)return;
        var t = n[n.length - 1].getNext(), u = m.createElement(this.type);
        k.push(u);
        while (n.length) {
            var v = n.shift(), w = m.createElement('li');
            v.moveChildren(w);
            v.remove();
            w.appendTo(u);
            if (!CKEDITOR.env.ie)w.appendBogus();
        }
        if (t)u.insertBefore(t); else u.appendTo(p);
    }

    ;
    function g(i, j, k) {
        var l = CKEDITOR.plugins.list.listToArray(j.root, k), m = [];
        for (var n = 0; n < j.contents.length; n++) {
            var o = j.contents[n];
            o = o.getAscendant('li', true);
            if (!o || o.getCustomData('list_item_processed'))continue;
            m.push(o);
            CKEDITOR.dom.element.setMarker(k, o, 'list_item_processed', true);
        }
        var p = null;
        for (n = 0; n < m.length; n++) {
            var q = m[n].getCustomData('listarray_index');
            l[q].indent = -1;
            p = q;
        }
        for (n = p + 1; n < l.length; n++)if (l[n].indent > l[n - 1].indent + 1) {
            var r = l[n - 1].indent + 1 - l[n].indent, s = l[n].indent;
            while (l[n] && l[n].indent >= s) {
                l[n].indent += r;
                n++;
            }
            n--;
        }
        var t = CKEDITOR.plugins.list.arrayToList(l, k, null, i.config.enterMode), u = t.listNode, v, w;

        function x(z) {
            if ((v = u[z ? 'getFirst' : 'getLast']()) && (!(v.is && v.isBlockBoundary()) && (w = j.root[z ? 'getPrevious' : 'getNext'](CKEDITOR.dom.walker.whitespaces(true))) && (!(w.is && w.isBlockBoundary({br:1})))))i.document.createElement('br')[z ? 'insertBefore' : 'insertAfter'](v);
        }

        ;
        x(true);
        x();
        var y = j.root.getParent();
        u.replace(j.root);
    }

    ;
    function h(i, j) {
        this.name = i;
        this.type = j;
    }

    ;
    h.prototype = {exec:function (i) {
        i.focus();
        var j = i.document, k = i.getSelection(), l = k && k.getRanges();
        if (!l || l.length < 1)return;
        if (this.state == CKEDITOR.TRISTATE_OFF) {
            var m = j.getBody();
            m.trim();
            if (!m.getFirst()) {
                var n = j.createElement(i.config.enterMode == CKEDITOR.ENTER_P ? 'p' : i.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'br');
                n.appendTo(m);
                l = [new CKEDITOR.dom.range(j)];
                if (n.is('br')) {
                    l[0].setStartBefore(n);
                    l[0].setEndAfter(n);
                } else l[0].selectNodeContents(n);
                k.selectRanges(l);
            } else {
                var o = l.length == 1 && l[0], p = o && o.getEnclosedNode();
                if (p && p.is && this.type == p.getName())c.call(this, i, CKEDITOR.TRISTATE_ON);
            }
        }
        var q = k.createBookmarks(true), r = [], s = {};
        while (l.length > 0) {
            o = l.shift();
            var t = o.getBoundaryNodes(), u = t.startNode, v = t.endNode;
            if (u.type == CKEDITOR.NODE_ELEMENT && u.getName() == 'td')o.setStartAt(t.startNode, CKEDITOR.POSITION_AFTER_START);
            if (v.type == CKEDITOR.NODE_ELEMENT && v.getName() == 'td')o.setEndAt(t.endNode, CKEDITOR.POSITION_BEFORE_END);
            var w = o.createIterator(), x;
            w.forceBrBreak = this.state == CKEDITOR.TRISTATE_OFF;
            while (x = w.getNextParagraph()) {
                var y = new CKEDITOR.dom.elementPath(x), z = null, A = false, B = y.blockLimit, C;
                for (var D = 0; D < y.elements.length && (C = y.elements[D]) && (!C.equals(B)); D++)if (a[C.getName()]) {
                    B.removeCustomData('list_group_object');
                    var E = C.getCustomData('list_group_object');
                    if (E)E.contents.push(x); else {
                        E = {root:C, contents:[x]};
                        r.push(E);
                        CKEDITOR.dom.element.setMarker(s, C, 'list_group_object', E);
                    }
                    A = true;
                    break;
                }
                if (A)continue;
                var F = B;
                if (F.getCustomData('list_group_object'))F.getCustomData('list_group_object').contents.push(x); else {
                    E = {root:F, contents:[x]};
                    CKEDITOR.dom.element.setMarker(s, F, 'list_group_object', E);
                    r.push(E);
                }
            }
        }
        var G = [];
        while (r.length > 0) {
            E = r.shift();
            if (this.state == CKEDITOR.TRISTATE_OFF) {
                if (a[E.root.getName()])e.call(this, i, E, s, G); else f.call(this, i, E, G);
            } else if (this.state == CKEDITOR.TRISTATE_ON && a[E.root.getName()])g.call(this, i, E, s);
        }
        for (D = 0; D < G.length; D++) {
            z = G[D];
            var H, I = this;
            (H = function (J) {
                var K = z[J ? 'getPrevious' : 'getNext'](CKEDITOR.dom.walker.whitespaces(true));
                if (K && K.getName && K.getName() == I.type) {
                    K.remove();
                    K.moveChildren(z, J ? true : false);
                }
            })();
            H(true);
        }
        CKEDITOR.dom.element.clearAllMarkers(s);
        k.selectBookmarks(q);
        i.focus();
    }};
    CKEDITOR.plugins.add('list', {init:function (i) {
        var j = new h('numberedlist', 'ol'), k = new h('bulletedlist', 'ul');
        i.addCommand('numberedlist', j);
        i.addCommand('bulletedlist', k);
        i.ui.addButton('NumberedList', {label:i.lang.numberedlist, command:'numberedlist'});
        i.ui.addButton('BulletedList', {label:i.lang.bulletedlist, command:'bulletedlist'});
        i.on('selectionChange', CKEDITOR.tools.bind(d, j));
        i.on('selectionChange', CKEDITOR.tools.bind(d, k));
    }, requires:['domiterator']});
})();
