| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875 | /** * Created with JetBrains PhpStorm. * User: taoqili * Date: 12-10-12 * Time: 上午10:05 * To change this template use File | Settings | File Templates. */UE.plugins['table'] = function () {    var me = this,        tabTimer = null,        //拖动计时器        tableDragTimer = null,        //双击计时器        tableResizeTimer = null,        //单元格最小宽度        cellMinWidth = 5,        isInResizeBuffer = false,        //单元格边框大小        cellBorderWidth = 5,        //鼠标偏移距离        offsetOfTableCell = 10,        //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次        singleClickState = 0,        userActionStatus = null,        //双击允许的时间范围        dblclickTime = 360,        UT = UE.UETable,        getUETable = function (tdOrTable) {            return UT.getUETable(tdOrTable);        },        getUETableBySelected = function (editor) {            return UT.getUETableBySelected(editor);        },        getDefaultValue = function (editor, table) {            return UT.getDefaultValue(editor, table);        },        removeSelectedClass = function (cells) {            return UT.removeSelectedClass(cells);        };    function showError(e) {//        throw e;    }    me.ready(function(){        var me = this;        var orgGetText = me.selection.getText;        me.selection.getText = function(){            var table = getUETableBySelected(me);            if(table){                var str = '';                utils.each(table.selectedTds,function(td){                    str += td[browser.ie?'innerText':'textContent'];                })                return str;            }else{                return orgGetText.call(me.selection)            }        }    })    //处理拖动及框选相关方法    var startTd = null, //鼠标按下时的锚点td        currentTd = null, //当前鼠标经过时的td        onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断        onBorder = false, //检测鼠标按下时是否处在单元格边缘位置        dragButton = null,        dragOver = false,        dragLine = null, //模拟的拖动线        dragTd = null;    //发生拖动的目标td    var mousedown = false,    //todo 判断混乱模式        needIEHack = true;    me.setOpt({        'maxColNum':20,        'maxRowNum':100,        'defaultCols':5,        'defaultRows':5,        'tdvalign':'top',        'cursorpath':me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_",        'tableDragable':false,        'classList':["ue-table-interlace-color-single","ue-table-interlace-color-double"]    });    me.getUETable = getUETable;    var commands = {        'deletetable':1,        'inserttable':1,        'cellvalign':1,        'insertcaption':1,        'deletecaption':1,        'inserttitle':1,        'deletetitle':1,        "mergeright":1,        "mergedown":1,        "mergecells":1,        "insertrow":1,        "insertrownext":1,        "deleterow":1,        "insertcol":1,        "insertcolnext":1,        "deletecol":1,        "splittocells":1,        "splittorows":1,        "splittocols":1,        "adaptbytext":1,        "adaptbywindow":1,        "adaptbycustomer":1,        "insertparagraph":1,        "insertparagraphbeforetable":1,        "averagedistributecol":1,        "averagedistributerow":1    };    me.ready(function () {        utils.cssRule('table',            //选中的td上的样式            '.selectTdClass{background-color:#edf5fa !important}' +                'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' +                //插入的表格的默认样式                'table{margin-bottom:10px;border-collapse:collapse;display:table;}' +                'td,th{padding: 5px 10px;border: 1px solid #DDD;}' +                'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +                'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' +                'table tr.firstRow th{border-top-width:2px;}' +                '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' +                'td p{margin:0;padding:0;}', me.document);        var tableCopyList, isFullCol, isFullRow;        //注册del/backspace事件        me.addListener('keydown', function (cmd, evt) {            var me = this;            var keyCode = evt.keyCode || evt.which;            if (keyCode == 8) {                var ut = getUETableBySelected(me);                if (ut && ut.selectedTds.length) {                    if (ut.isFullCol()) {                        me.execCommand('deletecol')                    } else if (ut.isFullRow()) {                        me.execCommand('deleterow')                    } else {                        me.fireEvent('delcells');                    }                    domUtils.preventDefault(evt);                }                var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true),                    range = me.selection.getRange();                if (range.collapsed && caption && isEmptyBlock(caption)) {                    me.fireEvent('saveScene');                    var table = caption.parentNode;                    domUtils.remove(caption);                    if (table) {                        range.setStart(table.rows[0].cells[0], 0).setCursor(false, true);                    }                    me.fireEvent('saveScene');                }            }            if (keyCode == 46) {                ut = getUETableBySelected(me);                if (ut) {                    me.fireEvent('saveScene');                    for (var i = 0, ci; ci = ut.selectedTds[i++];) {                        domUtils.fillNode(me.document, ci)                    }                    me.fireEvent('saveScene');                    domUtils.preventDefault(evt);                }            }            if (keyCode == 13) {                var rng = me.selection.getRange(),                    caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true);                if (caption) {                    var table = domUtils.findParentByTagName(caption, 'table');                    if (!rng.collapsed) {                        rng.deleteContents();                        me.fireEvent('saveScene');                    } else {                        if (caption) {                            rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true);                        }                    }                    domUtils.preventDefault(evt);                    return;                }                if (rng.collapsed) {                    var table = domUtils.findParentByTagName(rng.startContainer, 'table');                    if (table) {                        var cell = table.rows[0].cells[0],                            start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true),                            preNode = table.previousSibling;                        if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE' ) && domUtils.isStartInblock(rng)) {                            var first = domUtils.findParent(me.selection.getStart(), function(n){return domUtils.isBlockElm(n)}, true);                            if(first && ( /t(h|d)/i.test(first.tagName) || first ===  start.firstChild )){                                me.execCommand('insertparagraphbeforetable');                                domUtils.preventDefault(evt);                            }                        }                    }                }            }            if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') {                tableCopyList = null;                var ut = getUETableBySelected(me);                if (ut) {                    var tds = ut.selectedTds;                    isFullCol = ut.isFullCol();                    isFullRow = ut.isFullRow();                    tableCopyList = [                        [ut.cloneCell(tds[0],null,true)]                    ];                    for (var i = 1, ci; ci = tds[i]; i++) {                        if (ci.parentNode !== tds[i - 1].parentNode) {                            tableCopyList.push([ut.cloneCell(ci,null,true)]);                        } else {                            tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci,null,true));                        }                    }                }            }        });        me.addListener("tablehasdeleted",function(){            toggleDraggableState(this, false, "", null);            if (dragButton)domUtils.remove(dragButton);        });        me.addListener('beforepaste', function (cmd, html) {            var me = this;            var rng = me.selection.getRange();            if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) {                var div = me.document.createElement("div");                div.innerHTML = html.html;                //trace:3729                html.html = div[browser.ie9below ? 'innerText' : 'textContent'];                return;            }            var table = getUETableBySelected(me);            if (tableCopyList) {                me.fireEvent('saveScene');                var rng = me.selection.getRange();                var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode;                if (td) {                    var ut = getUETable(td);                    if (isFullRow) {                        var rowIndex = ut.getCellInfo(td).rowIndex;                        if (td.tagName == 'TH') {                            rowIndex++;                        }                        for (var i = 0, ci; ci = tableCopyList[i++];) {                            var tr = ut.insertRow(rowIndex++, "td");                            for (var j = 0, cj; cj = ci[j]; j++) {                                var cell = tr.cells[j];                                if (!cell) {                                    cell = tr.insertCell(j)                                }                                cell.innerHTML = cj.innerHTML;                                cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width'));                                cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign'));                                cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align'));                                cj.style.cssText && (cell.style.cssText = cj.style.cssText)                            }                            for (var j = 0, cj; cj = tr.cells[j]; j++) {                                if (!ci[j])                                    break;                                cj.innerHTML = ci[j].innerHTML;                                ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width'));                                ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign'));                                ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align'));                                ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText)                            }                        }                    } else {                        if (isFullCol) {                            cellInfo = ut.getCellInfo(td);                            var maxColNum = 0;                            for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) {                                maxColNum += cj.colSpan || 1;                            }                            me.__hasEnterExecCommand = true;                            for (i = 0; i < maxColNum; i++) {                                me.execCommand('insertcol');                            }                            me.__hasEnterExecCommand = false;                            td = ut.table.rows[0].cells[cellInfo.cellIndex];                            if (td.tagName == 'TH') {                                td = ut.table.rows[1].cells[cellInfo.cellIndex];                            }                        }                        for (var i = 0, ci; ci = tableCopyList[i++];) {                            tmpNode = td;                            for (var j = 0, cj; cj = ci[j++];) {                                if (td) {                                    td.innerHTML = cj.innerHTML;                                    //todo 定制处理                                    cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width'));                                    cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign'));                                    cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align'));                                    cj.style.cssText && (td.style.cssText = cj.style.cssText);                                    preNode = td;                                    td = td.nextSibling;                                } else {                                    var cloneTd = cj.cloneNode(true);                                    domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']);                                    preNode.parentNode.appendChild(cloneTd)                                }                            }                            td = ut.getNextCell(tmpNode, true, true);                            if (!tableCopyList[i])                                break;                            if (!td) {                                var cellInfo = ut.getCellInfo(tmpNode);                                ut.table.insertRow(ut.table.rows.length);                                ut.update();                                td = ut.getVSideCell(tmpNode, true);                            }                        }                    }                    ut.update();                } else {                    table = me.document.createElement('table');                    for (var i = 0, ci; ci = tableCopyList[i++];) {                        var tr = table.insertRow(table.rows.length);                        for (var j = 0, cj; cj = ci[j++];) {                            cloneTd = UT.cloneCell(cj,null,true);                            domUtils.removeAttributes(cloneTd, ['class']);                            tr.appendChild(cloneTd)                        }                        if (j == 2 && cloneTd.rowSpan > 1) {                            cloneTd.rowSpan = 1;                        }                    }                    var defaultValue = getDefaultValue(me),                        width = me.body.offsetWidth -                            (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0);                    me.execCommand('insertHTML', '<table  ' +                        ( isFullCol && isFullRow ? 'width="' + width + '"' : '') +                        '>' + table.innerHTML.replace(/>\s*</g, '><').replace(/\bth\b/gi, "td") + '</table>')                }                me.fireEvent('contentchange');                me.fireEvent('saveScene');                html.html = '';                return true;            } else {                var div = me.document.createElement("div"), tables;                div.innerHTML = html.html;                tables = div.getElementsByTagName("table");                if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) {                    utils.each(tables, function (t) {                        domUtils.remove(t)                    });                    if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) {                        div.innerHTML = div[browser.ie ? 'innerText' : 'textContent'];                    }                } else {                    utils.each(tables, function (table) {                        removeStyleSize(table, true);                        domUtils.removeAttributes(table, ['style', 'border']);                        utils.each(domUtils.getElementsByTagName(table, "td"), function (td) {                            if (isEmptyBlock(td)) {                                domUtils.fillNode(me.document, td);                            }                            removeStyleSize(td, true);//                            domUtils.removeAttributes(td, ['style'])                        });                    });                }                html.html = div.innerHTML;            }        });        me.addListener('afterpaste', function () {            utils.each(domUtils.getElementsByTagName(me.body, "table"), function (table) {                if (table.offsetWidth > me.body.offsetWidth) {                    var defaultValue = getDefaultValue(me, table);                    table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px'                }            })        });        me.addListener('blur', function () {            tableCopyList = null;        });        var timer;        me.addListener('keydown', function () {            clearTimeout(timer);            timer = setTimeout(function () {                var rng = me.selection.getRange(),                    cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true);                if (cell) {                    var table = cell.parentNode.parentNode.parentNode;                    if (table.offsetWidth > table.getAttribute("width")) {                        cell.style.wordBreak = "break-all";                    }                }            }, 100);        });        me.addListener("selectionchange", function () {            toggleDraggableState(me, false, "", null);        });        //内容变化时触发索引更新        //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新        me.addListener("contentchange", function () {            var me = this;            //尽可能排除一些不需要更新的状况            hideDragLine(me);            if (getUETableBySelected(me))return;            var rng = me.selection.getRange();            var start = rng.startContainer;            start = domUtils.findParentByTagName(start, ['td', 'th'], true);            utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) {                if (me.fireEvent("excludetable", table) === true) return;                table.ueTable = new UT(table);                //trace:3742//                utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) {////                    if (domUtils.isEmptyBlock(td) && td !== start) {//                        domUtils.fillNode(me.document, td);//                        if (browser.ie && browser.version == 6) {//                            td.innerHTML = ' '//                        }//                    }//                });//                utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) {//                    if (domUtils.isEmptyBlock(th) && th !== start) {//                        domUtils.fillNode(me.document, th);//                        if (browser.ie && browser.version == 6) {//                            th.innerHTML = ' '//                        }//                    }//                });                table.onmouseover = function () {                    me.fireEvent('tablemouseover', table);                };                table.onmousemove = function () {                    me.fireEvent('tablemousemove', table);                    me.options.tableDragable && toggleDragButton(true, this, me);                    utils.defer(function(){                        me.fireEvent('contentchange',50)                    },true)                };                table.onmouseout = function () {                    me.fireEvent('tablemouseout', table);                    toggleDraggableState(me, false, "", null);                    hideDragLine(me);                };                table.onclick = function (evt) {                    evt = me.window.event || evt;                    var target = getParentTdOrTh(evt.target || evt.srcElement);                    if (!target)return;                    var ut = getUETable(target),                        table = ut.table,                        cellInfo = ut.getCellInfo(target),                        cellsRange,                        rng = me.selection.getRange();//                    if ("topLeft" == inPosition(table, mouseCoords(evt))) {//                        cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell());//                        ut.setSelected(cellsRange);//                        return;//                    }//                    if ("bottomRight" == inPosition(table, mouseCoords(evt))) {////                        return;//                    }                    if (inTableSide(table, target, evt, true)) {                        var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex);                        if (evt.shiftKey && ut.selectedTds.length) {                            if (ut.selectedTds[0] !== endTdCol) {                                cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol);                                ut.setSelected(cellsRange);                            } else {                                rng && rng.selectNodeContents(endTdCol).select();                            }                        } else {                            if (target !== endTdCol) {                                cellsRange = ut.getCellsRange(target, endTdCol);                                ut.setSelected(cellsRange);                            } else {                                rng && rng.selectNodeContents(endTdCol).select();                            }                        }                        return;                    }                    if (inTableSide(table, target, evt)) {                        var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex);                        if (evt.shiftKey && ut.selectedTds.length) {                            if (ut.selectedTds[0] !== endTdRow) {                                cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow);                                ut.setSelected(cellsRange);                            } else {                                rng && rng.selectNodeContents(endTdRow).select();                            }                        } else {                            if (target !== endTdRow) {                                cellsRange = ut.getCellsRange(target, endTdRow);                                ut.setSelected(cellsRange);                            } else {                                rng && rng.selectNodeContents(endTdRow).select();                            }                        }                    }                };            });            switchBorderColor(me, true);        });        domUtils.on(me.document, "mousemove", mouseMoveEvent);        domUtils.on(me.document, "mouseout", function (evt) {            var target = evt.target || evt.srcElement;            if (target.tagName == "TABLE") {                toggleDraggableState(me, false, "", null);            }        });        /**         * 表格隔行变色         */        me.addListener("interlacetable",function(type,table,classList){            if(!table) return;            var me = this,                rows = table.rows,                len = rows.length,                getClass = function(list,index,repeat){                    return list[index] ? list[index] : repeat ? list[index % list.length]: "";                };            for(var i = 0;i<len;i++){                rows[i].className = getClass( classList|| me.options.classList,i,true);            }        });        me.addListener("uninterlacetable",function(type,table){            if(!table) return;            var me = this,                rows = table.rows,                classList = me.options.classList,                len = rows.length;            for(var i = 0;i<len;i++){                domUtils.removeClasses( rows[i], classList );            }        });        me.addListener("mousedown", mouseDownEvent);        me.addListener("mouseup", mouseUpEvent);        //拖动的时候触发mouseup        domUtils.on( me.body, 'dragstart', function( evt ){            mouseUpEvent.call( me, 'dragstart', evt );        });        me.addOutputRule(function(root){            utils.each(root.getNodesByTagName('div'),function(n){                if (n.getAttr('id') == 'ue_tableDragLine') {                    n.parentNode.removeChild(n);                }            });        });        var currentRowIndex = 0;        me.addListener("mousedown", function () {            currentRowIndex = 0;        });        me.addListener('tabkeydown', function () {            var range = this.selection.getRange(),                common = range.getCommonAncestor(true, true),                table = domUtils.findParentByTagName(common, 'table');            if (table) {                if (domUtils.findParentByTagName(common, 'caption', true)) {                    var cell = domUtils.getElementsByTagName(table, 'th td');                    if (cell && cell.length) {                        range.setStart(cell[0], 0).setCursor(false, true)                    }                } else {                    var cell = domUtils.findParentByTagName(common, ['td', 'th'], true),                        ua = getUETable(cell);                    currentRowIndex = cell.rowSpan > 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex;                    var nextCell = ua.getTabNextCell(cell, currentRowIndex);                    if (nextCell) {                        if (isEmptyBlock(nextCell)) {                            range.setStart(nextCell, 0).setCursor(false, true)                        } else {                            range.selectNodeContents(nextCell).select()                        }                    } else {                        me.fireEvent('saveScene');                        me.__hasEnterExecCommand = true;                        this.execCommand('insertrownext');                        me.__hasEnterExecCommand = false;                        range = this.selection.getRange();                        range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor();                        me.fireEvent('saveScene');                    }                }                return true;            }        });        browser.ie && me.addListener('selectionchange', function () {            toggleDraggableState(this, false, "", null);        });        me.addListener("keydown", function (type, evt) {            var me = this;            //处理在表格的最后一个输入tab产生新的表格            var keyCode = evt.keyCode || evt.which;            if (keyCode == 8 || keyCode == 46) {                return;            }            var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey;            notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td"));            var ut = getUETableBySelected(me);            if (!ut) return;            notCtrlKey && ut.clearSelected();        });        me.addListener("beforegetcontent", function () {            switchBorderColor(this, false);            browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) {                if (domUtils.isEmptyNode(ci)) {                    ci.innerHTML = ' '                }            });        });        me.addListener("aftergetcontent", function () {            switchBorderColor(this, true);        });        me.addListener("getAllHtml", function () {            removeSelectedClass(me.document.getElementsByTagName("td"));        });        //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况        me.addListener("fullscreenchanged", function (type, fullscreen) {            if (!fullscreen) {                var ratio = this.body.offsetWidth / document.body.offsetWidth,                    tables = domUtils.getElementsByTagName(this.body, "table");                utils.each(tables, function (table) {                    if (table.offsetWidth < me.body.offsetWidth) return false;                    var tds = domUtils.getElementsByTagName(table, "td"),                        backWidths = [];                    utils.each(tds, function (td) {                        backWidths.push(td.offsetWidth);                    });                    for (var i = 0, td; td = tds[i]; i++) {                        td.setAttribute("width", Math.floor(backWidths[i] * ratio));                    }                    table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me))))                });            }        });        //重写execCommand命令,用于处理框选时的处理        var oldExecCommand = me.execCommand;        me.execCommand = function (cmd, datatat) {            var me = this,                args = arguments;            cmd = cmd.toLowerCase();            var ut = getUETableBySelected(me), tds,                range = new dom.Range(me.document),                cmdFun = me.commands[cmd] || UE.commands[cmd],                result;            if (!cmdFun) return;            if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) {                me.__hasEnterExecCommand = true;                me.fireEvent("beforeexeccommand", cmd);                tds = ut.selectedTds;                var lastState = -2, lastValue = -2, value, state;                for (var i = 0, td; td = tds[i]; i++) {                    if (isEmptyBlock(td)) {                        range.setStart(td, 0).setCursor(false, true)                    } else {                        range.selectNode(td).select(true);                    }                    state = me.queryCommandState(cmd);                    value = me.queryCommandValue(cmd);                    if (state != -1) {                        if (lastState !== state || lastValue !== value) {                            me._ignoreContentChange = true;                            result = oldExecCommand.apply(me, arguments);                            me._ignoreContentChange = false;                        }                        lastState = me.queryCommandState(cmd);                        lastValue = me.queryCommandValue(cmd);                        if (domUtils.isEmptyBlock(td)) {                            domUtils.fillNode(me.document, td)                        }                    }                }                range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true);                me.fireEvent('contentchange');                me.fireEvent("afterexeccommand", cmd);                me.__hasEnterExecCommand = false;                me._selectionChange();            } else {                result = oldExecCommand.apply(me, arguments);            }            return result;        };    });    /**     * 删除obj的宽高style,改成属性宽高     * @param obj     * @param replaceToProperty     */    function removeStyleSize(obj, replaceToProperty) {        removeStyle(obj, "width", true);        removeStyle(obj, "height", true);    }    function removeStyle(obj, styleName, replaceToProperty) {        if (obj.style[styleName]) {            replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10));            obj.style[styleName] = "";        }    }    function getParentTdOrTh(ele) {        if (ele.tagName == "TD" || ele.tagName == "TH") return ele;        var td;        if (td = domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)) return td;        return null;    }    function isEmptyBlock(node) {        var reg = new RegExp(domUtils.fillChar, 'g');        if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) {            return 0;        }        for (var n in dtd.$isNotEmpty) {            if (node.getElementsByTagName(n).length) {                return 0;            }        }        return 1;    }    function mouseCoords(evt) {        if (evt.pageX || evt.pageY) {            return { x:evt.pageX, y:evt.pageY };        }        return {            x:evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft,            y:evt.clientY + me.document.body.scrollTop - me.document.body.clientTop        };    }    function mouseMoveEvent(evt) {        if( isEditorDisabled() ) {            return;        }        try {            //普通状态下鼠标移动            var target = getParentTdOrTh(evt.target || evt.srcElement),                pos;            //区分用户的行为是拖动还是双击            if( isInResizeBuffer  ) {                me.body.style.webkitUserSelect = 'none';                if( Math.abs( userActionStatus.x - evt.clientX ) > offsetOfTableCell || Math.abs( userActionStatus.y - evt.clientY ) > offsetOfTableCell ) {                    clearTableDragTimer();                    isInResizeBuffer = false;                    singleClickState = 0;                    //drag action                    tableBorderDrag(evt);                }            }            //修改单元格大小时的鼠标移动            if (onDrag && dragTd) {                singleClickState = 0;                me.body.style.webkitUserSelect = 'none';                me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();                pos = mouseCoords(evt);                toggleDraggableState(me, true, onDrag, pos, target);                if (onDrag == "h") {                    dragLine.style.left = getPermissionX(dragTd, evt) + "px";                } else if (onDrag == "v") {                    dragLine.style.top = getPermissionY(dragTd, evt) + "px";                }                return;            }            //当鼠标处于table上时,修改移动过程中的光标状态            if (target) {                //针对使用table作为容器的组件不触发拖拽效果                if (me.fireEvent('excludetable', target) === true)                    return;                pos = mouseCoords(evt);                var state = getRelation(target, pos),                    table = domUtils.findParentByTagName(target, "table", true);                if (inTableSide(table, target, evt, true)) {                    if (me.fireEvent("excludetable", table) === true) return;                    me.body.style.cursor = "url(" + me.options.cursorpath + "h.png),pointer";                } else if (inTableSide(table, target, evt)) {                    if (me.fireEvent("excludetable", table) === true) return;                    me.body.style.cursor = "url(" + me.options.cursorpath + "v.png),pointer";                } else {                    me.body.style.cursor = "text";                    var curCell = target;                    if (/\d/.test(state)) {                        state = state.replace(/\d/, '');                        target = getUETable(target).getPreviewCell(target, state == "v");                    }                    //位于第一行的顶部或者第一列的左边时不可拖动                    toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target);                }            } else {                toggleDragButton(false, table, me);            }        } catch (e) {            showError(e);        }    }    var dragButtonTimer;    function toggleDragButton(show, table, editor) {        if (!show) {            if (dragOver)return;            dragButtonTimer = setTimeout(function () {                !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton);            }, 2000);        } else {            createDragButton(table, editor);        }    }    function createDragButton(table, editor) {        var pos = domUtils.getXY(table),            doc = table.ownerDocument;        if (dragButton && dragButton.parentNode)return dragButton;        dragButton = doc.createElement("div");        dragButton.contentEditable = false;        dragButton.innerHTML = "";        dragButton.style.cssText = "width:15px;height:15px;background-image:url(" + editor.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (pos.y - 15) + "px;left:" + (pos.x) + "px;";        domUtils.unSelectable(dragButton);        dragButton.onmouseover = function (evt) {            dragOver = true;        };        dragButton.onmouseout = function (evt) {            dragOver = false;        };        domUtils.on(dragButton, 'click', function (type, evt) {            doClick(evt, this);        });        domUtils.on(dragButton, 'dblclick', function (type, evt) {            doDblClick(evt);        });        domUtils.on(dragButton, 'dragstart', function (type, evt) {            domUtils.preventDefault(evt);        });        var timer;        function doClick(evt, button) {            // 部分浏览器下需要清理            clearTimeout(timer);            timer = setTimeout(function () {                editor.fireEvent("tableClicked", table, button);            }, 300);        }        function doDblClick(evt) {            clearTimeout(timer);            var ut = getUETable(table),                start = table.rows[0].cells[0],                end = ut.getLastCell(),                range = ut.getCellsRange(start, end);            editor.selection.getRange().setStart(start, 0).setCursor(false, true);            ut.setSelected(range);        }        doc.body.appendChild(dragButton);    }//    function inPosition(table, pos) {//        var tablePos = domUtils.getXY(table),//            width = table.offsetWidth,//            height = table.offsetHeight;//        if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) {//            return "topLeft";//        } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) {//            return "bottomRight";//        }//    }    function inTableSide(table, cell, evt, top) {        var pos = mouseCoords(evt),            state = getRelation(cell, pos);        if (top) {            var caption = table.getElementsByTagName("caption")[0],                capHeight = caption ? caption.offsetHeight : 0;            return (state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8);        } else {            return (state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8);        }    }    /**     * 获取拖动时允许的X轴坐标     * @param dragTd     * @param evt     */    function getPermissionX(dragTd, evt) {        var ut = getUETable(dragTd);        if (ut) {            var preTd = ut.getSameEndPosCells(dragTd, "x")[0],                nextTd = ut.getSameStartPosXCells(dragTd)[0],                mouseX = mouseCoords(evt).x,                left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20 ,                right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, "width"), 10));            left += cellMinWidth;            right -= cellMinWidth;            return mouseX < left ? left : mouseX > right ? right : mouseX;        }    }    /**     * 获取拖动时允许的Y轴坐标     */    function getPermissionY(dragTd, evt) {        try {            var top = domUtils.getXY(dragTd).y,                mousePosY = mouseCoords(evt).y;            return mousePosY < top ? top : mousePosY;        } catch (e) {            showError(e);        }    }    /**     * 移动状态切换     */    function toggleDraggableState(editor, draggable, dir, mousePos, cell) {        try {            editor.body.style.cursor = dir == "h" ? "col-resize" : dir == "v" ? "row-resize" : "text";            if (browser.ie) {                if (dir && !mousedown && !getUETableBySelected(editor)) {                    getDragLine(editor, editor.document);                    showDragLineAt(dir, cell);                } else {                    hideDragLine(editor)                }            }            onBorder = draggable;        } catch (e) {            showError(e);        }    }    /**     * 获取与UETable相关的resize line     * @param uetable UETable对象     */    function getResizeLineByUETable() {        var lineId = '_UETableResizeLine',            line = this.document.getElementById( lineId );        if( !line ) {            line = this.document.createElement("div");            line.id = lineId;            line.contnetEditable = false;            line.setAttribute("unselectable", "on");            var styles = {                width: 2*cellBorderWidth + 1 + 'px',                position: 'absolute',                'z-index': 100000,                cursor: 'col-resize',                background: 'red',                display: 'none'            };            //切换状态            line.onmouseout = function(){                this.style.display = 'none';            };            utils.extend( line.style, styles );            this.document.body.appendChild( line );        }        return line;    }    /**     * 更新resize-line     */    function updateResizeLine( cell, uetable ) {        var line = getResizeLineByUETable.call( this ),            table = uetable.table,            styles = {                top: domUtils.getXY( table ).y + 'px',                left: domUtils.getXY( cell).x + cell.offsetWidth - cellBorderWidth + 'px',                display: 'block',                height: table.offsetHeight + 'px'            };        utils.extend( line.style, styles );    }    /**     * 显示resize-line     */    function showResizeLine( cell ) {        var uetable = getUETable( cell );        updateResizeLine.call( this, cell, uetable );    }    /**     * 获取鼠标与当前单元格的相对位置     * @param ele     * @param mousePos     */    function getRelation(ele, mousePos) {        var elePos = domUtils.getXY(ele);        if( !elePos ) {            return '';        }        if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) {            return "h";        }        if (mousePos.x - elePos.x < cellBorderWidth) {            return 'h1'        }        if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) {            return "v";        }        if (mousePos.y - elePos.y < cellBorderWidth) {            return 'v1'        }        return '';    }    function mouseDownEvent(type, evt) {        if( isEditorDisabled() ) {            return ;        }        userActionStatus = {            x: evt.clientX,            y: evt.clientY        };        //右键菜单单独处理        if (evt.button == 2) {            var ut = getUETableBySelected(me),                flag = false;            if (ut) {                var td = getTargetTd(me, evt);                utils.each(ut.selectedTds, function (ti) {                    if (ti === td) {                        flag = true;                    }                });                if (!flag) {                    removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td"));                    ut.clearSelected()                } else {                    td = ut.selectedTds[0];                    setTimeout(function () {                        me.selection.getRange().setStart(td, 0).setCursor(false, true);                    }, 0);                }            }        } else {            tableClickHander( evt );        }    }    //清除表格的计时器    function clearTableTimer() {        tabTimer && clearTimeout( tabTimer );        tabTimer = null;    }    //双击收缩    function tableDbclickHandler(evt) {        singleClickState = 0;        evt = evt || me.window.event;        var target = getParentTdOrTh(evt.target || evt.srcElement);        if (target) {            var h;            if (h = getRelation(target, mouseCoords(evt))) {                hideDragLine( me );                if (h == 'h1') {                    h = 'h';                    if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) {                        me.execCommand('adaptbywindow');                    } else {                        target = getUETable(target).getPreviewCell(target);                        if (target) {                            var rng = me.selection.getRange();                            rng.selectNodeContents(target).setCursor(true, true)                        }                    }                }                if (h == 'h') {                    var ut = getUETable(target),                        table = ut.table,                        cells = getCellsByMoveBorder( target, table, true );                    cells = extractArray( cells, 'left' );                    ut.width = ut.offsetWidth;                    var oldWidth = [],                        newWidth = [];                    utils.each( cells, function( cell ){                        oldWidth.push( cell.offsetWidth );                    } );                    utils.each( cells, function( cell ){                        cell.removeAttribute("width");                    } );                    window.setTimeout( function(){                        //是否允许改变                        var changeable = true;                        utils.each( cells, function( cell, index ){                            var width = cell.offsetWidth;                            if( width > oldWidth[index] ) {                                changeable = false;                                return false;                            }                            newWidth.push( width );                        } );                        var change = changeable ? newWidth : oldWidth;                        utils.each( cells, function( cell, index ){                            cell.width = change[index] - getTabcellSpace();                        } );                    }, 0 );//                    minWidth -= cellMinWidth;////                    table.removeAttribute("width");//                    utils.each(cells, function (cell) {//                        cell.style.width = "";//                        cell.width -= minWidth;//                    });                }            }        }    }    function tableClickHander( evt ) {        removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th"));        //trace:3113        //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值        utils.each(me.document.getElementsByTagName('table'), function (t) {            t.ueTable = null;        });        startTd = getTargetTd(me, evt);        if( !startTd ) return;        var table = domUtils.findParentByTagName(startTd, "table", true);        ut = getUETable(table);        ut && ut.clearSelected();        //判断当前鼠标状态        if (!onBorder) {            me.document.body.style.webkitUserSelect = '';            mousedown = true;            me.addListener('mouseover', mouseOverEvent);        } else {            //边框上的动作处理            borderActionHandler( evt );        }    }    //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响    function borderActionHandler( evt ) {        if ( browser.ie ) {            evt = reconstruct(evt );        }        clearTableDragTimer();        //是否正在等待resize的缓冲中        isInResizeBuffer = true;        tableDragTimer = setTimeout(function(){            tableBorderDrag( evt );        }, dblclickTime);    }    function extractArray( originArr, key ) {        var result = [],            tmp = null;        for( var i = 0, len = originArr.length; i<len; i++ ) {            tmp = originArr[ i ][ key ];            if( tmp ) {                result.push( tmp );            }        }        return result;    }    function clearTableDragTimer() {        tableDragTimer && clearTimeout(tableDragTimer);        tableDragTimer = null;    }    function reconstruct( obj ) {        var attrs = ['pageX', 'pageY', 'clientX', 'clientY', 'srcElement', 'target'],            newObj = {};        if( obj ) {            for( var i = 0, key, val; key = attrs[i]; i++ ) {                val=obj[ key ];                val && (newObj[ key ] = val);            }        }        return newObj;    }    //边框拖动    function tableBorderDrag( evt ) {        isInResizeBuffer = false;        startTd = evt.target || evt.srcElement;        if( !startTd ) return;        var state = getRelation(startTd, mouseCoords(evt));        if (/\d/.test(state)) {            state = state.replace(/\d/, '');            startTd = getUETable(startTd).getPreviewCell(startTd, state == 'v');        }        hideDragLine(me);        getDragLine(me, me.document);        me.fireEvent('saveScene');        showDragLineAt(state, startTd);        mousedown = true;        //拖动开始        onDrag = state;        dragTd = startTd;    }    function mouseUpEvent(type, evt) {        if( isEditorDisabled() ) {            return ;        }        clearTableDragTimer();        isInResizeBuffer = false;        if( onBorder ) {            singleClickState = ++singleClickState % 3;            userActionStatus = {                x: evt.clientX,                y: evt.clientY            };            tableResizeTimer = setTimeout(function(){                singleClickState > 0 && singleClickState--;            }, dblclickTime );            if( singleClickState === 2 ) {                singleClickState = 0;                tableDbclickHandler(evt);                return;            }        }        if (evt.button == 2)return;        var me = this;        //清除表格上原生跨选问题        var range = me.selection.getRange(),            start = domUtils.findParentByTagName(range.startContainer, 'table', true),            end = domUtils.findParentByTagName(range.endContainer, 'table', true);        if (start || end) {            if (start === end) {                start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true);                end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true);                if (start !== end) {                    me.selection.clearRange()                }            } else {                me.selection.clearRange()            }        }        mousedown = false;        me.document.body.style.webkitUserSelect = '';        //拖拽状态下的mouseUP        if ( onDrag && dragTd ) {            me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();            singleClickState = 0;            dragLine = me.document.getElementById('ue_tableDragLine');            // trace 3973            if (dragLine) {                var dragTdPos = domUtils.getXY(dragTd),                    dragLinePos = domUtils.getXY(dragLine);                switch (onDrag) {                    case "h":                        changeColWidth(dragTd, dragLinePos.x - dragTdPos.x);                        break;                    case "v":                        changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight);                        break;                    default:                }                onDrag = "";                dragTd = null;                hideDragLine(me);                me.fireEvent('saveScene');                return;            }        }        //正常状态下的mouseup        if (!startTd) {            var target = domUtils.findParentByTagName(evt.target || evt.srcElement, "td", true);            if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, "th", true);            if (target && (target.tagName == "TD" || target.tagName == "TH")) {                if (me.fireEvent("excludetable", target) === true) return;                range = new dom.Range(me.document);                range.setStart(target, 0).setCursor(false, true);            }        } else {            var ut = getUETable(startTd),                cell = ut ? ut.selectedTds[0] : null;            if (cell) {                range = new dom.Range(me.document);                if (domUtils.isEmptyBlock(cell)) {                    range.setStart(cell, 0).setCursor(false, true);                } else {                    range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true);                }            } else {                range = me.selection.getRange().shrinkBoundary();                if (!range.collapsed) {                    var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true),                        end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true);                    //在table里边的不能清除                    if (start && !end || !start && end || start && end && start !== end) {                        range.setCursor(false, true);                    }                }            }            startTd = null;            me.removeListener('mouseover', mouseOverEvent);        }        me._selectionChange(250, evt);    }    function mouseOverEvent(type, evt) {        if( isEditorDisabled() ) {            return;        }        var me = this,            tar = evt.target || evt.srcElement;        currentTd = domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true);        //需要判断两个TD是否位于同一个表格内        if (startTd && currentTd &&            ((startTd.tagName == "TD" && currentTd.tagName == "TD") || (startTd.tagName == "TH" && currentTd.tagName == "TH")) &&            domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) {            var ut = getUETable(currentTd);            if (startTd != currentTd) {                me.document.body.style.webkitUserSelect = 'none';                me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();                var range = ut.getCellsRange(startTd, currentTd);                ut.setSelected(range);            } else {                me.document.body.style.webkitUserSelect = '';                ut.clearSelected();            }        }        evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);    }    function setCellHeight(cell, height, backHeight) {        var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10),            tmpHeight = backHeight + height;        height = tmpHeight < lineHight ? lineHight : tmpHeight;        if (cell.style.height) cell.style.height = "";        cell.rowSpan == 1 ? cell.setAttribute("height", height) : (cell.removeAttribute && cell.removeAttribute("height"));    }    function getWidth(cell) {        if (!cell)return 0;        return parseInt(domUtils.getComputedStyle(cell, "width"), 10);    }    function changeColWidth(cell, changeValue) {        var ut = getUETable(cell);        if (ut) {            //根据当前移动的边框获取相关的单元格            var table = ut.table,                cells = getCellsByMoveBorder( cell, table );            table.style.width = "";            table.removeAttribute("width");            //修正改变量            changeValue = correctChangeValue( changeValue, cell, cells );            if (cell.nextSibling) {                var i=0;                utils.each( cells, function( cellGroup ){                    cellGroup.left.width = (+cellGroup.left.width)+changeValue;                    cellGroup.right && ( cellGroup.right.width = (+cellGroup.right.width)-changeValue );                } );            } else {                utils.each( cells, function( cellGroup ){                    cellGroup.left.width -= -changeValue;                } );            }        }    }    function isEditorDisabled() {        return me.body.contentEditable === "false";    }    function changeRowHeight(td, changeValue) {        if (Math.abs(changeValue) < 10) return;        var ut = getUETable(td);        if (ut) {            var cells = ut.getSameEndPosCells(td, "y"),            //备份需要连带变化的td的原始高度,否则后期无法获取正确的值                backHeight = cells[0] ? cells[0].offsetHeight : 0;            for (var i = 0, cell; cell = cells[i++];) {                setCellHeight(cell, changeValue, backHeight);            }        }    }    /**     * 获取调整单元格大小的相关单元格     * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格     */    function getCellsByMoveBorder( cell, table, isContainMergeCell ) {        if( !table ) {            table = domUtils.findParentByTagName( cell, 'table' );        }        if( !table ) {            return null;        }        //获取到该单元格所在行的序列号        var index = domUtils.getNodeIndex( cell ),            temp = cell,            rows = table.rows,            colIndex = 0;        while( temp ) {            //获取到当前单元格在未发生单元格合并时的序列            if( temp.nodeType === 1 ) {                colIndex += (temp.colSpan || 1);            }            temp = temp.previousSibling;        }        temp = null;        //记录想关的单元格        var borderCells = [];        utils.each(rows, function( tabRow ){            var cells = tabRow.cells,                currIndex = 0;            utils.each( cells, function( tabCell ){                currIndex += (tabCell.colSpan || 1);                if( currIndex === colIndex ) {                    borderCells.push({                        left: tabCell,                        right: tabCell.nextSibling || null                    });                    return false;                } else if( currIndex > colIndex ) {                    if( isContainMergeCell ) {                        borderCells.push({                            left: tabCell                        });                    }                    return false;                }            } );        });        return borderCells;    }    /**     * 通过给定的单元格集合获取最小的单元格width     */    function getMinWidthByTableCells( cells ) {        var minWidth = Number.MAX_VALUE;        for( var i = 0, curCell; curCell = cells[ i ] ; i++ ) {            minWidth = Math.min( minWidth, curCell.width || getTableCellWidth( curCell ) );        }        return minWidth;    }    function correctChangeValue( changeValue, relatedCell, cells ) {        //为单元格的paading预留空间        changeValue -= getTabcellSpace();        if( changeValue < 0 ) {            return 0;        }        changeValue -= getTableCellWidth( relatedCell );        //确定方向        var direction = changeValue < 0 ? 'left':'right';        changeValue = Math.abs(changeValue);        //只关心非最后一个单元格就可以        utils.each( cells, function( cellGroup ){            var curCell = cellGroup[direction];            //为单元格保留最小空间            if( curCell ) {                changeValue = Math.min( changeValue, getTableCellWidth( curCell )-cellMinWidth );            }        } );        //修正越界        changeValue = changeValue < 0 ? 0 : changeValue;        return direction === 'left' ? -changeValue : changeValue;    }    function getTableCellWidth( cell ) {        var width = 0,            //偏移纠正量            offset = 0,            width = cell.offsetWidth - getTabcellSpace();        //最后一个节点纠正一下        if( !cell.nextSibling ) {            width -= getTableCellOffset( cell );        }        width = width < 0 ? 0 : width;        try {            cell.width = width;        } catch(e) {        }        return width;    }    /**     * 获取单元格所在表格的最末单元格的偏移量     */    function getTableCellOffset( cell ) {        tab = domUtils.findParentByTagName( cell, "table", false);        if( tab.offsetVal === undefined ) {            var prev = cell.previousSibling;            if( prev ) {                //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立                tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0;            } else {                tab.offsetVal = 0;            }        }        return tab.offsetVal;    }    function getTabcellSpace() {        if( UT.tabcellSpace === undefined ) {            var cell = null,                tab = me.document.createElement("table"),                tbody = me.document.createElement("tbody"),                trow = me.document.createElement("tr"),                tabcell = me.document.createElement("td"),                mirror = null;            tabcell.style.cssText = 'border: 0;';            tabcell.width = 1;            trow.appendChild( tabcell );            trow.appendChild( mirror = tabcell.cloneNode( false ) );            tbody.appendChild( trow );            tab.appendChild( tbody );            tab.style.cssText = "visibility: hidden;";            me.body.appendChild( tab );            UT.paddingSpace = tabcell.offsetWidth - 1;            var tmpTabWidth = tab.offsetWidth;            tabcell.style.cssText = '';            mirror.style.cssText = '';            UT.borderWidth = ( tab.offsetWidth - tmpTabWidth ) / 3;            UT.tabcellSpace = UT.paddingSpace + UT.borderWidth;            me.body.removeChild( tab );        }        getTabcellSpace = function(){ return UT.tabcellSpace; };        return UT.tabcellSpace;    }    function getDragLine(editor, doc) {        if (mousedown)return;        dragLine = editor.document.createElement("div");        domUtils.setAttributes(dragLine, {            id:"ue_tableDragLine",            unselectable:'on',            contenteditable:false,            'onresizestart':'return false',            'ondragstart':'return false',            'onselectstart':'return false',            style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"        });        editor.body.appendChild(dragLine);    }    function hideDragLine(editor) {        if (mousedown)return;        var line;        while (line = editor.document.getElementById('ue_tableDragLine')) {            domUtils.remove(line)        }    }    /**     * 依据state(v|h)在cell位置显示横线     * @param state     * @param cell     */    function showDragLineAt(state, cell) {        if (!cell) return;        var table = domUtils.findParentByTagName(cell, "table"),            caption = table.getElementsByTagName('caption'),            width = table.offsetWidth,            height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0),            tablePos = domUtils.getXY(table),            cellPos = domUtils.getXY(cell), css;        switch (state) {            case "h":                css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth);                dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)';                break;            case "v":                css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight );                //必须加上border:0和color:blue,否则低版ie不支持背景色显示                dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)';                break;            default:        }    }    /**     * 当表格边框颜色为白色时设置为虚线,true为添加虚线     * @param editor     * @param flag     */    function switchBorderColor(editor, flag) {        var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color;        for (var i = 0, node; node = tableArr[i++];) {            var td = domUtils.getElementsByTagName(node, "td");            if (td[0]) {                if (flag) {                    color = (td[0].style.borderColor).replace(/\s/g, "");                    if (/(#ffffff)|(rgb\(255,255,255\))/ig.test(color))                        domUtils.addClass(node, "noBorderTable")                } else {                    domUtils.removeClasses(node, "noBorderTable")                }            }        }    }    function getTableWidth(editor, needIEHack, defaultValue) {        var body = editor.body;        return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0);    }    /**     * 获取当前拖动的单元格     */    function getTargetTd(editor, evt) {        var target = domUtils.findParentByTagName(evt.target || evt.srcElement, ["td", "th"], true),            dir = null;        if( !target ) {            return null;        }        dir = getRelation( target, mouseCoords( evt ) );        //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td        if( !target ) {            return null;        }        if( dir === 'h1' && target.previousSibling ) {            var position = domUtils.getXY( target),                cellWidth = target.offsetWidth;            if( Math.abs( position.x + cellWidth - evt.clientX ) > cellWidth / 3 ) {                target = target.previousSibling;            }        } else if( dir === 'v1' && target.parentNode.previousSibling ) {            var position = domUtils.getXY( target),                cellHeight = target.offsetHeight;            if( Math.abs( position.y + cellHeight - evt.clientY ) > cellHeight / 3 ) {                target = target.parentNode.previousSibling.firstChild;            }        }        //排除了非td内部以及用于代码高亮部分的td        return target && !(editor.fireEvent("excludetable", target) === true) ? target : null;    }};
 |