(function($){
	
	var _undefined,
		_function = 'function', 	
		_number = 'number';
	
	$('html').addClass('js-enabled');
	
	$(function(){
		
		var _activeMain = -1,
			_activeSub = -1,
			_container = $('#leftNavigation');
			
		//Set selected states based on the object _ActiveNavItem	
		if (typeof _ActiveNavItem != _undefined){
			
			if (typeof _ActiveNavItem.mainIndex == _number && _ActiveNavItem.mainIndex > -1){
				_activeMain = _container.find('li.main-nav-item').eq(_ActiveNavItem.mainIndex).addClass('selected').addClass('active');
				
				if (typeof _ActiveNavItem.subIndex == _number && _ActiveNavItem.subIndex > -1){
					_activeSub =  _activeMain.find('.second-level > li').eq(_ActiveNavItem.subIndex).addClass('selected');
					if (_activeSub && _activeSub.hasClass('has-sub')){
						_activeSub.addClass('has-sub-selected');
					}
				}
			}
		}
		
		new $.Flyout({container:_container, mainSelector : 'ul.second-level > li', subSelector : 'div.third-level > div.wrapper > ul > li'});
		new $.Accordion({container:_container, initialOpen:_activeMain});
		
		//Added for 4th tier items, they won't have a sub nav so timeout not needed
		_container.find('div.fourth-level li').hover(function(){
			$(this).addClass('hovered');
		}, function(){
			$(this).removeClass('hovered');
		});
		
		//Add arrows spans through javascript to avoid mistakes and clutter in the html. Arrows only serve a purpose when js is turned on anyway
		_container.find('li.has-sub > a').each(function(){
			this.innerHTML = this.innerHTML + "<span class=\"arrow\">&nbsp;</span>";
		});		
		
		//Tracking logic
		_container.find('a').each(function(){
			$(this).click(function(e){
				e.preventDefault();
				$.Tracking(this);
				
				if (this.className.indexOf('acc-trigger') == -1){
					window.location = this.href;
				}
			});
		});
		
	});

	$.Flyout = function(params){
		var self = this,
			settings = $.extend({},this.defaults,params),
			_mainShowTimeout, _mainHideTimeout, _subShowTimeout, _subHideTimeout, _contTimeout,
			_mains = settings.container.find(settings.mainSelector),
			_subs = settings.container.find(settings.subSelector);
		
		if (!settings.container || !settings.container.get(0)) return;
		
		settings.container.hover(function(){
			clearTimeout(_contTimeout);
		},function(){
			_contTimeout = setTimeout(function(){
				self.hideAll();
			},200);
		});
		
		if (_mains){
			_mains.each(function(){
				var $this = $(this);
				$this.hover(function(){
					_showMain($this);
				},function(){
					_hideMain($this);
				});
			});
		}
		
		if (_subs){
			_subs.each(function(){
				var $this = $(this);
				$this.hover(function(){
					_showSub($this);
				},function(){
					_hideSub($this);
				});
			});
		}
		
		//added in 'sub-active' class to allow for arrow styling in ie6
		this.hideAll = function(){
			_mains.each(function(){
				$(this).removeClass(settings.hoverClass).removeClass('sub-active');
			});
		}
		
		function _showMain(item){
			clearTimeout(_mainShowTimeout);
			_checkHeight(item);
			if (!item.hasClass(settings.hoverClass)){
				_mainShowTimeout = setTimeout(function(){
					self.hideAll();		
					item.addClass(settings.hoverClass);
					if (item.hasClass('has-sub')){
						item.addClass('sub-active');
					}
				},settings.showTimeout);
			} else {
				clearTimeout(_mainHideTimeout);
			}
			
		}
		
		function _hideMain(item){
			clearTimeout(_mainHideTimeout);
			_mainHideTimeout = setTimeout(function(){
				item.removeClass(settings.hoverClass).removeClass('sub-active');
			},settings.hideTimeout);
		}
		
		function _showSub(item){
			clearTimeout(_subShowTimeout);
			_checkHeight(item);
			if (!item.hasClass(settings.hoverClass)){
				_subShowTimeout = setTimeout(function(){
					_hideAllSubs();
					item.addClass(settings.hoverClass);
					if (item.hasClass('has-sub')){
						item.addClass('sub-active');
					}
				},settings.showTimeout);
			} else {
				clearTimeout(_subHideTimeout);
			}
		}
		
		function _hideSub(item){
			clearTimeout(_subHideTimeout);
			_subHideTimeout = setTimeout(function(){
				item.removeClass(settings.hoverClass).removeClass('sub-active');
			},settings.hideTimeout);
		}
		
		function _hideAllSubs(){
			_subs.each(function(){
				$(this).removeClass(settings.hoverClass).removeClass('sub-active');
			});
		}
		
		function _checkHeight(item){
			if (item.hasClass('multi-line')) return;
			
			if (item.height() > settings.singleLineHeight){
				item.addClass('multi-line');
			}
			
		}
	}
	$.Flyout.prototype.defaults = {
		container : 0,
		selectedClass : 'selected',
		hoverClass : 'hovered',
		showTimeout : 200,
		hideTimeout: 200,
		mainSelector : '', 
		subSelector : '',
		singleLineHeight : 21
	}
	
	$.Accordion = function(params){
		var self = this, 
			settings = $.extend({}, this.defaults, params),
			_wrappers = settings.container.find('li.'+settings.wrapperClass),
			_locked = 0,
			_css = 0,
			_open = 0;
			
		if (!settings.container || !settings.container.get(0)) return;
				
		_wrappers.each(function(i){
			var $this = $(this);
			if (!$this.hasClass(settings.activeClass) && !_css){
				var content = $this.find('.'+settings.contentClass);
				_css = {
					height : content.css('height'),
					position : content.css('position'),
					left : content.css('left'),
					display : content.css('display'),
					top : content.css('top')
				}
			}
			
			if ($this.hasClass('selected')){
				_open = $this;
			}
		});
		
		$('#'+settings.container.attr('id')+ ' .' + settings.triggerClass).click(function(e){
			e.preventDefault();
			if (!_locked){
				var wrapper = $(this).parents('li.'+settings.wrapperClass).eq(0);
				_toggleSection(wrapper);
			}
		});
		
		this.show = function(wrapper){
			_locked = 1;
			if (!settings.multipleOpen){
				self.hideAll();
			}
			
			if (typeof settings.showBefore == _function){
				settings.showBefore();
			}
			
			var content = wrapper.find('.'+settings.contentClass);
		
			var height = _getHeight(content);
			content.css({
				height : 0,
				left : 'auto',
				top : 'auto',
				display : 'block',
				position: 'relative'
			});
			wrapper.addClass(settings.activeClass);
			content.animate(
				{	
					height : height
				},
				{
					duration:settings.speed,
					easing:'easeout',
					complete:function(){
						_locked = 0;
						_open = wrapper;						
						if (typeof settings.showAfter == _function){
							settings.showAfter();
						}
					}
				}
			)
		}
		
		this.hide = function(wrapper){			
			if (typeof settings.hideBefore == _function){
				settings.hideBefore();
			}
			var content = wrapper.find('.'+settings.contentClass);
			_open = 0;
			
			content.animate(
				{
					height:0
				},
				{
					duration:settings.speed,
					easing:'easeout',
					complete:function(){
						_locked = 0;
						wrapper.removeClass(settings.activeClass);
						if (typeof settings.hideAfter == _function){
							settings.hideAfter();
						}
						content.css(_css);
					}
				}
			)
		}
		
		this.hideAll = function(){
			if (_open){
				self.hide(_open);
			}
		}
		
		function _getHeight(content){
			var height;
			
			content.css({
				position : 'absolute',
				left : '-1000em',
				display : 'block',
				height : 'auto'
			});
			
			height = content.height();			
			content.css(_css);
			return height;
		}
		
		function _toggleSection(wrapper){
			if (wrapper.hasClass(settings.activeClass)){
				self.hide(wrapper);
			}
			else {
				self.show(wrapper);
			}
		}
	}
	$.Accordion.prototype.defaults = {
		container : 0,
		wrapperClass: 'acc-wrapper',
		triggerClass: 'acc-trigger',
		contentClass: 'acc-content',
		activeClass: 'active',
		disabledClass : 'disabled',
		selectedClass : 'selected',
		speed: 200,
		initialOpen : -1,
		multipleOpen : 0,
		showBefore : 0,
		showAfter :0,
		hideBefore : 0,
		hideAfter : 0
	}
	
	$.Tracking = function(link){
		
		var li = link.parentNode,
			id = "",
			title = "LeftPanel_",
			parents,
			liArray = [];
		
		while (li.nodeName.toLowerCase() != "li"){
			if (!li.parentNode || li.parentNode == null) {
				break;
			}
			li = li.parentNode;
		}		
		
		parents = li.parentNode;
		if (parents && parents != null){
			while (parents.parentNode){
				if (parents.nodeName.toLowerCase() == "li"){
					liArray.unshift(parents);
				}
				parents = parents.parentNode;
			}
		}
		
		for (var i=0; i<liArray.length; i++){
			if (liArray[i].id && liArray[i].id!=null){
				title += liArray[i].id.replace(/^nav/,'') + "_"; //remove nav namespace first
			}
		}

		if (li.id && li.id != null){
			id = li.id.replace(/^nav/,'');
		} else {
			id = link.id.replace(/^nav/,'');
		}
		
		title += id;
		
	//	dcsMultiTrack("DCS.dcsuri", link.href, "WT.ti", title);
		
	}
})(jQuery);
//easing function used for $.Accordion
jQuery.easing={easeout:function(e,f,a,h,g){return -h*f*f/(g*g)+2*h*f/g+a}};

_ActiveNavItem = {
		mainIndex: null,
		subIndex: null
	}