GoldmanSachs.Navigation = new Class ({
	presets : {
		DELAY_INTERVAL: 150,
		EXIT_INTERVAL: 300,
		HEAD_ID: 'gs_head',
		MAIN_ID : 'gs_nav',
		INDEX_LINK_ID: 'gs_nav_indexLink', 
		HANDLE_SELECTOR : '.gs_nav_hdr_sect',
		SELECTED_HANDLE_CLASSNAME : 'gs_nav_hdr_sect_selected',
		SEARCH_ID : 'gs_nav_search',
		SEARCH_OVERLAY_ID : 'gs_nav_search_overlay',
		DROP_CONTAINER_ID: 'gs_nav_dd',
		DROPS_SELECTOR: '.gs_nav_dd_item',		
		CONTAINER_ID : 'gs_doc',
		UTIL_NAV_ID: 'gs_utilNav',
		UTIL_NAV_HANDLE_SELECTOR: '.gs_utilNavItem_title',
		UTIL_NAV_DROP_SELECTOR: '.gs_utilNavDD', 
		UTIL_NAV_NODROP_HANDLE_SELECTOR : '.gs_utilNav_label',
		HALO_CLASSNAME : 'gs_un_halo',
		WIDE_HALO_CLASSNAME : 'gs_un_wideHalo',
		OVERLAY_Z_INDEX: 550		
		
	},
	options: {
		haloUtilNav: false,
		wideHalo: false
	},
	modules : [],
	waitForTimer: false,
	pauseNav: false,
	showMouseovers: false,
	initialize : function (options) {
		this.setOptions(options);
		this.mainContainer = $(this.presets.MAIN_ID);
		this.headContainer = $(this.presets.HEAD_ID);
		this.exitTimer = new GoldmanSachs.Timer(this.presets.EXIT_INTERVAL);
		this.exitTimer.addEvent('onExpire', this.reset.bind(this))
		this.mainContainer.addEvent('mouseleave', this.exitTimer.start.bind(this.exitTimer));
		this.mainContainer.addEvent('mouseenter', this.exitTimer.stop.bind(this.exitTimer));
		this.delayTimer = new GoldmanSachs.Timer(this.presets.DELAY_INTERVAL);
		this.delayTimer.addEvent('onExpire', this.handleExpire.bind(this))
		var ib = $(this.presets.INDEX_LINK_ID);
		if ($defined(ib)) {
			this.modules.push(new GoldmanSachs.NavigationIndexLink(ib, ib.hasClass(this.presets.SELECTED_HANDLE_CLASSNAME), this));	
		}
		var hds = this.mainContainer.getElements(this.presets.HANDLE_SELECTOR);
		var dps = this.mainContainer.getElements(this.presets.DROPS_SELECTOR)
		for (var i = 0; i<hds.length; i++) {
			var flagAsSelected = hds[i].hasClass(this.presets.SELECTED_HANDLE_CLASSNAME);
			this.modules.push(new GoldmanSachs.NavigationPair(hds[i], dps[i], flagAsSelected, this));
		}
		if ($(this.presets.SEARCH_ID)) this.modules.push(new GoldmanSachs.NavigationSearchModule($(this.presets.SEARCH_ID),this));
		else if ($(this.presets.SEARCH_OVERLAY_ID)) {
			var m = new GoldmanSachs.NavigationIndexLink($(this.presets.SEARCH_OVERLAY_ID),false, this);
			m.modType = 'search';
			this.modules.push(m);
		} 
		this.utilNav = $(this.presets.UTIL_NAV_ID);
		if ($defined(this.utilNav)) {
			if (this.options.haloUtilNav == true) {
				var halo = new Element('div', {'class': (this.options.wideHalo == true)? this.presets.WIDE_HALO_CLASSNAME : this.presets.HALO_CLASSNAME});
				this.headContainer.adopt(halo);
				if (window.ie6 == true) {
					var bg	= halo.getStyle('background-image');
					var bg = bg.substring(5,(bg.length - 2));
					halo.setStyles({"background-image": "none", "filter" : "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + bg + "', sizingMethod='crop')"});
				}	
			}		
			this.utilNav.addEvent('mouseleave', this.exitTimer.start.bind(this.exitTimer));
			this.utilNav.addEvent('mouseenter', this.exitTimer.stop.bind(this.exitTimer));
			var utilhandles = this.utilNav.getElements(this.presets.UTIL_NAV_HANDLE_SELECTOR);
			
			var utildrops = this.utilNav.getElements(this.presets.UTIL_NAV_DROP_SELECTOR);
			for (var i=0;i<utilhandles.length;i++) {
				this.modules.push(new GoldmanSachs.UtilityNavigationItem(utilhandles[i], utildrops[i]));
			}
			
			var utilNoDropHandles = this.utilNav.getElements(this.presets.UTIL_NAV_NODROP_HANDLE_SELECTOR);
			
			for (var i=0;i<utilNoDropHandles.length;i++) {
				this.modules.push(new GoldmanSachs.UtilityNavigationItem(utilNoDropHandles[i], null));
			}
			
		}
		for (var i = 0; i<this.modules.length; i++) {
			var ct = i;
			this.modules[i].handle.addEvent('mouseenter', this.initMousein.pass([ct] ,this));
			this.modules[i].handle.addEvent('mouseleave', this.initMouseout.pass([ct] ,this));
			this.modules[i].handle.addEvent('click', this.endPauseNav.pass([ct] ,this));
			if ((this.modules[i].modType == 'pair' || this.modules[i].modType == 'util') && this.modules[i].drop != null){this.modules[i].drop.addEvent('mouseenter', this.cancelMouseOut.bind(this));	}
			this.modules[i].addEvent('onImagesLoaded', this.checkMo.bind(this));
		}
		
		this.shadow = new Element('div');
		this.shadow.setStyles({'opacity':'0', 'height':'0', 'width':'0', 'position':'absolute', 'top':'0', 'left':'0', 'background' : '#000', 'z-index' : (this.presets.OVERLAY_Z_INDEX - 1)});
		this.shadowTrans = new Fx.Style(this.shadow, 'opacity', {'duration': 180});
		this.shadowTrans.addEvent('onComplete', this.handleExpire.bind(this));
		this.headContainer.adopt(this.shadow)
	},
	checkMo: function () {
		for (var i = 0; i<this.modules.length; i++) {
			if (this.modules[i].imagesAreLoaded == false) {	return false;}
		}
		this.showMouseovers = true;
	},
	initMousein : function (i) {
		this.onDeckMod = this.modules[i];
		if (this.waitForTimer == false) {
			//this.handleExpire();
			this.hidePage();
		} else {
			this.delayTimer.restart();
		}
	},
	initMouseout : function(i) {
		if (this.cancelShow == true) {
			this.cancelShow = false;
			this.waitForTimer = true;
			this.reset();
		} else {
			this.cancelShow = false;
			this.waitForTimer = true;
			this.delayTimer.restart();
		}
	},
	cancelMouseOut : function (i) {
		this.delayTimer.stop();
	},
	handleExpire : function () {	
		this.cancelShow = false;
		if (this.pauseNav == false) {
			if (this.onDeckMod != null) {
				for(var i = 0, mds= this.modules; i<mds.length; i++) {
					if (this.onDeckMod.modType == 'search' || this.onDeckMod.modType == 'index') {
						if (mds[i] == this.onDeckMod) {mds[i].doHot()} else {mds[i].doCold()};
						this.waitForTimer = false;	
					} else if (this.onDeckMod.modType == 'util' ) {
						if (mds[i] == this.onDeckMod) {
							mds[i].doHot();
						} else {
							mds[i].doCold();
						}
						this.waitForTimer = true;
					} else {
						if (mds[i] == this.onDeckMod) {mds[i].doHot()} else {mds[i].doWarm()};
						this.waitForTimer = true;
					}		
				}	
			} else {
				this.waitForTimer = false;
			}
			this.onDeckMod = null;
		}
	},
	reset : function () {
		this.waitForTimer = false;	
		this.cancelShow = false;
		this.delayTimer.stop();
		this.showPage();
		for (var i=0, mds = this.modules; i<mds.length;i++) {mds[i].doCold();}
	},
	doPauseNav : function () {
		this.pauseNav = true;
	},
	endPauseNav : function (i) {
		if ($defined(i)) {
			if (this.modules[i].modType != 'search') {
				this.pauseNav = false;
				this.onDeckMod = this.modules[i];
				this.handleExpire();
			}
		} else {
			this.pauseNav = false;
		}
	},
	hidePage: function () {
		this.cancelShow = true;
		this.shadowTrans.stop();
		var th = $(this.presets.CONTAINER_ID).getCoordinates().height
		var ww = window.getWidth()
		var contTarg = '';
		if (ww <= 984) {contTarg = '984px';
		} else if (ww >= 1280) {contTarg = '1280px';
		} else {contTarg = (window.gecko == true)? (ww - 1) + 'px' : ww + 'px';}
		this.shadow.setStyles({'height' : th + 'px', 'width' : contTarg});
		this.shadowTrans.start(0.6);
	},
	showPage: function () {
		this.shadowTrans.stop();
		this.delayTimer.stop();
		this.cancelShow = false;
		this.shadow.setStyles({'opacity': 0, 'height': '0', 'width':'0'});
	}
});

GoldmanSachs.Navigation.implement(new Options);

GoldmanSachs.NavigationIndexLink = new Class({
	onImagesLoaded: Class.empty,
	imagesAreLoaded: false,
	modType : 'index',
	initialize: function (elem, isSelected, container) {
		this.handle = elem;
		this.imageManager = new GoldmanSachs.NavigationImageManager(this.handle.getElements('img')[0], isSelected);
		this.imageManager.addEvent('onImagesLoaded', this.doImagesLoaded.bind(this));
		this.container = container;
	},
	doImagesLoaded : function () {
		this.imagesAreLoaded = true;
		this.fireEvent('onImagesLoaded');
	},
	doHot : function () {
		if (this.container.showMouseovers == true) {this.imageManager.doHot();}
	},
	doWarm : function () {
		if (this.container.showMouseovers == true) {this.imageManager.doWarm();}
	},
	doCool : function () {
		if (this.container.showMouseovers == true) {this.imageManager.doCool();}
	},
	doCold : function () {
		if (this.container.showMouseovers == true) {this.imageManager.doCold();	}
	}
});
GoldmanSachs.NavigationIndexLink.implement(new Events);

GoldmanSachs.NavigationPair = new Class({
	onImagesLoaded: Class.empty,
	imagesAreLoaded: false,
	modType : 'pair',
	initialize: function (hdl, dp, sel, container) {
		this.handle = hdl;
		this.drop = dp;
		this.isSelected = sel;
		this.container = container
		this.handleImage = new GoldmanSachs.NavigationImageManager(this.handle.getElements('img')[0], this.isSelected)
		this.handleImage.addEvent('onImagesLoaded', this.doImagesLoaded.bind(this))
	},
	doImagesLoaded : function () {
		this.imagesAreLoaded = true;
		this.fireEvent('onImagesLoaded');
	},
	doHot : function() {
		if (this.container.showMouseovers == true) {this.handleImage.doHot();}
		this.drop.setStyle('display', 'block');
	},
	doWarm : function() {
		if (this.container.showMouseovers == true) {this.handleImage.doWarm();}
		this.drop.setStyle('display', 'none');
	},
	doCold : function () {
		if (this.container.showMouseovers == true) {this.handleImage.doCold();}
		this.drop.setStyle('display', 'none');
	},
	doCool : function () {
		if (this.container.showMouseovers == true) {this.handleImage.doCool();}
		this.drop.setStyle('display', 'none');
	}
})
GoldmanSachs.NavigationPair.implement(new Events);

GoldmanSachs.NavigationSearchModule = new Class({
	onImagesLoaded: Class.empty,
	imagesAreLoaded: false,
	modType : 'search',
	keepOn : false,
	initialize: function (elem, cont) {
		this.handle = elem;
		this.container = cont;
		var inputs = this.handle.getElements('input');
		// Workaround for very strange Safari Beta bug where the order of items in the array were getting reversed
		(inputs[0].type == 'image')? inputs.reverse() : null;
		this.inputField = inputs[0];		
		this.searchString = this.inputField.value;
		this.submitButton =  new GoldmanSachs.NavigationImageManager(inputs[1], false);
		this.submitButton.addEvent('onImagesLoaded', this.doImagesLoaded.bind(this));
		// set Safari searchbox to white
		if (window.webkit419) this.inputField.setStyles('background-color:#fff;');
		this.inputField.addEvent('click', this.manageKeep.pass(['click'],this));
		this.inputField.addEvent('blur', this.manageKeep.pass(['blur'], this));
	},
	doImagesLoaded : function () {
		this.imagesAreLoaded = true;
		this.fireEvent('onImagesLoaded');
	},
	doHot : function (){
		if (this.container.showMouseovers == true) {
			if (this.container.showMouseovers == true) {this.submitButton.doWarm();}
			this.handle.setStyle('background-color', '#fff');
			this.inputField.setStyle('background-color', '#fff');
		}
	},
	doWarm : function (){
		this.doHot();
	},
	doCool : function (){
		if (this.keepOn == false) {
			this.handle.setStyle('background-color', '#444');
			if (window.webkit419) { this.inputField.setStyles('background-color:#fff;')
			} else {this.inputField.setStyle('background-color', '#444');}	
			this.submitButton.doCool();	
		}
	},
	doCold : function () {
		this.doCool();
	},
	manageKeep: function (evt){
		if (evt == 'click') {
			if (this.inputField.value == this.searchString) {this.inputField.value = '';	}
			this.container.doPauseNav();
			this.keepOn = true;
		} else {
			if (this.inputField.value == '') {this.inputField.value = this.searchString;}
			this.keepOn = false;
			this.container.endPauseNav();
			this.doCool();
		}
	}
});
GoldmanSachs.NavigationSearchModule.implement(new Events);
GoldmanSachs.NavigationImageManager = new Class ({
	onImagesLoaded: Class.empty,
	isLoaded : false,
	isSelected : false,
	skip: false,
	initialize : function (elem, isSelected) {
		this.element = elem;
		this.isSelected = isSelected;
		this.element.setProperty('title', '');		// prevents tooltipness
		var source = elem.getProperty('src');
		var baseUrl = source.substr(0, source.lastIndexOf('_o'));
		var extension = source.substr(source.lastIndexOf('.'), 4);
		var imgs = new Asset.images([baseUrl + '_off' + extension, baseUrl + '_off_active' + extension, baseUrl + '_on' + extension, baseUrl + '_on_active' + extension], {onComplete: this.doImagesLoaded.bind(this)});
		this.coldImg = imgs[0];
		this.coolImg = imgs[1];
		this.warmImg = imgs[2];
		this.hotImg = imgs[3];
	},
	doImagesLoaded: function() {
		this.fireEvent('onImagesLoaded');
	},
	doHot: function(){
		(this.skip == true) ? null: this.element.src = this.hotImg.src;
	},
	doWarm: function(){
		(this.skip == true) ? null: this.element.src = this.warmImg.src;
	},
	doCool: function(){
		(this.skip == true) ? null: this.element.src = this.coolImg.src;
	},
	doCold: function(){
		if (this.isSelected == true) {
			(this.skip == true) ? null: this.element.src = this.coolImg.src;
		} 
		else {
			(this.skip == true) ? null: this.element.src = this.coldImg.src;
		}
	}
});
GoldmanSachs.NavigationImageManager.implement(new Events);

GoldmanSachs.UtilityNavigationItem = new Class({
	presets : {
		LANG_IMAGE_SELECTOR: '.gs_utilNav_langImage'
	},
	onImagesLoaded: Class.empty,
	imagesAreLoaded: true,
	modType : 'util',
	initialize: function (hdl, dp) {
		this.handle = hdl;
		
		if (dp != null) {
			this.drop = dp;
			var imgs = this.drop.getElements(this.presets.LANG_IMAGE_SELECTOR);
			this.langImages = [];
			for (var i = 0; i<imgs.length; i ++) {
				this.langImages.push(new GoldmanSachs.ImageMouseover(imgs[i], {'listenToParent':true}));
			}	
		} else {
			this.drop = null;
		}	
	},
	doHot : function() {
		(this.drop != null) ? this.drop.setStyle('display', 'block'): null;
		this.handle.setStyle('color', '#999');
	},
	doWarm : function() {
		(this.drop != null) ? this.drop.setStyle('display', 'none'): null;
		this.handle.setStyle('color', '#fff');
	},
	doCold : function () {
		(this.drop != null) ? this.drop.setStyle('display', 'none'): null;
		this.handle.setStyle('color', '#fff');
	},
	doCool : function () {
		(this.drop != null) ? this.drop.setStyle('display', 'none'): null;
		this.handle.setStyle('color', '#fff');
	}
})
GoldmanSachs.UtilityNavigationItem.implement(new Events);