| /******************************************************************************* | 
| * KindEditor - WYSIWYG HTML Editor for Internet | 
| * Copyright (C) 2006-2011 kindsoft.net | 
| * | 
| * @author Roddy <luolonghao@gmail.com> | 
| * @site http://www.kindsoft.net/ | 
| * @licence http://www.kindsoft.net/license.php | 
| *******************************************************************************/ | 
|   | 
| KindEditor.plugin('table', function(K) { | 
|     var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder'; | 
|     // 设置颜色 | 
|     function _setColor(box, color) { | 
|         color = color.toUpperCase(); | 
|         box.css('background-color', color); | 
|         box.css('color', color === '#000000' ? '#FFFFFF' : '#000000'); | 
|         box.html(color); | 
|     } | 
|     // 初始化取色器 | 
|     var pickerList = []; | 
|     function _initColorPicker(dialogDiv, colorBox) { | 
|         colorBox.bind('click,mousedown', function(e){ | 
|             e.stopPropagation(); | 
|         }); | 
|         function removePicker() { | 
|             K.each(pickerList, function() { | 
|                 this.remove(); | 
|             }); | 
|             pickerList = []; | 
|             K(document).unbind('click,mousedown', removePicker); | 
|             dialogDiv.unbind('click,mousedown', removePicker); | 
|         } | 
|         colorBox.click(function(e) { | 
|             removePicker(); | 
|             var box = K(this), | 
|                 pos = box.pos(); | 
|             var picker = K.colorpicker({ | 
|                 x : pos.x, | 
|                 y : pos.y + box.height(), | 
|                 z : 811214, | 
|                 selectedColor : K(this).html(), | 
|                 colors : self.colorTable, | 
|                 noColor : self.lang('noColor'), | 
|                 shadowMode : self.shadowMode, | 
|                 click : function(color) { | 
|                     _setColor(box, color); | 
|                     removePicker(); | 
|                 } | 
|             }); | 
|             pickerList.push(picker); | 
|             K(document).bind('click,mousedown', removePicker); | 
|             dialogDiv.bind('click,mousedown', removePicker); | 
|         }); | 
|     } | 
|     // 取得下一行cell的index | 
|     function _getCellIndex(table, row, cell) { | 
|         var rowSpanCount = 0; | 
|         for (var i = 0, len = row.cells.length; i < len; i++) { | 
|             if (row.cells[i] == cell) { | 
|                 break; | 
|             } | 
|             rowSpanCount += row.cells[i].rowSpan - 1; | 
|         } | 
|         return cell.cellIndex - rowSpanCount; | 
|     } | 
|     self.plugin.table = { | 
|         //insert or modify table | 
|         prop : function(isInsert) { | 
|             var html = [ | 
|                 '<div style="padding:20px;">', | 
|                 //rows, cols | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keRows" style="width:90px;">' + lang.cells + '</label>', | 
|                 lang.rows + ' <input  type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" />   ', | 
|                 lang.cols + ' <input  type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />', | 
|                 '</div>', | 
|                 //width, height | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keWidth" style="width:90px;">' + lang.size + '</label>', | 
|                 lang.width + ' <input  type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" />   ', | 
|                 '<select name="widthType">', | 
|                 '<option value="%">' + lang.percent + '</option>', | 
|                 '<option value="px">' + lang.px + '</option>', | 
|                 '</select>   ', | 
|                 lang.height + ' <input  type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" />   ', | 
|                 '<select name="heightType">', | 
|                 '<option value="%">' + lang.percent + '</option>', | 
|                 '<option value="px">' + lang.px + '</option>', | 
|                 '</select>', | 
|                 '</div>', | 
|                 //space, padding | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="kePadding" style="width:90px;">' + lang.space + '</label>', | 
|                 lang.padding + ' <input  type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" />   ', | 
|                 lang.spacing + ' <input  type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />', | 
|                 '</div>', | 
|                 //align | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keAlign" style="width:90px;">' + lang.align + '</label>', | 
|                 '<select id="keAlign" name="align">', | 
|                 '<option value="">' + lang.alignDefault + '</option>', | 
|                 '<option value="left">' + lang.alignLeft + '</option>', | 
|                 '<option value="center">' + lang.alignCenter + '</option>', | 
|                 '<option value="right">' + lang.alignRight + '</option>', | 
|                 '</select>', | 
|                 '</div>', | 
|                 //border | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keBorder" style="width:90px;">' + lang.border + '</label>', | 
|                 lang.borderWidth + ' <input  type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" />   ', | 
|                 lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>', | 
|                 '</div>', | 
|                 //background color | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>', | 
|                 '<span class="ke-inline-block ke-input-color"></span>', | 
|                 '</div>', | 
|                 '</div>' | 
|             ].join(''); | 
|             var bookmark = self.cmd.range.createBookmark(); | 
|             var dialog = self.createDialog({ | 
|                 name : name, | 
|                 width : 500, | 
|                 title : self.lang(name), | 
|                 body : html, | 
|                 beforeRemove : function() { | 
|                     colorBox.unbind(); | 
|                 }, | 
|                 yesBtn : { | 
|                     name : self.lang('yes'), | 
|                     click : function(e) { | 
|                         var rows = rowsBox.val(), | 
|                             cols = colsBox.val(), | 
|                             width = widthBox.val(), | 
|                             height = heightBox.val(), | 
|                             widthType = widthTypeBox.val(), | 
|                             heightType = heightTypeBox.val(), | 
|                             padding = paddingBox.val(), | 
|                             spacing = spacingBox.val(), | 
|                             align = alignBox.val(), | 
|                             border = borderBox.val(), | 
|                             borderColor = K(colorBox[0]).html() || '', | 
|                             bgColor = K(colorBox[1]).html() || ''; | 
|                         if (rows == 0 || !/^\d+$/.test(rows)) { | 
|                             alert(self.lang('invalidRows')); | 
|                             rowsBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (cols == 0 || !/^\d+$/.test(cols)) { | 
|                             alert(self.lang('invalidRows')); | 
|                             colsBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(width)) { | 
|                             alert(self.lang('invalidWidth')); | 
|                             widthBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(height)) { | 
|                             alert(self.lang('invalidHeight')); | 
|                             heightBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(padding)) { | 
|                             alert(self.lang('invalidPadding')); | 
|                             paddingBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(spacing)) { | 
|                             alert(self.lang('invalidSpacing')); | 
|                             spacingBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(border)) { | 
|                             alert(self.lang('invalidBorder')); | 
|                             borderBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         //modify table | 
|                         if (table) { | 
|                             if (width !== '') { | 
|                                 table.width(width + widthType); | 
|                             } else { | 
|                                 table.css('width', ''); | 
|                             } | 
|                             if (table[0].width !== undefined) { | 
|                                 table.removeAttr('width'); | 
|                             } | 
|                             if (height !== '') { | 
|                                 table.height(height + heightType); | 
|                             } else { | 
|                                 table.css('height', ''); | 
|                             } | 
|                             if (table[0].height !== undefined) { | 
|                                 table.removeAttr('height'); | 
|                             } | 
|                             table.css('background-color', bgColor); | 
|                             if (table[0].bgColor !== undefined) { | 
|                                 table.removeAttr('bgColor'); | 
|                             } | 
|                             if (padding !== '') { | 
|                                 table[0].cellPadding = padding; | 
|                             } else { | 
|                                 table.removeAttr('cellPadding'); | 
|                             } | 
|                             if (spacing !== '') { | 
|                                 table[0].cellSpacing = spacing; | 
|                             } else { | 
|                                 table.removeAttr('cellSpacing'); | 
|                             } | 
|                             if (align !== '') { | 
|                                 table[0].align = align; | 
|                             } else { | 
|                                 table.removeAttr('align'); | 
|                             } | 
|                             if (border !== '') { | 
|                                 table.attr('border', border); | 
|                             } else { | 
|                                 table.removeAttr('border'); | 
|                             } | 
|                             if (border === '' || border === '0') { | 
|                                 table.addClass(zeroborder); | 
|                             } else { | 
|                                 table.removeClass(zeroborder); | 
|                             } | 
|                             if (borderColor !== '') { | 
|                                 table.attr('borderColor', borderColor); | 
|                             } else { | 
|                                 table.removeAttr('borderColor'); | 
|                             } | 
|                             self.hideDialog().focus(); | 
|                             self.cmd.range.moveToBookmark(bookmark); | 
|                             self.cmd.select(); | 
|                             self.addBookmark(); | 
|                             return; | 
|                         } | 
|                         //insert new table | 
|                         var style = ''; | 
|                         if (width !== '') { | 
|                             style += 'width:' + width + widthType + ';'; | 
|                         } | 
|                         if (height !== '') { | 
|                             style += 'height:' + height + heightType + ';'; | 
|                         } | 
|                         if (bgColor !== '') { | 
|                             style += 'background-color:' + bgColor + ';'; | 
|                         } | 
|                         var html = '<table'; | 
|                         if (style !== '') { | 
|                             html += ' style="' + style + '"'; | 
|                         } | 
|                         if (padding !== '') { | 
|                             html += ' cellpadding="' + padding + '"'; | 
|                         } | 
|                         if (spacing !== '') { | 
|                             html += ' cellspacing="' + spacing + '"'; | 
|                         } | 
|                         if (align !== '') { | 
|                             html += ' align="' + align + '"'; | 
|                         } | 
|                         if (border !== '') { | 
|                             html += ' border="' + border + '"'; | 
|                         } | 
|                         if (border === '' || border === '0') { | 
|                             html += ' class="' + zeroborder + '"'; | 
|                         } | 
|                         if (borderColor !== '') { | 
|                             html += ' bordercolor="' + borderColor + '"'; | 
|                         } | 
|                         html += '>'; | 
|                         for (var i = 0; i < rows; i++) { | 
|                             html += '<tr>'; | 
|                             for (var j = 0; j < cols; j++) { | 
|                                 html += '<td>' + (K.IE ? ' ' : '<br />') + '</td>'; | 
|                             } | 
|                             html += '</tr>'; | 
|                         } | 
|                         html += '</table>'; | 
|                         if (!K.IE) { | 
|                             html += '<br />'; | 
|                         } | 
|                         self.insertHtml(html); | 
|                         self.select().hideDialog().focus(); | 
|                         self.addBookmark(); | 
|                     } | 
|                 } | 
|             }), | 
|             div = dialog.div, | 
|             rowsBox = K('[name="rows"]', div).val(3), | 
|             colsBox = K('[name="cols"]', div).val(2), | 
|             widthBox = K('[name="width"]', div).val(100), | 
|             heightBox = K('[name="height"]', div), | 
|             widthTypeBox = K('[name="widthType"]', div), | 
|             heightTypeBox = K('[name="heightType"]', div), | 
|             paddingBox = K('[name="padding"]', div).val(2), | 
|             spacingBox = K('[name="spacing"]', div).val(0), | 
|             alignBox = K('[name="align"]', div), | 
|             borderBox = K('[name="border"]', div).val(1), | 
|             colorBox = K('.ke-input-color', div); | 
|             _initColorPicker(div, colorBox.eq(0)); | 
|             _initColorPicker(div, colorBox.eq(1)); | 
|             _setColor(colorBox.eq(0), '#000000'); | 
|             _setColor(colorBox.eq(1), ''); | 
|             // foucs and select | 
|             rowsBox[0].focus(); | 
|             rowsBox[0].select(); | 
|             var table; | 
|             if (isInsert) { | 
|                 return; | 
|             } | 
|             //get selected table node | 
|             table = self.plugin.getSelectedTable(); | 
|             if (table) { | 
|                 rowsBox.val(table[0].rows.length); | 
|                 colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0); | 
|                 rowsBox.attr('disabled', true); | 
|                 colsBox.attr('disabled', true); | 
|                 var match, | 
|                     tableWidth = table[0].style.width || table[0].width, | 
|                     tableHeight = table[0].style.height || table[0].height; | 
|                 if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) { | 
|                     widthBox.val(match[1]); | 
|                     widthTypeBox.val(match[2]); | 
|                 } else { | 
|                     widthBox.val(''); | 
|                 } | 
|                 if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) { | 
|                     heightBox.val(match[1]); | 
|                     heightTypeBox.val(match[2]); | 
|                 } | 
|                 paddingBox.val(table[0].cellPadding || ''); | 
|                 spacingBox.val(table[0].cellSpacing || ''); | 
|                 alignBox.val(table[0].align || ''); | 
|                 borderBox.val(table[0].border === undefined ? '' : table[0].border); | 
|                 _setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || '')); | 
|                 _setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || '')); | 
|                 widthBox[0].focus(); | 
|                 widthBox[0].select(); | 
|             } | 
|         }, | 
|         //modify cell | 
|         cellprop : function() { | 
|             var html = [ | 
|                 '<div style="padding:20px;">', | 
|                 //width, height | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keWidth" style="width:90px;">' + lang.size + '</label>', | 
|                 lang.width + ' <input  type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" />   ', | 
|                 '<select name="widthType">', | 
|                 '<option value="%">' + lang.percent + '</option>', | 
|                 '<option value="px">' + lang.px + '</option>', | 
|                 '</select>   ', | 
|                 lang.height + ' <input  type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" />   ', | 
|                 '<select name="heightType">', | 
|                 '<option value="%">' + lang.percent + '</option>', | 
|                 '<option value="px">' + lang.px + '</option>', | 
|                 '</select>', | 
|                 '</div>', | 
|                 //align | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keAlign" style="width:90px;">' + lang.align + '</label>', | 
|                 lang.textAlign + ' <select id="keAlign" name="textAlign">', | 
|                 '<option value="">' + lang.alignDefault + '</option>', | 
|                 '<option value="left">' + lang.alignLeft + '</option>', | 
|                 '<option value="center">' + lang.alignCenter + '</option>', | 
|                 '<option value="right">' + lang.alignRight + '</option>', | 
|                 '</select> ', | 
|                 lang.verticalAlign + ' <select name="verticalAlign">', | 
|                 '<option value="">' + lang.alignDefault + '</option>', | 
|                 '<option value="top">' + lang.alignTop + '</option>', | 
|                 '<option value="middle">' + lang.alignMiddle + '</option>', | 
|                 '<option value="bottom">' + lang.alignBottom + '</option>', | 
|                 '<option value="baseline">' + lang.alignBaseline + '</option>', | 
|                 '</select>', | 
|                 '</div>', | 
|                 //border | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keBorder" style="width:90px;">' + lang.border + '</label>', | 
|                 lang.borderWidth + ' <input  type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" />   ', | 
|                 lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>', | 
|                 '</div>', | 
|                 //background color | 
|                 '<div class="ke-dialog-row">', | 
|                 '<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>', | 
|                 '<span class="ke-inline-block ke-input-color"></span>', | 
|                 '</div>', | 
|                 '</div>' | 
|             ].join(''); | 
|             var bookmark = self.cmd.range.createBookmark(); | 
|             var dialog = self.createDialog({ | 
|                 name : name, | 
|                 width : 500, | 
|                 title : self.lang('tablecell'), | 
|                 body : html, | 
|                 beforeRemove : function() { | 
|                     colorBox.unbind(); | 
|                 }, | 
|                 yesBtn : { | 
|                     name : self.lang('yes'), | 
|                     click : function(e) { | 
|                         var width = widthBox.val(), | 
|                             height = heightBox.val(), | 
|                             widthType = widthTypeBox.val(), | 
|                             heightType = heightTypeBox.val(), | 
|                             padding = paddingBox.val(), | 
|                             spacing = spacingBox.val(), | 
|                             textAlign = textAlignBox.val(), | 
|                             verticalAlign = verticalAlignBox.val(), | 
|                             border = borderBox.val(), | 
|                             borderColor = K(colorBox[0]).html() || '', | 
|                             bgColor = K(colorBox[1]).html() || ''; | 
|                         if (!/^\d*$/.test(width)) { | 
|                             alert(self.lang('invalidWidth')); | 
|                             widthBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(height)) { | 
|                             alert(self.lang('invalidHeight')); | 
|                             heightBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         if (!/^\d*$/.test(border)) { | 
|                             alert(self.lang('invalidBorder')); | 
|                             borderBox[0].focus(); | 
|                             return; | 
|                         } | 
|                         cell.css({ | 
|                             width : width !== '' ? (width + widthType) : '', | 
|                             height : height !== '' ? (height + heightType) : '', | 
|                             'background-color' : bgColor, | 
|                             'text-align' : textAlign, | 
|                             'vertical-align' : verticalAlign, | 
|                             'border-width' : border, | 
|                             'border-style' : border !== '' ? 'solid' : '', | 
|                             'border-color' : borderColor | 
|                         }); | 
|                         self.hideDialog().focus(); | 
|                         self.cmd.range.moveToBookmark(bookmark); | 
|                         self.cmd.select(); | 
|                         self.addBookmark(); | 
|                     } | 
|                 } | 
|             }), | 
|             div = dialog.div, | 
|             widthBox = K('[name="width"]', div).val(100), | 
|             heightBox = K('[name="height"]', div), | 
|             widthTypeBox = K('[name="widthType"]', div), | 
|             heightTypeBox = K('[name="heightType"]', div), | 
|             paddingBox = K('[name="padding"]', div).val(2), | 
|             spacingBox = K('[name="spacing"]', div).val(0), | 
|             textAlignBox = K('[name="textAlign"]', div), | 
|             verticalAlignBox = K('[name="verticalAlign"]', div), | 
|             borderBox = K('[name="border"]', div).val(1), | 
|             colorBox = K('.ke-input-color', div); | 
|             _initColorPicker(div, colorBox.eq(0)); | 
|             _initColorPicker(div, colorBox.eq(1)); | 
|             _setColor(colorBox.eq(0), '#000000'); | 
|             _setColor(colorBox.eq(1), ''); | 
|             // foucs and select | 
|             widthBox[0].focus(); | 
|             widthBox[0].select(); | 
|             // get selected cell | 
|             var cell = self.plugin.getSelectedCell(); | 
|             var match, | 
|                 cellWidth = cell[0].style.width || cell[0].width || '', | 
|                 cellHeight = cell[0].style.height || cell[0].height || ''; | 
|             if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) { | 
|                 widthBox.val(match[1]); | 
|                 widthTypeBox.val(match[2]); | 
|             } else { | 
|                 widthBox.val(''); | 
|             } | 
|             if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) { | 
|                 heightBox.val(match[1]); | 
|                 heightTypeBox.val(match[2]); | 
|             } | 
|             textAlignBox.val(cell[0].style.textAlign || ''); | 
|             verticalAlignBox.val(cell[0].style.verticalAlign || ''); | 
|             var border = cell[0].style.borderWidth || ''; | 
|             if (border) { | 
|                 border = parseInt(border); | 
|             } | 
|             borderBox.val(border); | 
|             _setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || '')); | 
|             _setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || '')); | 
|             widthBox[0].focus(); | 
|             widthBox[0].select(); | 
|         }, | 
|         insert : function() { | 
|             this.prop(true); | 
|         }, | 
|         'delete' : function() { | 
|             var table = self.plugin.getSelectedTable(); | 
|             self.cmd.range.setStartBefore(table[0]).collapse(true); | 
|             self.cmd.select(); | 
|             table.remove(); | 
|             self.addBookmark(); | 
|         }, | 
|         colinsert : function(offset) { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 index = cell.cellIndex + offset; | 
|             // 取得第一行的index | 
|             index += table.rows[0].cells.length - row.cells.length; | 
|   | 
|             for (var i = 0, len = table.rows.length; i < len; i++) { | 
|                 var newRow = table.rows[i], | 
|                     newCell = newRow.insertCell(index); | 
|                 newCell.innerHTML = K.IE ? '' : '<br />'; | 
|                 // 调整下一行的单元格index | 
|                 index = _getCellIndex(table, newRow, newCell); | 
|             } | 
|             self.cmd.range.selectNodeContents(cell).collapse(true); | 
|             self.cmd.select(); | 
|             self.addBookmark(); | 
|         }, | 
|         colinsertleft : function() { | 
|             this.colinsert(0); | 
|         }, | 
|         colinsertright : function() { | 
|             this.colinsert(1); | 
|         }, | 
|         rowinsert : function(offset) { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0]; | 
|             var rowIndex = row.rowIndex; | 
|             if (offset === 1) { | 
|                 rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset; | 
|             } | 
|             var newRow = table.insertRow(rowIndex); | 
|   | 
|             for (var i = 0, len = row.cells.length; i < len; i++) { | 
|                 // 调整cell个数 | 
|                 if (row.cells[i].rowSpan > 1) { | 
|                     len -= row.cells[i].rowSpan - 1; | 
|                 } | 
|                 var newCell = newRow.insertCell(i); | 
|                 // copy colspan | 
|                 if (offset === 1 && row.cells[i].colSpan > 1) { | 
|                     newCell.colSpan = row.cells[i].colSpan; | 
|                 } | 
|                 newCell.innerHTML = K.IE ? '' : '<br />'; | 
|             } | 
|             // 调整rowspan | 
|             for (var j = rowIndex; j >= 0; j--) { | 
|                 var cells = table.rows[j].cells; | 
|                 if (cells.length > i) { | 
|                     for (var k = cell.cellIndex; k >= 0; k--) { | 
|                         if (cells[k].rowSpan > 1) { | 
|                             cells[k].rowSpan += 1; | 
|                         } | 
|                     } | 
|                     break; | 
|                 } | 
|             } | 
|             self.cmd.range.selectNodeContents(cell).collapse(true); | 
|             self.cmd.select(); | 
|             self.addBookmark(); | 
|         }, | 
|         rowinsertabove : function() { | 
|             this.rowinsert(0); | 
|         }, | 
|         rowinsertbelow : function() { | 
|             this.rowinsert(1); | 
|         }, | 
|         rowmerge : function() { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 rowIndex = row.rowIndex, // 当前行的index | 
|                 nextRowIndex = rowIndex + cell.rowSpan, // 下一行的index | 
|                 nextRow = table.rows[nextRowIndex]; // 下一行 | 
|             // 最后一行不能合并 | 
|             if (table.rows.length <= nextRowIndex) { | 
|                 return; | 
|             } | 
|             var cellIndex = cell.cellIndex; // 下一行单元格的index | 
|             if (nextRow.cells.length <= cellIndex) { | 
|                 return; | 
|             } | 
|             var nextCell = nextRow.cells[cellIndex]; // 下一行单元格 | 
|             // 上下行的colspan不一致时不能合并 | 
|             if (cell.colSpan !== nextCell.colSpan) { | 
|                 return; | 
|             } | 
|             cell.rowSpan += nextCell.rowSpan; | 
|             nextRow.deleteCell(cellIndex); | 
|             self.cmd.range.selectNodeContents(cell).collapse(true); | 
|             self.cmd.select(); | 
|             self.addBookmark(); | 
|         }, | 
|         colmerge : function() { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 rowIndex = row.rowIndex, // 当前行的index | 
|                 cellIndex = cell.cellIndex, | 
|                 nextCellIndex = cellIndex + 1; | 
|             // 最后一列不能合并 | 
|             if (row.cells.length <= nextCellIndex) { | 
|                 return; | 
|             } | 
|             var nextCell = row.cells[nextCellIndex]; | 
|             // 左右列的rowspan不一致时不能合并 | 
|             if (cell.rowSpan !== nextCell.rowSpan) { | 
|                 return; | 
|             } | 
|             cell.colSpan += nextCell.colSpan; | 
|             row.deleteCell(nextCellIndex); | 
|             self.cmd.range.selectNodeContents(cell).collapse(true); | 
|             self.cmd.select(); | 
|             self.addBookmark(); | 
|         }, | 
|         rowsplit : function() { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 rowIndex = row.rowIndex; | 
|             // 不是可分割单元格 | 
|             if (cell.rowSpan === 1) { | 
|                 return; | 
|             } | 
|             var cellIndex = _getCellIndex(table, row, cell); | 
|             for (var i = 1, len = cell.rowSpan; i < len; i++) { | 
|                 var newRow = table.rows[rowIndex + i], | 
|                     newCell = newRow.insertCell(cellIndex); | 
|                 if (cell.colSpan > 1) { | 
|                     newCell.colSpan = cell.colSpan; | 
|                 } | 
|                 newCell.innerHTML = K.IE ? '' : '<br />'; | 
|                 // 调整下一行的单元格index | 
|                 cellIndex = _getCellIndex(table, newRow, newCell); | 
|             } | 
|             K(cell).removeAttr('rowSpan'); | 
|             self.cmd.range.selectNodeContents(cell).collapse(true); | 
|             self.cmd.select(); | 
|             self.addBookmark(); | 
|         }, | 
|         colsplit : function() { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 cellIndex = cell.cellIndex; | 
|             // 不是可分割单元格 | 
|             if (cell.colSpan === 1) { | 
|                 return; | 
|             } | 
|             for (var i = 1, len = cell.colSpan; i < len; i++) { | 
|                 var newCell = row.insertCell(cellIndex + i); | 
|                 if (cell.rowSpan > 1) { | 
|                     newCell.rowSpan = cell.rowSpan; | 
|                 } | 
|                 newCell.innerHTML = K.IE ? '' : '<br />'; | 
|             } | 
|             K(cell).removeAttr('colSpan'); | 
|             self.cmd.range.selectNodeContents(cell).collapse(true); | 
|             self.cmd.select(); | 
|             self.addBookmark(); | 
|         }, | 
|         coldelete : function() { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 index = cell.cellIndex; | 
|             for (var i = 0, len = table.rows.length; i < len; i++) { | 
|                 var newRow = table.rows[i], | 
|                     newCell = newRow.cells[index]; | 
|                 if (newCell.colSpan > 1) { | 
|                     newCell.colSpan -= 1; | 
|                     if (newCell.colSpan === 1) { | 
|                         K(newCell).removeAttr('colSpan'); | 
|                     } | 
|                 } else { | 
|                     newRow.deleteCell(index); | 
|                 } | 
|                 // 跳过不需要删除的行 | 
|                 if (newCell.rowSpan > 1) { | 
|                     i += newCell.rowSpan - 1; | 
|                 } | 
|             } | 
|             if (row.cells.length === 0) { | 
|                 self.cmd.range.setStartBefore(table).collapse(true); | 
|                 self.cmd.select(); | 
|                 K(table).remove(); | 
|             } else { | 
|                 self.cmd.selection(true); | 
|             } | 
|             self.addBookmark(); | 
|         }, | 
|         rowdelete : function() { | 
|             var table = self.plugin.getSelectedTable()[0], | 
|                 row = self.plugin.getSelectedRow()[0], | 
|                 cell = self.plugin.getSelectedCell()[0], | 
|                 rowIndex = row.rowIndex; | 
|             // 从下到上删除 | 
|             for (var i = cell.rowSpan - 1; i >= 0; i--) { | 
|                 table.deleteRow(rowIndex + i); | 
|             } | 
|             if (table.rows.length === 0) { | 
|                 self.cmd.range.setStartBefore(table).collapse(true); | 
|                 self.cmd.select(); | 
|                 K(table).remove(); | 
|             } else { | 
|                 self.cmd.selection(true); | 
|             } | 
|             self.addBookmark(); | 
|         } | 
|     }; | 
|     self.clickToolbar(name, self.plugin.table.prop); | 
| }); |