/* 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($('<thead>').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;
    }
};