/*  @fileoverview TextResizeDetector (Renamed to TRD)
 *  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 */
TRD = 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(TRD.TARGET_ELEMENT_ID);
	 // insert before firstChild
	 if (elC) elC.insertBefore(el,elC.firstChild);
	 iBase = iCurrSize = TRD.getSize();
  };

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

  function _detect() {
	 var iNewSize = TRD.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 (!TRD.onAvailableCount_i ) { TRD.onAvailableCount_i =0; }
		if (document.getElementById(TRD.TARGET_ELEMENT_ID)) {
		  TRD.init();
		  if (TRD.USER_INIT_FUNC){ TRD.USER_INIT_FUNC(); }
		  TRD.onAvailableCount_i = null;
		} else {
		  if (TRD.onAvailableCount_i<600) {
			 TRD.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(); }
  }
}();

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