/*-------------------------------------------------------------------- 
Scripts for creating and manipulating custom menus based on standard <ul> markup
Version: 3.0, 03.31.2009

By: Maggie Costello Wachs (maggie@filamentgroup.com) and Scott Jehl (scott@filamentgroup.com)
http://www.filamentgroup.com
* reference articles: http://www.filamentgroup.com/lab/jquery_ipod_style_drilldown_menu/
		
Copyright (c) 2009 Filament Group
Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
--------------------------------------------------------------------*/

(function($) {

    var allUIMenus = [];

    $.fn.menu = function(options) {
        var caller = this;
        var options = options;
        var m = new Menu(caller, options);
        allUIMenus.push(m);

        $(this)
	.mousedown(function() {
	    if (!m.menuOpen) { m.showLoading(); };
	})
	.click(function() {
	    if (m.menuOpen == false) { m.showMenu(); }
	    else { m.kill(); };
	    return false;
	});
    };

    function Menu(caller, options) {
        var menu = this;
        var caller = $(caller);
        var container = $('<div class="fg-menu-container ui-widget ui-widget-content ui-corner-all">' + options.content + '</div>');

        this.menuOpen = false;
        this.menuExists = false;

        var options = jQuery.extend({
            content: null,
            width: 240, // width of menu container, must be set or passed in to calculate widths of child menus
            maxHeight: 250, // max height of menu (if a drilldown: height does not include breadcrumb)
            positionOpts: {
                posX: 'left',
                posY: 'bottom',
                offsetX: 0,
                offsetY: 0,
                directionH: 'right',
                directionV: 'down',
                detectH: true, // do horizontal collision detection  
                detectV: false, // do vertical collision detection
                linkToFront: false
            },
            showSpeed: 200, // show/hide speed in milliseconds
            callerOnState: 'ui-state-active', // class to change the appearance of the link/button when the menu is showing
            loadingState: 'ui-state-loading', // class added to the link/button while the menu is created
            linkHover: 'ui-state-hover', // class for menu option hover state
            linkHoverSecondary: 'li-hover', // alternate class, may be used for multi-level menus		
            // ----- multi-level menu defaults -----
            crossSpeed: 200, // cross-fade speed for multi-level menus
            crumbDefaultText: 'Choose an option:',
            backLink: true, // in the ipod-style menu: instead of breadcrumbs, show only a 'back' link
            backLinkText: 'Back',
            flyOut: false, // multi-level menus are ipod-style by default; this parameter overrides to make a flyout instead
            flyOutOnState: 'ui-state-default',
            nextMenuLink: 'ui-icon-triangle-1-e', // class to style the link (specifically, a span within the link) used in the multi-level menu to show the next level
            topLinkText: 'All',
            nextCrumbLink: 'ui-icon-carat-1-e'
        }, options);

        var killAllMenus = function() {
            $.each(allUIMenus, function(i) {
                if (allUIMenus[i].menuOpen) { allUIMenus[i].kill(); };
            });
        };

        this.kill = function() {
            caller
			.removeClass(options.loadingState)
			.removeClass('fg-menu-open')
			.removeClass(options.callerOnState);
            container.find('li').removeClass(options.linkHoverSecondary).find('a').removeClass(options.linkHover);
            if (options.flyOutOnState) { container.find('li a').removeClass(options.flyOutOnState); };
            if (options.callerOnState) { caller.removeClass(options.callerOnState); };
            if (container.is('.fg-menu-ipod')) { menu.resetDrilldownMenu(); };
            if (container.is('.fg-menu-flyout')) { menu.resetFlyoutMenu(); };
            container.parent().hide();
            menu.menuOpen = false;
            $(document).unbind('click', killAllMenus);
            $(document).unbind('keydown');
        };

        this.showLoading = function() {
            caller.addClass(options.loadingState);
        };

        this.showMenu = function() {
            killAllMenus();
            if (!menu.menuExists) { menu.create() };
            caller
			.addClass('fg-menu-open')
			.addClass(options.callerOnState);
            container.parent().show().click(function() { menu.kill(); return false; });
            container.hide().slideDown(options.showSpeed).find('.fg-menu:eq(0)');
            menu.menuOpen = true;
            caller.removeClass(options.loadingState);
            $(document).click(killAllMenus);

            // assign key events
            $(document).keydown(function(event) {
                var e;
                if (event.which != "") { e = event.which; }
                else if (event.charCode != "") { e = event.charCode; }
                else if (event.keyCode != "") { e = event.keyCode; }

                var menuType = ($(event.target).parents('div').is('.fg-menu-flyout')) ? 'flyout' : 'ipod';

                switch (e) {
                    case 37: // left arrow 
                        if (menuType == 'flyout') {
                            $(event.target).trigger('mouseout');
                            if ($('.' + options.flyOutOnState).size() > 0) { $('.' + options.flyOutOnState).trigger('mouseover'); };
                        };

                        if (menuType == 'ipod') {
                            $(event.target).trigger('mouseout');
                            if ($('.fg-menu-footer').find('a').size() > 0) { $('.fg-menu-footer').find('a').trigger('click'); };
                            if ($('.fg-menu-header').find('a').size() > 0) { $('.fg-menu-current-crumb').prev().find('a').trigger('click'); };
                            if ($('.fg-menu-current').prev().is('.fg-menu-indicator')) {
                                $('.fg-menu-current').prev().trigger('mouseover');
                            };
                        };
                        return false;
                        break;

                    case 38: // up arrow 
                        if ($(event.target).is('.' + options.linkHover)) {
                            var prevLink = $(event.target).parent().prev().find('a:eq(0)');
                            if (prevLink.size() > 0) {
                                $(event.target).trigger('mouseout');
                                prevLink.trigger('mouseover');
                            };
                        }
                        else { container.find('a:eq(0)').trigger('mouseover'); }
                        return false;
                        break;

                    case 39: // right arrow 
                        if ($(event.target).is('.fg-menu-indicator')) {
                            if (menuType == 'flyout') {
                                $(event.target).next().find('a:eq(0)').trigger('mouseover');
                            }
                            else if (menuType == 'ipod') {
                                $(event.target).trigger('click');
                                setTimeout(function() {
                                    $(event.target).next().find('a:eq(0)').trigger('mouseover');
                                }, options.crossSpeed);
                            };
                        };
                        return false;
                        break;

                    case 40: // down arrow 
                        if ($(event.target).is('.' + options.linkHover)) {
                            var nextLink = $(event.target).parent().next().find('a:eq(0)');
                            if (nextLink.size() > 0) {
                                $(event.target).trigger('mouseout');
                                nextLink.trigger('mouseover');
                            };
                        }
                        else { container.find('a:eq(0)').trigger('mouseover'); }
                        return false;
                        break;

                    case 27: // escape
                        killAllMenus();
                        break;

                    case 13: // enter
                        if ($(event.target).is('.fg-menu-indicator') && menuType == 'ipod') {
                            $(event.target).trigger('click');
                            setTimeout(function() {
                                $(event.target).next().find('a:eq(0)').trigger('mouseover');
                            }, options.crossSpeed);
                        };
                        break;
                };
            });
        };

        this.create = function() {
            container.css({ width: options.width }).appendTo('body').find('ul:first').not('.fg-menu-breadcrumb').addClass('fg-menu');
            container.find('ul, li a').addClass('ui-corner-all');

            // aria roles & attributes
            container.find('ul').attr('role', 'menu').eq(0).attr('aria-activedescendant', 'active-menuitem').attr('aria-labelledby', caller.attr('id'));
            container.find('li').attr('role', 'menuitem');
            container.find('li:has(ul)').attr('aria-haspopup', 'true').find('ul').attr('aria-expanded', 'false');
            var $a = container.find('a').attr('tabindex', '-1');

            $a.each(function() {
                var $item = $(this);
                var $icon = $item.children('.ui-icon');
                $icon.css({
                    'margin-right': '0.2em',
                    'margin-top': '-0.15em',
                    'float': 'left'
                });
                if ($item.height() > $icon.height()) {
                    $icon.css({
                        'margin-bottom': $item.height() - $icon.height()
                    });
                }
            });

            // when there are multiple levels of hierarchy, create flyout or drilldown menu
            if (container.find('ul').size() > 1) {
                if (options.flyOut) { menu.flyout(container, options); }
                else { menu.drilldown(container, options); }
            }
            else {
                container.find('a').click(function() {
                    menu.chooseItem(this);
                    return false;
                });
            };

            if (options.linkHover) {
                var allLinks = container.find('.fg-menu li a');
                allLinks.hover(
				function() {
				    var menuitem = $(this);
				    $('.' + options.linkHover).removeClass(options.linkHover).blur().parent().removeAttr('id');
				    $(this).addClass(options.linkHover).focus().parent().attr('id', 'active-menuitem');
				},
				function() {
				    $(this).removeClass(options.linkHover).blur().parent().removeAttr('id');
				}
			);
            };

            if (options.linkHoverSecondary) {
                container.find('.fg-menu li').hover(
				function() {
				    $(this).siblings('li').removeClass(options.linkHoverSecondary);
				    if (options.flyOutOnState) { $(this).siblings('li').find('a').removeClass(options.flyOutOnState); }
				    $(this).addClass(options.linkHoverSecondary);
				},
				function() { $(this).removeClass(options.linkHoverSecondary); }
			);
            };

            menu.setPosition(container, caller, options);
            menu.menuExists = true;
        };

        this.chooseItem = function(item) {
            menu.kill();
            location.href = $(item).attr('href');
        };
    };

    Menu.prototype.flyout = function(container, options) {
        var menu = this;

        this.resetFlyoutMenu = function() {
            var allLists = container.find('ul ul');
            allLists.removeClass('ui-widget-content').hide();
        };

        container.addClass('fg-menu-flyout').find('li:has(ul)').each(function() {
            var linkWidth = container.width();
            var showTimer, hideTimer;
            var allSubLists = $(this).find('ul');

            allSubLists.css({ left: linkWidth, width: linkWidth }).hide();

            $(this).find('a:eq(0)').addClass('fg-menu-indicator').html('<span>' + $(this).find('a:eq(0)').text() + '</span><span class="ui-icon ' + options.nextMenuLink + '"></span>').hover(
			function() {
			    clearTimeout(hideTimer);
			    var subList = $(this).next();
			    if (!fitVertical(subList, $(this).offset().top)) { subList.css({ top: 'auto', bottom: 0 }); };
			    if (!fitHorizontal(subList, $(this).offset().left + 100)) { subList.css({ left: 'auto', right: linkWidth, 'z-index': 999 }); };
			    showTimer = setTimeout(function() {
			        subList.addClass('ui-widget-content').show(options.showSpeed).attr('aria-expanded', 'true');
			    }, 300);
			},
			function() {
			    clearTimeout(showTimer);
			    var subList = $(this).next();
			    hideTimer = setTimeout(function() {
			        subList.removeClass('ui-widget-content').hide(options.showSpeed).attr('aria-expanded', 'false');
			    }, 400);
			}
		);

            $(this).find('ul a').hover(
			function() {
			    clearTimeout(hideTimer);
			    if ($(this).parents('ul').prev().is('a.fg-menu-indicator')) {
			        $(this).parents('ul').prev().addClass(options.flyOutOnState);
			    }
			},
			function() {
			    hideTimer = setTimeout(function() {
			        allSubLists.hide(options.showSpeed);
			        container.find(options.flyOutOnState).removeClass(options.flyOutOnState);
			    }, 500);
			}
		);
        });

        container.find('a').click(function() {
            menu.chooseItem(this);
            return false;
        });
    };


    Menu.prototype.drilldown = function(container, options) {
        var menu = this;
        var topList = container.find('.fg-menu');
        var breadcrumb = $('<ul class="fg-menu-breadcrumb ui-widget-header ui-corner-all ui-helper-clearfix"></ul>');
        var crumbDefaultHeader = $('<li class="fg-menu-breadcrumb-text">' + options.crumbDefaultText + '</li>');
        var firstCrumbText = (options.backLink) ? options.backLinkText : options.topLinkText;
        var firstCrumbClass = (options.backLink) ? 'fg-menu-prev-list' : 'fg-menu-all-lists';
        var firstCrumbLinkClass = (options.backLink) ? 'ui-state-default ui-corner-all' : '';
        var firstCrumbIcon = (options.backLink) ? '<span class="ui-icon ui-icon-triangle-1-w"></span>' : '';
        var firstCrumb = $('<li class="' + firstCrumbClass + '"><a href="#" class="' + firstCrumbLinkClass + '">' + firstCrumbIcon + firstCrumbText + '</a></li>');

        container.addClass('fg-menu-ipod');

        if (options.backLink) { breadcrumb.addClass('fg-menu-footer').appendTo(container).hide(); }
        else { breadcrumb.addClass('fg-menu-header').prependTo(container); };
        breadcrumb.append(crumbDefaultHeader);

        var checkMenuHeight = function(el) {
            if (el.height() > options.maxHeight) { el.addClass('fg-menu-scroll') };
            el.css({ height: options.maxHeight });
        };

        var resetChildMenu = function(el) { el.removeClass('fg-menu-scroll').removeClass('fg-menu-current').height('auto'); };

        this.resetDrilldownMenu = function() {
            $('.fg-menu-current').removeClass('fg-menu-current');
            topList.animate({ left: 0 }, options.crossSpeed, function() {
                $(this).find('ul').each(function() {
                    $(this).hide();
                    resetChildMenu($(this));
                });
                topList.addClass('fg-menu-current');
            });
            $('.fg-menu-all-lists').find('span').remove();
            breadcrumb.empty().append(crumbDefaultHeader);
            $('.fg-menu-footer').empty().hide();
            checkMenuHeight(topList);
        };

        topList
		.addClass('fg-menu-content fg-menu-current ui-widget-content ui-helper-clearfix')
		.css({ width: container.width() })
		.find('ul')
			.css({ width: container.width(), left: container.width() })
			.addClass('ui-widget-content')
			.hide();
        checkMenuHeight(topList);

        topList.find('a').each(function() {
            // if the link opens a child menu:
            if ($(this).next().is('ul')) {
                $(this)
				.addClass('fg-menu-indicator')
				.each(function() { $(this).html('<span>' + $(this).text() + '</span><span class="ui-icon ' + options.nextMenuLink + '"></span>'); })
				.click(function() { // ----- show the next menu			
				    var nextList = $(this).next();
				    var parentUl = $(this).parents('ul:eq(0)');
				    var parentLeft = (parentUl.is('.fg-menu-content')) ? 0 : parseFloat(topList.css('left'));
				    var nextLeftVal = Math.round(parentLeft - parseFloat(container.width()));
				    var footer = $('.fg-menu-footer');

				    // show next menu   		
				    resetChildMenu(parentUl);
				    checkMenuHeight(nextList);
				    topList.animate({ left: nextLeftVal }, options.crossSpeed);
				    nextList.show().addClass('fg-menu-current').attr('aria-expanded', 'true');

				    var setPrevMenu = function(backlink) {
				        var b = backlink;
				        var c = $('.fg-menu-current');
				        var prevList = c.parents('ul:eq(0)');
				        c.hide().attr('aria-expanded', 'false');
				        resetChildMenu(c);
				        checkMenuHeight(prevList);
				        prevList.addClass('fg-menu-current').attr('aria-expanded', 'true');
				        if (prevList.hasClass('fg-menu-content')) { b.remove(); footer.hide(); };
				    };

				    // initialize "back" link
				    if (options.backLink) {
				        if (footer.find('a').size() == 0) {
				            footer.show();
				            $('<a href="#"><span class="ui-icon ui-icon-triangle-1-w"></span> <span>Back</span></a>')
								.appendTo(footer)
								.click(function() { // ----- show the previous menu
								    var b = $(this);
								    var prevLeftVal = parseFloat(topList.css('left')) + container.width();
								    topList.animate({ left: prevLeftVal }, options.crossSpeed, function() {
								        setPrevMenu(b);
								    });
								    return false;
								});
				        }
				    }
				    // or initialize top breadcrumb
				    else {
				        if (breadcrumb.find('li').size() == 1) {
				            breadcrumb.empty().append(firstCrumb);
				            firstCrumb.find('a').click(function() {
				                menu.resetDrilldownMenu();
				                return false;
				            });
				        }
				        $('.fg-menu-current-crumb').removeClass('fg-menu-current-crumb');
				        var crumbText = $(this).find('span:eq(0)').text();
				        var newCrumb = $('<li class="fg-menu-current-crumb"><a href="javascript://" class="fg-menu-crumb">' + crumbText + '</a></li>');
				        newCrumb
							.appendTo(breadcrumb)
							.find('a').click(function() {
							    if ($(this).parent().is('.fg-menu-current-crumb')) {
							        menu.chooseItem(this);
							    }
							    else {
							        var newLeftVal = -($('.fg-menu-current').parents('ul').size() - 1) * 180;
							        topList.animate({ left: newLeftVal }, options.crossSpeed, function() {
							            setPrevMenu();
							        });

							        // make this the current crumb, delete all breadcrumbs after this one, and navigate to the relevant menu
							        $(this).parent().addClass('fg-menu-current-crumb').find('span').remove();
							        $(this).parent().nextAll().remove();
							    };
							    return false;
							});
				        newCrumb.prev().append(' <span class="ui-icon ' + options.nextCrumbLink + '"></span>');
				    };
				    return false;
				});
            }
            // if the link is a leaf node (doesn't open a child menu)
            else {
                $(this).click(function() {
                    menu.chooseItem(this);
                    return false;
                });
            };
        });
    };


    /* Menu.prototype.setPosition parameters (defaults noted with *):
    referrer = the link (or other element) used to show the overlaid object 
    settings = can override the defaults:
    - posX/Y: where the top left corner of the object should be positioned in relation to its referrer.
    X: left*, center, right
    Y: top, center, bottom*
    - offsetX/Y: the number of pixels to be offset from the x or y position.  Can be a positive or negative number.
    - directionH/V: where the entire menu should appear in relation to its referrer.
    Horizontal: left*, right
    Vertical: up, down*
    - detectH/V: detect the viewport horizontally / vertically
    - linkToFront: copy the menu link and place it on top of the menu (visual effect to make it look like it overlaps the object) */

    Menu.prototype.setPosition = function(widget, caller, options) {
        var el = widget;
        var referrer = caller;
        var dims = {
            refX: referrer.offset().left,
            refY: referrer.offset().top,
            refW: referrer.getTotalWidth(),
            refH: referrer.getTotalHeight()
        };
        var options = options;
        var xVal, yVal;

        var helper = $('<div class="positionHelper"></div>');
        helper.css({ position: 'absolute', left: dims.refX, top: dims.refY, width: dims.refW, height: dims.refH });
        el.wrap(helper);

        // get X pos
        switch (options.positionOpts.posX) {
            case 'left': xVal = 0;
                break;
            case 'center': xVal = dims.refW / 2;
                break;
            case 'right': xVal = dims.refW;
                break;
        };

        // get Y pos
        switch (options.positionOpts.posY) {
            case 'top': yVal = 0;
                break;
            case 'center': yVal = dims.refH / 2;
                break;
            case 'bottom': yVal = dims.refH;
                break;
        };

        // add the offsets (zero by default)
        xVal += options.positionOpts.offsetX;
        yVal += options.positionOpts.offsetY;

        // position the object vertically
        if (options.positionOpts.directionV == 'up') {
            el.css({ top: 'auto', bottom: yVal });
            if (options.positionOpts.detectV && !fitVertical(el)) {
                el.css({ bottom: 'auto', top: yVal });
            }
        }
        else {
            el.css({ bottom: 'auto', top: yVal });
            if (options.positionOpts.detectV && !fitVertical(el)) {
                el.css({ top: 'auto', bottom: yVal });
            }
        };

        // and horizontally
        if (options.positionOpts.directionH == 'left') {
            el.css({ left: 'auto', right: xVal });
            if (options.positionOpts.detectH && !fitHorizontal(el)) {
                el.css({ right: 'auto', left: xVal });
            }
        }
        else {
            el.css({ right: 'auto', left: xVal });
            if (options.positionOpts.detectH && !fitHorizontal(el)) {
                el.css({ left: 'auto', right: xVal });
            }
        };

        // if specified, clone the referring element and position it so that it appears on top of the menu
        if (options.positionOpts.linkToFront) {
            referrer.clone().addClass('linkClone').css({
                position: 'absolute',
                top: 0,
                right: 'auto',
                bottom: 'auto',
                left: 0,
                width: referrer.width(),
                height: referrer.height()
            }).insertAfter(el);
        };
    };


    /* Utilities to sort and find viewport dimensions */

    function sortBigToSmall(a, b) { return b - a; };

    jQuery.fn.getTotalWidth = function() {
        return $(this).width() + parseInt($(this).css('paddingRight')) + parseInt($(this).css('paddingLeft')) + parseInt($(this).css('borderRightWidth')) + parseInt($(this).css('borderLeftWidth'));
    };

    jQuery.fn.getTotalHeight = function() {
        return $(this).height() + parseInt($(this).css('paddingTop')) + parseInt($(this).css('paddingBottom')) + parseInt($(this).css('borderTopWidth')) + parseInt($(this).css('borderBottomWidth'));
    };

    function getScrollTop() {
        return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    };

    function getScrollLeft() {
        return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
    };

    function getWindowHeight() {
        var de = document.documentElement;
        return self.innerHeight || (de && de.clientHeight) || document.body.clientHeight;
    };

    function getWindowWidth() {
        var de = document.documentElement;
        return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
    };

    /* Utilities to test whether an element will fit in the viewport
    Parameters:
    el = element to position, required
    leftOffset / topOffset = optional parameter if the offset cannot be calculated (i.e., if the object is in the DOM but is set to display: 'none') */

    function fitHorizontal(el, leftOffset) {
        var leftVal = parseInt(leftOffset) || $(el).offset().left;
        return (leftVal + $(el).width() <= getWindowWidth() + getScrollLeft() && leftVal - getScrollLeft() >= 0);
    };

    function fitVertical(el, topOffset) {
        var topVal = parseInt(topOffset) || $(el).offset().top;
        return (topVal + $(el).height() <= getWindowHeight() + getScrollTop() && topVal - getScrollTop() >= 0);
    };

    /*-------------------------------------------------------------------- 
    * javascript method: "pxToEm"
    * by:
    Scott Jehl (scott@filamentgroup.com) 
    Maggie Wachs (maggie@filamentgroup.com)
    http://www.filamentgroup.com
    *
    * Copyright (c) 2008 Filament Group
    * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
    *
    * Description: Extends the native Number and String objects with pxToEm method. pxToEm converts a pixel value to ems depending on inherited font size.  
    * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/
    * Demo: http://www.filamentgroup.com/examples/pxToEm/	 	
    *							
    * Options:  	 								
    scope: string or jQuery selector for font-size scoping
    reverse: Boolean, true reverses the conversion to em-px
    * Dependencies: jQuery library						  
    * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true});
    *
    * Version: 2.0, 08.01.2008 
    * Changelog:
    *		08.02.2007 initial Version 1.0
    *		08.01.2008 - fixed font-size calculation for IE
    --------------------------------------------------------------------*/

    Number.prototype.pxToEm = String.prototype.pxToEm = function(settings) {
        //set defaults
        settings = jQuery.extend({
            scope: 'body',
            reverse: false
        }, settings);

        var pxVal = (this == '') ? 0 : parseFloat(this);
        var scopeVal;
        var getWindowWidth = function() {
            var de = document.documentElement;
            return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
        };

        /* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size. 
        For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size. 	
        When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size) 
        to get an accurate em value. */

        if (settings.scope == 'body' && $.browser.msie && (parseFloat($('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) {
            var calcFontSize = function() {
                return (parseFloat($('body').css('font-size')) / getWindowWidth()).toFixed(3) * 16;
            };
            scopeVal = calcFontSize();
        }
        else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); };

        var result = (settings.reverse == true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em';
        return result;
    };
})(jQuery);
