(function($) {
	if (typeof window.panels != 'object') window.panels = {};
	var undefined;
	var $win = $(window);
	var $pc = $('#page-content');
	var pcInfo = $pc.position();
	var topLimit = 510; // video player/hero area is 510px tall
	var targOpenCatfishHeight = 160;
	var targClosedCatfishHeight = 30;

	function Catfish () {
		var self = {};
		/* 
			OBJECT: oElements 
				- container for jQuery objects
		*/
		var oElements = {};
		/* 
			OBJECT: oInfo
				- data to hold info about elements within class
				- rename this later with a more reasonable name
		*/
		var oInfo = {
			targetY: 0, // target y location for panels
			bIsCatfish: false, // is the nav a catfish?
			bLimitTop: false, // changes if bIsCatfish == true
			bIsHome: true, // is the user on the homepage?
			nTargetLeftMargin: 60, // target left margin to apply to catfish
			nTopLimit: 510, // video player/hero area is 510px tall
			returner: {}, // object returned with nav info
			trackTab: {}, // track tab info for clicking
			current: null, // current tab
			block_classes: 'd-block display-b display-block display_block',
			hide_classes: 'd-none display-n display-none display_none'
		};
		/*
			OBJECT: oCurHover
				- holder object for sliding elements
		*/
		var oCurHover = {};

		var oOptions = {
			bIsHome: true,
			bIsCatfish: false,
			bLimitTop: false, 
			nTargetLeftMargin: 60, // target left margin to apply to catfish
			nTopLimit: 510, // video player/hero area is 510px tall
			nTargOpenCatfishHeight: 160, 
			nTargClosedCatfishHeight: 30,
			sEventType: 'hover', // type of action: click/hover
			els: {
				page_container: '#page-container', // used for positioning catfish when horizontal scroll is present
				page_content: '#page-content', // used to dynamically get left position
				footer_container: '#footer-container', // page footer 
				slider_wrap: '#topbar-container',
				panel: '#panel-wrap', // $panelHolder = $('#whatsNewPanels'),
				panels: '.panel-container', //$panels = $('.panel'),
				panel_close: '.btn-close',
				tab_wrap: '.tab-wrap', // wraps the text to the actual link
				tab_anchors: '#panel-buttons a', // $whatsNewButtons = $('#whatsNewButtons a'),
				tab_btns: '#panel-buttons', // #whatsNewButtons
				tab_li: '#panel-buttons li',
				top_video_wrap: '#top-video-holder', // $topVideoHolder = $('#topVideoHolder'),
				top_video_player: '#top-video-player',
				video_close: '#btn-video-close', // $videoClose = $('#videoCloseBtn'),
				catfish_wrap: '#catfish-wrap',
				catfish_container: '#catfish-container',
				catfish: '#catfish',
				catfish_bg: '#catfish-bg',
				catfish_panels_wrap: '#catfish-panels-wrap',
				catfish_hp_bar: '#catfish-hp-bar'
			},
			classes: {
				active: 'active',
				remove_active: 'active btn_0_alt btn_0 btn_1_alt btn_1 btn_2' // all possible style classes that should be removed when a tab is not active
			},
			// used to store content to inject into panels
			html: {},
			method: 'hover' // method to use on tabs
		};
		
		/*
			oRegexps: OBJECT of regular expressions for easier look up
		*/
		var oRegexps = {
			'type': /^type$/gi,
			// pageName-__topnav__products prop18-topnav
			'tracking': /[(pageName)-]?[_{2}(\w+)]+/gi,
			'commerce': /\/commerce\//gi,
			'prop': /^prop\d{1,2}/gi,
			'pn': /^pageName/i
		};

		self.checks = function() {
			var blogTest = {
				'dev': /\bcs\./i,
				'staging': /\binside\-staging\./i,
				'prod': /\binside\./i
			};
			var vers = $.browser.version;
			var versions = vers.split('.');
			self.settings = {
				bIsBlog: blogTest[NIKEOS.site_mode].test(window.location.host),
				isMozilla: $.browser.mozilla,
				isIE: $.browser.msie,
				isSafari: $.browser.safari,
				nBrowserVers: vers,
				nMajor: parseInt(versions[0] || 0, 10),
				nMinor: parseInt(versions[1] || 0, 10) ,
				nRelease: parseInt(versions[2] || 0, 10),
				nBuild: parseInt(versions[3] || 0, 10)
			};
		};

		/*
			FUNCTION: returnjQueryObj()
				@obj:	OBJECT of key/value strings to be turned into jQuery objects
			returns an object of jQuery-fied elements
		*/
		function returnjQueryObj(obj) {
			var returned = {};
			if (!obj) return returned;
			for (var p in obj) {
				if (obj.hasOwnProperty(p) && obj[p]) {
					returned[p] = $(obj[p]);
				}
			}
			return returned;
		}
		
		/*
			FUNCTION: returnObjData()
			returns opposite direction of string passed in, defaults to 'up'
		*/
		function returnOppDir(dir) {
			return dir == 'up' ? 'down' : 'up';
		}

		/*
			FUNCTION: returnObjData()
			returns json object of object passed into more standard format
		*/
		function returnObjData(obj) {
			var tabId = obj.id,
				sPanelName = tabId.split('-')[1] || tabId,
				$this = $(obj),
				$par = $this.parent(),
				dir = oInfo.bIsCatfish && oInfo.bIsHome ? 'up' : 'down',
				nOffset = oInfo.nOffset;
			return {
				tabId: tabId,
				sPanelName: sPanelName,
				$this: $this,
				$par: $par,
				dir: dir,
				nOffset: nOffset
			};
		}

		function return_scroll_height () { // modified from http://www.codehouse.com/javascript/articles/scroll_area/
		   return window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop || 0;
		}
		function return_scroll_width () { // modified from http://www.codehouse.com/javascript/articles/scroll_area/
		   return window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft || 0;
		}

		function return_view_height () {
			return 	window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight;
		}
		function return_view_width () {
			return 	window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth;
		}

		function createInnerBorder() {
			return $('<div class="inner-border">&nbsp;</div>');
		}

		/*
			FUNCTION: isObjectEmpty()
			returns bool if json object is empty
		*/
		function isObjectEmpty(obj) {
			if (!obj) return false;
			var count = 0;
			for (var p in obj) {
				if (obj.hasOwnProperty(p) && obj[p]) {
					return false;
				}
			}
			return true;
		}
		
		/*
			FUNCTION: typeOf(), http://javascript.crockford.com/remedial.html
			returns true object type.  array, null, and object types return object by default
		*/
		function typeOf(value) {
			var s = typeof value;
			if (s === 'object') {
				if (value) {
					if (value instanceof Array) {
						s = 'array';
					}
				} else {
					s = 'null';
				}
			}
			return s;
		}

		function checkFooterPos() {
			if (!oInfo.footer_position || oInfo.footer_position.top != oElements.footer_container.position().top) {
				oInfo.footer_position = oElements.footer_container.position();
				return true;
			}
			return false;
		}

		/*
			FUNCTION: detectPos()
			- makes sure the catfish and pilars do not go above the 510 mark b/c of the video player
			- keeps catfish positioned left to right correctly
		*/
		function detectPos(e) {
			
			// get the scrolling dimensions as well as the viewport dimensions
			var scroll_height = return_scroll_height();
			var scroll_width = return_scroll_width();
			var view_height = return_view_height();
			var view_width = return_view_width();
			NIKEOS.log('scroll_height: ', scroll_height, ' view_height: ', view_height);
			NIKEOS.log('scroll_width: ', scroll_width, ' view_width: ', view_width);	
			
			checkFooterPos();
			
			var footer_top = oInfo.footer_position.top - 10;
			var scrollCheckTop = scroll_height + view_height;
			
			NIKEOS.log('oInfo.footer position: ', oInfo.footer_position, ' checkTop: ', scrollCheckTop);
			
			
			// get the total height of catfish
			var cwOffset = oElements.catfish_wrap.offset();
			var cwHeight = oElements.catfish_wrap.height();
			var panelsH = oElements.panels.height();
			var currentTop = cwOffset.top - panelsH;
			// change the height if it's not on the homepage
			var comboH = cwHeight + panelsH; //oInfo.bIsHome ? cwHeight + panelsH : cwHeight;
			
			// viewable height with catfish
			var viewable = view_height - comboH; 
			var targOffset = topLimit - viewable;
			var offsetRange = currentTop - viewable;
			var maxScrollChange = scroll_height - offsetRange;
			var bottom = scroll_height < targOffset ? -(targOffset - scroll_height) : 0;
			
			// find out where we want to line up the catfish with
			var pp = oElements.page_content.position();
			// get the left margin of the catfish and adjust on horizontal scroll and window resize
			var ccMargin = oElements.catfish_container.css('margin-left');
			var ccParsed = parseInt(ccMargin, 10);
			var catfishPos = oElements.catfish.position();
			var non_scrolled_margin = (pp.left - catfishPos.left) + ccParsed;
			NIKEOS.log('catfish pos: ', catfishPos);
			NIKEOS.log('catfish pos: ', catfishPos.left, ' targ margin: ', oInfo.nTargetLeftMargin);
			NIKEOS.log('ccMargin: ', ccMargin, ' ccParsed: ', ccParsed, ' : ', pp.left);
			NIKEOS.log('non_scrolled_margin: ', non_scrolled_margin);
			NIKEOS.log('non_scrolled_margin - scroll_width: ', non_scrolled_margin - scroll_width);
			var margin = pp.left >= catfishPos.left ? (scroll_width > 0 ? non_scrolled_margin - scroll_width : non_scrolled_margin)
						: oInfo.nTargetLeftMargin;
			NIKEOS.log('margin: ', margin);
			// set the left margin on scroll and window resize
			oElements.catfish_container.css('marginLeft', Math.ceil(margin));
			
			// oElements.panels.height(): 130 
			var updatedFooterTop = oInfo.bIsHome ? footer_top - oElements.panels.height() : footer_top - 90;
			var updateFooterPadding = oInfo.bIsHome ? oInfo.paddings.footer_bottom : checks.settings.bIsBlog ? oInfo.paddings.footer_bottom + 60 : oInfo.paddings.footer_bottom + 40;
			var updatePanelsWrapTop = oInfo.bIsHome ? oElements.panels.height() : 90; 

			if (scrollCheckTop > footer_top || view_height > footer_top || view_height < oInfo.nTopLimit) {
				// footer is close by
				NIKEOS.log('------------------- scrollCheckTop > footer_top || view_height > footer_top');
				oElements.catfish_wrap.css({
					position: 'absolute',
					bottom: 'auto',
					top: updatedFooterTop,
					height: oInfo.nTargOpenCatfishHeight //160
				});
				oElements.catfish_panels_wrap.css({
					top: updatePanelsWrapTop
				});
				oElements.catfish_hp_bar.css({
					bottom: 0,
					top: 'auto'
				});
				oElements.catfish.css({
					top: 'auto',
					height: oInfo.nTargOpenCatfishHeight
				});
				oElements.footer_container.css({
					'paddingTop': updateFooterPadding, //oInfo.paddings.footer_bottom,
					'paddingBottom': 0
				});
			} else if (view_height < footer_top && !oInfo.bIsHome && view_height > oInfo.nTopLimit) {
				// footer not seen and catfish not taking up 510 area
				NIKEOS.log('------------------- view_height < footer_top && !oInfo.bIsHome');
				oElements.catfish_wrap.css({
					position: 'fixed',
					bottom: 0,
					top: 'auto',
					height: 'auto'
				});
				oElements.catfish_panels_wrap.css({
					top: updatePanelsWrapTop
				});
				oElements.catfish_hp_bar.css({
					bottom: 0,
					top: 'auto'
				});
				oElements.catfish.css({
					top: 'auto',
					height: oInfo.nTargOpenCatfishHeight
				});
				oElements.footer_container.css({
					'paddingTop': oInfo.paddings.footer_bottom,//oInfo.paddings.footer_bottom,
					'paddingBottom': 0
				});
			} else {
				NIKEOS.log('------------------- ELSE');
			}

			if ((view_height + scroll_height) < oInfo.nTopLimit) {
				//  || (view_height - oElements.catfish_wrap.height()) < oInfo.nTopLimit
				// animate the catfish so that it slides up or down, depending on if the comboH is beneath the nTopLimit
				oElements.catfish_wrap.stop().animate(
					{
						bottom: bottom
					},
					'fast',
					'easeOutQuad',
					null
				);
			}
/*			
			if (checks) {
				if (checks.settings.bIsIE && checks.settings.nMajor == 7) {
					oElements.footer_container.css({
						'paddingTop': update
					});
				}
				
			}
*/			
			
			
		}

		// attaches resize and scroll events to the browser window if catfish
		function keepPosition() {
			if (oInfo.bIsCatfish) {
				$win.resize(detectPos);
				$win.scroll(detectPos);
			}
		}

		/*
			FUNCTION: sliding()
			animates the top position of passed in element
		*/
		function sliding($el, dir, opts, cb) {
			/*
				$el:	STRING/jQuery-fied OBJECT, if string, gets turned into jQuery Object
				dir:	STRING, up/down
				opts:	OBJECT, can override three defaults: nsSpeed, nOffset, sEasing
				cb:		FUNCTION, callback when animation is done
			*/
			if (typeof $el == 'string') {
				$el = $($el);
			}
			var _dir = dir.toLowerCase();
			var opts = opts || {};
			var oSlideSettings = $.extend({ nsSpeed: 'slow', nOffset: 0, sEasing: 'easeOutQuart', bClosing: false }, opts);
			NIKEOS.log('el: ', $el, ' case: ', dir);
			var elHeight = $el.outerHeight(true);
			var upTarget = opts.nOffset > 0 && !oSlideSettings.bClosing ? elHeight + oSlideSettings.nOffset : !oSlideSettings.bClosing ? elHeight : 0;
			var downTarget = elHeight; //opts.nOffset > 0 ? elHeight + oSlideSettings.nOffset : elHeight;
			var $catfishParent = $el.parents(oOptions.els.catfish_panels_wrap);
			var catPos = $catfishParent.position();
			if (catPos.top != 0 && !oSlideSettings.bClosing) {
				upTarget += catPos.top;
			}
			NIKEOS.log('nOffset: ', oSlideSettings.nOffset);
			NIKEOS.log('upTarget: ', upTarget);
			NIKEOS.log('downTarget: ', downTarget);
			var newUpTarget = upTarget > 0 ? downTarget + oSlideSettings.nOffset : upTarget;
			if (oInfo.bIsHome) {
				newUpTarget += 10; // hacky yes, need to figure out why
			}
			NIKEOS.log('newUpTarget: ', newUpTarget);
			var _y = _dir == 'up' ? -(newUpTarget) : downTarget;//-(upTarget) : downTarget;
			NIKEOS.log(_dir, ' _y: ', _y);
			$el.stop().animate(
				{
					'top': _y
				}, 
				oSlideSettings.nsSpeed, 
				oSlideSettings.sEasing,
				function() {
					if (cb) cb();
				}
			);
		}

		/*
			FUNCTION: slider()
			wrapper for close-then-open functionality.
			to open/close a single element, use the sliding() method
		*/
		function slider (type, tabId, $child, $secChild, dir, nOffset, nsSpeed, cb) {
			/*
				type:		STRING, show/hide
				tabId:		STRING
				$child:	 	OBJECT, jQuery-fied object, first object to animate
				$secChild:	OBJECT, jQuery-fied object, second object to animate 
				dir:	 	STRING, up/down
				nOffset:	NUMBER, 
				nsSpeed:	NUMBER/STRING, speed of animation, defaults to 'fast'
				cb:			FUNCTION
			*/
			var t = type || 'show';
			var firstAnime = t == 'show' ? $child : $secChild;
			var secondAnime = t == 'show' ? $secChild : $child;
			var nsSpeed = nsSpeed || 'fast';
			var oCur = oCurHover[tabId];
			
			var options = {
				nOffset: nOffset, 
				nsSpeed: nsSpeed 
			};
			
			oCur.bFirstIsAnimating = true;
			
			NIKEOS.log('slider options: ', type, tabId, $child, $secChild, dir, nOffset, nsSpeed);
			NIKEOS.log('sliding options (first): ', firstAnime, dir, options, 'cb()');
			
			sliding(firstAnime, dir, options, function(e) {
				var oppDir = returnOppDir(dir);
				var offset = t == 'show' ? 0 : nOffset;
				var bIsClosing = t == 'show' ? false : true;
				NIKEOS.log('in cb: ', oppDir);
				secondAnime.removeClass(oInfo.hide_classes).addClass(oInfo.block_classes);
				firstAnime.removeClass(oInfo.block_classes).addClass(oInfo.hide_classes);
				oCur.bFirstIsAnimating = false;
				oCur.bSecondIsAnimating = true;
				sliding(secondAnime, oppDir, { nOffset: offset, bClosing: bIsClosing, nsSpeed: nsSpeed }, function() {
					oCur.bIsClosing = bIsClosing;
					oCur.bSecondIsAnimating = false;
					var console_message = t == 'show' ? 'in second cb hover: ' : 'in second cb off: ';
					NIKEOS.log(console_message, tabId, ' : ', oCur.bIsClosing);
					// this means the hover off event did not get fired and the tabs are still open...so fix it
					if (!oCur.bIsClosing && !oCur.bFirstIsAnimating && !oCur.bSecondIsAnimating && !oCur.bHoverOn) {
						setTimeout(function() {
							slider('hide', tabId, oCur.$child, oCur.$secChild, dir, oCur.nOffset, nsSpeed);
						}, 0);
					}
				});
				if (cb) cb();
			});
		}

		/*
			FUNCTION: showAllCatfish()
			shows catfish if on homepage
		*/
		function showAllCatfish() {
			var hoverInfo = {};
			var duration = 700;
			var numTouts = oInfo.panel_length;
			var count = 0;
			var step = Math.round(1000 / numTouts);
			NIKEOS.log('init DURATION: ', duration);

			oElements.tab_wrap.each(function(i,a) {
				$(this).addClass('invisible');
			});
			oElements.catfish_bg.addClass('invisible');

			oElements.panels.each(function(i,a) {
				count++;
				var objInfo = returnObjData(this);
				var tabId = objInfo.tabId,
					sPanelName = objInfo.sPanelName,
					dir = objInfo.dir,
					nOffset = objInfo.nOffset,
					$this = objInfo.$this,
					$par = objInfo.$par,
					$sib = $this.siblings(oElements.panels);
				$this.addClass('d-block').click(function(i,a) {
					window.location.href = $this.find('a').attr('href');
				});
				NIKEOS.log('all sliding: ', $this, dir, { nOffset: nOffset, nsSpeed: duration });
				sliding($this, dir, { nOffset: nOffset, nsSpeed: duration });
				duration += step;
				NIKEOS.log('DURATION: ', duration);
				if (count == numTouts) {
					detectPos(null);
				}
			});
		}

		function clicker(e) {
			e.preventDefault();
			var objInfo = returnObjData(this);
			NIKEOS.log('objInfo: ', objInfo);
			var tabId = objInfo.tabId,
				sPanelName = objInfo.sPanelName,
				dir = objInfo.dir,
				nOffset = objInfo.nOffset,
				$this = objInfo.$this,
				$par = objInfo.$par,
				children = oOptions.els.tab_anchors + ', ' + oOptions.els.panels,
				_child = $this.children(children),
				$child = (oInfo.bIsCatfish && oInfo.bIsHome) ? $(_child[1]) : $(_child[0]),
				$secChild = (oInfo.bIsCatfish && oInfo.bIsHome) ? $(_child[0]) : $(_child[1]);
			if (typeof oCurHover[tabId] != 'object') {
				oCurHover[tabId] = {};
			}
			oCurHover[tabId] = {
				tabId: tabId,
				sPanelName: sPanelName,
				nOffset: nOffset,
				dir: dir,
				$this: $this,
				$par: $par,
				$child: $child,
				$secChild: $secChild
			};
			var oCur = oCurHover[tabId];
			NIKEOS.log('dir: ', dir);
			$this.addClass(oOptions.classes.active);
			$child.addClass('d-block');
			NIKEOS.log($child);
			oCur.bHoverOn = true;

			if (!oInfo.bIsHome && !oInfo.current) {
				NIKEOS.log('isnt home');
				oCur.bFirstIsAnimating = false;
				oCur.bSecondIsAnimating = false;
				oInfo.trackTab = {
					current: tabId,
					$child: $child,
					$secChild: $secChild,
					dir: dir, 
					nOffset: nOffset
				};
				oInfo.current = tabId;
				slider('show', tabId, $child, $secChild, dir, nOffset, 'fast');
			} else {
				var trackTab = oInfo.trackTab;
				if (trackTab.current != tabId) {
					slider('hide', trackTab.current, trackTab.$child, trackTab.$secChild, trackTab.dir, trackTab.nOffset, 'fast', function() {
						oInfo.trackTab = {
							current: tabId,
							$child: $child,
							$secChild: $secChild,
							dir: dir, 
							nOffset: nOffset
						};
						slider('show', tabId, $child, $secChild, dir, nOffset, 'fast');
					});
				} else {
					window.location.href = $this.find('a').attr('href');
				}
			}
			if (oInfo.current) {
				$('body').live('click',function() {
					oInfo.current = null;
					slider('hide', oInfo.trackTab.current, oInfo.trackTab.$child, oInfo.trackTab.$secChild, oInfo.trackTab.dir, oInfo.trackTab.nOffset, 'fast');
				});
			}
			return false;
		}

		function setUpHover() {
			oElements.tab_li.hover(
				function(e) {
					var objInfo = returnObjData(this);
					NIKEOS.log('objInfo: ', objInfo);
					var tabId = objInfo.tabId,
						sPanelName = objInfo.sPanelName,
						dir = objInfo.dir,
						nOffset = objInfo.nOffset,
						$this = objInfo.$this,
						$par = objInfo.$par,
						children = oOptions.els.tab_anchors + ', ' + oOptions.els.panels,
						_child = $this.children(children),
						$child = (oInfo.bIsCatfish && oInfo.bIsHome) ? $(_child[1]) : $(_child[0]),
						$secChild = (oInfo.bIsCatfish && oInfo.bIsHome) ? $(_child[0]) : $(_child[1]);
					if (typeof oCurHover[tabId] != 'object') {
						oCurHover[tabId] = {};
					}
					oCurHover[tabId] = {
						tabId: tabId,
						sPanelName: sPanelName,
						nOffset: nOffset,
						dir: dir,
						$this: $this,
						$par: $par,
						$child: $child,
						$secChild: $secChild
					};
					var oCur = oCurHover[tabId];
					NIKEOS.log('dir: ', dir);
					$this.addClass(oOptions.classes.active);
					$child.addClass('d-block');
					NIKEOS.log($child);
					oCur.bHoverOn = true;
					if (!oInfo.bIsHome) {
						NIKEOS.log('isnt home');
						oCur.bFirstIsAnimating = false;
						oCur.bSecondIsAnimating = false;
						slider('show', tabId, $child, $secChild, dir, nOffset, 50);
					}
				},
				function(e) {
					var id = this.id;
					var oCur = oCurHover[id],
						tabId = oCur.tabId,
						dir = oCur.dir == 'down' && !oInfo.bIsHome ? 'down' : 'up',
						$this = oCur.$this;
					$this.removeClass('d-block');
					oCur.bHoverOn = false;
					if (!oInfo.bIsHome) {
						NIKEOS.log('isnt home, dir: ', dir);
						slider('hide', tabId, oCur.$child, oCur.$secChild, dir, oCur.nOffset, 50);
					}
				}
			);
		}

		self.init = function(oOpts) {
			
			NIKEOS.log('INITING Pillars');
			/*
				oOpts	- OBJECT passed in to merge with oOptions
			*/
			$.extend(true, oOptions, oOpts);

			// creates jQuery elements out of passed in trings 
			oElements = returnjQueryObj(oOptions.els);
			NIKEOS.log('oOptions: ', oOptions);
	
			$.extend(true, oInfo, oOptions, {
				panel_length: oElements.panels.length,
				panel_anchors_length: oElements.tab_anchors.length // wNB_length = $whatsNewButtons.length,
			});

			if (oInfo.bIsCatfish) {
				topLimit = oInfo.nTopLimit;
				oElements.panels.each(function(i,a) {
					var $this = $(this);
					var id = $this.attr('id');
					if (oOptions.html[id]) {
						$this.data('html', oOptions.html[id]);
					}
					$this.data('dims', $this.outerHeight());
				});
				oElements.slider_wrap = oElements.catfish;

				var h = oElements.slider_wrap.outerHeight(true);
				oInfo.nOffset = h;
				if (oInfo.bIsHome) h += oElements.panels.data('dims');
				
				oInfo.footer_position = oElements.footer_container.position();
				
				// used for positioning catfish based on window size
				$.extend(true, oInfo, {
					margins: {
						'default': 60,
						'small': pcInfo.left
					},
					paddings: {
						'footer_bottom': oElements.footer_container.height()
					} 
				});
				
				detectPos();
				if (oInfo.bLimitTop) keepPosition();
			}

			oElements.panels.hover(
				function(e) {
					hoverInfo = returnObjData(this);
					var $this = hoverInfo.$this;
					var $img = $this.find('img');
					var ib = $this.find('.inner-border');
					$img.data('pos', {});
					var imgPos = {};
					
					if (ib.length == 0) {
						var innerBorder = createInnerBorder();
						if (!innerBorder.attr('id')) innerBorder.attr('id', hoverInfo.tabId + '-border');
						hoverInfo.borders = innerBorder;
						imgPos = $img.position();
						
						$img.data('pos', imgPos);

						innerBorder.prependTo($this.find('a')).addClass(oInfo.block_classes);

						var borderTopW = parseInt(innerBorder.css('borderTopWidth'),10);
						var borderRightW = parseInt(innerBorder.css('borderRightWidth'),10);
						var borderBotW = parseInt(innerBorder.css('borderBottomWidth'),10);
						var borderLeftW = parseInt(innerBorder.css('borderLeftWidth'),10);
						var updatedW = $img.width() - (borderRightW + borderLeftW);
						var updatedH = $img.height() - (borderTopW + borderBotW);
						
						innerBorder.css({
							width: updatedW,
							height: updatedH,
							top: imgPos.top,
							left: imgPos.left
						});

						hoverInfo.bIsBorderSet = true;

					} else if (ib.length > 0) {
						hoverInfo.borders = ib;
						hoverInfo.borders.removeClass(oInfo.hide_classes).addClass(oInfo.block_classes);
						hoverInfo.bIsBorderSet = true;
					}

					$img.stop().animate({}, 'fast');
					hoverInfo.img = $img;
				},
				function(e) {
					if (hoverInfo.bIsBorderSet) {
						hoverInfo.bIsBorderSet = false;
						hoverInfo.borders.removeClass(oInfo.block_classes).addClass(oInfo.hide_classes);
					}
					if (hoverInfo.img) hoverInfo.img.stop().animate({ }, 'fast');
				}
			).click(function(e) {
				// fire tracking here
//				e.preventDefault();
				var $this = $(this);
				var trackClass = $this.siblings('a').attr('class').split(' ');
				var t_obj = {};
				function returnTrackingValue (str) {
					var val = str;
					var prop = val.split('-');
					val = prop[1].replace(/(_){2}/gi, '>');
					return {
						prop: prop[0],
						val: val
					};
				}
				$.each(trackClass, function(i,a) {
					if (oRegexps.prop.test(a) || oRegexps.pn.test(a)) {
						var prop = returnTrackingValue(a);
						t_obj[prop.prop] = prop.val;
					}
				});
				
				// loop above not working with multiple 'prop##' classes
				if (t_obj.prop17 && !t_obj.prop18) {
					t_obj.prop18 = 'bottom_nav';
				} else if (!t_obj.prop17 && t_obj.prop18) {
					t_obj.prop17 = 'nav';
				}
				tracking.trackClick(t_obj);
				window.location.href = $(this).find('a').attr('href');
				return false;
			});
			if (oInfo.bIsHome && oInfo.bDoNotDelay) {
				NIKEOS.log('i am bIsHome: ', oInfo.bIsHome);
				setTimeout(function() { self.slideAll(); }, 0); 
			} else {
				NIKEOS.log('i am NOT bIsHome: ', oInfo.bIsHome);
				if (self.sifr != undefined) {
					self.sifr.init();
					self.sifr.doSifr(oElements.tab_wrap);
				}
				if (oInfo.sEventType == 'click') {
					oElements.tab_li.click(clicker);	
				} else {
					oElements.catfish_bg.removeClass('invisible').css({ 'display': 'block' });
					setUpHover();
					var rsCount = 0;
					var resizeInt = setInterval(function() {
						rsCount++;
						if (checkFooterPos() || rsCount > 40) {
							detectPos();
							clearInterval(resizeInt); // ramifications for timer being left on?
						}
					}, 100);

				}
			}
		};
		self.reposition = function() {
			detectPos();
		};
		self.slideAll = function() {
			showAllCatfish();
		};
		// FUNCTION: slideOne()
		// ability to slide pilars individually
		self.slideOne = function($el, sDir, nOffset, nsSpeed) {
			/*
				@$el:	STRING/jQuery-fied Element
				@sDir:	STRING of direction, up/down
				@nOffset:	NUMBER of offset (padding) to slide elements (which part gets offset?)
				@nsSpeed:	STRING/NUMBER of duration of animation to take place
			*/
			if ($el == undefined) return false;
			var $this = typeof $el == 'string' ? $($el) : $el;
			var dir = sDir || 'up';
			var offset = nOffset || 0;
			var duration = nsSpeed || 'fast';
			var hideClasses = 'd-none, display-n, display-none';
			if ($this.css('display') == 'none' || $this.hasClass(hideClasses)) {
				$this.css('display', 'block');
			}
			sliding($this, dir, { nOffset: offset, nsSpeed: duration });
		};
		// FUNCTION: updateContent()
		// allows for updating content on the fly
		self.updateContent = function($el, content) {
			if (typeof $el == 'STRING') {
				$el = $($el);
			}
			$el.html(content);
		};
		// don't self init this piece so then options can actually be passed in
		return self;	
	}

	function DoSifr() {
		// current: ffffff - off: 242731
		var self = {};
		var dClr = '242731';
		var size = 16;
		var baseUrl = NIKEOS.BASE[NIKEOS.site_mode];
		var reFireArr = [];
		var bIsRunning = false;
		var sifrFont = {
			stratum1: {
				ratios: '[10, 1.16, 14, 1.09, 15, 1.1, 21, 1.06, 22, 1.07, 25, 1.06, 29, 1.04, 30, 1.05, 31, 1.03, 32, 1.05, 38, 1.04, 39, 1.02, 40, 1.04, 49, 1.02, 58, 1.03, 97, 1.02, 1.01]',
				black: { src: baseUrl + '/usnikefootball/global/swf/stratum1/stratum1-black.swf' },
				bold: {	src: baseUrl + '/usnikefootball/global/swf/stratum1/stratum1-bold.swf' },
				light: { src: baseUrl + '/usnikefootball/global/swf/stratum1/stratum1-light.swf' },
				med: { src: baseUrl + '/usnikefootball/global/swf/stratum1/stratum1-medium.swf' },
				reg: { src: baseUrl + '/usnikefootball/global/swf/stratum1/stratum1-regular.swf' }
			}
		};
		var fire_sifr = function(a, cb) {
			NIKEOS.log('fire_sifr()...');
			var $a = $(a);
			var id = $a.attr('id') || 'sifr-id-' + Math.round(Math.random()*100);
			var color = $a.parents().hasClass('current') ? 'ffffff' : dClr;
			var fVers = $a.parents().hasClass('current') ? 'reg' : 'bold';
			NIKEOS.log('sifr id: ', id, "$a.parents().hasClass('current'): ", $a.parents().hasClass('current'));
			if (!$a.attr('id')) {
				$a.attr('id', id);
			}
			var fls = $a.find('.sIFR-replaced');
			
			if (fls.length < 1) {
				// only initialize if no flash object
				var obj = {};
				
				obj[id] = {
					el: '#' + id + ' .tab-title',
					fontFam: 'stratum1',
					font: fVers,
					hoverColor: '#' + color,
					css: {
						'.sIFR-root': {
							'color': '#' + color,
							'background-color': 'transparent',
							'font-size': size + 'px',
							'cursor': 'default',
							'text-align': 'center',
							'text-transform': 'uppercase',
							'cursor': 'hand'
						}
					},
					flash: {
						ratios: sifrFont.stratum1.ratios,
						fitExactly: false,
						forceWidth: true,
						selectable: false,
						selector: '#' + id + ' .tab-title',
						wmode: 'transparent'
					}
				};
				sparq.ui.sifr.runSifr(id, obj);
			} else {
				NIKEOS.log('element has sifr');
				//reFireArr.push(a);
				//self.refire();
			}
			if (cb) cb();
		};
		
		self.init = function() {
			sparq.ui.sifr.addFonts(sifrFont);
		};
		
		self.refire = function() {
			if (!bIsRunning && reFireArr.length > 0) {
				bIsRunning = true;
				fire_sifr(reFireArr[0], self.stop_fire);
				reFireArr.shift();
			}
		};
		
		self.stop_fire = function() {
			bIsRunning = false;
		};

		self.doSifr = function(els) {
			NIKEOS.log('...doSifr()');
			els.each(function(i,a) {
				fire_sifr(a, function() { fire_sifr(a, null); });
			});
		};
		return self;
	}

	if (typeof window.helpers == undefined) window.helpers = {};

	$.extend(true, window.helpers, {
		scrollWindow: function(direction, speed, ease, element) {
			var d = direction || 0;
			var e = ease || 'easeOutQuad';
			var _s = speed || 'fast';
			var el = element || window;
			if (typeof $.scrollTo == 'function') {
				$(el).scrollTo(d, _s, { easing: e });
			}
		}
	});

	function Checks() {
		var self = {};
		self.init = function() {
			var blogTest = {
				'dev': /\bcs\./i,
				'staging': /\binside\-staging\./i,
				'prod': /\binside\./i
			};
			var vers = $.browser.version;
			var versions = vers.split('.');
			self.settings = {
				bIsBlog: blogTest[NIKEOS.site_mode].test(window.location.host),
				bIsMozilla: $.browser.mozilla,
				bIsIE: $.browser.msie,
				bIsSafari: $.browser.safari,
				nBrowserVers: vers,
				nMajor: parseInt(versions[0] || 0, 10),
				nMinor: parseInt(versions[1] || 0, 10) ,
				nRelease: parseInt(versions[2] || 0, 10),
				nBuild: parseInt(versions[3] || 0, 10)
			};
		};
		self.addSetting = function(oProp) {
			return $.extend(true, self.settings || {}, oProp);
		};
		self.init();
		return self;
	}

	window.checks = Checks();	
	window.catfish = Catfish();
	window.catfish.sifr = DoSifr();
	setTimeout(function() {
		var hasCatfish = ($('.catfish').length > 0 || $('#catfish').length > 0) ? true : false;
		var bIsHome = site_data.nav.current == 'home' ? true : false;
		var nOffset = 0;
		var targLeft = catfish ? $('#catfish-container').css('margin-left') : 60;
		var opts = {
			bDoNotDelay: $.getURLParam('slideall') ? true : false,
			bIsHome: bIsHome,
			bIsCatfish: hasCatfish,
			bLimitTop: hasCatfish,
			nTopLimit: 510,
			nTargetLeftMargin: parseInt(targLeft,10),
			sEventType: 'hover'
		};
		if (hasCatfish) {
			if (NIKEOS.catfish.options) {
				$.extend(true, opts, NIKEOS.catfish.options || {});
				window.catfish.init(opts);
			}
		}
	}, 1000);
	
})(jQuery);

