(function($) { var fixCellIndexes = function(table) { var rows = table.rows; var len = rows.length; var matrix = []; for (var i = 0; i < len; i++) { var cells = rows[i].cells; var clen = cells.length; for (var j = 0; j < clen; j++) { var c = cells[j]; var rowSpan = c.rowSpan || 1; var colSpan = c.colSpan || 1; var firstAvailCol = -1; if (!matrix[i]) { matrix[i] = [] } var m = matrix[i]; while (m[++firstAvailCol]) { } c.realIndex = firstAvailCol; for (var k = i; k < i + rowSpan; k++) { if (!matrix[k]) { matrix[k] = [] } var matrixrow = matrix[k]; for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) { matrixrow[l] = 1 } } } } }; $.fn.columnHover = function(options) { var settings = $.extend({ hoverClass: 'hover', eachCell: false, includeSpans: true, ignoreCols: [] }, options); var hover = function(cell, colIndex, on) { var a = colIndex[cell.realIndex]; var i = 0; if ($(settings.ignoreCols).index(cell.realIndex + 1) != -1) { return } while (++i < cell.colSpan) { a = a.concat(colIndex[cell.realIndex + i]) } if (on) { $(a).addClass(settings.hoverClass) } else { $(a).removeClass(settings.hoverClass) } }; var addHover = function($s, colIndex) { $s.bind('mouseover', function() { hover(this, colIndex, true) }).bind('mouseout', function() { hover(this, colIndex, false) }) }; return this.each(function() { var colIndex = []; var tbl = this; var body, row, c, tboI, rowI, cI, rI, s; if (!tbl.tBodies || !tbl.tBodies.length || !tbl.tHead || !settings.hoverClass.length) { return } fixCellIndexes(tbl); for (tboI = -1; tboI < tbl.tBodies.length; tboI++) { if (tboI == -1) { body = tbl.tHead } else { body = tbl.tBodies[tboI] } for (rowI = 0; rowI < body.rows.length; rowI++) { row = body.rows[rowI]; for (cI = 0; cI < row.cells.length; cI++) { c = row.cells[cI]; if (!settings.includeSpans && c.colSpan > 1) { continue } s = (settings.includeSpans) ? c.colSpan : 1; while (--s >= 0) { rI = c.realIndex + s; if (!colIndex[rI]) { colIndex[rI] = [] } colIndex[rI].push(c) } if (settings.eachCell) { addHover($(c), colIndex) } } } } addHover($('td, th', tbl.tHead), colIndex); if (settings.eachCell && tbl.tFoot) { addHover($('td, th', tbl.tFoot), colIndex) } }) } })(jQuery);
