var floating_header = function() {

this.header = document.createElement('table');
this.header_height = 0;

this.getkeys = function(obj) {
    var keys = new Array();
    for ( var key in obj ) {
        keys.push(key);
    }
    return keys;
};

this.getXY = function( o ) {
    var y = 0;
    var x = 0;
    while( o != null ) {
        y += o.offsetTop;
        x += o.offsetLeft;
        o = o.offsetParent;
    }
    return { "x": x, "y": y };
}

this.setheader = function() {
        var win = window.pageYOffset ? window.pageYOffset : 0;
        var cel = document.documentElement ? document.documentElement.scrollTop : 0;
        var body = document.body ? document.body.scrollTop : 0;
        var result = win ? win : 0;
        if ( cel && ( ! result || ( result > cel ))) result = cel;
        var screenpos = body && ( ! result || ( result > body ) ) ? body : result;
        var theady_max = this.getXY(this.table_obj.getElementsByTagName('THEAD')[0]).y + this.table_obj.offsetHeight - this.header_height;
        if ( screenpos > this.theady && screenpos < theady_max ) {
			var offsetMe = document.getElementsByTagName('THEAD')[0].parentNode;
			var offset = 0;
			var count = 4;

			while (offsetMe != null && count > 0) {
				if (!isNaN(offsetMe.offsetLeft) && count < 3 && offsetMe.offsetLeft > offset)
					offset += offsetMe.offsetLeft;
				offsetMe = offsetMe.parentNode;
				count--;
			}
            this.header.style.top=Math.round(screenpos);
            this.header.style.display = 'block';
			this.header.style.left = offset;
			
            this.header_height = header.offsetHeight;
        }
        else {
            this.header.style.display = 'none';
        }
}

this.addclass = function(obj, newclass) {
    if ( obj.classes == null ) {
        obj.classes = new Array();
    }
    obj.classes[newclass] = 1;
    obj.className = this.getkeys(obj.classes).join(' ');
    return true;
};

this.theady = 0;

this.build_header = function() {
    this.table_obj = document.getElementsByTagName('THEAD');
    if ( ! this.table_obj ) {
        alert("you MUST have <thead> and </thead> tags wrapping the part of the table you want to keep on the screen");
        return;
    }
    this.table_obj = this.table_obj[0];
    while ( this.table_obj.tagName != 'TABLE' ) {
        if ( this.table_obj.tagName == 'BODY' ) {
            alert('The THEAD section MUST be inside a table - how did you do that???');
            return;
        }
        this.table_obj = this.table_obj.parentNode;
    }

    thead = this.table_obj.getElementsByTagName('THEAD')[0].cloneNode(1);
    thead.id = 'copyrow';
    this.header.style.position='absolute';
    this.header.style.display='none';
    this.header.appendChild(thead);
    this.header.style.width = this.table_obj.offsetWidth;
    var srcths = this.table_obj.getElementsByTagName('THEAD')[0].getElementsByTagName('*');
    var copyths = thead.getElementsByTagName('*');
	var newWidth;
    for ( var x = 0; x < copyths.length; x++ ) {
        copyths[x].className = srcths[x].className;
        copyths[x].align = srcths[x].align;
        copyths[x].background = srcths[x].background;
        copyths[x].bgColor = srcths[x].bgColor;
        copyths[x].colSpan = srcths[x].colSpan;
        copyths[x].height = srcths[x].height;
        copyths[x].rowSpan = srcths[x].rowSpan;
        pr = Math.round(srcths[x].style.paddingRight.split('px')[0]);
        pl = Math.round(srcths[x].style.paddingLeft.split('px')[0]);
        bl = ( Math.round(srcths[x].style.borderLeftWidth.split('px')[0]) ) ? Math.round(srcths[x].style.borderLeftWidth.split('px')[0]) : 0;
        br = ( Math.round(srcths[x].style.borderRightWidth.split('px')[0]) ) ? Math.round(srcths[x].style.borderRightWidth.split('px')[0]) : 0;
        pt = Math.round(srcths[x].style.paddingTop.split('px')[0]);
        pb = Math.round(srcths[x].style.paddingBottom.split('px')[0]);
        bt = Math.round(srcths[x].style.borderTopWidth.split('px')[0]);
        bb = Math.round(srcths[x].style.borderBottomWidth.split('px')[0]);
/*
        if ( srcths[x].currentStyle ) {
            for ( var y in srcths[x].currentStyle ) {
                if ( y == 'font' || y == 'top' ) continue;
                copyths[x].style[y] = srcths[x].currentStyle[y];
            }
            pr = Math.round(srcths[x].currentStyle.paddingRight.split('px')[0]);
            pl = Math.round(srcths[x].currentStyle.paddingLeft.split('px')[0]);
            bl = ( Math.round(srcths[x].currentStyle.borderLeftWidth.split('px')[0]) ) ? Math.round(srcths[x].currentStyle.borderLeftWidth.split('px')[0]) : 0;
            pt = Math.round(srcths[x].currentStyle.paddingTop.split('px')[0]);
            pb = Math.round(srcths[x].currentStyle.paddingBottom.split('px')[0]);
            bt = Math.round(srcths[x].currentStyle.borderTopWidth.split('px')[0]);
        }
*/
        if ( srcths[x].onclick ) copyths[x].onclick = srcths[x].onclick;
        var width = ( srcths[x].offsetWidth - pr - pl > 0 ) ? srcths[x].offsetWidth - pr - pl : 0;
        copyths[x].style.position = srcths[x].style.position;
        copyths[x].style.top = ( srcths[x].offsetTop - pt - pb > 0 ) ? srcths[x].offsetTop - pt - pb : srcths[x].offsetTop;
        copyths[x].style.top = srcths[x].style.top;
        copyths[x].style.height = srcths[x].offsetHeight;
        copyths[x].style.left = srcths[x].offsetLeft;

        if ( ! copyths[x].currentStyle ) {
            //copyths[x].style.width = Math.floor(document.defaultView.getComputedStyle(srcths[x],"").getPropertyValue("width").split('px')[0]);
            copyths[x].style.width = document.defaultView.getComputedStyle(srcths[x],"").getPropertyValue("width");
        }
        else {

			newWidth = srcths[x].offsetWidth;
			if (!isNaN(pr))
				newWidth -= pr;
			if (!isNaN(pl))
				newWidth -= pl; // - bl;
            copyths[x].style.width = newWidth;
            copyths[x].width = srcths[x].width;            copyths[x].width = srcths[x].width;
        }
        if ( x == copyths.length - 1 ) {
            this.header.style.paddingBottom = pb;
            this.header.style.borderBottom = bb;
        }
    }
    this.addclass(this.header, 'main');

this.table_obj.parentNode.appendChild(this.header);
//    document.body.appendChild(this.header);
    theady = this.getXY(this.table_obj.getElementsByTagName('THEAD')[0]).y;
}

var origonload = window.onload;
window.onload = function() {
    if (origonload) {
        origonload();
    }
    this.build_header();
};

window.onscroll=this.setheader;

};
floating_header();