///////////////////////////////
// FME Application Domain
///////////////////////////////

var FME = function()
{
	var constructors = CONSTRUCTORS();

	var myDataFormatsSearch;
	var myScrollableHandler;
	var myTabs;
	var myResources;
	var mySolutionTabs;
	var myCommunities;
	var myInnerMessaging;
	var myProductInfo;
	var myGoogleSearch;
	var myTrialDownloads;
	var mySoftwarePartners;
	var myTrainingCalendarSearch;
	var myVideoPlayerObj;
	var myOverlay;
	var myToggleExpandCollapse;

	$( document ).ready( function()
	{
		myDataFormatsSearch = constructors.get( "dataFormatsSearch" )();
		myScrollableHandler = constructors.get( "scrollableHandler" )();
		myTabs = constructors.get( "tabs" )();
		myResources = constructors.get( "fmeResources" )();
		mySolutionTabs = constructors.get( "solutionTabs" )();
		myCommunities = constructors.get( "communities" )();
		myInnerMessaging = constructors.get( "innerMessaging" )();
		myProductInfo = constructors.get( "productInfo" )();
		myGoogleSearch = constructors.get( "googleSearch" )();
		myToggleExpandCollapse = constructors.get( "toggleExpandCollapse" )( ".expand-collapse-description", "More...", "Close", 0 );
		myOverlay = constructors.get( "initOverlay" )();

		if( constructors.exists( "trialDownloads" ) )
		{
			myTrialDownloads = constructors.get( "trialDownloads" )();
		}
		if( constructors.exists( "trainingCalendarSearch" ) )
		{
			myTrainingCalendarSearch = constructors.get( "trainingCalendarSearch" )();
		}
		if( constructors.exists( "videoplayer" ) )
		{
			myVideoPlayerObj = constructors.get( "videoplayer" )();
		}
		if( constructors.exists("softwarePartners") )
		{
			mySoftwarePartners = constructors.get( "softwarePartners" )();
		}
	});

	return {
		addConstructor: function( n, c ) {constructors.set( n, c );},
		getConstructor: function( n ) {return constructors.get( n );},

		getDataFormatsSearch: function() {return myDataFormatsSearch;},
		getScrollableHandler: function() {return myScrollableHandler;},
		getTabs: function() {return myTabs;},
		getResources: function() {return myResources;},
		getSolutionTabs: function() {return mySolutionTabs;},
		getCommunities: function() {return myCommunities;},
		getInnerMessaging: function() {return myInnerMessaging;},
		getProductInfo: function() {return myProductInfo;},
		getGoogleSearch: function() {return myGoogleSearch;},
		getTrialDownloads: function() {return myTrialDownloads;},
		getSoftwarePartners: function() {return mySoftwarePartners;},
		getMyToggleExpandCollapse: function() {return myToggleExpandCollapse;},
		getMyOverlay: function() {return myOverlay;},
		getTrainingCalendarSearch: function() {return myTrainingCalendarSearch;},
		getVideoPlayer: function() {return (myVideoPlayerObj == null) ? null : myVideoPlayerObj.player;}
	};
}();


