function loadHeightFix()
{
    window.heightFix = new HeightFix();
    window.heightFix.run();
}

function HeightFix() { }

HeightFix.prototype.run = function ()
{
    var body = document.getElementsByTagName("BODY")[0];
    this.setPercentageHeights(body);
    this.setMinHeights(body);
    this.fixNode(body, this.getWindowHeight());
}

HeightFix.prototype.resize = function (now)
{
    if (!now && document.all)
    {
        if (window.heightFixTimeout)
        {
            window.clearTimeout(window.heightFixTimeout);
        }
        window.heightFixTimeout = window.setTimeout("window.heightFix.resize(true)", 100);
        return;
    }
    this.run();
}

HeightFix.prototype.setPercentageHeights = function (node)
{
    if (node.style && node.style.height.indexOf("%") != -1)
    {
        node.percentageHeight = parseInt(node.style.height);
    }
    else if (node.percentageHeight)
    {
        node.style.height = node.percentageHeight;
    }
    for (var i = 0; i < node.childNodes.length; i++)
    {
        this.setPercentageHeights(node.childNodes[i]);
    }
}

HeightFix.prototype.setMinHeights = function (node)
{
    for (var i = 0; i < node.childNodes.length; i++)
    {
        this.setMinHeights(node.childNodes[i]);
    }
    if (node.percentageHeight)
    {
        node.style.height = "auto";
        var styleMinHeight = node.style.minHeight ? node.style.minHeight : 0;
        node.minHeight = Math.max(parseInt(styleMinHeight), node.offsetHeight);
    }
}

HeightFix.prototype.getWindowHeight = function ()
{
    if (window.innerHeight)
    {
        return window.innerHeight;
    }

    var html = document.getElementsByTagName("HTML")[0];
    var body = document.getElementsByTagName("BODY")[0];
    var display = body.style.display;
    body.style.display = "none";
    var height = html.clientHeight;
    body.style.display = display;
    return height;
}

HeightFix.prototype.fixNode = function (node, height)
{
    if (node.minHeight && node.minHeight > height)
    {
        height = node.minHeight;
    }

    var vspace = height;
    for (var i = 0; i < node.childNodes.length; i++)
    {
        var child = node.childNodes[i];
        if (!child.percentageHeight && child.offsetHeight && !this.isFloating(child))
        {
            vspace -= parseInt(child.offsetHeight);
        }
    }

    for (var i = 0; i < node.childNodes.length; i++)
    {
        var child = node.childNodes[i];
        if (child.percentageHeight)
        {
            this.fixNode(child, vspace * child.percentageHeight / 100);
        }
    }

    if (node.style)
    {
        node.style.height = height + "px";
    }
}

HeightFix.prototype.isFloating = function (node)
{
    var flt = node.style ? (node.style.styleFloat ? node.style.styleFloat : node.style.cssFloat) : null;
    return (flt && (flt == "left" || flt == "right"));
}

if (!window.onload)   { window.onload   = function () { loadHeightFix(); } }
if (!window.onresize) { window.onresize = function () { window.heightFix.resize(); } }