﻿// Scrollable Tables for IE and Mozilla
// License: http://www.gnu.org/licenses/gpl.txt
// Compressed by: http://dean.edwards.name/packer/
(function($) {
    var create = {
        elem: false
		, appendTo: false
		, width: 12
		, run: function() {
		    var $elem = create.elem
			, $append = create.appendTo
			, $width = create.width
			, $tr = $elem.find('tr');

		    if ($tr.length > 0) {
		        if ('' !== $elem[0].className) {
		            if ($append)
		                $append.addClass($elem[0].className);
		        }
		        $tr.each(function() {
		            var selfTR = this
					, tr = document.createElement('tr')
					, th = document.createElement('th');

		            if (!jQuery.browser.msie && !jQuery.browser.safari) {
		                $(th).addClass('scrollbar');
		            }
		            $(th).width($width).appendTo(selfTR);

		            $(selfTR).find('th').each(function() {
		                $(this).css({
		                    width: $(this).width()
							, backgroundColor: $(this).css('background-color')
		                }).clone(true).attr({
		                    rowSpan: this.rowSpan,
		                    colSpan: this.colSpan
		                }).appendTo(tr);
		            });
		            $(tr).appendTo($append);
		        });

		        if ('tfoot' === $elem[0].tagName.toLowerCase()) {
		            $elem.css('visibility', (($.browser.msie) ? 'hidden' : 'collapse'));
		        }


		    }

		    create.elem = false;
		    create.appendTo = false;
		}
    };
    $.fn.scrollableTable = function(options) {
        var opts = $.extend({},
        $.fn.scrollableTable.defaults, options);
        return this.each(function() {
            var scrolTable = $(this);
            opts.tableWidth = opts.tableWidth ? opts.tableWidth : scrolTable.width();
            opts.tableHeight = opts.tableHeight ? opts.tableHeight : scrolTable.height();

            var theadHeight = scrolTable.find("thead").height() ? scrolTable.find("thead").height() : 0;
            var tfootHeight = scrolTable.find("tfoot").height() ? scrolTable.find("tfoot").height() : 0;
            var tbodyHeight = scrolTable.find("tbody").height();
            var calulatedHeight = opts.tableHeight - (theadHeight + tfootHeight);

            if (jQuery.browser.msie || jQuery.browser.safari) {
                if (tbodyHeight >= calulatedHeight) {
                    var containerDiv = $("<div></div>");
                    containerDiv.insertBefore(scrolTable);
                    var tableFoot = scrolTable.find("tfoot");
                    var tableHead = scrolTable.find("thead");
                    if (tableHead) {
                        var headerTable = scrolTable.clone(true);
                        headerTable.find("tbody").remove();
                        headerTable.find("tfoot").remove();
                        headerTable.css("margin", "0px");
                        /*headerTable.width(opts.tableWidth - opts.scrollWidth);*/
                        scrolTable.find("thead").remove();
                        containerDiv.append(headerTable)

                        create.elem = headerTable.find('thead');
                        create.width = opts.scrollWidth;
                        create.run();
                    }
                    var tableDiv = $("<div></div>");
                    tableDiv.append(scrolTable);
                    tableDiv.width(opts.tableWidth);
                    tableDiv.css("overflow", "auto");
                    tableDiv.height(opts.tableHeight);
                    scrolTable.css("margin", "0px");
                    scrolTable.width(opts.tableWidth - opts.scrollWidth);
                    containerDiv.append(tableDiv);
                    if (tableFoot) {
                        var footerTable = scrolTable.clone(true);
                        footerTable.find("thead").remove();
                        footerTable.find("tbody").remove();
                        footerTable.css("margin", "0px");
                        footerTable.width(opts.tableWidth - opts.scrollWidth);
                        scrolTable.find("tfoot").remove();
                        containerDiv.append(footerTable)
                        containerDiv.css("border-bottom", "1px solid black");
                    }
                    $.scrollableTable.syncWidths(containerDiv, opts)
                }
            } else if (jQuery.browser.mozilla) {
                if (tbodyHeight >= calulatedHeight) {
                    create.elem = scrolTable.find("thead");
                    create.width = opts.scrollWidth;
                    create.run();
                    scrolTable.find("tbody").css("overflow", "-moz-scrollbars-vertical")
                    tbodyHeight = scrolTable.find("tbody").height();

                    var cellSpacing = (scrolTable.attr("offsetHeight") - (tbodyHeight + theadHeight + tfootHeight)) / 4;
                    var tBodyHeight = (opts.tableHeight - (theadHeight + cellSpacing * 2) - (tfootHeight + cellSpacing * 2));
                    var tBodyWidth = opts.tableWidth;

                    scrolTable.css("width", opts.tableWidth + 'px');
                    scrolTable.find("tbody").css("height", tBodyHeight + 'px');
                    scrolTable.find("tbody").css("width", tBodyWidth + 'px')
                }
            }
        })
    };
    $.scrollableTable = {
        syncWidths: function(container, opts) {
            if (jQuery.browser.msie || jQuery.browser.safari) {
                var thead = container.find("thead");
                var tbody = container.find("tbody");
                var tfoot = container.find("tfoot");
                var synchList = container.find(opts.synchWidthsWith + " tr:first td");
                if (opts.synchWidthsWith != "tbody") {
                    synchList = container.find(opts.synchWidthsWith + " tr:first th")
                }
                if (synchList.size() > 0) {
                    $.each(tbody.find("tr"),
                    function(i, tr) {
                        $.each($(tr).find("td"),
                        function(i, td) {
                            var column = $(synchList[i]);
                            $(td).width(column.width());
                            $(td).removeAttr("width")
                        })
                    });
                    if (thead) {
                        var theadColumns = thead.find("tr:first th");
                        $.each(theadColumns,
                        function(i, th) {
                            $(th).css("wordBreak", "break-all");
                            $(th).removeAttr("width");
                            $(th).css("width", "")
                        });
                        $.each(tbody.find("tr:first td"),
                        function(i, td) {
                            $(theadColumns[i]).width($(td).width())
                        })
                    }
                    if (tfoot) {
                        var tfootColumns = tfoot.find("tr:first th");
                        $.each(tfootColumns,
                        function(i, th) {
                            $(th).css("wordBreak", "break-all");
                            $(th).removeAttr("width");
                            $(th).css("width", "")
                        });
                        $.each(tbody.find("tr:first td"),
                        function(i, td) {
                            $(tfootColumns[i]).width($(td).width())
                        })
                    }
                }
            }
        }
    };
    $.fn.scrollableTable.defaults = {
        synchWidthsWith: "tbody",
        scrollWidth: 17
    }
})(jQuery);