FME.addConstructor( "toggleExpandCollapse", function( selector, moreText, closeText, collapseHeight )
{
	var selectorLink = selector+'-link';

	$( selector ).each( function(index) {
		var toggleText = closeText;
		$( this ).data( "defaultHeight", $( this ).height() );

		//if class is set to be 'expanded' then prepare for it to collapse
		if( !$( this ).is( selector+'-expanded' ) )
		{
			$( this ).siblings( selector+"-synopsis" ).show();
			$( this ).height( collapseHeight );
			toggleText = moreText;
		}

		//add link to container
		$( this ).after( '<div class="'+(selectorLink.replace('.',''))+'" style="cursor:pointer;color:#E98300;">'+toggleText+'</div>' );


		//set the div on click to expand in a toggle fashion
		if( !$( this ).is( selector+'-expanded' ) )
		{
			$( this ).siblings( selectorLink ).toggle(
				function() {
					$( this ).siblings( selector+"-synopsis" ).hide();
					$( this ).prev().animate( {height:$( this ).siblings( selector ).data( "defaultHeight" )}, 500 );
					$( this ).html( closeText );
				},
				function() {
					$( this ).prev().animate( {height:collapseHeight}, 500 );
					$( this ).siblings( selector+"-synopsis" ).show();
					$( this ).html( moreText );
				}
			);
		} else //reverse the toggle if already expanded
		{
			$( this ).siblings( selectorLink ).toggle(
				function() {
					$( this ).prev().animate( {height:collapseHeight}, 500 );
					$( this ).siblings( selector+"-synopsis" ).show();
					$( this ).html( moreText );
				},
				function() {
					$( this ).siblings( selector+"-synopsis" ).hide();
					$( this ).prev().animate( {height:$( this ).siblings( selector ).data( "defaultHeight" )}, 500 );
					$( this ).html( closeText );
				}
			);
		}
	});
});


// Data formats search box functionality

FME.addConstructor( "dataFormatsSearch", function()
{
	var setup = function()
	{
	};

	var setupSearchBox = function( data )
	{
		$( "#data-formats-field" ).autocomplete( {
			source: data
		});
	};

	setup();

	return {
		setDataFormats: function( data )
		{
			setupSearchBox( data );
		}
	};
});

// Sets up various scrollables

FME.addConstructor( "scrollableHandler", function()
{
	var setup = function()
	{
		$( "div.hero-spot" ).scrollable( {transition: "crossfade", autoCycle: {seconds: 10, holdOnClick: true, holdResumeSeconds: 0}} );
		if( !$.browser.msie || ($.browser.msie && parseInt( $.browser.version) > 6) )
		{
			$( "div.news-items" ).scrollable( {transition: "crossfade", autoCycle: {seconds: 7},sequentialAccessNav: false, randomAccessNav: false} );
		}
		$( "div.demos-scroll-window, div.data-transformation-scroll" ).scrollable( {sequentialAccessNav: true} );		
		$( "div.featured-solutions-mask" ).scrollable( {sequentialAccessNav: true, randomAccessNav: false} );
		$( "div.data-transformation-mask" ).scrollable( {sequentialAccessNav: true} );
	};

	setup();

	return {
		update: function()
		{
			setup();
		}
	};
});

// tabs

FME.addConstructor( "tabs", function()
{
	var setup = function()
	{
		$( "div.tabs-container > div.tab-component-box:gt(0)" ).hide();

		$( "ul.tabs li" ).click( function( e )
		{
			var position =  $( this ).index();
			$( "div.tabs-container > div.tab-component-box" ).hide();
			$( "div.tabs-container > div.tab-component-box:eq(" + position + ")" ).show();

			$( "ul.tabs li" ).removeClass( "selected" );
			$( this ).addClass( "selected" );

			if( position == 1 ) {
				$( this ).find( "a" ).css({backgroundPosition: "right top"});
			}

			e.preventDefault();
		});
	};

	setup();

	return {};
});

// FME resources

FME.addConstructor( "fmeResources", function()
{
	var setup = function()
	{
		$( "li.resources > ul.navigation > li" ).hover(
			function()
			{
				$( this ).removeClass("hover");
				if( $( this ).children( "ul" ).length>0 )
				{
					$( this ).addClass("hover");
				}
				var top = ( $( this ).height() ) * ( $( this ).index() + 1 ) + 2;
				//modified top value to make box appear centered vertically
				$( this ).find( "ul" ).css({top: top - ( ($( this ).children(".lower-johnson-boxes ul.container li.item-1 ul li ul").height()/2)-5 )});
			},
			function()
			{
				if( $( this ).children( "ul" ).length>0 )
				{
					$( this ).removeClass("hover");
				}
			}
		);
	};

	setup();

	return {};
});

