/**
*  @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 [email protected]
* @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;