/** * @requires Xquared.js * @requires rdom/Base.js */ xq.RichTable = xq.Class(/** @lends xq.RichTable.prototype */{ /** * TODO: Add description * * @constructs */ initialize: function(rdom, table) { xq.addToFinalizeQueue(this); this.rdom = rdom; this.table = table; }, insertNewRowAt: function(tr, where) { var row = this.rdom.createElement("TR"); var cells = tr.cells; for(var i = 0; i < cells.length; i++) { var cell = this.rdom.createElement(cells[i].nodeName); this.rdom.correctEmptyElement(cell); row.appendChild(cell); } return this.rdom.insertNodeAt(row, tr, where); }, insertNewCellAt: function(cell, where) { // collect cells; var cells = []; var x = this.getXIndexOf(cell); var y = 0; while(true) { var cur = this.getCellAt(x, y); if(!cur) break; cells.push(cur); y++; } // insert new cells for(var i = 0; i < cells.length; i++) { var cell = this.rdom.createElement(cells[i].nodeName); this.rdom.correctEmptyElement(cell); this.rdom.insertNodeAt(cell, cells[i], where); } }, deleteRow: function(tr) { return this.rdom.removeBlock(tr); }, deleteCell: function(cell) { if(!cell.previousSibling && !cell.nextSibling) { this.rdom.deleteNode(this.table); return; } // collect cells; var cells = []; var x = this.getXIndexOf(cell); var y = 0; while(true) { var cur = this.getCellAt(x, y); if(!cur) break; cells.push(cur); y++; } for(var i = 0; i < cells.length; i++) { this.rdom.deleteNode(cells[i]); } }, getPreviousCellOf: function(cell) { if(cell.previousSibling) return cell.previousSibling; var adjRow = this.getPreviousRowOf(cell.parentNode); if(adjRow) return adjRow.lastChild; return null; }, getNextCellOf: function(cell) { if(cell.nextSibling) return cell.nextSibling; var adjRow = this.getNextRowOf(cell.parentNode); if(adjRow) return adjRow.firstChild; return null; }, getPreviousRowOf: function(row) { if(row.previousSibling) return row.previousSibling; var rowContainer = row.parentNode; if(rowContainer.previousSibling && rowContainer.previousSibling.lastChild) return rowContainer.previousSibling.lastChild; return null; }, getNextRowOf: function(row) { if(row.nextSibling) return row.nextSibling; var rowContainer = row.parentNode; if(rowContainer.nextSibling && rowContainer.nextSibling.firstChild) return rowContainer.nextSibling.firstChild; return null; }, getAboveCellOf: function(cell) { var row = this.getPreviousRowOf(cell.parentNode); if(!row) return null; var x = this.getXIndexOf(cell); return row.cells[x]; }, getBelowCellOf: function(cell) { var row = this.getNextRowOf(cell.parentNode); if(!row) return null; var x = this.getXIndexOf(cell); return row.cells[x]; }, getXIndexOf: function(cell) { var row = cell.parentNode; for(var i = 0; i < row.cells.length; i++) { if(row.cells[i] === cell) return i; } return -1; }, getYIndexOf: function(cell) { var y = -1; // find y var group = row.parentNode; for(var i = 0; i col) ? row.cells[col] : null; }, getRowAt: function(index) { if(this.hasHeadingAtTop()) { return index === 0 ? this.table.tHead.rows[0] : this.table.tBodies[0].rows[index - 1]; } else { var rows = this.table.tBodies[0].rows; return (rows.length > index) ? rows[index] : null; } }, getDom: function() { return this.table; }, hasHeadingAtTop: function() { return !!(this.table.tHead && this.table.tHead.rows[0]); }, hasHeadingAtLeft: function() { return this.table.tBodies[0].rows[0].cells[0].nodeName === "TH"; }, correctEmptyCells: function() { var cells = xq.$A(this.table.getElementsByTagName("TH")); var tds = xq.$A(this.table.getElementsByTagName("TD")); for(var i = 0; i < tds.length; i++) { cells.push(tds[i]); } for(var i = 0; i < cells.length; i++) { if(this.rdom.isEmptyBlock(cells[i])) this.rdom.correctEmptyElement(cells[i]) } } }); xq.RichTable.create = function(rdom, cols, rows, headerPositions) { if(["t", "tl", "lt"].indexOf(headerPositions) !== -1) var headingAtTop = true if(["l", "tl", "lt"].indexOf(headerPositions) !== -1) var headingAtLeft = true var sb = [] sb.push('') // thead if(headingAtTop) { sb.push('') for(var i = 0; i < cols; i++) sb.push('') sb.push('') rows -= 1 } // tbody sb.push('') for(var i = 0; i < rows; i++) { sb.push('') for(var j = 0; j < cols; j++) { if(headingAtLeft && j === 0) { sb.push('') } else { sb.push('') } } sb.push('') } sb.push('') sb.push('
') // create DOM element var container = rdom.createElement("div"); container.innerHTML = sb.join(""); // correct empty cells and return var rtable = new xq.RichTable(rdom, container.firstChild); rtable.correctEmptyCells(); return rtable; }