// Handles overlay box init
FME.addConstructor( "initOverlay", function()
{
	var setup = function()
	{
		$( "a[rel='#autoiframe']" ).overlay(
		{
			effect: "autoiframe",
			mask: "#666666"/*,
			onBeforeClose: function()
			{
				var iframe = $( "#autoiframe iframe" );
				var iframeContainer = $( "#autoiframe div.iframe" );

				iframeContainer.width( iframe.width() );
				iframeContainer.height( iframe.height() );

				iframe.hide();
			}
			*/
		});
	};

	setup();

	return {};
});


FME.addConstructor( "solutionTabs", function()
{
	var setup = function()
	{
		$( "ul.solution-tabs li" ).click( function( e )
		{
			var position =  $( this ).index();
			$( "ul.solution-content > li" ).hide();
			$( "ul.solution-content > li:eq(" + position + ")" ).show();

			$( "ul.solution-tabs li" ).removeClass( "selected" );
			$( this ).addClass( "selected" );
		});
	};

	setup();

	return {};
});

// Handles interactivity on the communities page

FME.addConstructor( "communities", function()
{
	var backCaption = "Back to " + $( "div.section-header" ).text() + " page";

	var setup = function()
	{
		if( $("form#communities-search").length > 0 )
		{
			$( "form#communities-search" ).submit( function()
			{
				var url = $( this ).attr( "action" ) + "?";
				$( "input", this ).each( function()
				{
					url = url + $( this ).attr( "name" ) + "=" + $( this ).val() + "&";
				});

				ajaxSearch( url );
				return false;
			});

			$( ".three-columns a[href*=site-search]" ).live( "click", function( e )
			{
				var queryString = $( this ).attr( "href" ).split( "?" )[ 1 ];
				var url = $( "form#communities-search" ).attr( "action" ) + "?" + queryString;

				ajaxSearch( url );
				e.preventDefault();
			});
		}
	};

	var ajaxSearch = function( url )
	{
		$( "div.three-columns" ).empty();
		$( "div.three-columns" ).append( $( "<div class='wait' />" ) );

		$( "div.three-columns" ).load( url.replace( " ", "%20" ) + " div.search-results", function()
		{
			var backCaptionHTML = $( "<p><a class=\"red-arrow\" href=\"" + window.location.href.split( "?" )[ 0 ] + "\">" + backCaption + "</a></p>" );
			if( $( "div.search-results > h3" ).length > 0 )
			{
				backCaptionHTML.insertAfter( $( "div.search-results > h3" ) );
			} else
			{
				backCaptionHTML.prependTo( "div.three-columns" );
			}
		});
		$( "div.three-columns" ).ajaxError( function() {alert("There was an error in obtaining AJAX data");
		} );
	};

	setup();

	return {};
});

// Handles setting up all inner-message textboxes

FME.addConstructor( "innerMessaging", function()
{
	var setup = function()
	{
		$( "input.pre-content-input, .non-styled-pre-content-input" ).innerMessage();
	};

	setup();

	return {};
});

// Product info tabs

FME.addConstructor( "productInfo", function()
{
	var setup = function()
	{
		$( "#fme-desktop-tabs" ).tabs();
	};

	setup();

	return {};
});

// Google search custom JS handling

FME.addConstructor( "googleSearch", function()
{
	var setup = function()
	{
		$( "form[action='/search/']" ).not( ".communities-search-box form" ).submit( function()
		{
			var textBox = $( "input[type=text]", this );
			textBox.hide();
			$( ":submit", this ).attr( "disabled", "disabled" );
			if( document.getElementById(textBox.attr("id")) )
			{
				var actualValue = document.getElementById(textBox.attr("id")).value;
				if( actualValue == textBox.attr("title") && textBox.is(".inner-messaging") ) {
					document.getElementById(textBox.attr("id")).value = '';
				}
			}
			$( "<div>Searching for '" + textBox.val() + "'...</div>" ).addClass( textBox.attr( "class" ) ).insertBefore( textBox );
			return true;
		});
	};

	setup();

	return {};
});

// Example module to get started with

FME.addConstructor( "example", function()
{
	var setup = function()
	{
	};

	setup();

	return {};
});
