var GS = window['GS'] || {};
var gsAnalytics = gsAnalytics || {};
if(typeof gsAnalytics.handleSidebarToutImpression === "undefined") { 
	gsAnalytics.handleSidebarToutImpression = function(){};
	gsAnalytics.scaffold = true;
}

GS.Sitewide = (function ($){
    GS.Sitewide = function(){
		
		// Private variables
		var displayNav           = false,
			showToplevelNavDelay = 200,
			showChildNavDelay    = 40,
			showNavTimer         = null,
			navLimit             = -1;

		// Public variables
		this.navIndex = -1; // TODO: this variables is currently public because GS.Transition depends on it
		
		//Add variables for user-specific context, such as region or division
		this.context = {
			region: false,
			division: false
		};

		//Add variable for job search source file path
		//this.jobSearchSourcePath  = '/careers/';
		this.jobSearchSourcePath  = '/a/data/jobs/';
		this.jobSearchDefaultFile  = 'search.html';

		this.testMediaQuerySupport = function(){
			$('body').append('<div id="mqdetect"></div>');
		}
		
		// add responsive layout class for browsers not supporting CSS3 media queries
		this.addView1280Class = function(){
			if ($('#mqdetect').width() != 10 && $('body').innerWidth() > 1230) {
				$('body').addClass('view1280');
			}
			else {
				$('body').removeClass('view1280');
			}
		}
		
		// add cursor for expanded hit areas
		this.hitAreaCursor = function(e){
			if ((hitlink = $(e).find('a.hitLink:first').attr('href')) || $(e).find('a:first').attr('href')) {
				$(e).css('cursor', 'pointer');
			}
		}
		
		// opacity pulse - rollover effect ON
		this.pulseOpacityOn = function(el, target){
			if (target) {
				$(el).find(target).animate({
					opacity: 0.75
				}, 400, function(){
					// Animation complete.
					$(this).animate({
						opacity: 1
					}, 250, function(){
						$(this).css('opacity', '');
					});
				});
			}
			else {
				$(el).animate({
					opacity: 0.75
				}, 400, function(){
					// Animation complete.
					$(this).animate({
						opacity: 1
					}, 250, function(){
						$(this).css('opacity', '');
					});
				});
			}
		}
		
		// opacity pulse - rollover effect Off
		this.pulseOpacityOff = function(el, target){
			if (target) {
				$(el).find(target).stop().css('opacity', '1').css('opacity', '');
			}
			else {
				$(el).stop().css('opacity', '1').css('opacity', '');
			}
		}
		
		// FAQs
		this.hideFaqAnswers = function(){
			$('ul.faqs li div').hide();
		}
		
		//Resize window
		this.windowResize = function(){
			var resizeTimer = null;
			$(window).resize(function(){
				if (resizeTimer) {
					clearTimeout(resizeTimer);
				}
				
//				GS.MediaComponent.resizeControls() missing				
//				resizeTimer = setTimeout('GS.Sitewide.addView1280Class(); GS.Sitewide.initMap(); GS.Sitewide.initGrid(); GS.Navigation.setSubNavPositions(); GS.MediaComponent.resizeControls()', 5);
				
				resizeTimer = setTimeout(function(){
					GS.Sitewide.addView1280Class();
					GS.Sitewide.initMap();
					GS.Navigation.setSubNavPositions();
					if (GS.MediaComponent && GS.MediaComponent.updateMediaComponent && typeof GS.MediaComponent.updateMediaComponent === 'function') {
						GS.MediaComponent.updateMediaComponent();
					}
				}, 5);
			});
		}
		
		// Remove iFrames
		this.removeIframe = function(){
			if (top.location != self.location) 
            	top.location = self.location.href
		}
		
		// Expand link hit areas
		this.expandHitArea = function(){
			$('.hitArea').live('mouseenter', function(){
				if( (hitlink = $(this).find('a.hitLink:first').attr('href')) || $(this).find('a:first').attr('href') ) {
					$(this).css('cursor','pointer');
				}
    		});
			
		  $('.hitArea').live('click', function(e){
				var hitlink = '';

				if(hitlink = $(this).find('a.hitLink:first').attr('href')) {
					window.location = hitlink;
				}
				else{
					hitlink = $(this).find('a:first').attr('href');
					if(hitlink) {
					   window.location = hitlink;
					}
				};
			});

			/*if( $('body.top-level').size() > 0 ) {
			    $('.hitArea').live('click', function(e){
			        var hitlink = '';

			        if(hitlink = $(this).find('a.hitLink:first').attr('href')) {
			            window.location = hitlink;
			        }
			        else{
			            hitlink = $(this).find('a:first').attr('href');
			            if(hitlink) {
			               window.location = hitlink;
			            }
			        };
			    });
			} else {
			    $('.hitArea').live('click touchend', function(e){
			        var hitlink = '';

			        if(hitlink = $(this).find('a.hitLink:first').attr('href')) {
			            window.location = hitlink;
			        }
			        else{
			            hitlink = $(this).find('a:first').attr('href');
			            if(hitlink) {
			               window.location = hitlink;
			            }
			        };
			    });
			}*/
		}		
		// Common opacity rollover effect
		this.opacityRollovers = function(){
			$('.quickLinks li a').live({
				mouseenter: function(){
					GS.Sitewide.pulseOpacityOn(this);
					GS.Sitewide.hitAreaCursor(this);
				},
				mouseleave: function(){
					GS.Sitewide.pulseOpacityOff(this);
				}
			});
			$('.featuredItems article').live({
				mouseenter: function(){
					GS.Sitewide.pulseOpacityOn(this, 'img');
					GS.Sitewide.hitAreaCursor(this);
				},
				mouseleave: function(){
					GS.Sitewide.pulseOpacityOff(this, 'img');
				}
			});
			$('.homepage-grid article').live({
				mouseenter: function(){
					GS.Sitewide.pulseOpacityOn(this, 'img');
					GS.Sitewide.hitAreaCursor(this);
				},
				mouseleave: function(){
					GS.Sitewide.pulseOpacityOff(this, 'img');
				}
			});
		}
		
		// Searchbox expand / contract effect
		this.searchStyling = function(){
			$('#searchBox').live({
				focus: function(){
					$(this).animate({
						width: '360'
					}, 'fast');
				},
				blur: function(){
					$(this).animate({
						width: '170'
					}, 'fast');
				}
			});
		}
		
		// FAQs slider effect 
		this.FAQtoggle = function(){
			$('ul.faqs li').click(function(){
				if($(this).tagName != 'a'){
					$(this).toggleClass('faqExpanded').find('div').slideToggle('fast');
				}
			});
		}
		
		// Sorting
		this.filtering = function(str, what){
			var $filterObject = $('.filter:visible');
			//debugger;
			if (str !== 'all' && str !== 'filter_all' && $filterObject.length != 0) {
				$filterObject.find('li').hide().end().find("."+str).show();
			} else if ((str === 'all' || str === 'filter_all') && $filterObject.length != 0) {
				$filterObject.find('li').show();
			}
		}

		// Customised Select Box 
		this.customSelect = function() {
			$('.customSelect li').not('.selected').hide();
			$('.customSelect .selected a').live({
				click: function(e){
					e.stopPropagation();
					e.preventDefault();
					$($(this).parents('.customSelect')).addClass('open').removeClass('closed').find('li').slideDown();
				}
			});
			
			var str ="";
			$('.customSelect.open a').live({
				click: function(e) {	
					e.stopPropagation();
					e.preventDefault();
					var $customSelect = $(this).parents('.customSelect');
					if($customSelect.hasClass('redirectSelection')) {
					//	alert('This should redirect you to another page -- ' + $(this).attr('href'));
					window.location = $(this).attr('href');
					} else if ($customSelect.hasClass('filterSection')) {
						$('.tab').hide();
						$($(this).attr('href')).show();
					} else if ($customSelect.hasClass('filter-blog')) {
						if ($(this).attr('href').replace('#', '') == "all") {
							$('.blogList > li').show();
							GS.Sitewide.blogBg();
						}
						else {
							$('.blogList > li').hide();
							$('.' + $(this).attr('href').replace('#', '')).show();
							GS.Sitewide.blogBg();
						}
					}

					$customSelect.find('li').not($(this).parent()).slideUp('400', function(){$customSelect.addClass('closed').removeClass('open');});
					$customSelect.find('li').removeClass('selected');
					$($(this).parent()).addClass('selected');
					str = $(this).attr('id');
					$customSelect.trigger('onFilter', [str, $(this)]);
				}
			});
			
			$('.customSelect.open').live({
				mouseleave : function() {
					var $this = $(this);
					
					$($(this).find('li')).not($('li.selected')).slideUp('400', function(){$($(this).parents('.customSelect')).addClass('closed').removeClass('open');});
				}	
			});
			
			$('.customSelect').bind('onFilter', function(e, filter, item) {
				GS.Sitewide.filtering(filter, null);
			});
		}

		// Toggle tabs state when clicking on a CURRENT | ARCHIVE or any third level navigation
		this.tabToggle = function() {
			$('nav.state li a').bind('click', function(e) {
				e.preventDefault();
				e.stopPropagation();
				if ($(this).parent().hasClass('selected')) {
					return
				}
				else {
					$('nav.state').find('li').removeClass('selected');
					$(this).parent().addClass('selected');
					var targetTab = $(this).attr('href');
					$('.tab').hide();
					$(targetTab).show();
				}
				
			});
			
			if ($('nav').hasClass('state')) {
				$('.tab:gt(0)').hide();
			}
			
			
		}
		
		// shows/hides share overlay, share links make use of addthis functions
		this.toggleShareOverlay = function() {
			var shareLink = $('.shareLink');
			
			shareLink.hover(
				function() {
					$('#shareOverlay').show();
				},
				function() {
					$('#shareOverlay').hide();
				}
			);
		}

		// shows/hides share overlay, share links make use of addthis functions
		this.toggleFeedOverlay = function() {
			var shareLink = $('.rssLink');
			
			shareLink.hover(
				function() {
					$('#feedOverlay').show();
				},
				function() {
					$('#feedOverlay').hide();
				}
			);
		}
		
		this.financialsSelectControler = function() {
			$('.archive').hide();
			$('#archiveSelect').hide();
			
			$('a#arc').bind('click', function(e) {
				e.preventDefault();
				$('#archiveSelect:hidden').show();
			});
			
			$('a#current').bind('click', function(e) {
				e.preventDefault();
				$('#archiveSelect:visible').hide();
			});
			
		}
		
		// Placeholder text in form inputs
		this.initPlaceholder = function() {
			$('[placeholder]').placeholder();
		}
		
		// Filter office locations based on country or city
		this.officeToggle = function() {
			$('ul.listings>li').tsort('span.city');
			$('ul.listings>li').tsort('span.country');
			
			$('a#country').unbind('click').bind('click', function(e) {
				e.preventDefault();
				$(this).parents('ul').find('a').removeClass('selected');
				$(this).addClass('selected');
				$("ul.listings>li").tsort('span.country');
			});
			
			$('a#city').unbind('click').bind('click', function(e) {
				e.preventDefault();
				$(this).parents('ul').find('a').removeClass('selected');
				$(this).addClass('selected');
				$('ul.listings>li').tsort('span.city');
			});
		}
		
		// Init map interactivity, plot map points
		this.initMap = function() {
			var mapDiv = $('#map-container');
			var locImg = '<a href="HREF" class="loc"></a>';
			var factor;
			
			if ($('body').innerWidth() > 1230) {
				factor = 1.0;
			} else {
				factor = 0.8;
			}
			
			$('.loc').remove();
			$('ul.listings>li').each(function(idx, elem) {
				var elem = $(elem);
//				var titleText = elem.find('span.country').text() + ', ' + elem.find('span.city').text();
				var tooltipText = elem.find('span.city').text();
				var anchor = '#' + tooltipText.toLowerCase().replace(/, /g, '-').replace(/ /g, '');
				
				var mapdot = $(locImg).css({
					left: parseInt(elem.data('x') * factor),
					top: parseInt(elem.data('y') * factor)
				})
				.attr({
					'href': anchor
				})
				.addClass(elem.attr('class'))
				.appendTo(mapDiv)
				.tooltip({
					delay: 0,
					left: 15,
					top: 0,
					showURL: false,
					bodyHandler: function() {
						return tooltipText;
					}
				});
			});
			
			$('.loc').click(function(e) {
				e.preventDefault();
				
				var anchor = $(this).attr('href');

				// user clicked on hidden cty/cities, show them before scrolling
				if ($(anchor).is(':hidden')) {
					var clickedFilter = $(this).attr('class').split(' ')[1];
					GS.Sitewide.filtering(clickedFilter, null);
					resetMap(clickedFilter);
					
					// set drop down to the clicked region
					$('.regionSelect').find('li').removeClass('selected').hide();
					$('.regionSelect li #'+clickedFilter).parent().addClass('selected').show();
				}
				
				$('html, body').animate({
					scrollTop: $(anchor).offset().top
				}, 'fast');
			});
			
			function resetMap(filterStr) {
				mapDiv.find('a').each(function() {
					var elem = $(this);
					
					if (filterStr === 'filter_all')
						elem.removeClass('hide');
					else {
						elem.addClass('hide');
						if (elem.hasClass(filterStr))
							elem.removeClass('hide');
					}
				});
			}
			
			$('.customSelect')
				.unbind('onFilter')
				.bind('onFilter', function(e, filter, item) {
					resetMap(filter);
					GS.Sitewide.filtering(filter, null);
				});
		}
		
		// Scroll to the office location based on window hash
		this.scrollToOffice = function () {
			function respondToHash() {
				if (window.location.hash != '') {
					$('section.office-listings ul.listings > li').each(function(){
						if ($('span.country', $(this)).text() == window.location.hash.substring(1,window.location.hash.length)) {
							$('body,html,document').scrollTop($(this).offset().top);
							return false;
						}
					});
				}
			}
			$(window).bind('load', respondToHash);
			$(window).bind('hashchange', respondToHash);
		}
		
		// Match heights of elements for uniform display
		this.matchHeight = function() {
			if($('.matchHeight').size() > 0) {
				//Timeout added to counteract delays in element sizing from web font loading
				setTimeout(function(){
					var maxHeight = '0';
					$('.matchHeight').each(function(){
						maxHeight = ($(this).height() > maxHeight) ? $(this).height() : maxHeight;
					});
					$('.matchHeight').height(maxHeight);
				}, 250);
			}
		}
		
		// 10,000 pages content
		this.initGrid = function() {
			var intervalID;
			var page = $('body').attr('class').split(' ')[1];
			page = page ? page : $('body').attr('class');
			var currentFilters = [];
			
			function resetFilters() {
				var filterObj = $('.grid-content li');
				
				filterObj.find('a').hover(thumbMouseEnter, thumbMouseLeave);
				
				// reset all to visible
				filterObj
					.css('opacity', 1)
					.removeClass('filteredOut')
					.find('a')
						.removeClass('disabled')
					.end()
					.tsort({order:'asc',attr:'rel'});
			}
			
			function filterMultiple(str, clicked) {
				var id;
				
				if (typeof clicked === 'string')
					id = clicked;
				else
					id = clicked.parents('.customSelect').attr('id');
				
				var found = false;
				var obj = {};
				
				// if selected filter already in place, replace with newly selected filter
				for (var i=0, len = currentFilters.length; i < len; ++i) {
					for (var j in currentFilters[i]) {
						if (id === j) {
							found = true;
							
							if (str === '') {
								currentFilters.splice(i, 1);
							} else {
								currentFilters[i][j] = str;
							}
						}
					}
				}
				
				// new filter, add to list of current filters
				if (!found) {
					obj[id] = str;
					currentFilters.push(obj);
				}
				
				resetFilters();
				
				var filterObj = $('.grid-content li');
				
				for (var i=0, len = currentFilters.length; i < len; ++i) {
					for (var j in currentFilters[i]) {
						var filter = currentFilters[i][j];
						
						filterObj
							.not("."+filter)
							.css('opacity', 0.3)
							.addClass('filteredOut')
								.find('a')
									.addClass('disabled')
									.unbind('mouseenter mouseleave')
							.end()
							.tsort('.filteredOut');
					}
				}
			}
			
			function filterImages(str) {
				var filterObj = $('.grid-content li');
				
				filterObj.find('a').hover(thumbMouseEnter, thumbMouseLeave);
				
				if (str !== 'filter_all' && filterObj.length !== 0) {
					filterObj
						.css('opacity', 1)
						.removeClass('filteredOut')
						.find('a')
							.removeClass('disabled')
						.end()
							.not("."+str)
							.css('opacity', 0.3)
							.addClass('filteredOut')
								.find('a')
									.addClass('disabled')
									.unbind('mouseenter mouseleave')
						.end()
						.tsort('.filteredOut');

				} else if (str === 'filter_all' && filterObj.length != 0) {
					filterObj
						.css('opacity', 1)
						.removeClass('filteredOut')
						.tsort({order:'asc',attr:'rel'});
				}
			}
			
			
			// if exists
			if ($('.regionSelect').length > 0) {
				$('.regionSelect')
					.unbind('onFilter')
					.bind('onFilter', function(e, filter) {
						filterImages(filter);
					});
			}
			
			if ($('.cityFilter').length > 0) {
				$('.cityFilter')
					.unbind('onFilter')
					.bind('onFilter', function(e, filter) {
						filterImages(filter);
					});
			}
			
			if ($('.people-content').length > 0) {
				$('.people-content .customSelect')
					.unbind('onFilter')
					.bind('onFilter', function(e, filter, item) {
						filterMultiple(filter, item);
					});
				
				$('#filter_video').click(function(e) {
					if (this.checked)
						filterMultiple('filter_video', 'video');
					else
						filterMultiple('', 'video');
				});
				
				$('#reset').click(function(e) {
					e.preventDefault();
					
					currentFilters = [];
					resetFilters();
					
					$('#filter_video').attr('checked', false);
					
					// reset filter dropdown(s) to the first item
					$('.people-content .customSelect').each(function() {
						var listitems = $(this).find('li');
						
						listitems
							.removeClass('selected')
							.hide()
						.first()
							.addClass('selected')
							.show();
					});
				});
			}
			
			// create placeholder for the rollover card and inject into the DOM
			var profileContainer = $('<div id="profile-container" />');
			var profileData = $('<div class="profile-data" />');
			
			if ($('body').hasClass('ten-thousand')) {
				var tenkElems = [
					$('<h4 class="name" />'),
					$('<p class="country" />'),
					$('<p class="business">Business: <br /><span></span></p>'),
					$('<p class="desc" />'),
					$('<a href="#" class="hitLink">View her profile</a>')];
				for (var i = 0; i<tenkElems.length; ++i) {
				  	profileData.append(tenkElems[i]);
				}
			} else if ($('body').hasClass('careerspeople')) { 
				profileContainer.addClass('careerspeople');
				var peopleElems = [
					$('<h4 class="name" />'),
					$('<p class="title" />'),
					$('<p class="position" />'),
					$('<a href="#" class="hitLink">Read profile</a>')];
				for (var i = 0; i<peopleElems.length; ++i) {
				  	profileData.append(peopleElems[i]);
				}
			}
			
			var profileCard = $('<div class="profile-card hitArea" />').append($('<img />')).append(profileData);
			profileContainer.append(profileCard);
			$('body').prepend(profileContainer);
			
			function thumbMouseEnter(e) {
				//console.log('elem mouseenter')
				e.preventDefault();

				var elem = $(this);
				var card = $('.profile-card');
				
				$.data(this, 'hover', true);
				
				function showProfileCard() {
					if (!elem.data('hover')) return false;
					var midpoint = elem.parents('ul.grid-content').offset().left + (elem.parents('ul.grid-content').width() / 2);
					var origin = {x: $('ul.grid-content').position().left, y: $('ul.grid-content').position().top};
					var headerHeight = $('header').outerHeight(true);
					var side;
					
					card.addClass(page);
					
					// update details on the profile card before showing
					var li = elem.parent();
					card.find('img').attr('src', li.data('img'));
					if (li.data('name')) card.find('h4.name').text(li.data('name'));
					if (li.data('cty')) card.find('p.country').text(li.data('cty'));
					if (li.data('biz')) card.find('p.business span').text(li.data('biz'));
					if (li.data('link')) card.find('a').attr('href', li.data('link'));
					if (li.data('desc')) card.find('p.desc').text(li.data('desc'));
					if (li.data('title')) card.find('p.title').text(li.data('title'));
					if (li.data('div')) card.find('p.position').text(li.data('div'));
					
					elem.unbind('mouseleave');
					
					if (e.pageX < midpoint) {
						side = 'left';
					} else {
						side = 'right';
					}

					card.removeClass('left right')
					.addClass(side)
					.css({
						left: elem.parent().position().left + origin.x, 
						top: elem.parent().position().top + origin.y + headerHeight
					})
					.fadeIn(400)
					.mouseleave(function() {
						//console.log('card mouseleave')
						
						elem.bind('mouseleave', thumbMouseLeave);
						
						card.removeClass('left right')
						.css({
							display: 'none'
						})
						.unbind('mouseleave');
					});

				}

				if (intervalID === undefined) clearTimeout(intervalID);
				intervalID = setTimeout(function(){ showProfileCard() }, 250);
			}
										
			function thumbMouseLeave(e) {
				//console.log('elem mouseleave')
				var elem = $(this);
				$.data(this, 'hover', false);
			}

			var gridItems = $('ul.grid-content li');
			for(i=0;i<gridItems.length;i++){
				$(gridItems[i]).attr('rel',i);
			}

			$('ul.grid-content li a')
				.removeAttr('style')
				.unbind('mouseenter mouseleave')
				.hover(thumbMouseEnter, thumbMouseLeave)
				.click(function(e) { return false; e.preventDefault(); });
		}
		
		// ajax call for differnt region triggered on select
		this.regionLoad = function() {
			var defaultRegion = $('.loadRegion li.selected a').first().text();
			var defaultRegionHTML = $('.daAjax').html();
			$('.loadRegion.open a:gt(0)').live('click', function(){
				var url = $(this).attr('href'), region = $(this).text();
				if (region === defaultRegion) {
					$('.daAjax').html(defaultRegionHTML);
				} else {
					if ($.browser.msie) {
						$('.daAjax').loadShiv(url + " #loadContent");
					}
					else {
						$('.daAjax').load(url + " #loadContent");
					}
					$(this).parents('aside').find('h3 strong').text(region);
				}
			});
		}

		this.prepDivisionSelects = function() {
			//Here we would prepare division-specific drop-downs to default to GS.Sitewide.context.division
			$('.divisionSelect').each(function(){
				if(GS.Sitewide.context.division && GS.Sitewide.context.division !== ''){
					//console.log('The user has set their contextual region to: ' + GS.Geolocation.context.region);
					var targetDivision = GS.Sitewide.context.division;
					//console.log('User selection trumps geolocation');
					var targetOption = $('.divisionSelect-'+targetDivision,this);
					if(targetOption.size() > 0){
						$('li',this).removeClass('selected').hide();
						targetOption.parent('li').addClass('selected').show();
					}
				}
			});
		}

		// blog - applying backgound colors
		this.blogBg = function() {
			var it = 0;
			$('.blogList > li').each(function(i){
				switch(it) {
					case 0:
					  $(this).addClass('blogGrad1');
					  break;
					case 1:
					  $(this).addClass('blogGrad2');
					  break;
					case 2:
					  $(this).addClass('blogGrad3');
					  it = -1;
					  break;
  				}
				it++
			});
		}
		
		this.applicationDeadLine = function() {
			 $('.appDeadLine p').html($('.appDeadLine a:first').attr('data-deadline') + " <a href='#' class='buttonLink'>apply now</a>");
			 $('.appDeadLine .customSelect.open a').live('click', function(){
			 	var date = $(this).attr('data-deadline');
				$(this).parents('.customSelect').next('p').html(date+ " <a href='#' class='buttonLink'>apply now</a>");
			 });
		}
		
		this.stockPrice = function() {
			//Replaces old list-based markup with a table (of relatively equal semantic worth)
			//Should be appended after .quickLinks
			var stockBlock = $('<section></section>');
			var stockSource = '/a/data/stock/stock.html'
					
			var stockChartURL = '/investor-relations/stock-chart/index.html';
			stockBlock.load(stockSource +' .stockprice', function(responseText, textStatus, XHR){
				if(textStatus === 'success') {
					stockBlock.addClass('stockPrice hitArea').prepend('<h2 class="hidden">Latest stock information</h2>');
					$('tfoot',stockBlock).replaceWith('<tfoot><tr><td colspan="4"><a href="'+stockChartURL+'">View stock chart</a></td></tr></tfoot>');
					$('.quickLinks').after(stockBlock);
				} else {
					//Do nothing - if we can't load the stock quote we don't display the block
				}
			});
		}
		
		// Functions for Careers job search pages
		this.jobSearch = function() {
			// stores the default text 
			var regionDefault = GS.Sitewide.selectorHelper($('.regionSelect li:first').attr('class'));
			var divisionDefault = GS.Sitewide.selectorHelper($('.divisionSelect li:first').attr('class'));
			var jobsHolder = $('#jobs');
			var currentFilters = [];
			
			function resetFilters() {
				var filterObj = $('.searchListing tbody tr');
				
				// reset all to visible
				filterObj.not(':first').css('display', 'table-row');
				filterObj.first().addClass('hidden');
			}
			
			function filterMultiple(str, clicked) {
				var id = clicked.parents('.customSelect').attr('id');
				
				var found = false;
				var obj = {};
				
				// if selected filter already in place, replace with newly selected filter
				for (var i=0, len = currentFilters.length; i < len; ++i) {
					for (var j in currentFilters[i]) {
						if (id === j) {
							found = true;
							
							if (str === '') {
								currentFilters.splice(i, 1);
							} else {
								currentFilters[i][j] = str;
							}
						}
					}
				}
				
				// new filter, add to list of current filters
				if (!found) {
					obj[id] = str;
					currentFilters.push(obj);
				}
				
				resetFilters();
				
				var filterObj = $('.searchListing tbody tr');
				
				for (var i=0, len = currentFilters.length; i < len; ++i) {
					for (var j in currentFilters[i]) {
						var filter = currentFilters[i][j];
						
						filterObj
							.not("."+filter)
							.css('display', 'none');
						
						if (filterObj.find(':visible').length === 0)
							filterObj.first().removeClass('hidden').css('display', 'table-row');
					}
				}
			}
			
			$('.searchListing').tablesorter();
			
			// $('.filters .customSelect')
			// 	.unbind('onFilter')
			// 	.bind('onFilter', function(e, filter, item) {
			// 		filterMultiple(filter, item);
			// 	});

			$('.filters .customSelect')
				.die('onFilter')
				.live('onFilter', function(e, filter, item) {
					filterMultiple(filter, item);
				});
			
			$('.searchCTA').click(function(e) {
				e.preventDefault();
				
				// trimming it because IE inexplicably adds a space
				var regionSelected = GS.Sitewide.selectorHelper($('.regionSelect li.selected a:eq(0)').attr('class'));
				regionSelected = (regionSelected == false || regionSelected == 'all') ? false : regionSelected;
				var divisionSelected = GS.Sitewide.selectorHelper($('.divisionSelect li.selected a:eq(0)').attr('class'));
				divisionSelected = (divisionSelected == false || divisionSelected == 'all') ? false : divisionSelected;
				var loadFile = '';
				
				if ((regionSelected && regionSelected !== regionDefault) && (divisionSelected && divisionSelected !== divisionDefault)) {
					loadFile = regionSelected + '-' + divisionSelected + '.html';
				} else if (divisionSelected && divisionSelected !== divisionDefault) {
					loadFile = divisionSelected + '.html';
				} else if (regionSelected && regionSelected !== regionDefault) {
					loadFile = regionSelected + '.html';
				} else {
					loadFile = GS.Sitewide.jobSearchDefaultFile;
				}
				
				// load in the table from the selected file
				if (loadFile !== '') {
					loadFile = GS.Sitewide.jobSearchSourcePath + loadFile;
					//Reload page
					window.location = loadFile;
					//Or load new content via AJAX
					// jobsHolder.load(loadFile + ' .searchListing', function() {
					// 	// reinit the listing table
					// 	$('.searchListing').tablesorter();
					// });
				}
			});
		}
		
		
		// Functions for Careers job search sidebar
		this.jobSearchSidebar = function() {
			var loadPath = '';
			var jobSideBar = $('.jobSidebar');
			
			function loadJobsListings() {
				// Check if user-selected region is available
				// If not, fall back to geo-located region
				if (GS.Sitewide.context.region && GS.Sitewide.context.region !== '') {
					loadPath = GS.Sitewide.jobSearchSourcePath + GS.Sitewide.context.region + '-' + GS.Sitewide.context.division;
				} else if (GS.Sitewide.context.region === false) {
					loadPath = '';
				} else if(GS.Geolocation.region && GS.Geolocation.region !== '') {
					GS.Sitewide.context.region = GS.Geolocation.region;
					loadPath = GS.Sitewide.jobSearchSourcePath + GS.Sitewide.context.region + '-' + GS.Sitewide.context.division;
				}

				$('#top3').remove();
				$('#entryLevel').remove();
				
				// create div holder, load in content and inject into the DOM
				$('<div id="top3" />').load(loadPath + '-top3.html', function(response, status, xhr) {
					if (status === 'success') $(this).appendTo(jobSideBar);

					$('<div id="entryLevel" />').load(loadPath + '-entry.html', function(response, status, xhr) {
						if (status === 'success') $(this).appendTo(jobSideBar);
					});
				});
			}
			
			// $('.jobSidebar .regionSelect')
			// 	.unbind('onFilter')
			// 	.bind('onFilter', function(e, filter, item) {
			// 		//GS.Sitewide.context.region = item.text().toLowerCase();
			// 		GS.Sitewide.context.region = GS.Sitewide.selectorHelper(item.attr('class'));
			// 		loadJobsListings();
			// 	});

			$('.jobSidebar .regionSelect')
				.die('onFilter')
				.live('onFilter', function(e, filter, item) {
					//GS.Sitewide.context.region = item.text().toLowerCase();
					GS.Sitewide.context.region = GS.Sitewide.selectorHelper(item.attr('class'));
					loadJobsListings();
				});

			// first load
			loadJobsListings();
		}
		
		//Utility function to parse region or division selector values
		this.selectorHelper = function(testString) {
			var responseString = false;
			if(testString) {
				testMatches = testString.match(/(regionSelect|divisionSelect)\-[^\s]+/);
				responseString = (testMatches && testMatches[0]) ? $.trim(testMatches[0].replace(/(regionSelect|divisionSelect)\-/,'').toLowerCase()) : '';
			}
			return responseString;
		}
		
		// Function for Our Thinking Index page
		this.initOurThinking = function() {
			$('.radioType').click(function() {
				$('.customSelect')
					.addClass('hidden')
					.each(function() {
						// reset dropdown(s) to the first item
						var listitems = $(this).find('li');
					
						listitems
							.removeClass('selected')
							.hide()
						.first()
							.addClass('selected')
							.show();
					});
				
				GS.Sitewide.filtering('filter_all', null);
				$('#' + this.value).removeClass('hidden');
			});
		}

		// Function for Research Sources
		this.initSources = function() {
			var sourcePattern = /.*source_(.*)(\W|$)/;
			$('cite').hover(
				function(e) {
					if(sourcePattern.test($(this).attr('class'))) {
						var sourceName = RegExp.$1;
						var width = $(this).width();
						$(this).css({'position': 'relative'});
						var $tooltip = $('#sourcetip_' + sourceName)
							.clone()
							.attr('id', 'temp_id');
						$(this).append($tooltip);
						$tooltip.removeClass('hidden');
						var toolHeight = $tooltip.height();
						$tooltip.css({
							"left": (width) + 8 + "px",
							"top" : '-' + toolHeight + 'px'
						});
						var left = $tooltip.offset().left;
						var top = $tooltip.offset().top;
						$tooltip.remove().appendTo('body').css({'left': left + 'px', 'top': top + 'px'}); 
					}
				},
				function(e) {
					$('#temp_id').remove();
					
				}
			);
		}
		
		//Careers People Horizontal Nav
		this.getPeers = function() { 
				var peopleJsonPage = $("nav.quickLinks").data("jsonlink");
				$.getJSON(peopleJsonPage, function(data){
					
					var sizeOfProfiles = data['profiles']['length'];
					
					$.each(data['profiles'], function(index,person) {
					 	if(window.location.pathname == person['url']){
					 		var left = (index + sizeOfProfiles - 1) % sizeOfProfiles;
					 			right = (index + 1) % sizeOfProfiles;
					 		
					        $("li.quickNext a").attr('href', data['profiles'][right]['url']).text(data['profiles'][right]['name']);
					        $("li.quickPrevious a").attr('href', data['profiles'][left]['url']).text(data['profiles'][left]['name']);
						}
				 	});
				});
			
		}
		
		//Investor Relations Fullfillment Form
		this.getFinancialReports = function() {
			var subject = $("ul#reportList").data("rsubject");
			var body = $("ul#reportList").data("rbody");
			body = body.replace(/\\n/g, "\n");
			var address = $("ul#reportList").data("email");
			
			function concatOrErrorSelections() {
				var hostname = "http://" + window.location.hostname;
				var _s = "";
				var delim = "";
				var count = 0;
				$('.checkbox:checked').each(function() {
					_s += delim + delim + $(this).attr('name') + "\n" + hostname + $(this).attr('value');
					delim = "\n";
					count++;
				});
				
				if (count == 0) {
					alert("Please make a selection from the list of reports.");
					return;
				} else {
					return _s;
				}
			}
			
			$('div.form #submitrequest').click(function(){
				var form = $('#mailing')[0];
			
				var _s = concatOrErrorSelections();
				if (_s == "") return;
				
				var spacer = "          ";
				
				var errorPrefix = "The following fields are required: ";
				var errors = [];
				
				function errorIfEmpty(value, field) {
					if ($.trim(value) == "") {
						errors.push(field);
					}
					
					return value;
				}
				
				function appendNewLineOrTrim(input, newline) {
					if (newline == undefined)
						newline = true;
						
					if (input == undefined || $.trim(input) == ""){
						return "";
					} else
						return spacer + $.trim(input) + (newline ? "\n" : "");
				}
				
				function concat(values) {
					var result = "";
					var d = "";
					for (var i = 0; i < values.length; i++) {
						if (values[i] && $.trim(values[i]) != "") {
							result += d + $.trim(values[i]);
							d = ", ";					
						}
					}
					return result;
				}
				
				var originalVal = $.fn.val;
		        $.fn.val = function (value) {
		            if (typeof value == 'undefined') {
		                return $(this).attr("value") === $(this).attr("placeholder") ? "" : $(this).attr("value");
		            }
		
		            return originalVal.call(this, value);
		        };
				
				var _r = "";
				_r += appendNewLineOrTrim(errorIfEmpty($("#fname").val(), "Full Name"));
				_r += appendNewLineOrTrim($("#company").val());
				_r += appendNewLineOrTrim($("#add1").val(), "Address Line 1");
				_r += appendNewLineOrTrim($("#add2").val());
				
				_r += appendNewLineOrTrim(concat([errorIfEmpty($("#city").val(), "City"), errorIfEmpty($("#state").val(), "State/Province/Region"), errorIfEmpty($("#postal").val(), "Zip/Postal Code"), errorIfEmpty($("#country").val(), "Country")]));
				
				_r += appendNewLineOrTrim($("#phone").val(), false);
	
				if (errors.length > 0) {
					alert(errorPrefix + concat(errors));
				} else {
					var l = "mailto:" + address + "?subject=" + subject + "&body=" + escape(body.replace("${selection}", _s).replace("${requester}", _r));
					if (($.browser.msie) && ($.browser.version >= 8.0)) {
						window.open(l);
					} else {
						window.location = l;
					}
				}
			});
		}
		
		this.analyticsEscape = function() { 
			var regex = /(\||'|\$|%|\^|\*|:|~|,)/gi; 
			return function(input) { 
				return input && input.replace(regex, '')
			}; 
		}();

		this.truncateHorizontalNav = function () {
			var threshold = 65;
			if ($('nav.quickLinks').length > 0) { 
				$('nav.quickLinks li a').each(function() { 
					$(this).closest('li').data('navText', $(this).text()); 
					if ($(this).text().length > threshold) { 
						$(this).text(
							$.trim($(this).text())
								.substr(0, threshold)
								.split(" ")
								.slice(0, -1)
								.join(" ")
							+ '...'); 
					} 
				}); 
			}
		}

		//Prep data for Omniture analytics
		this.prepAnalytics = function() {
			//Top-level page touts
			if ($('.homepage-grid article').length >0) {
				$('.homepage-grid article').live('click.analytics', function(e) {
					var nodeCount = $('.homepage-grid article').length;
					var gridTitle = '';
					if (typeof $('body').data('transitionIndex') == 'undefined') {
						gridTitle = 'Careers';
					}
					else {
						gridTitle = ($('body').data('transitionIndex') == -1) ? 'Home' : $('#main-nav > ul > li').eq($('body').data('transitionIndex')).find('a').eq(0).text();
					}
					var toutTitle = $('h2',this).text();
					var toutPosition = $(this).index();
					var toutSubtitle = '';
					if ($('a', this).length != 1) {
						if ($(e.target).is('a')) 
							toutSubtitle = $(e.target).text();
						toutPosition = toutPosition + ':' + ($.inArray(e.target, $(this).find('a')) + 1);
					}
					var datamap = {
						type: 'toplevel-tout',
						title: toutTitle,
						position: toutPosition,
						count: nodeCount,
						pageTitle: gridTitle,
						subTitle: toutSubtitle
					};
					GS.Sitewide.doAnalytics(e,datamap);
				});
			}

			//Breadcrumbs
			if ($('.breadcrumbs li a').length >0) {
				var analyticsTitle = "";
				$('.breadcrumbs li a').each(function(){
					analyticsTitle = (analyticsTitle == "") ? GS.Sitewide.analyticsEscape($(this).text()) : analyticsTitle + ":" + GS.Sitewide.analyticsEscape($(this).text());
					var datamap = {
						type: 'breadcrumb',
						title: analyticsTitle
					};
					$(this).data('analytics',datamap).bind('click', function(e){GS.Sitewide.doAnalytics(e,$(this).data('analytics'))});
				});
			}

			//Page-level sidebar touts
			if($('.featuredItems article').length > 0){
				var nodeIndex = 1;
				$('.featuredItems article').each(function(){
					var datamap = {
						type: 'sidebar-tout',
						title: $.trim($.map($('a',this)[0].childNodes, function(val, i) { if (val.nodeType === 3) return val.data; }).join('')),
						position: nodeIndex
					};
					$(this).data('analytics',datamap).bind('click', function(e){GS.Sitewide.doAnalytics(e,$(this).data('analytics'))});
					nodeIndex++;
				});
			}
			
			//Home link
			if($('#homelink a').length > 0){
				$('#homelink a').each(function(){
					var datamap = {
						type: 'navigation-slide',
						title: 'Home',
						position: '0'
					};
					$(this).data('analytics',datamap).bind('click', function(e){GS.Sitewide.doAnalytics(e,$(this).data('analytics'))});
				});
			}

			
			//Horizontal navigation
			if($('nav.quickLinks').length > 0){
				$('nav.quickLinks li').live('click.analytics', function(e) {
					var datamap = {
						type: 'horizontal-nav',
						title: $(this).data('navText'),
						direction: ($(this).hasClass('quickNext')) ? 'right' : 'left'
					};
					GS.Sitewide.doAnalytics(e, datamap);
				});
			}

			//Home page swipe arrows			
			$('.transitionButton').live('click.analytics', function(e) {
				var datamap = {
					type: 'homepage-swipe',
					title: $(this).html(),
					direction: ($(this).id == 'transitionPrevButton') ? 'left' : 'right'
				};
				GS.Sitewide.doAnalytics(e,datamap);
			});		
		}
		
		this.sbAnalytics = function() {
			if($('section.grid2-padded a').length > 0){
				$('section.grid2-padded a').each(function(){
					var localRE = new RegExp('//' + location.host + "($|/)" );
					if (($(this).get(0).href.substring(0,4) === 'http') && !(localRE.test($(this).get(0).href)) && (($(this).get(0).href).indexOf('addthis') == -1)) {
						var datamap = {
							type: '10ksb-link',
							title: $.trim($(this).text())
						};
						$(this).data('analytics',datamap).bind('click', function(e){GS.Sitewide.doAnalytics(e,$(this).data('analytics'))});
					}
						
				});
			}
		}
		
		this.enhanceOTAnalytics = function() {
			if (typeof gsAnalytics.handleOurThinkingVideo != 'undefined') {
				var oldOpenFunction = GS.MediaComponent.trackVideoOpen;
				GS.MediaComponent.trackVideoOpen = function(playername, videoname, duration) {
					gsAnalytics.handleOurThinkingVideo(videoname);
					oldOpenFunction(playername, videoname, duration);
				}
			}
			
			if($('ul.cards').length > 0){
				$('ul.cards li.hitArea').live('click.analytics', function(e) {
					var datamap = {
						type: 'our-thinking-card',
						title: $.trim($.map($('a',this)[0].childNodes, function(val, i) { if (val.nodeType === 3) return val.data; }).join(''))
					};
					GS.Sitewide.doAnalytics(e, datamap);
				});
			}
		}

		this.stopShareLink = function() {
			if ($('.shareLink a').length > 0){ 
				$('.shareLink a').attr('href', '#') 
			}
		}

		this.fixSearch = function() {
			$('#searchBox').closest("form").attr('action', '/search/search.gscgi').attr('method','post');
		}
		
		//Pass relevant analytics data to GSAnalytics
		this.doAnalytics = function(e,datamap){
		if(!(typeof gsAnalytics.scaffold !== "undefined" && gsAnalytics.scaffold)){ 	
			switch(datamap.type) {
				case 'breadcrumb':
					gsAnalytics.handleBreadcrumb(e.target, datamap.title);
					break;
				
				case 'toplevel-tout':
					gsAnalytics.handleGridTout(e.target, datamap.title, datamap.position, datamap.count, datamap.pageTitle, datamap.subTitle);
					break;
				
				case 'sidebar-tout':
					gsAnalytics.handleSidebarToutClick(e.target, datamap.title, datamap.position);
					break;
				
				case 'horizontal-nav':
					gsAnalytics.handleHorizontalNav(e.target, datamap.title, datamap.direction);
					break;
					
				case 'navigation':
					gsAnalytics.handleGlobalNav(e.target, datamap.title, datamap.position);
					break;
					
				case 'navigation-slide':
					gsAnalytics.handleGlobalNav(true, datamap.title, datamap.position);
					if(($('body').hasClass('top-level')) && (typeof $('body').data('transitionIndex') != 'undefined')) 
						gsAnalytics.fireHomepageSwipePageView(true, datamap.title);
					break;	
					
				case 'homepage-swipe':
					gsAnalytics.handleHomepageSwipe(true, datamap.title, datamap.direction);
					break;	
					
				case '10ksb-link':
					gsAnalytics.handleSBLink(e.target, datamap.title);
					break;
					
				case 'our-thinking-card':
					gsAnalytics.handleOurThinkingDownload(e.target, datamap.title);
					break;
			}
		}
			//alert(datamap);
			//console.log(datamap);
		 	//e.stopPropagation();
			//e.preventDefault();
		}

    }

    return new GS.Sitewide();
})(jQuery);

window['GS']['Sitewide']=GS.Sitewide;
window['GS']['Sitewide']['context']=GS.Sitewide.context;
window['GS']['Sitewide']['context']['region']=GS.Sitewide.context.region;

GS.Page.register('*', GS.Sitewide.removeIframe);
GS.Page.register('*', GS.Sitewide.windowResize);
GS.Page.register('*', GS.Sitewide.expandHitArea);
GS.Page.register('*', GS.Sitewide.opacityRollovers);
GS.Page.register('*', GS.Sitewide.searchStyling);
GS.Page.register('*', GS.Sitewide.testMediaQuerySupport);
GS.Page.register('*', GS.Sitewide.addView1280Class);
GS.Page.register('*', GS.Sitewide.windowResize);
GS.Page.register('*', GS.Sitewide.customSelect);
GS.Page.register('*', GS.Sitewide.tabToggle);
GS.Page.register('*', GS.Sitewide.matchHeight);
GS.Page.register('*', GS.Sitewide.initPlaceholder);
GS.Page.register('*', GS.Sitewide.toggleShareOverlay);
GS.Page.register('*', GS.Sitewide.toggleFeedOverlay);
GS.Page.register('*', GS.Sitewide.applicationDeadLine);
GS.Page.register('*', GS.Sitewide.hideFaqAnswers);
GS.Page.register('*', GS.Sitewide.FAQtoggle);
GS.Page.register('*', GS.Sitewide.prepDivisionSelects);
GS.Page.register('*', GS.Sitewide.stopShareLink);
GS.Page.register('*', GS.Sitewide.fixSearch);
GS.Page.register('*', GS.Sitewide.truncateHorizontalNav);
GS.Page.register('*', GS.Sitewide.prepAnalytics);
GS.Page.register({'className': 'blog'}, GS.Sitewide.blogBg);
GS.Page.register({'className': '10ksb'}, GS.Sitewide.sbAnalytics);
GS.Page.register({'className': 'tenkWomen'}, GS.Sitewide.regionLoad);
GS.Page.register({'className': 'financials'}, GS.Sitewide.financialsSelectControler);
GS.Page.register({'className': 'offices'}, GS.Sitewide.officeToggle);
GS.Page.register({'className': 'offices'}, GS.Sitewide.initMap);
GS.Page.register({'className': 'offices'}, GS.Sitewide.scrollToOffice);
GS.Page.register({'className': 'ten-thousand'}, GS.Sitewide.initGrid);
GS.Page.register({'className': 'careerspeople'}, GS.Sitewide.initGrid);
GS.Page.register({'className': 'stockquote'}, GS.Sitewide.stockPrice);
GS.Page.register({'className': 'careersSearch'}, GS.Sitewide.jobSearch);
GS.Page.register({'className': 'careers'}, GS.Sitewide.jobSearchSidebar);
GS.Page.register({'className': 'ourthinking'}, GS.Sitewide.initOurThinking);
GS.Page.register({'className': 'sources'}, GS.Sitewide.initSources);
GS.Page.register({'className': 'peoplePage'}, GS.Sitewide.getPeers);
GS.Page.register({'className': 'financialReports'}, GS.Sitewide.getFinancialReports);
GS.Page.register({'className': 'enhancedOTAnalytics'}, GS.Sitewide.enhanceOTAnalytics);
