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

/**
 * @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();
            }
    }
 }();

TextResizeDetector.TARGET_ELEMENT_ID = 'doc';
TextResizeDetector.USER_INIT_FUNC = null;

