/*
 Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or http://ckeditor.com/license
*/
(function() {
    function r(a) {
        for (var e = 0, l = 0, k = 0, m, g = a.$.rows.length; k < g; k++) {
            m = a.$.rows[k];
            for (var d = e = 0, c, b = m.cells.length; d < b; d++) c = m.cells[d], e += c.colSpan;
            e > l && (l = e)
        }
        return l
    }

    function o(a) {
        return function() {
            var e = this.getValue(),
                e = !!(CKEDITOR.dialog.validate.integer()(e) && 0 < e);
            e || (alert(a), this.select());
            return e
        }
    }

    function n(a, e) {
        var l = function(g) {
                return new CKEDITOR.dom.element(g, a.document)
            },
            n = a.editable(),
            m = a.plugins.dialogadvtab;
        return {
            title: a.lang.table.title,
            minWidth: 310,
            minHeight: CKEDITOR.env.ie ?
                270 : 240,
            onLoad: function() {
                var g = this,
                    a = g.getContentElement("advanced", "advStyles");
                if (a) a.on("change", function() {
                    var a = this.getStyle("width", ""),
                        b = g.getContentElement("info", "txtWidth");
                    b && b.setValue(a, !0);
                    a = this.getStyle("height", "");
                    (b = g.getContentElement("info", "txtHeight")) && b.setValue(a, !0)
                })
            },
            onShow: function() {
                var g = a.getSelection(),
                    d = g.getRanges(),
                    c, b = this.getContentElement("info", "txtRows"),
                    h = this.getContentElement("info", "txtCols"),
                    p = this.getContentElement("info", "txtWidth"),
                    f = this.getContentElement("info",
                        "txtHeight");
                "tableProperties" == e && ((g = g.getSelectedElement()) && g.is("table") ? c = g : 0 < d.length && (CKEDITOR.env.webkit && d[0].shrink(CKEDITOR.NODE_ELEMENT), c = a.elementPath(d[0].getCommonAncestor(!0)).contains("table", 1)), this._.selectedElement = c);
                c ? (this.setupContent(c), b && b.disable(), h && h.disable()) : (b && b.enable(), h && h.enable());
                p && p.onChange();
                f && f.onChange()
            },
            onOk: function() {
                var g = a.getSelection(),
                    d = this._.selectedElement && g.createBookmarks(),
                    c = this._.selectedElement || l("table"),
                    b = {};
                this.commitContent(b,
                    c);
                if (b.info) {
                    b = b.info;
                    if (!this._.selectedElement)
                        for (var h = c.append(l("tbody")), e = parseInt(b.txtRows, 10) || 0, f = parseInt(b.txtCols, 10) || 0, i = 0; i < e; i++)
                            for (var j = h.append(l("tr")), k = 0; k < f; k++) j.append(l("td")).appendBogus();
                    e = b.selHeaders;
                    if (!c.$.tHead && ("row" == e || "both" == e)) {
                        j = new CKEDITOR.dom.element(c.$.createTHead());
                        h = c.getElementsByTag("tbody").getItem(0);
                        h = h.getElementsByTag("tr").getItem(0);
                        for (i = 0; i < h.getChildCount(); i++) f = h.getChild(i), f.type == CKEDITOR.NODE_ELEMENT && !f.data("cke-bookmark") &&
                            (f.renameNode("th"), f.setAttribute("scope", "col"));
                        j.append(h.remove())
                    }
                    if (null !== c.$.tHead && !("row" == e || "both" == e)) {
                        j = new CKEDITOR.dom.element(c.$.tHead);
                        h = c.getElementsByTag("tbody").getItem(0);
                        for (k = h.getFirst(); 0 < j.getChildCount();) {
                            h = j.getFirst();
                            for (i = 0; i < h.getChildCount(); i++) f = h.getChild(i), f.type == CKEDITOR.NODE_ELEMENT && (f.renameNode("td"), f.removeAttribute("scope"));
                            h.insertBefore(k)
                        }
                        j.remove()
                    }
                    if (!this.hasColumnHeaders && ("col" == e || "both" == e))
                        for (j = 0; j < c.$.rows.length; j++) f = new CKEDITOR.dom.element(c.$.rows[j].cells[0]),
                            f.renameNode("th"), f.setAttribute("scope", "row");
                    if (this.hasColumnHeaders && !("col" == e || "both" == e))
                        for (i = 0; i < c.$.rows.length; i++) j = new CKEDITOR.dom.element(c.$.rows[i]), "tbody" == j.getParent().getName() && (f = new CKEDITOR.dom.element(j.$.cells[0]), f.renameNode("td"), f.removeAttribute("scope"));
                    b.txtHeight ? c.setStyle("height", b.txtHeight) : c.removeStyle("height");
                    b.txtWidth ? c.setStyle("width", b.txtWidth) : c.removeStyle("width");
                    c.getAttribute("style") || c.removeAttribute("style")
                    var bootstrapClass = 'table';
                    bootstrapClass += this.getValueOf('bootstrapCssTab', 'stripedRows') ? ' table-striped' : '';
                    bootstrapClass += this.getValueOf('bootstrapCssTab', 'bordered') ? ' table-bordered' : '';
                    bootstrapClass += this.getValueOf('bootstrapCssTab', 'hover') ? ' table-hover' : '';
                    bootstrapClass += this.getValueOf('bootstrapCssTab', 'condensed') ? ' table-condensed' : '';
	                c.$.className = bootstrapClass;
                }
                if (this._.selectedElement) try {
                    g.selectBookmarks(d)
                } catch (m) {} else a.insertElement(c),
                    setTimeout(function() {
                        var g = new CKEDITOR.dom.element(c.$.rows[0].cells[0]),
                            b = a.createRange();
                        b.moveToPosition(g, CKEDITOR.POSITION_AFTER_START);
                        b.select()
                    }, 0)
            },
            contents: [
	            {
	            	id 		: 'info',
	                label	: a.lang.table.title,
	                elements: [
		                {
		                	type 	: 'hbox',
		                	children: [
		                		{
		                            type: "text",
		                            id: "txtBorder",
		                            requiredContent: "table[border]",
		                            "default": '',
		                            label: a.lang.table.border,
		                            style: 'display:none;',
		                            controlStyle: "width:3em;",
		                            validate: CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),
		                            setup: function(a) {
		                                this.setValue(a.getAttribute("border") ||
		                                    "")
		                            },
		                            commit: function(a, d) {
		                                this.getValue() ? d.setAttribute("border", this.getValue()) : d.removeAttribute("border")
		                            }
		                        }
		                	]
		                },
		                {
		                	type 	: 'hbox',
		                	widths	: ['33.333%', '33.333%', '33.333%'],
		                	children: [
		                		{
		                            type: "text",
		                            id: "txtRows",
		                            "default": 3,
		                            label: a.lang.table.rows,
		                            required: !0,
		                            validate: o(a.lang.table.invalidRows),
		                            setup: function(a) {
		                                this.setValue(a.$.rows.length)
		                            },
		                            commit: k
		                        }, {
		                            type: "text",
		                            id: "txtCols",
		                            "default": 2,
		                            label: a.lang.table.columns,
		                            required: !0,
		                            validate: o(a.lang.table.invalidCols),
		                            setup: function(a) {
		                                this.setValue(r(a))
		                            },
		                            commit: k
		                        }, {
		                            type: "text",
		                            id: "txtWidth",
		                            requiredContent: "table{width}",
		                            label: a.lang.common.width,
		                            title: a.lang.common.cssLengthTooltip,
		                            "default": a.filter.check("table{width}") ? 500 > n.getSize("width") ? "100%" : 500 : 0,
		                            getValue: q,
		                            validate: CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", a.lang.common.width)),
		                            onChange: function() {
		                                var a = this.getDialog().getContentElement("advanced", "advStyles");
		                                a &&
		                                    a.updateStyle("width", this.getValue())
		                            },
		                            setup: function(a) {
		                                this.setValue(a.getStyle("width"))
		                            },
		                            commit: k
		                        }
		                    ]
		                },
		                {
		                	type 	: 'hbox',
		                	widths	: ['33.333%', '33.333%', '33.333%'],
		                	children: [
		                        {
		                            type: "text",
		                            id: "txtHeight",
		                            requiredContent: "table{height}",
		                            label: a.lang.common.height,
		                            title: a.lang.common.cssLengthTooltip,
		                            "default": "",
		                            getValue: q,
		                            validate: CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", a.lang.common.height)),
		                            onChange: function() {
		                                var a = this.getDialog().getContentElement("advanced", "advStyles");
		                                a && a.updateStyle("height", this.getValue())
		                            },
		                            setup: function(a) {
		                                (a = a.getStyle("height")) && this.setValue(a)
		                            },
		                            commit: k
		                        }, 
		                        {
		                            type: "select",
		                            id: "selHeaders",
		                            requiredContent: "th",
		                            "default": "",
		                            label: a.lang.table.headers,
		                            items: [
		                                [a.lang.table.headersNone, ""],
		                                [a.lang.table.headersRow, "row"],
		                                [a.lang.table.headersColumn, "col"],
		                                [a.lang.table.headersBoth, "both"]
		                            ],
		                            setup: function(a) {
		                                var d = this.getDialog();
		                                d.hasColumnHeaders = !0;
		                                for (var c = 0; c < a.$.rows.length; c++) {
		                                    var b = a.$.rows[c].cells[0];
		                                    if (b && "th" != b.nodeName.toLowerCase()) {
		                                        d.hasColumnHeaders = !1;
		                                        break
		                                    }
		                                }
		                                null !== a.$.tHead ? this.setValue(d.hasColumnHeaders ? "both" : "row") : this.setValue(d.hasColumnHeaders ? "col" : "")
		                            },
		                            commit: k
		                        }, 
		                        {
		                            id: "cmbAlign",
		                            type: "select",
		                            requiredContent: "table[align]",
		                            "default": "",
		                            label: a.lang.common.align,
		                            items: [
		                                [a.lang.common.notSet, ""],
		                                [a.lang.common.alignLeft, "left"],
		                                [a.lang.common.alignCenter, "center"],
		                                [a.lang.common.alignRight, "right"]
		                            ],
		                            setup: function(a) {
		                                this.setValue(a.getAttribute("align") || "")
		                            },
		                            commit: function(a, d) {
		                                this.getValue() ? d.setAttribute("align", this.getValue()) : d.removeAttribute("align")
		                            }
		                        }
		                    ]
		                },
						{
		                	type 	: 'vbox',
		                	children: [
		                		{
			                        type: "text",
			                        id: "txtCaption",
			                        requiredContent: "caption",
			                        label: a.lang.table.caption,
			                        setup: function(a) {
			                            this.enable();
			                            a = a.getElementsByTag("caption");
			                            if (0 < a.count()) {
			                                var a = a.getItem(0),
			                                    d = a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));
			                                d && !d.equals(a.getBogus()) ? (this.disable(), this.setValue(a.getText())) : (a = CKEDITOR.tools.trim(a.getText()), this.setValue(a))
			                            }
			                        },
			                        commit: function(e, d) {
			                            if (this.isEnabled()) {
			                                var c = this.getValue(),
			                                    b = d.getElementsByTag("caption");
			                                if (c) 0 < b.count() ? (b = b.getItem(0), b.setHtml("")) : (b = new CKEDITOR.dom.element("caption", a.document), d.getChildCount() ? b.insertBefore(d.getFirst()) : b.appendTo(d)), b.append(new CKEDITOR.dom.text(c, a.document));
			                                else if (0 < b.count())
			                                    for (c = b.count() - 1; 0 <= c; c--) b.getItem(c).remove()
			                            }
			                        }
			                    },
			                    {
			                        type: "text",
			                        id: "txtSummary",
			                        bidi: !0,
			                        requiredContent: "table[summary]",
			                        label: a.lang.table.summary,
			                        setup: function(a) {
			                            this.setValue(a.getAttribute("summary") || "")
			                        },
			                        commit: function(a, d) {
			                            this.getValue() ? d.setAttribute("summary",
			                                this.getValue()) : d.removeAttribute("summary")
			                        }
			                    }
		                	]
		                }
	                ]
	            },
	            {
	            	id		: 'bootstrapCssTab',
	                label	: 'Bootstrap CSS',
	                elements: [
						{
							type	: 'hbox',
							widths	: ['50%', '50%'],
							children: [
								{
									id			: 'stripedRows',
									label		: 'Striped Rows',
									type		: 'checkbox',
									value 		: 'table-striped',
									setup		: function(a){
										var tableClasses = (a.getAttribute('class')).split(' ');
										this.setValue(mj_in_array('table-striped', tableClasses));
	                                }
								},
								{
									id			: 'bordered',
									label		: 'Bordered',
									type		: 'checkbox',
									value 		: 'table-bordered',
									setup		: function(a){
										var tableClasses = (a.getAttribute('class')).split(' ');
										this.setValue(mj_in_array('table-bordered', tableClasses));
	                                }
								}
							]
						},
						{
							type	: 'hbox',
							widths	: ['50%', '50%'],
							children: [
								{
									id			: 'hover',
									label		: 'Hover',
									type		: 'checkbox',
									value 		: 'table-hover',
									setup		: function(a){
										var tableClasses = (a.getAttribute('class')).split(' ');
										this.setValue(mj_in_array('table-hover', tableClasses));
	                                }
								},
								{
									id			: 'condensed',
									label		: 'Condensed',
									type		: 'checkbox',
									value 		: 'table-condensed',
									setup		: function(a){
										var tableClasses = (a.getAttribute('class')).split(' ');
										this.setValue(mj_in_array('table-condensed', tableClasses));
	                                }
								}
							]
						}
					]
	            }
            ]
        }
    }
    var q = CKEDITOR.tools.cssLength,
        k = function(a) {
            var e = this.id;
            a.info || (a.info = {});
            a.info[e] = this.getValue()
        };
    CKEDITOR.dialog.add("table", function(a) {
        return n(a, "table")
    });
    CKEDITOR.dialog.add("tableProperties", function(a) {
        return n(a, "tableProperties")
    })
})();

function mj_in_array(needle, haystack){
	
    for(var i in haystack){
        if(haystack[i] == needle) return true;
    }
    return false;
	
};