/** 
 *  @fileoverview swiTextResizeDetector
 * 
 *  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>
 *  
 *  * based on the work of Lawrence Carvalho
 * @version 1.1
 *
 * Depende de swijs.js
 *
 */

/**
 * @constructor
 */
swiTextResizeDetector = function() 
{
  var el  = null;
  var iIntervalDelay  = 200; /* 200 ms tempo de detecão.  Aumentar se ficar muito pesado */
  var iInterval = null;
  var iCurrSize = -1;
  var iBase = -1;
  var aListeners = [];
  var createControlElement = function() 
  {
    el = document.createElement('span');
    el.id='swiTextResizeControl';
    el.innerHTML='&nbsp;';
    el.style.position="absolute";
    el.style.left="-9999px";
    var elC = e$(swiTextResizeDetector.TARGET_ELEMENT_ID);
    // insert before firstChild
    if (elC)
      elC.insertBefore(el,elC.firstChild);
    iBase = iCurrSize = swiTextResizeDetector.getSize();
  };

  function _stopDetector() 
  {
    window.clearInterval(iInterval);
    iInterval=null;
  };
	
  function _startDetector() 
  {
    if (!iInterval) 
    {
      iInterval = window.setInterval('swiTextResizeDetector.detect()',iIntervalDelay);
    }
  };
 	
  function _detect() 
  {
    var iNewSize = swiTextResizeDetector.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 (!swiTextResizeDetector.onAvailableCount_i ) 
    {
      swiTextResizeDetector.onAvailableCount_i =0;
    }

    if (e$(swiTextResizeDetector.TARGET_ELEMENT_ID)) 
    {
      swiTextResizeDetector.init();
      if (swiTextResizeDetector.USER_INIT_FUNC)
      {
	swiTextResizeDetector.USER_INIT_FUNC();
      }
      swiTextResizeDetector.onAvailableCount_i = null;
    }
    else 
    {
      if (swiTextResizeDetector.onAvailableCount_i<600) 
      {
	swiTextResizeDetector.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();
    }
  }
}();

/* To activate define this in the code
swiTextResizeDetector.TARGET_ELEMENT_ID = 'doc';
swiTextResizeDetector.USER_INIT_FUNC = null;

*/
