/* 
	CSSPlus+ DHTML Library
	jQuery 1.2 (and Timer plugin) based unobtrusive CSS-ish menus (menus themselves are CSS rendered, behaviors for attaching to objects is handled here).
	Author: Craig Waterman
*/

var gTimer				= null;		// Placeholder for a global timer
var gActiveMenu		= null;		// Placeholder for which menu is active.
var gActiveImage		= null;		// Placeholder for sticky image.
var gObscureSelects	= false;		// Flag to force hiding select dropdowns in IE when the menus are active.
var gMenuSpeed			= 250;			// Speed at which the menus disappear after mouseout (in ms)
var gImageSuffix		= "_on";		// Extension to the base filename for rollovers.

// Unobtrusive image rollovers (any tag with a .src)
$(document).ready(
	function()
	{
		$(".rollover").each(
			function(e)
			{
				var currentImage = $(this);
				var srcNorm = currentImage.attr("src");
				var lastDot = srcNorm.lastIndexOf(".");
				var extCheck = srcNorm.substring(lastDot, lastDot - gImageSuffix.length);
				var srcOver = srcNorm;

				if (extCheck != gImageSuffix)
				{
					srcOver = srcNorm.substring(0,srcNorm.lastIndexOf(".")) + gImageSuffix + srcNorm.substring(srcNorm.lastIndexOf("."));
					var tempImage = new Image();
					tempImage.src = srcOver;
					currentImage.attr("overImage", tempImage);
				}
				
				currentImage.attr("srcNorm", srcNorm);
				currentImage.attr("srcOver", srcOver);
			}
		)
		.mouseover(
			function(e)
			{
				var currentImage = $(this);

				currentImage.attr( "src", currentImage.attr("srcOver") );
				
				if (gActiveMenu)
				{
					if (gActiveMenu.attr("id") != currentImage.attr("id") + '_items')
					{
						resetMenu();
					}
				}				
			}
		)
		.mouseout(
			function(e)
			{
			
				currentImage = $(this);
				if ( !currentImage.attr("menuOpen") )
				{
					currentImage.attr("src", currentImage.attr("srcNorm") );
				}
			}
		);
		
		// IE 6 hover state modifications
		if( $.browser.msie && parseInt($.browser.version) < 7 )
		{
			//document.execCommand("BackgroundImageCache",false,true);
			$("ul.menu li")
			$("ul.menu li")
			.mouseover(
				function(e)
				{
					$(this)
					.addClass("DisplayHover")
					.children("ul").each( function(e) { $(this).addClass("DisplayBlock"); } )
					.end()
					.children("ba").each( function(e) { $(this).addClass("DisplayHover"); } )
					;
				}
			)
			.mouseout(
				function(e)
				{
					hideMenu();
					e.stopPropagation();
					$(this).removeClass("DisplayHover")
					.children("ul").each( function(e) { $(this).removeClass("DisplayBlock"); } )
					.end()
					.children("ba").each( function(e) { $(this).removeClass("DisplayHover"); } )
					;
				}
			);
		}
	}
);

// Menuing additions to core CSS-based rollovers.
$(window).resize( positionMenus );

$(document)
.ready(
	function()
	{
		positionMenus();
		$(".sub").each
		(
			function()
			{
				$(this).mouseover(
					function()
					{
						if( gTimer )
						{
							gTimer.stop();	
						}
					}
				)
				.mouseout( hideMenu );
			}
		);
	}
);

function positionMenus() {
	$(".menuanchor").each(
		function()
		{
			tAnchor = $(this);
			tMenu = $("#" + this.id + '_items');
			
			if( tMenu )
			{
				var offset = tAnchor.offset();
				tHeight = tAnchor.outerHeight() - 1;
				tWidth = tAnchor.width();
				
				if( tMenu.hasClass("horizontal") )
				{
					tMenu.css({marginLeft : (offset.left+tWidth)+"px", marginTop : offset.top+"px"});
				}
				else
				{
					tMenu.css({marginLeft : offset.left+"px", marginTop : offset.top+tHeight+"px"});
				}
			}
			
			tMenu.mouseover( hoverMenu ).mouseout( hideMenu );
			tAnchor.mouseover( showMenu ).mouseout( hideMenu );
			
		}
	
	);

}

// Stop the global hiding timer.
function hoverMenu(e) {
	if (gTimer) {
		gTimer.stop();
	}
}

// Determine if select objects need hiding. Mark the image attached to this event as sticky
function showMenu(e) {

	var oe = $(this);
	
	if (gObscureSelects) { obscureSelects(); }
	
	// reset PEs here.
	if (gTimer) {
		gTimer.stop();
	}

	if (gActiveMenu) {
		if ( gActiveMenu.attr("id") != oe.attr("id") + '_items') {
			resetMenu();
		}
	}

	gActiveImage = oe;
	gActiveMenu = $( "#" + oe.attr( "id" ) + '_items' );

	gActiveMenu.removeClass( 'hide' );
	gActiveImage.attr( "src", gActiveImage.attr("srcOver") );
	gActiveImage.attr( "menuOpen", true );

}

// Set a timer to hide the menus.
function hideMenu(e) {
	if (gTimer) {
		gTimer.stop();
		gTimer = null;
	}

	gTimer = $.timer( 
		gMenuSpeed, 
		function( timer )
		{
			resetMenu();timer.stop();
		}
	);
}

// Actually hide the menus. Reset any sticky image at the same time. Reset SELECT drop-downs.
function resetMenu() {
	if (gActiveMenu) {
		
		gActiveMenu.addClass('hide');

		gActiveImage.attr( "src", gActiveImage.attr("srcNorm") );
		gActiveImage.attr( "menuOpen", false );

		gActiveMenu = null;
		gActiveImage = null;

	}

	if ( gObscureSelects ) { unObscureSelects(); }

	if( gTimer )
	{
		gTimer.stop();
	}
}

// So named due to f(n) naming conflicts with boxover.
function obscureSelects() { 
	if( $.browser.msie )
	{
		$("select").addClass("obscure");
	}
}

function unObscureSelects() {
	if( $.browser.msie )
	{
		$("select").removeClass("obscure");
	}
}