/*
    by Paul@YellowPencil.com and Scott@YellowPencil.com
    includes TextResizeDetector by Lawrence Carvalho <carvalho@uk.yahoo-inc.com>
    feel free to delete all comments except for the above credit
*/

// Replace 'center' 'right' and 'left' with the ID names of the columns you want to balance.
// The last one is there to show how you can add more columns.  Just delete the ones you're not using.
var divs = new Array('center', 'right', 'left');

// Initialize Scripts - is this a browser that understands DOM?
function scriptInit() { if (!document.getElementById) { return; } }

// Set up Event Listener
function addEvent(elm, evType, fn, useCapture) { 
    if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; } 
    else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; }
    else { elm['on' + evType] = fn; }
}

// Start Column Script
function setTall() {
    if (document.getElementById) { var maxHeight = 0; for (var i = 0; i < divs.length; i++) {
            if (document.getElementById(divs[i]) != null)
            { var div = document.getElementById(divs[i]); div.style.height = null; if (div.offsetHeight > maxHeight) maxHeight = div.offsetHeight; }
        }
    for (var i = 0; i < divs.length; i++) {
            if (document.getElementById(divs[i]) != null)
            { var div = document.getElementById(divs[i]); div.style.height = maxHeight + 'px'; if (div.offsetHeight > maxHeight) { div.style.height = (maxHeight - (div.offsetHeight - maxHeight)) + 'px'; } }
        }
    }
}

// Start Column Script delayed
function delayTall() {
    setTimeout("setTall()",200);
    }

// Assign one of the columns to the TextResizeDetector.
function initTall() {
    if (document.getElementById) { for (var i = 0; i < divs.length; i++)
        { if (document.getElementById(divs[i]) != null) { TextResizeDetector.TARGET_ELEMENT_ID = divs[i]; break; } }
    setTimeout("setTall()",200); } 
}

// Fire Events
addEvent(window, 'load', initTall, false);
addEvent(window, 'resize', setTall, false);
addEvent(document, 'click', delayTall, false);

/*  Detects changes to font sizes when user changes browser settings
    Fires a custom event with the following data:
    iBase  : base font size
    iDelta : difference in pixels from previous setting
    iSize  : size in pixel of text
    author Lawrence Carvalho carvalho@uk.yahoo-inc.com */

// @constructor
TextResizeDetector = function() {
    var el  = null;
    var iIntervalDelay  = 200;
    var iInterval = null;
    var iCurrSize = -1;
    var iBase = -1;
    var aListeners = [];
    var createControlElement = function() {
        el = document.createElement('span');
        el.id='textResizeControl';
        el.innerHTML='&nbsp;';
        el.style.position="absolute";
        el.style.left="-9999px";
        var elC = document.getElementById(TextResizeDetector.TARGET_ELEMENT_ID);
        // insert before firstChild
        if (elC)
            elC.insertBefore(el,elC.firstChild);
        iBase = iCurrSize = TextResizeDetector.getSize();
    };

    function _stopDetector() {
        window.clearInterval(iInterval);
        iInterval=null;
    };
    function _startDetector() {
        if (!iInterval) {
            iInterval = window.setInterval('TextResizeDetector.detect()',iIntervalDelay);
        }
    };

     function _detect() {
        var iNewSize = TextResizeDetector.getSize();

        if(iNewSize!== iCurrSize) {
            for (var    i=0;i <aListeners.length;i++) {
                aListnr = aListeners[i];
                var oArgs = {  iBase: iBase,iDelta:((iCurrSize!=-1) ? iNewSize - iCurrSize + 'px' : "0px"),iSize:iCurrSize = iNewSize};
                if (!aListnr.obj) {
                    aListnr.fn('textSizeChanged',[oArgs]);
                }
                else  {
                    aListnr.fn.apply(aListnr.obj,['textSizeChanged',[oArgs]]);
                }
            }

        }
        return iCurrSize;
    };
    var onAvailable = function() {
        if (!TextResizeDetector.onAvailableCount_i ) {
            TextResizeDetector.onAvailableCount_i =0;
        }

        if (document.getElementById(TextResizeDetector.TARGET_ELEMENT_ID)) {
            TextResizeDetector.init();
            if (TextResizeDetector.USER_INIT_FUNC){
                TextResizeDetector.USER_INIT_FUNC();
            }
            TextResizeDetector.onAvailableCount_i = null;
        }
        else {
            if (TextResizeDetector.onAvailableCount_i<600) {
                TextResizeDetector.onAvailableCount_i++;
                setTimeout(onAvailable,200)
            }
        }
    };
    setTimeout(onAvailable,500);

    return {
            /*
             * Initializes the detector
             *
             * @param {String} sId The id of the element in which to create the control element
             */
            init: function() {

                createControlElement();
                _startDetector();
            },
            /**
             * Adds listeners to the ontextsizechange event.
             * Returns the base font size
             *
             */
            addEventListener:function(fn,obj,bScope) {
                aListeners[aListeners.length] = {
                    fn: fn,
                    obj: obj
                }
                return iBase;
            },
            /**
             * performs the detection and fires textSizeChanged event
             * @return the current font size
             * @type {integer}
             */
            detect:function() {
                return _detect();
            },
            /**
             * Returns the height of the control element
             *
             * @return the current height of control element
             * @type {integer}
             */
            getSize:function() {
                    var iSize;
                    return el.offsetHeight;


            },
            /**
             * Stops the detector
             */
            stopDetector:function() {
                return _stopDetector();
            },
            /*
             * Starts the detector
             */
            startDetector:function() {
                return _startDetector();
            }
    }
 }();

/*** end TextResizeDetector */

TextResizeDetector.TARGET_ELEMENT_ID = 'doc';
TextResizeDetector.USER_INIT_FUNC = function() {
    var iBase = TextResizeDetector.addEventListener(setTall, null);
};


