// =================================================================================================
// 	Page Events - Contains all of the scripting for joinNPC.com
//	
//	Requires:
//		YUI 2 - Core, Dom, Events, Animation
// -------------------------------------------------------------------------------------------------
var JoinNPC = JoinNPC || {};

JoinNPC.pageEvents = function() {
	// ---------------------------------------------------------------------------------------------
	// 	Alias YAHOO namespace
	// ---------------------------------------------------------------------------------------------
		var Dom = YAHOO.util.Dom; // YUI Dom
		var Event = YAHOO.util.Event; // YUI Event
		var Element = YAHOO.util.Element; // YUI Element
		var Anim = YAHOO.util.Anim; // YUI Animation
		var Easing = YAHOO.util.Easing; // YUI Easing
		var Connect = YAHOO.util.Connect; // YUI EConnection Manager
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	//  Define module-wide variable scope	
	// ---------------------------------------------------------------------------------------------
		var moduleVars = {};
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	Init Module - Loads all of the module wide variables on DOM ready.
	//  @private
	// ---------------------------------------------------------------------------------------------
		var initModule = function() {
			moduleVars.panelElements = Dom.getElementsByClassName('stagePanel', 'div', 'stagePanelContainer'); // The array of stage panels that need to slide back and forth
			moduleVars.numberOfPanels = moduleVars.panelElements.length; // The number of stage panels
			moduleVars.panelCounter = 0; // Set a panel counter.
			moduleVars.pagePosition = 0; // Panel counter for navigating panels (in pixels)
			moduleVars.slideAmount = -990; // Stage Width (Reverse because left is negative)
			moduleVars.sliderToggle = 'closed'; // Set open / close state of slider
		}
	// ---------------------------------------------------------------------------------------------
		
	
	// ---------------------------------------------------------------------------------------------
	//  stageSetup() - get width of all elements for stage container, then sets the width of
	//  stagePanelContainer.
	//  @private
	// ---------------------------------------------------------------------------------------------
		var stageSetup = function() {
			var stageWidth = 0;
			var target = document.getElementById('stagePanelContainer');

			for(i=0; i<moduleVars.panelElements.length; i++) {
				// Yahoo - access node region and get width
				stageWidth += Dom.getRegion(moduleVars.panelElements[i]).width;
			}
			
			// Set Stage Width
			target.style.width = stageWidth + 'px';
		}
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	readQueryString(param) - Searches query string and returns value of param 
	//  @private
	// ---------------------------------------------------------------------------------------------
		var readQueryString = function(param) {	  
			param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
			
			var regex = new RegExp("[\\?&]"+param+"=([^&#]*)");
			var qs = regex.exec(window.location.href);
			
			if(qs != null) {
				return qs[1];
			}
		}	
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	preloadImages( '01.gif', '02.gif' ) - Preload Core Images
	//  @private
	// ---------------------------------------------------------------------------------------------
		var preloadImages = function() {
			// Set images to be preloaded here
			var args = [
				'../images/contact_bg.jpg',
				'../images/contact_us_button.png',
				'../images/footer_tab.png',
				'../images/footer_hover_bg.png',
				'../images/footer_hover_icon.png',
				'../images/next_button.png',  
				'../images/prev_button.png',
				'../images/submit_button.png'
			];
			
			document.imageArray = new Array(args.length);
			
			for(var i=0; i<args.length; i++) {
				document.imageArray[i] = new Image;
				document.imageArray[i].src = args[i];
			}
		}(); // Module is executed because we want this function to run before onDocumentReady
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	//  Background Image Control for IE6 - Set IE6 to Cache background images
	//	@private
	// ---------------------------------------------------------------------------------------------
		var backgroundControl = function() {
			// Error is expected depending on IE build, so we use a try/catch.
			try {
				document.execCommand("BackgroundImageCache",false,true);
			} catch(e) {}
		}
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	sliderMenu() - slides container up and down. Used for contact form
	//  @private
	// ---------------------------------------------------------------------------------------------
		var sliderMenu = function() {
			var slide = function() {
				var slider = document.getElementById('slider');
				var buttonText = document.getElementById('sliderToggleLink').innerHTML;
				
				if(Dom.hasClass(slider, 'open') == true) {
					Dom.removeClass(slider, 'open');
				}
				
				if(Dom.hasClass(slider, 'closed') == true) {
					Dom.removeClass(slider, 'closed');
				}
				
				// Check to see panel state
				if (moduleVars.sliderToggle == 'closed') {
					moduleVars.sliderToggle = 'open';
					buttonText = 'Open';
					
					// Yahoo animation object.
					var myAnim = new Anim('slider', {
						top: { to : 0 } 
					}, .5, Easing.easeOut);
					
					myAnim.animate();
					
					Dom.addClass(slider, 'open');
				} else {
					moduleVars.sliderToggle = 'closed';
					buttonText = 'Close';
					
					// This determines the height of the slider
					var sliderContentHeight = Dom.getRegion(document.getElementById('sliderContent')).height;
					
					// Yahoo animation object
					myAnim = new Anim('slider', {
						top: { to: (sliderContentHeight * -1) } // We want to close, so we change the abs position to negative
					}, .5, Easing.easeOut);
	
					myAnim.animate();
					
					Dom.addClass(slider, 'closed');
				}
			}
			
			var init = function() {
				var triggers = Dom.getElementsByClassName('sliderToggleLink');
				
				// Set event listeners on all button elements
				for(i=0; i<triggers.length; i++) {
					Event.addListener(triggers[i], "click", sliderMenu.slide);
				}
			}
			
			// Return methods to module
			return {
				init:init,
				slide:slide
			}
		}();
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	//	triggerSliderMenu() - Makes sliderMenu.slide publicly available 
	//	@public
	// ---------------------------------------------------------------------------------------------
		var triggerSliderMenu = function() {
			sliderMenu.slide();
		}
	// ---------------------------------------------------------------------------------------------
			
	
	// ---------------------------------------------------------------------------------------------
	// 	movePanel() - Moves stage (amt) - Use Whole Numbers (ex: 2 or -2).
	//	@public
	// ---------------------------------------------------------------------------------------------
		var movePanel = function(amt) {
			var testMove = moduleVars.panelCounter + amt;
			
			if(testMove < 0) {
				return false;
			} else if(testMove >= moduleVars.numberOfPanels) {
				return false;
			} else {
				var footerElements = document.getElementById('footerNavigation').getElementsByTagName('a');
			
				for(i=0; i<footerElements.length; i++) {
					if(Dom.hasClass(footerElements[i], 'currentLink') == true) {
						Dom.removeClass(footerElements[i], 'currentLink');
						Dom.addClass(footerElements[i + amt], 'currentLink');
						
						// When we encounter this condition, break the loop.
						break;
					}
				}
				
				moduleVars.panelCounter = moduleVars.panelCounter + amt;

				var target = document.getElementById('stagePanelContainer');
				var movement = amt * moduleVars.slideAmount;
				
				moduleVars.pagePosition = moduleVars.pagePosition + movement;
				
				// Yahoo animation object
				var myAnim = new Anim('stagePanelContainer', {
					left: {
						to: moduleVars.pagePosition,
						unit: 'px'
					} 
				}, 1, YAHOO.util.Easing.easeOut);
				
				myAnim.animate();
			}
		}
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	//  moveStagePanel(currentLink, panel) - Same as above, except moves to a specific panel in the 
	//  current section.
	//  @public
	// ---------------------------------------------------------------------------------------------
		var moveStagePanel = function(currentLink, panel) {
			var footerElements = document.getElementById('footerNavigation').getElementsByTagName('a');
			
			if(currentLink != '') {
				for(i=0; i<footerElements.length; i++) {
					Dom.removeClass(footerElements[i], 'currentLink');
				}
			
				Dom.addClass(currentLink, 'currentLink');
			}
			
			moduleVars.panelCounter = panel;
			
			movement = panel * moduleVars.slideAmount;
			
			moduleVars.pagePosition = movement;
			
			// Yahoo animation object
			var myAnim = new Anim('stagePanelContainer', {
				left: {
					to: moduleVars.pagePosition,
					unit: 'px'
				} 
			}, 1, YAHOO.util.Easing.easeOut);
		
			myAnim.animate();
		}
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	setCurrentPage() - Sets the current state of the page, using a query string.
	//		* Category and Page must be a number. ex: ?category=4&page=1
	//  @private
	// ---------------------------------------------------------------------------------------------
		var setCurrentPage = function() {
			var category = parseInt(readQueryString('category')) - 1; // -1 to account for 0
			var page = parseInt(readQueryString('page') - 1); // -1 to account for 0
			
			// Test query string value to endure it's a number
			if(isNaN(category) == false || isNaN(page) == false) {
				// Attempt to get the target elements. If category query sting value is higher than the number of categories,
				// target will be undefined, so it's in a try/catch block.
				try {
					target = Dom.getElementsByClassName('footerColumn', 'div', 'footerNavigation')[category].getElementsByTagName('a');
					
					// Page is valid only if it is less than or equal to the number of items in target
					if(page <= target.length) {
						Dom.addClass(target[page], 'currentLink');
						moveStagePanel('', page);
						Dom.addClass(target, 'current');
					}
				} catch(e) {
					// Suppress any errors
				}
			}
		}
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	handleKeyPress(type, args, object) - Function is fired from Yahoo keypress listener. It
	//  determines what to do with the keypress that is sent.
	//  @private
	// ---------------------------------------------------------------------------------------------
		var handleKeyPress = function(type, args, obj) {
			// Determine keypress
			switch (args[0]) {
				case 37:    // Left Key
					movePanel(-1);
					break;
				case 39:    // Right Key
					movePanel(1);
					break;
				default:
					return false;
			}
		}
	// ---------------------------------------------------------------------------------------------


	// ---------------------------------------------------------------------------------------------
	// 	onDocumentReadyFunctions() - Any functions that you want to run onDocumentReady, add here.
	//  @private
	// ---------------------------------------------------------------------------------------------
		var onDocumentReadyFunctions = function() {
			// Set module wide variables
			initModule();
			
			// Init sliding box
			sliderMenu.init();
			
			// Call stage setup function
			stageSetup();

			// Setup Keyboard Event Listener
			var kl = new YAHOO.util.KeyListener(
				document, // The element to attach the event to. (In this case, the whole page)
				{ keys:[37, 38, 39, 40] }, // The keycodes of the keys to listen to
				{ fn:handleKeyPress } // The function to run when the event is triggered
			); 
			
			// Enable keyboard event listener
			kl.enable();
			
			// Background Cache Fix for IE
			backgroundControl();
			
			// Get the current page
			setCurrentPage();
		}
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	//  YAHOO - Loads function using onDOMReady event.
	// ---------------------------------------------------------------------------------------------
		Event.onDOMReady(onDocumentReadyFunctions);
	// ---------------------------------------------------------------------------------------------
	
	
	// ---------------------------------------------------------------------------------------------
	// 	Return all public functions needed to public namespace
	// ---------------------------------------------------------------------------------------------
		return {
			movePanel:movePanel,
			moveStagePanel:moveStagePanel,
			triggerSliderMenu:triggerSliderMenu
		}
	// ---------------------------------------------------------------------------------------------
}();
// =================================================================================================

