/* Copyright (c) 2009 Mustafa OZCAN (http://www.mustafaozcan.net) * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. * Version: 1.0.2 * Requires: jquery.1.3+ */ jQuery.fn.fixedtableheader = function(options) { var settings = jQuery.extend({ headerrowsize: 1, highlightrow: false, highlightclass: "highlight", top : "0" }, options); this.each(function(i) { var $tbl = $(this); var $tblhfixed = $tbl.find("tr.header"); var headerelement = "th"; if ($tblhfixed.find(headerelement).length == 0) { headerelement = "td"; } if ($tblhfixed.find(headerelement).length > 0) { $tblhfixed.find(headerelement).each(function() { $(this).css("width", $(this).width()); }); var $clonedTable = $tbl.clone().empty(); var tblwidth = GetTblWidth($tbl); $clonedTable.attr("id", "fixedtableheader" + i) .css({ "position": "fixed", "top": settings.top, "left": $tbl.offset().left }) .append($('').append($tblhfixed.clone())) .width(tblwidth) .hide() .addClass('fixed-header-block') .appendTo($("body")); if (settings.highlightrow) { $("tr:gt(" + (settings.headerrowsize - 1) + ")", $tbl) .hover( function() { $(this).addClass(settings.highlightclass); }, function() { $(this).removeClass(settings.highlightclass); }); } $(window).scroll(function() { if (jQuery.browser.msie && jQuery.browser.version == "6.0") { $clonedTable.css({ "position": "absolute", "top": settings.top + $(window).scrollTop(), "left": $tbl.offset().left }); } else { $clonedTable.css({ "position": "fixed", "top": settings.top, "left": $tbl.offset().left - $(window).scrollLeft() }); } var sctop = $(window).scrollTop(); var elmtop = $tblhfixed.offset().top; if (sctop > elmtop && sctop <= (elmtop + $tbl.height() - $tblhfixed.height())) { $clonedTable.show(); } else { $clonedTable.hide(); } }); $(window).resize(function() { if ($clonedTable.outerWidth() != $tbl.outerWidth()) { $tblhfixed.find(headerelement).each(function(index) { var w = $(this).width(); $(this).css("width", w); $clonedTable.find(headerelement).eq(index).css("width", w); }); $clonedTable.width($tbl.outerWidth()); } $clonedTable.css("left", $tbl.offset().left); }); } }); function GetTblWidth($tbl) { var tblwidth = $tbl.outerWidth(); return tblwidth; } };