Figment.Import( 'Figment.DOM', Figment.getJSRoot() + '_framework/' );
Figment.Import( 'Figment.EventHandler',Figment.getJSRoot() + '_framework/' );

/**
 * Event handler for the contextual help buttons.
 * 
 * @requires		Figment.DOM
 * @requires		Figment.EventHandler
 * @type			Disney.WDPRO.UI.ContextualHelp
 * @author			Daniel Konopacki
 * @constructor
 * @fileoverview	Event handler for the contextual help buttons.
 */

Figment.Namespace( 'Disney.WDPRO.UI.ContextualHelp' );
Disney.WDPRO.UI.ContextualHelp = {
	
	CONST_CONTEXTUALHELP_CONTAINER_CLASSNAME: 'contextualHelp_Popup',
	CONST_CONTEXTUALHELP_CLOSE_STATE: 'closedState',
	CONST_CONTEXTUALHELP_OPEN_STATE: 'openedState',
	CONST_CURRENT_HELP_WINDOW: null,
	
	/**
	 * Initialize the class. Adds necessary event handlers to the button
	 * objects and to the entire document.
	 * @param null
	 * @return void
	 * @private
	 */
	main: function () {
		
		var objButtons = Figment.DOM.getElementsByTagName( 'input' );
		var arrContextualHelpList = [];
		var displayAction = '';
		
		if ( objButtons !== null && objButtons.length > 0 ) {
			
			for ( var i=0; i < objButtons.length; i++ ) {
				
				if ( objButtons[ i ].className.indexOf( 'contextualHelp_' ) > -1 ) {
					
					objButtons[ i ].parentID = ( objButtons[ i ].parentNode.id !== '' ) ? objButtons[ i ].parentNode.id : objButtons[ i ].parentNode.parentNode.parentNode.id;
					arrContextualHelpList.push( objButtons[ i ] );
					
				}
				
			}
			
		}
		
		if ( arrContextualHelpList !== null && arrContextualHelpList.length > 0 ) {
			
			for ( var i=0; i < arrContextualHelpList.length; i++ ) {
				
				Figment.EventHandler.addEvent( arrContextualHelpList[ i ], 'click', Disney.WDPRO.UI.ContextualHelp.EVENT_SwapStates_onClick );
				
			}
			
		}
					
		Figment.EventHandler.addEvent( document, 'click', Disney.WDPRO.UI.ContextualHelp.EVENT_Document_onClick );
		
		delete objButtons;
		delete arrContextualHelpList;
		delete displayAction;
		
	},
	
	/**
	 * Changes the states of the contextual help object to either show it or hide it.
	 * @param objTargetDiv: The HTML object that is to be hidden or shown.
	 * @param strCurrentState: The current visibility state of the object.
	 * @return void
	 */
	swapState: function ( objTargetDiv, strCurrentState ) {
		
		var strNewState = '';
		
		if ( objTargetDiv !== null ) {
			
			strNewState = Disney.WDPRO.UI.ContextualHelp.getNewState( strCurrentState );
			
			if ( strNewState !== '' && strNewState !== null ) {
				
				Disney.WDPRO.UI.ContextualHelp.toggleSelectBoxes();
				objTargetDiv.className = Disney.WDPRO.UI.ContextualHelp[ 'CONST_CONTEXTUALHELP_' + strNewState.toUpperCase() + '_STATE' ];
				Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW = ( strNewState == 'open' ) ? objTargetDiv.parentNode : null;
			
			}
		
		}
		
		delete strNewState;
		
	},
	
	/**
	 * Hide select boxes in order to prevent unsightly boxes showing through
	 * the blocking layer. Used to fix IE :-(.
	 */
	toggleSelectBoxes: function()
	{
		var objBody	= Figment.DOM.getElementsByTagName( "body" )[0];

		if( Figment.DOM.hasClassName( objBody, 'hideSelects' ))
		{
			Figment.DOM.removeClassName( objBody, 'hideSelects' );
		}
		else
		{
			Figment.DOM.addClassName( objBody, 'hideSelects' );
		}
		
		// Garbage man!
		delete objBody;
	},
	
	/**
	 * Returns the current visibility state of the object.
	 * @param strClassState: The className of the object.
	 * @return String
	 */
	getState: function ( strClassState ) {
		
		var strState = '';
		
		if ( strClassState !== null && strClassState !== '' ) {
			
			strState = strClassState.replace( 'State', '' );
			
			if ( strState !== null && strState !== '' ) {
				
				return strState;
				
			}
		
			return null;
			
		}
		
		delete strState;
		return null;
		
	},
	
	/**
	 * Switches between two different states
	 * @param strCurrentState: The current state of the object.
	 * @return String
	 */
	getNewState: function ( strCurrentState ) {
		
		if ( strCurrentState !== null && strCurrentState !== '' ) {
			
			return ( strCurrentState.toLowerCase() === 'closed' ) ? 'open' : 'close';
			
		}
		
		return null;
		
	},
	
	/**
	 * Gets the div layer that acts as the contextual help pop-up window
	 * @param objContextualHelp: The contextual help object that was invoked
	 * @return HtmlDIVElement
	 */
	getFromEvent: function( objContextualHelp ) {
		
		if ( objContextualHelp !== null || objContextualHelp !== '' ) {
			
			if ( objContextualHelp.childNodes.length > 0 ) {
				
				for ( var i=0; i < objContextualHelp.childNodes.length; i++ ) {
					
					if ( objContextualHelp.childNodes[ i ].className !== null && objContextualHelp.childNodes[ i ].className !== undefined ) {
						
						if ( objContextualHelp.childNodes[ i ].className.indexOf( 'State' ) > -1 ) {
							
							return objContextualHelp.childNodes[ i ];
							
						}
						
					}
					
				}
				
			}
			
		}
		
		return null;
		
	},
	
	/**
	 * Walks back up the DOM tree to determine whether a particular DOM element that
	 * was triggered belongs to a currently opened contextual help window.
	 * @param objElement: The DOM element that was invoked
	 * @return HtmlDIVElement
	 */
	getParentObject: function ( objElement ) {
		
		var currentElement = null;
		
		if ( objElement !== null ) {
			
			currentElement = objElement;
			
			while ( currentElement !== null && currentElement.tagName !== undefined ) {
				
				if ( currentElement.id === Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW.id ) {
					
					return currentElement;
					
				} else {
					
					currentElement = currentElement.parentNode;
					
				}
				
			}
		
		}
		
		delete currentElement;
		return null;
		
	},
	
	/**
	 * Determines whether a DOM object should trigger a contextual help close event.
	 * @param objElement: The object that triggered the event.
	 * @return Boolean
	 */
	fireTrigger: function ( objElement ) {
		
		if ( objElement !== null && Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW !== null ) {
			
			if ( objElement.id === Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW.id ) {
				
				return true;
			
			} else if ( Disney.WDPRO.UI.ContextualHelp.getParentObject( objElement ) !== null ) {
				
				return false;
				
			}
		
		}
		
		return true;
		
	},
	
	/**
	 * EVENT - Swaps the state of the contextual help to either show it or hide it
	 * based on button selection.
	 * @param evt: The event that was fired
	 * @return void
	 */
	EVENT_SwapStates_onClick: function ( evt ) {
		
		var objWindowEvent = Figment.EventHandler.getEvent( evt );
		var objElement = objWindowEvent.targetElement;
		var objLayer = Figment.DOM.getElementById( objElement.parentID );
		var objState = null;
		var strState = '';
		
		if ( Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW === null || Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW === Figment.DOM.getElementById( objElement.parentID ) ) {
		
			if ( objLayer !== null ) {
				
				objState = Disney.WDPRO.UI.ContextualHelp.getFromEvent( objLayer );
				
				if ( objState !== null ) {
					
					Disney.WDPRO.UI.ContextualHelp.swapState( objState, Disney.WDPRO.UI.ContextualHelp.getState( objState.className ) );
					
				}
				
			}
		
		}
		
		delete objElement;
		delete objWindowEvent;
		delete objLayer;
		delete objState;
		delete strState;
		
	},
	
	/**
	 * EVENT - Sets the events for when a user triggers an event directly from the
	 * document. This is only used to close the contextual help.
	 * @param evt: The event that was fired
	 * @return void
	 */
	EVENT_Document_onClick: function( evt ) {
		
		var objWindowEvent = Figment.EventHandler.getEvent( evt );
		var objElement = objWindowEvent.targetElement;
		var objLayer = Disney.WDPRO.UI.ContextualHelp.CONST_CURRENT_HELP_WINDOW;
		var objState = null;
		
		// Check to see if the event happened on an element inside a state fieldset
		if ( Disney.WDPRO.UI.ContextualHelp.fireTrigger( objElement ) ) {
			
			if ( objLayer !== null ) {
				
				objState = Disney.WDPRO.UI.ContextualHelp.getFromEvent( objLayer );
				
				if ( objState !== null ) {
					
					objWindowEvent.preventDefault();
					Disney.WDPRO.UI.ContextualHelp.swapState( objState, Disney.WDPRO.UI.ContextualHelp.getState( objState.className ) );
					
				}
				
			}
			
		}

		delete objWindowEvent.targetElement;
		delete objWindowEvent.element;
		delete objWindowEvent;
		delete objElement;
		delete objStates;
		delete objState;
		
	}
	
};

Figment.EntryPoint.add( Disney.WDPRO.UI.ContextualHelp );