tableEditor.js
上传用户:simon2hong
上传日期:2021-11-18
资源大小:16746k
文件大小:26k
源码类别:

OA系统

开发平台:

C#

  1. ///////////////////////////////////////////////////////////////
  2. // Table Editing Class
  3. // Author:  Billy Cook (wcook@nuvox.net)
  4. // Date:    2002-05-07
  5. // Purpose: Provide methods to edit a table.  Only
  6. //          works in Internet Explorer version 5.5
  7. //          and above for now.
  8. //
  9. function tableEditor(docID, pntCell) {
  10.    this.docID = docID;        // ID of editable portion of document
  11.    this.pntCell = pntCell;    // TD contentarea is contained in if any
  12.    this.tableCell = null;     // cell currently selected
  13.    this.tableElem = null;     // table currently selected
  14.    this.cellResizeObj = null; // object that user clicks on to resize cell
  15.    this.cellWidth = null;     // selected cell's current width
  16.    this.cellHeight = null;    // selected cell's current height
  17.    this.cellX = null;         // x coord of selected cell's bottom right 
  18.    this.cellY = null;         // y coord of selected cell's bottom right
  19.    this.moveable = null;      // moveable div
  20.    // define methods only once
  21.    if (typeof(_tableEditor_prototype_called) == 'undefined') {
  22.       _tableEditor_prototype_called = true;
  23.       // public methods
  24.       tableEditor.prototype.mergeDown = mergeDown;
  25.       tableEditor.prototype.unMergeDown = unMergeDown;
  26.       tableEditor.prototype.mergeRight = mergeRight;
  27.       tableEditor.prototype.splitCell = splitCell;
  28.       tableEditor.prototype.addCell = addCell;
  29.       tableEditor.prototype.removeCell = removeCell;
  30.       tableEditor.prototype.processRow = processRow;
  31.       tableEditor.prototype.processColumn = processColumn;
  32.       tableEditor.prototype.buildTable = buildTable;
  33.       tableEditor.prototype.setTableElements = setTableElements;
  34.       tableEditor.prototype.unSetTableElements = unSetTableElements;
  35.       tableEditor.prototype.setDrag = setDrag;
  36.       tableEditor.prototype.stopCellResize = stopCellResize;
  37.       tableEditor.prototype.markCellResize = markCellResize;
  38.       tableEditor.prototype.resizeCell = resizeCell;
  39.       tableEditor.prototype.changePos = changePos;
  40.       tableEditor.prototype.resizeColumn = resizeColumn;
  41.       tableEditor.prototype.resizeRow = resizeRow;
  42.       tableEditor.prototype.repositionArrows = repositionArrows;
  43.       tableEditor.prototype.explore = explore;
  44.       // private methods
  45.       tableEditor.prototype.__addOrRemoveCols = __addOrRemoveCols;
  46.       tableEditor.prototype.__findParentTable = __findParentTable;
  47.       tableEditor.prototype.__hideArrows = __hideArrows;
  48.       tableEditor.prototype.__showArrows = __showArrows;
  49.       tableEditor.prototype.__resizeColumn = __resizeColumn;
  50.    }
  51.    // create divs for editing cell width and height
  52.    document.body.innerHTML += ' <div id="rArrow" title="Drag to modify cell width." style="position:absolute; visibility:hidden; cursor: E-resize; z-index: 1" onmousedown="tEdit.markCellResize(this)" onmouseup="tEdit.stopCellResize(false)" ondragstart="handleDrag(0)"> <table border="0" cellpadding="0" cellspacing="0" width="7" height="7"> <tr><td bgcolor="#000000"></td></tr> </table> </div> <div id="dArrow" title="Drag to modify cell height." style="position:absolute; visibility:hidden; cursor: S-resize; z-index: 1" onmousedown="tEdit.markCellResize(this)" onmouseup="tEdit.stopCellResize(false)" ondragstart="handleDrag(0)"> <table border="0" cellpadding="0" cellspacing="0" width="7" height="7"> <tr><td bgcolor="#000000"></td></tr> </table> </div>';
  53.    ////////////////////////////////////////////////////////////////
  54.    //  method: setTableElements
  55.    //    args: none
  56.    // purpose: look to see if the cursor is inside a TD or TABLE and
  57.    //          if so assign the TD to this.tableCell or the TABLE to
  58.    //          this.tableElem
  59.    //
  60.    function setTableElements(){
  61.       // stop resizing cell if already resizing one
  62.       this.stopCellResize(true);
  63.       this.tableCell = null;
  64.       
  65.       cursorPos=document.selection.createRange();
  66.       if (document.selection.type == 'Text') {
  67.          var elt = cursorPos.parentElement(); 
  68.          while (elt) {
  69.             if (elt.tagName == "TD") {
  70.                break;
  71.             }
  72.             elt = elt.parentElement;
  73.          }
  74.          if (elt) {
  75.             // don't select document area
  76.             if (elt.id == this.docID)
  77.                return;
  78.             // don't select parent TD
  79.             if (this.pntCell)
  80.                if (this.pntCell == elt.id)
  81.                   return;
  82.             this.tableCell = elt;
  83.             // set width and height as globals for 
  84.             // resizing
  85.             this.cellWidth = this.tableCell.offsetWidth;
  86.             this.cellHeight = this.tableCell.offsetHeight;
  87.             this.__showArrows();
  88.          }
  89.       } else {
  90.          if (cursorPos.length == 1) {
  91.             if (cursorPos.item(0).tagName == "TABLE") {
  92.                this.tableElem = cursorPos.item(0);
  93.                this.__hideArrows();
  94.                this.tableCell = null;
  95.             }
  96.          }
  97.       }
  98.    }
  99.    ////////////////////////////////////////////////////////////////
  100.    //  method: unSetTableElements
  101.    //    args: none
  102.    // purpose: unset references to currently selected cell or table 
  103.    //          
  104.    function unSetTableElements(){
  105.       this.tableCell = null;
  106.       this.tableElem = null;
  107.       return;
  108.    }
  109.    ////////////////////////////////////////////////////////////////
  110.    //  method: mergeDown
  111.    //    args: none
  112.    // purpose: merge the currently selected cell with the one below it
  113.    //
  114.    function mergeDown() {
  115.       if (!this.tableCell)
  116.          return;
  117.       
  118.       if (!this.tableCell.parentNode.nextSibling) {
  119.          alert("下方无单元格可合并!");
  120.          return;
  121.       }
  122.       var topRowIndex = this.tableCell.parentNode.rowIndex;
  123.       //               [  TD   ] [  TR    ] [  TBODY ] [                   TR                      ] [            TD                 ]
  124.       var bottomCell = this.tableCell.parentNode.parentNode.childNodes[ topRowIndex + this.tableCell.rowSpan ].childNodes[ this.tableCell.cellIndex ];
  125.       if (!bottomCell) {
  126.          alert("下方无单元格可合并!");
  127.          return;
  128.       }
  129.       // don't allow merging rows with different colspans
  130.       if (this.tableCell.colSpan != bottomCell.colSpan) {
  131.          alert("列跨距不同,不能合并单元格!"); 
  132.          return;
  133.       }
  134.       // do the merge
  135.       this.tableCell.innerHTML += bottomCell.innerHTML;
  136.       this.tableCell.rowSpan += bottomCell.rowSpan;
  137.       bottomCell.removeNode(true); 
  138.       this.repositionArrows();
  139.    }
  140.    ////////////////////////////////////////////////////////////////
  141.    //  method: unMergeDown
  142.    //    args: none
  143.    // purpose: merge the currently selected cell with the one below it
  144.    //
  145.    function unMergeDown() {
  146.       if (!this.tableCell)
  147.          return;
  148.       
  149.       if (this.tableCell.rowSpan <= 1) {
  150.          alert("行跨距已经为1");
  151.          return;
  152.       }
  153.       var topRowIndex = this.tableCell.parentNode.rowIndex;
  154.       // add a cell to the beginning of the next row
  155.       this.tableCell.parentNode.parentNode.childNodes[ topRowIndex + this.tableCell.rowSpan - 1 ].appendChild( document.createElement("TD") );
  156.       this.tableCell.rowSpan -= 1;
  157.    }
  158.    ////////////////////////////////////////////////////////////////
  159.    //  method: mergeRight
  160.    //    args: none
  161.    // purpose: merge the currently selected cell with the one to 
  162.    //          the immediate right.  Won't allow user to merge cells
  163.    //          with different rowspans.
  164.    //
  165.    function mergeRight() {
  166.       if (!this.tableCell)
  167.          return;
  168.       if (!this.tableCell.nextSibling)
  169.          return;
  170.       // don't allow user to merge rows with different rowspans
  171.       if (this.tableCell.rowSpan != this.tableCell.nextSibling.rowSpan) {
  172.          alert("行跨距不同,不能合并单元格!");
  173.          return;
  174.       }
  175.       this.tableCell.innerHTML += this.tableCell.nextSibling.innerHTML;
  176.       this.tableCell.colSpan += this.tableCell.nextSibling.colSpan;
  177.       this.tableCell.nextSibling.removeNode(true);
  178.        
  179.       this.repositionArrows();
  180.       this.__hideArrows();
  181.       this.tableCell = null;
  182.    }
  183.    ////////////////////////////////////////////////////////////////
  184.    //  method: splitCell 
  185.    //    args: none
  186.    // purpose: split the currently selected cell back into two cells 
  187.    //          it the cell has a colspan > 1.
  188.    //
  189.    function splitCell() {
  190.       if (!this.tableCell)
  191.          return;
  192.       if (this.tableCell.colSpan < 2) {
  193.          alert("单元格不能被拆分成多列!");
  194.          return;
  195.       }
  196.       this.tableCell.colSpan = this.tableCell.colSpan - 1;
  197.       var newCell = this.tableCell.parentNode.insertBefore( document.createElement("TD"), this.tableCell);
  198.       newCell.rowSpan = this.tableCell.rowSpan;
  199.       this.repositionArrows();
  200.    }
  201.    ////////////////////////////////////////////////////////////////
  202.    //  method: removeCell 
  203.    //    args: none
  204.    // purpose: remove the currently selected cell
  205.    //
  206.    function removeCell() {
  207.       if (!this.tableCell)
  208.          return;
  209.       // can't remove all cells for a row
  210.       if (!this.tableCell.previousSibling && !this.tableCell.nextSibling) {
  211.          alert("不能删除一行中仅有的一个单元格!");
  212.          return;
  213.       }
  214.       this.tableCell.removeNode(false);
  215.       this.repositionArrows();
  216.       this.tableCell = null;
  217.    } 
  218.  
  219.    ////////////////////////////////////////////////////////////////
  220.    //  method: addCell 
  221.    //    args: none
  222.    // purpose: add a cell to the right of the selected cell
  223.    //
  224.    function addCell() {
  225.       if (!this.tableCell)
  226.          return;
  227.       this.tableCell.parentElement.insertBefore(document.createElement("TD"), this.tableCell.nextSibling);
  228.    }
  229.    ////////////////////////////////////////////////////////////////
  230.    //  method: processRow 
  231.    //    args: (string)action = "add" or "remove"
  232.    // purpose: add a row above the row that 
  233.    //          contains the currently selected cell or
  234.    //          remove the row containing the selected cell
  235.    //
  236.    function processRow(action) {
  237.       if (!this.tableCell)
  238.         return;
  239.       // go back to TABLE def and keep track of cell index
  240.       var idx = 0;
  241.       var rowidx = -1;
  242.       var tr = this.tableCell.parentNode;
  243.       var numcells = tr.childNodes.length;
  244.       var action_desc;
  245.      
  246.       while (tr) {
  247.          if (tr.tagName == "TR")
  248.             rowidx++;
  249.          tr = tr.previousSibling;
  250.       }
  251.       // now we should have a row index indicating where the
  252.       // row should be added / removed
  253.       var tbl = this.__findParentTable(this.tableCell);
  254.   
  255.       if (action == "add")
  256.           action_desc="插入";
  257.       else
  258.          action_desc="删除";
  259.       
  260.       if (!tbl) {
  261.          alert("不能" + action_desc + "行");
  262.          return;
  263.       }
  264.      
  265.       if (action == "add") {
  266.          var r = tbl.insertRow(rowidx);
  267.          for (var i = 0; i < numcells; i++) {
  268.             var c = r.appendChild( document.createElement("TD") );
  269.             if (this.tableCell.parentNode.childNodes[i].colSpan)
  270.                c.colSpan = this.tableCell.parentNode.childNodes[i].colSpan;
  271.          }
  272.       } else {
  273.          tbl.deleteRow(rowidx);
  274.          this.stopCellResize(true);
  275.          this.tableCell = null;
  276.       }
  277.    }
  278.    ////////////////////////////////////////////////////////////////
  279.    //  method: processColumn
  280.    //    args: (string)action = "add" or "remove"
  281.    // purpose: add a column to the right column containing
  282.    //          the selected cell
  283.    //
  284.    function processColumn(action) {
  285.       if (!this.tableCell)
  286.         return;
  287.       // store cell index in a var because the cell will be
  288.       // deleted when processing the first row
  289.       var cellidx = this.tableCell.cellIndex;
  290.       var action_desc;
  291.       var tbl = this.__findParentTable(this.tableCell);
  292.   
  293.       if (action == "add")
  294.           action_desc="插入";
  295.       else
  296.          action_desc="删除";
  297.       if (!tbl) {
  298.          alert("不能" + action_desc + "列");
  299.          return;
  300.       }
  301.          
  302.       // now we have the table containing the cell
  303.       this.__addOrRemoveCols(tbl, cellidx, action);
  304.       // clear out global this.tableCell value for remove
  305.       if (action == 'remove') {
  306.          this.stopCellResize(true);
  307.          this.tableCell = null;
  308.       } else {
  309.          this.repositionArrows();
  310.       }
  311.    }
  312.    ////////////////////////////////////////////////////////////////
  313.    //  method: __addOrRemoveCols
  314.    //    args: (table object)tbl, (int)cellidx, (string)action
  315.    //          tbl = the table containing the selected cell
  316.    //          cellidx = the index of the selected cell in its row
  317.    //          action = "add" or "remove" the column
  318.    //
  319.    // purpose: add or remove the column at the cell index
  320.    //
  321.    function __addOrRemoveCols(tbl, cellidx, action) {
  322.       if (!tbl.childNodes.length)
  323.          return;
  324.       var i;
  325.       for (i = 0; i < tbl.childNodes.length; i++) {
  326.          if (tbl.childNodes[i].tagName == "TR") {
  327.             var cell = tbl.childNodes[i].childNodes[ cellidx ];
  328.             if (!cell)
  329.                break; // can't add cell after cell that doesn't exist
  330.             if (action == "add") {
  331.                cell.insertAdjacentElement("AfterEnd",  document.createElement("TD") );
  332.             } else {
  333.                // don't delete too many cells because or a rowspan setting
  334.                  
  335.                if (cell.rowSpan > 1) {
  336.                   i += (cell.rowSpan - 1);
  337.                }
  338.                cell.removeNode(true);
  339.             }
  340.          } else {
  341.             // keep looking for a "TR"
  342.             this.__addOrRemoveCols(tbl.childNodes[i], cellidx, action); 
  343.          }
  344.       }
  345.    }
  346.    ////////////////////////////////////////////////////////////////
  347.    //  method: __findParentTable 
  348.    //    args: (TD object)cell
  349.    //          cell = the selected cell object
  350.    //
  351.    // purpose: locate the table object that contains the
  352.    //          cell object passed in
  353.    //
  354.    function __findParentTable(cell) {
  355.       var tbl = cell.parentElement
  356.       while (tbl) {
  357.          if (tbl.tagName == "TABLE") {
  358.             return tbl;
  359.          }
  360.          tbl = tbl.parentElement;
  361.       }
  362.       return false;
  363.    }
  364.    ////////////////////////////////////////////////////////////////
  365.    //  method: exploreTree 
  366.    //    args: (obj)obj, (obj)pnt
  367.    //          obj = object to explore
  368.    //          pnt = object to append output to
  369.    //
  370.    // purpose: traverse the dom tree printing out all properties
  371.    //          of the object, its children.....recursive.  helpful
  372.    //          when looking for object properties.
  373.    //
  374.    function exploreTree(obj, pnt) {
  375.       if (!obj.childNodes.length)
  376.          return;
  377.       var i;
  378.       var ul = pnt.appendChild( document.createElement("UL") );
  379.       for (i = 0; i < obj.childNodes.length; i++) {
  380.          var li = document.createElement("LI");
  381.          explore(obj.childNodes[i], li);
  382.          ul.appendChild(li);
  383.          exploreTree(obj.childNodes[i], li); 
  384.          /*
  385.          var n = document.createTextNode(obj.childNodes[i].tagName);
  386.          li.appendChild(n);
  387.          */
  388.       }
  389.    }
  390.    ////////////////////////////////////////////////////////////////
  391.    //  method: explore
  392.    //    args: (obj)obj, (obj)pnt
  393.    //          obj = object to explore
  394.    //          pnt = object to append output to
  395.    //
  396.    // purpose: show all properties for the object "obj"
  397.    //
  398.    function explore(obj, pnt) {
  399.       var i;
  400.       for (i in obj) {
  401.          var n = document.createTextNode(i +"="+obj[i]);
  402.          pnt.appendChild(n);
  403.          pnt.appendChild( document.createElement("BR") );
  404.       }
  405.    }
  406.    ////////////////////////////////////////////////////////////////
  407.    //  method: buildTable 
  408.    //    args: pnt = parent to append table to
  409.    //
  410.    // purpose: build a test table for debugging
  411.    //
  412.    function buildTable(pnt) {
  413.       var t = pnt.appendChild( document.createElement("TABLE") );
  414.       t.border=1;
  415.       t.cellPadding=2;
  416.       t.cellSpacing=0;
  417.       var tb = t.appendChild( document.createElement("TBODY") );
  418.       for(var r = 0; r < 10; r++) {
  419.          var tr = tb.appendChild( document.createElement("TR") );
  420.          for(var c = 0; c < 10; c++) {
  421.             var cell = tr.appendChild( document.createElement("TD") );
  422.             cell.appendChild( document.createTextNode(r+"-"+c) );
  423.          }
  424.       }
  425.    }
  426.    ////////////////////////////////////////////////////////////////
  427.    //  method: setDrag
  428.    //    args: obj = object (DIV) that is currently draggable
  429.    //
  430.    // purpose: set the object to be moved with the mouse
  431.    //
  432.    function setDrag(obj) {
  433.      if (this.moveable) 
  434.        this.moveable = null;
  435.      else 
  436.        this.moveable = obj; 
  437.    }
  438.    ////////////////////////////////////////////////////////////////
  439.    //  method: changePos
  440.    //    args: none
  441.    //          mouse pointer appear inside the object set by "setDrag"
  442.    //          function above.
  443.    //
  444.    // purpose: move the object selected in the "setDrag" function defined
  445.    //          above.
  446.    //
  447.    function changePos() {
  448.       if (!this.moveable) 
  449.          return;
  450.       this.moveable.style.posTop = event.clientY - 10;
  451.       this.moveable.style.posLeft = event.clientX - 25;
  452.    }
  453.    ////////////////////////////////////////////////////////////////
  454.    //  method: markCellResize
  455.    //    args: (object)obj = the square table div object that
  456.    //          was clicked on by the user to resize a cell
  457.    //
  458.    // purpose: store the object in "this.cellResizeObj" to be referenced
  459.    //          in the "resizeCell" function.
  460.    //          
  461.    //
  462.    function markCellResize(obj) {
  463.       if (this.cellResizeObj) {
  464.          this.cellResizeObj = null;
  465.       } else {
  466.          this.cellResizeObj = obj;
  467.       }
  468.    }
  469.    ////////////////////////////////////////////////////////////////
  470.    //  method: stopCellResize
  471.    //    args: (bool)hideArrows
  472.    //
  473.    // purpose: stop changing cell width and height
  474.    //
  475.    function stopCellResize(hidearrows) {
  476.       this.cellResizeObj = null;
  477.       if (hidearrows)
  478.          this.__hideArrows();
  479.    }
  480.    ////////////////////////////////////////////////////////////////
  481.    //  method: __hideArrows()
  482.    //    args: none
  483.    //
  484.    // purpose: hide editing tabs that are positioned in the selected
  485.    //          cell
  486.    //
  487.    function __hideArrows() {
  488.       document.getElementById("rArrow").style.visibility = 'hidden';
  489.       document.getElementById("dArrow").style.visibility = 'hidden';
  490.    }
  491.    ////////////////////////////////////////////////////////////////
  492.    //  method: __showArrows()
  493.    //    args: none
  494.    //
  495.    // purpose: position editing tabs in the middle or the right cell
  496.    //          wall and middle of the bottom wall to be used to drag
  497.    //          the cell's width and height dimensions
  498.    //
  499.    function __showArrows() {
  500.       if (!this.tableCell)
  501.          return;
  502.       var cell_hgt = this.tableCell.offsetTop;
  503.       var cell_wdt = this.tableCell.offsetLeft;
  504.       var par = this.tableCell.offsetParent;
  505.       while (par) {
  506.          cell_hgt = cell_hgt + par.offsetTop;
  507.          cell_wdt = cell_wdt + par.offsetLeft;
  508.          current_obj = par;
  509.          par = current_obj.offsetParent;
  510.       }
  511.       this.cellX = cell_wdt + this.tableCell.offsetWidth; //bottom right X
  512.       this.cellY = cell_hgt + this.tableCell.offsetHeight; // bottom right Y
  513.       var scrollTop = document.getElementById(this.docID).scrollTop;
  514.       var scrollLeft = document.getElementById(this.docID).scrollLeft;
  515.       document.getElementById("rArrow").style.posLeft = cell_wdt + this.tableCell.offsetWidth - 6 - scrollLeft;
  516.       document.getElementById("rArrow").style.posTop = cell_hgt + (this.tableCell.offsetHeight / 2) - 2 - scrollTop;
  517.       document.getElementById("dArrow").style.posLeft = cell_wdt + (this.tableCell.offsetWidth / 2) - 2 - scrollLeft;
  518.       document.getElementById("dArrow").style.posTop = cell_hgt + this.tableCell.offsetHeight - 6 - scrollTop;
  519.       document.getElementById("rArrow").style.visibility = 'visible';
  520.       document.getElementById("dArrow").style.visibility = 'visible';
  521.    }
  522.    ////////////////////////////////////////////////////////////////
  523.    //  method: repositionArrows()
  524.    //    args: none
  525.    //
  526.    // purpose: reposition editing tabs in the middle or the right cell
  527.    //          wall and middle of the bottom wall to be used to drag
  528.    //          the cell's width and height dimensions.  this must be
  529.    //          run while changing the cell's dimensions.
  530.    //
  531.    function repositionArrows() {
  532.       if (!this.tableCell)
  533.          return;
  534.       var cell_hgt = this.tableCell.offsetTop;
  535.       var cell_wdt = this.tableCell.offsetLeft;
  536.       var par = this.tableCell.offsetParent;
  537.       while (par) {
  538.          cell_hgt = cell_hgt + par.offsetTop;
  539.          cell_wdt = cell_wdt + par.offsetLeft;
  540.          current_obj = par;
  541.          par = current_obj.offsetParent;
  542.       }
  543.       var scrollTop = document.getElementById(this.docID).scrollTop;
  544.       var scrollLeft = document.getElementById(this.docID).scrollLeft;
  545.       document.getElementById("rArrow").style.posLeft = cell_wdt + this.tableCell.offsetWidth - 6 - scrollLeft;
  546.       document.getElementById("rArrow").style.posTop = cell_hgt + (this.tableCell.offsetHeight / 2) - 2 - scrollTop;
  547.       document.getElementById("dArrow").style.posLeft = cell_wdt + (this.tableCell.offsetWidth / 2) - 2 - scrollLeft; 
  548.       document.getElementById("dArrow").style.posTop = cell_hgt + this.tableCell.offsetHeight - 6 - scrollTop;
  549.    }
  550.    ////////////////////////////////////////////////////////////////
  551.    //  method: resizeCell()
  552.    //    args: none
  553.    //
  554.    // purpose: resize the selected cell based on the direction of the mouse
  555.    //
  556.    function resizeCell() {
  557.       if (!this.cellResizeObj)
  558.          return;
  559.       if (this.cellResizeObj.id == 'dArrow') {
  560.          var scrollTop = document.getElementById(this.docID).scrollTop;
  561.          var newHeight = (event.clientY - (this.cellY - scrollTop) ) + this.cellHeight;
  562.          if (newHeight > 0)
  563.             // don't resize entire row if rowspan > 1
  564.             if (this.tableCell.rowSpan > 1) 
  565.                this.tableCell.style.height = newHeight;
  566.             else 
  567.                this.resizeRow(newHeight);
  568.          this.repositionArrows();
  569.       } else if (this.cellResizeObj.id == 'rArrow') {
  570.          var scrollLeft = document.getElementById(this.docID).scrollLeft;
  571.          var newWidth = (event.clientX - (this.cellX - scrollLeft) ) + this.cellWidth;
  572.          if (newWidth > 0) 
  573.             // don't resize entire column if colspan > 1
  574.             if (this.tableCell.colSpan > 1)
  575.                this.tableCell.style.width = newWidth;
  576.             else
  577.                this.resizeColumn(newWidth);
  578.          this.repositionArrows();
  579.       } else {
  580.          // do nothing
  581.       }
  582.    }
  583.    ////////////////////////////////////////////////////////////////
  584.    //  method: resizeRow 
  585.    //    args: (int)size
  586.    // purpose: set cell.style.height on all cells in a row that
  587.    //          have rowspan = 1 
  588.    //
  589.    function resizeRow(size) {
  590.       if (!this.tableCell)
  591.         return;
  592.       // go back to TABLE def and keep track of cell index
  593.       var idx = 0;
  594.       var rowidx = -1;
  595.       var tr = this.tableCell.parentNode;
  596.       var numcells = tr.childNodes.length;
  597.       while (tr) {
  598.          if (tr.tagName == "TR")
  599.             rowidx++;
  600.          tr = tr.previousSibling;
  601.       }
  602.       // now we should have a row index indicating where the
  603.       // row should be added / removed
  604.       var tbl = this.__findParentTable(this.tableCell);
  605.   
  606.       if (!tbl) {
  607.          return;
  608.       }
  609.      
  610.       // resize cells in the row
  611.       for (var j = 0; j < tbl.rows(rowidx).cells.length; j++) {
  612.          if (tbl.rows(rowidx).cells(j).rowSpan == 1)
  613.             tbl.rows(rowidx).cells(j).style.height = size;
  614.       }
  615.    }
  616.    ////////////////////////////////////////////////////////////////
  617.    //  method: resizeColumn 
  618.    //    args: (int)size = size in pixels
  619.    // purpose: set column width
  620.    //
  621.    function resizeColumn(size) {
  622.       if (!this.tableCell)
  623.         return;
  624.       // store cell index in a var because the cell will be
  625.       // deleted when processing the first row
  626.       var cellidx = this.tableCell.cellIndex;
  627.       
  628.       var tbl = this.__findParentTable(this.tableCell);
  629.   
  630.       if (!tbl) {
  631.          alert("不能改变列宽!");
  632.          return;
  633.       }
  634.          
  635.       // now we have the table containing the cell
  636.       this.__resizeColumn(tbl, cellidx, size);
  637.    }
  638.    ////////////////////////////////////////////////////////////////
  639.    //  method: __resizeColumn
  640.    //    args: (table object)tbl, (int)cellidx, (int)size
  641.    //          tbl = the table containing the selected cell
  642.    //          cellidx = the index of the selected cell in its row
  643.    //          size = size in pixels
  644.    //
  645.    // purpose: resize all cells in the a column
  646.    //
  647.    function __resizeColumn(tbl, cellidx, size) {
  648.       if (!tbl.childNodes.length)
  649.          return;
  650.       var i;
  651.       for (i = 0; i < tbl.childNodes.length; i++) {
  652.          if (tbl.childNodes[i].tagName == "TR") {
  653.             var cell = tbl.childNodes[i].childNodes[ cellidx ];
  654.             if (!cell)
  655.                break; // can't add cell after cell that doesn't exist
  656.             if (cell.colSpan == 1)
  657.                cell.style.width = size;
  658.          } else {
  659.             // keep looking for a "TR"
  660.             this.__resizeColumn(tbl.childNodes[i], cellidx, size); 
  661.          }
  662.       }
  663.    }