PageSourceSearch

https://www.sandiegosymphony.org/static/js/main.3e2d416d235d.js

js sandiegosymphony.org collected 2026-09-24 09:47:25 UTC 4,781 bytes, 162 lines download raw bytes

1/* global $ */
2
3// Background image sync slider
4$(function() {
5	// Create the fade effect on the image behind the slider
6	var $bgSyncSlider = $('[data-bg-sync]')
7	var $slides = $bgSyncSlider.find('.js_slides').children()
8
9	// Before sliding, create an img element with the current slide image
10	if($bgSyncSlider[0]){
11		$bgSyncSlider[0].addEventListener('before.lory.slide', function() {
12			$slides.filter('.active')
13				.find('img')
14				.clone()
15				.addClass('bg')
16				.prependTo($bgSyncSlider)
17		})
18
19		// After sliding, update the slider bg and fade out the previous img element
20		$bgSyncSlider[0].addEventListener('after.lory.slide', function() {
21			var $activeImg = $slides.filter('.active').find('img')
22			$bgSyncSlider.css('background-image', 'url("' + $activeImg.attr('src') + '")')
23			$bgSyncSlider.find('img.bg').fadeOut(500)
24		})
25	}
26})
27
28// Site header 2018
29$(function() {
30	var $body = $('body')
31	var $header = $('.site-header-2018')
32	var $navToggle = $header.find('.navtoggle')
33	var $navDrawer = $('.navdrawer-2018')
34	var isNavOpen = false
35
36	function toggleNav() {
37		isNavOpen = !isNavOpen
38		$navToggle.toggleClass('-active')
39		$navDrawer.toggleClass('-active')
40		$body.toggleClass('-nav-visible')
41	}
42
43	$navToggle.on('click', toggleNav)
44
45	// Better accessibility for keyboard users
46	$body.on('keydown', function(event) {
47		if (!(event.key === 'Escape' && isNavOpen)) return
48		toggleNav()
49		$navToggle.focus()
50	})
51})
52
53// Site menu 2018
54$(function() {
55	// Make sure only one collapsible is open at a time
56	$('.site-menu-2018 [data-toggle="collapse"]').on('click', function() {
57		$('.site-menu-2018 .collapse.in').collapse('hide');
58	});
59})
60
61// Initialize lory slider
62$(function() {
63	// Init LoryA11y
64	loryA11y.initLory()
65})
66$(function() {
67	var mediaQuery = window.matchMedia("(max-width: 996px)")
68
69	$('[data-smooth-scroll]').click(function(){
70		/* Height to dropdown menu for mobile */
71		var heightMenu = 0
72		if (mediaQuery.matches) heightMenu = 350
73		$('html, body').animate({
74	        scrollTop: $( $(this).attr('href') ).offset().top - heightMenu
75		}, 500);
76		return false;
77	});
78})
79// Vimeo videos sound toggle
80$(function() {
81	$toggles = $('[data-toggle-sound]')
82	if (!$toggles.length) return
83	$.getScript('https://player.vimeo.com/api/player.js', function() {
84		$toggles.each(function(i, btn) {
85			var $btn = $(btn)
86			var $icon = $btn.find('.glyphicon')
87			var $target = $($btn.attr('data-toggle-sound'))
88			var player = new Vimeo.Player($target[0])
89			player.setVolume(0)
90			$btn.on('click', function() {
91				player.getVolume().then(function(vol) {
92					var isMuted = vol === 0;
93					player.setVolume(isMuted ? 1 : 0)
94					$icon
95						.toggleClass('glyphicon-volume-off', !isMuted)
96						.toggleClass('glyphicon-volume-up', isMuted)
97				})
98			})
99		})
100	})
101})
102
103$(function() {
104	$('[data-history-safe-iframe-src]').each((i, iframe) => {
105		const src = iframe.dataset.historySafeIframeSrc
106		if (!src || iframe.dataset.historySafeIframeInitialized === 'true') return
107
108		iframe.dataset.historySafeIframeInitialized = 'true'
109
110		try {
111			if (iframe.contentWindow && iframe.contentWindow.location) {
112				iframe.contentWindow.location.replace(src)
113			} else {
114				iframe.src = src
115			}
116		} catch (e) {
117			iframe.src = src
118		}
119	})
120
121	// Load the YouTube JS API (required later)
122	const $youtubeIframes = $('iframe[src*="youtube.com"], iframe[data-history-safe-iframe-src*="youtube"]')
123	if ($youtubeIframes.length && typeof YT === 'undefined') {
124		$.getScript('https://www.youtube.com/iframe_api')
125	}
126
127	// Toggle autoplay on all iframes inside modals
128	// For YouTube and Vimeo try to use postMessages to avoid reloading
129	// For all other providers (like Facebook) we reload the whole iframe
130	$(document).on('show.bs.modal hide.bs.modal', function(event) {
131		const action = event.type === 'show' ? 'play' : 'pause'
132		$(event.target).find('iframe').each((i, iframe) => {
133			const iframeSrc = iframe.dataset.historySafeIframeSrc || iframe.src
134			let msg
135			if (iframeSrc.search('vimeo') !== -1) {
136				msg = { method: action }
137			} else if (iframeSrc.search('youtube') !== -1) {
138				msg = { event: 'command', func: action + 'Video' }
139			} else {
140				msg = false
141			}
142			if (msg) { // Services that support postMessage
143				iframe.contentWindow.postMessage(JSON.stringify(msg), '*')
144			} else { // Services that DON'T support postMessage
145				const src = iframe.src
146				iframe.src = src // Reload iframe (pause)
147			}
148		})
149	})
150})
151
152// Push events to GTM's dataLayer
153// Elements should define event data in the data-gtm attribute
154$(document).on('click jPlayer_play', '[data-gtm]', function(event) {
155	const eventData = event.target.dataset.gtm
156	if (!eventData) return
157	try {
158		dataLayer.push(JSON.parse(eventData))
159	} catch(e) {
160		console.error('Failed to push to dataLayer', eventData, e)
161	}
162})

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.