/** 

 *  @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;




