﻿/**
* @projectDescription Monitor Font Size Changes with jQuery
*
* @version 1.0
* @author Dave Cardwell
*
* jQuery-Em - $Revision: 24 $ ($Date: 2007-08-19 11:24:56 +0100 (Sun, 19 Aug 2007) $)
* http://davecardwell.co.uk/javascript/jquery/plugins/jquery-em/
*
* Copyright Â©2007 Dave Cardwell <http://davecardwell.co.uk/>
*
* Released under the MIT licence:
* http://www.opensource.org/licenses/mit-license.php
*/

// Upon $(document).ready()â�¦
jQuery(function($) {
    // Configurationâ�¦
    var eventName = 'emchange';


    // Set up default options.
    $.em = $.extend({
        /**
        * The jQuery-Em version string.
        *
        * @example $.em.version;
        * @desc '1.0a'
        *
        * @property
        * @name version
        * @type String
        * @cat Plugins/Em
        */
        version: '1.0',

        /**
        * The number of milliseconds to wait when polling for changes to the
        * font size.
        *
        * @example $.em.delay = 400;
        * @desc Defaults to 200.
        *
        * @property
        * @name delay
        * @type Number
        * @cat Plugins/Em
        */
        delay: 200,

        /**
        * The element used to detect changes to the font size.
        *
        * @example $.em.element = $('<div />')[0];
        * @desc Default is an empty, absolutely positioned, 100em-wide <div>.
        *
        * @private
        * @property
        * @name element
        * @type Element
        * @cat Plugins/Em
        */
        element: $('<div />').css({ left: '-100em',
            position: 'absolute',
            width: '100em'
        })
                             .prependTo('body')[0],

        /**
        * The action to perform when a change in the font size is detected.
        *
        * @example $.em.action = function() { ... }
        * @desc The default action is to trigger a global â��emchangeâ�� event.
        * You probably shouldnâ��t change this behaviour as other plugins may
        * rely on it, but the option is here for completion.
        *
        * @example $(document).bind('emchange', function(e, cur, prev) {...})
        * @desc Any functions triggered on this event are passed the current
        * font size, and last known font size as additional parameters.
        *
        * @private
        * @property
        * @name action
        * @type Function
        * @cat Plugins/Em
        * @see current
        * @see previous
        */
        action: function() {
            var currentWidth = $.em.element.offsetWidth / 100;

            // If the font size has changed since we last checkedâ�¦
            if (currentWidth != $.em.current) {
                /**
                * The previous pixel value of the user agentâ��s font size. See
                * $.em.current for caveats. Will initially be undefined until
                * the â��emchangeâ�� event is triggered.
                *
                * @example $.em.previous;
                * @result 16
                *
                * @property
                * @name previous
                * @type Number
                * @cat Plugins/Em
                * @see current
                */
                $.em.previous = $.em.current;

                /**
                * The current pixel value of the user agentâ��s font size. As
                * with $.em.previous, this value *may* be subject to minor
                * browser rounding errors that mean you might not want to
                * rely upon it as an absolute value.
                *
                * @example $.em.current;
                * @result 14
                *
                * @property
                * @name current
                * @type Number
                * @cat Plugins/Em
                * @see previous
                */
                $.em.current = currentWidth;

                $.event.trigger(eventName, [$.em.current, $.em.previous]);
            }
        }
    }, $.em);


    /**
    * Bind a function to the emchange event of each matched element.
    *
    * @example $("p").emchange( function() { alert("Hello"); } );
    *
    * @name emchange
    * @type jQuery
    * @param Function fn A function to bind to the emchange event.
    * @cat Plugins/Em
    */

    /**
    * Trigger the emchange event of each matched element.
    *
    * @example $("p").emchange()
    *
    * @name emchange
    * @type jQuery
    * @cat Plugins/Em
    */
    $.fn[eventName] = function(fn) {
        return fn ? this.bind(eventName, fn)
                                               : this.trigger(eventName);
    };


    // Store the initial pixel value of the user agentâ��s font size.
    $.em.current = $.em.element.offsetWidth / 100;

    /**
    * While polling for font-size changes, $.em.iid stores the intervalID in
    * case you should want to cancel with clearInterval().
    *
    * @example window.clearInterval( $.em.iid );
    * 
    * @property
    * @name iid
    * @type Number
    * @cat Plugins/Em
    */
    $.em.iid = setInterval($.em.action, $.em.delay);
});
