/*-------------------------------------------------------------------- 
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.
--------------------------------------------------------------------*/
// Função para permitir o uso do $ do jQuery
jQuery(document).ready(function($) {
	// Code that uses jQuery's $ can follow here.
	var hinitMenu = 0;
	
	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();			
				// ivia
				hinitMenu = $("#menuContainer ul:first").height();
				if ($.browser.msie && $.browser.version == "8.0") { $("#menuContainer ul:first").append("<br clear='all' />"); }
			} else { 
				m.kill(); 
			};
			return false;
		});
	
	};
	
	function Menu(caller, options){
		var menu = this;
		var caller = $(caller);
		var container = $('<div id="menuContainer" 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: 300, // width of menu container, must be set or passed in to calculate widths of child menus
			//maxHeight: 200, // 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: true, // 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;
			// IVIA
			$("#menuContainer").height("auto");
			if ($.browser.msie && $.browser.version == "8.0") { $("#menuContainer ul:first br").remove(); }
			$(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');
			container.find('a').attr('tabindex', '-1');
			
			// 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();
			// edit this for your own custom function/callback:
			// $('#menuSelection').text($(item).text());
			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();
						
						// Alterações IVIA 
						$("#menuContainer").height($(this).next().height() + 30);					
						$("ul.fg-menu-footer").css("top",$(this).next().height() + "px");
						// Fim Alterações
						
			    		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)');
	
							// Alterações IVIA
							var hFooter = 0;
							if(prevList.html()!=parentUl.html()){
								hFooter = $("ul.fg-menu-footer").height() + 10;
							} 
							else {
								hFooter = 0;
							}
							$("#menuContainer").height(prevList.height() + hFooter);
							$("ul.fg-menu-footer").css("top",prevList.height() + "px");
							// Fim Alterações
							
				    		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>Voltar</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) * 300;
										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 - 4, 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);
		};
		//alert(widget.html()); 
		
		
	};
	
	
	/* 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;
	};
});
