{"version":3,"file":"js/application-eb387d49ba86d9b95f80.js","mappings":"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","sources":["webpack:///./app/javascript/packs/Menu.js","webpack:///./app/javascript/packs/SearchBar.js","webpack:///./app/javascript/packs/SearchBarMobile.js","webpack:///./app/javascript/packs/Video.js","webpack:///./app/javascript/packs/ExpandToggle.js","webpack:///./app/javascript/packs/Main.js","webpack:///./app/javascript/application.js","webpack:///./app/javascript/packs/vendor/apm-html5-player/script/AudioAnalytics.js","webpack:///./app/javascript/packs/vendor/apm-html5-player/script/FormatTime.js","webpack:///./app/javascript/packs/vendor/apm-html5-player/script/Player.js","webpack:///./app/javascript/packs/vendor/apm-html5-player/script/Playlist.js"],"sourcesContent":["'use strict';\n\n// Required Modules\nimport $ from 'jquery';\n\nconst Menu = function($el) {\n // The containing DOM element\n this.$el = $el;\n\n this.toggleMenu();\n};\n\nMenu.prototype.toggleMenu = function() {\n $(this.$el).click(function() {\n $('.mast_nav').toggleClass('active');\n });\n};\n\nexport default Menu;\n","'use strict';\n\n// Required Modules\nimport $ from 'jquery';\n\nconst SearchBar = function($el) {\n // The containing DOM element\n this.$el = $el;\n this.toggleSearchBar();\n};\n\nSearchBar.prototype.toggleSearchBar = function() {\n $(this.$el).click(function() {\n $('.js-search-bar-header').toggleClass('active');\n $('.js-search-whiteout').toggleClass('active');\n $('.js-search-outline').focus();\n\n });\n};\n\nexport default SearchBar;\n","'use strict';\n\n// Required Modules\nimport $ from 'jquery';\n\nconst ACTIVE_CLASS = 'active';\n\nconst SearchBarMobile = function($el) {\n // The containing DOM element\n this.$el = $el;\n this.$icon = $('.js-icon-mobile-search');\n\n this.toggleSearchBarMobile();\n};\n\nSearchBarMobile.prototype.toggleSearchBarMobile = function() {\n var self = this;\n\n $(this.$el).on('keyup', function() {\n if($(this).val().length < 1) {\n self.$icon.removeClass(ACTIVE_CLASS);\n } else {\n self.$icon.addClass(ACTIVE_CLASS);\n }\n });\n};\n\nexport default SearchBarMobile;\n","import $ from 'jquery';\n\nconst Video = function($el) {\n this.$el = $el;\n this.loadPoster();\n};\n\nVideo.prototype.loadPoster = function() {\n var poster = this.$el.data('poster');\n if(window.innerWidth < 1024 && poster.length > 0) { // don't if we are on something like desktop\n this.$el.attr('poster', poster);\n }\n};\n\nexport default Video;\n","import $ from 'jquery';\n\nconst ExpandToggle = function($el) {\n this.$el = $el;\n this.toggle();\n};\n\nExpandToggle.prototype.toggle = function() {\n this.$el.each(function(idx) {\n $(this).append(\"
\");\n var wrap = $(this).find('div.expandWrapper');\n\n $(this).children().each(function(idx) {\n if(idx === 0 ) return;\n if($(this).hasClass('expandWrapper')) return; \n $(this).appendTo(wrap);\n })\n\n $(this).append(\"
More
\");\n });\n\n $('.toggle').on('click', function() {\n $(this).prev().toggle('slow');\n if($(this).text() === 'More') {\n $(this).text('Less'); \n }\n else {\n $(this).text('More'); \n }\n });\n};\n\n\nexport default ExpandToggle;\n","// Required modules for page load\n'use strict';\n\nimport $ from 'jquery';\nimport Menu from './Menu';\nimport SearchBar from './SearchBar';\nimport SearchBarMobile from './SearchBarMobile';\nimport Player from './vendor/apm-html5-player/script/Player';\nimport Playlist from './vendor/apm-html5-player/script/Playlist';\nimport AudioAnalytics from './vendor/apm-html5-player/script/AudioAnalytics';\nimport FormatTime from './vendor/apm-html5-player/script/FormatTime';\nimport DataTables, { responsive } from 'datatables';\nimport Video from './Video';\nimport ExpandToggle from './ExpandToggle';\n\n//var DataTables = require('datatables');\n//var DataTablesResponsive = require('datatables.responsive');\n\n// Constructor\nconst Main = function() {\n // The Time formatter utility\n this.formatTime = new FormatTime();\n\n this.init();\n};\n\nMain.prototype.init = function() {\n var self = this;\n\n if (document.getElementsByTagName('audio')[0]) {\n var player_analytics = new AudioAnalytics();\n player_analytics.init({ audio: document.getElementsByTagName('audio')[0] });\n }\n\n if ($('.js-datatables').length) {\n $('.js-datatables').DataTable({\n language: {\n aria: {\n paginate: {\n next: 'Next',\n previous: 'Previous'\n }\n },\n info: '_START_-_END_ of _TOTAL_ rows',\n paginate: {\n next: '»',\n previous: '«'\n },\n search: 'Search table data:',\n searchPlaceholder: 'Search table data'\n },\n lengthChange: false,\n order: [],\n responsive: true\n });\n }\n\n $('.js-player').each(function() {\n new Player($, $(this), self.formatTime, Playlist).init();\n });\n\n if ($('.js-menu-toggle').length) {\n var menu = new Menu($('.js-menu-toggle'));\n }\n if ($('.js-search-toggle').length) {\n var searchbar = new SearchBar($('.js-search-toggle'));\n }\n\n if ($('.js-search-mobile-toggle').length) {\n var searchbarmobile = new SearchBarMobile($('.js-search-mobile-toggle'));\n }\n\n if($('video').length) {\n new Video($('video'));\n }\n\n if($(\".expand\").length) {\n new ExpandToggle($('.expand'));\n }\n};\n\nexport default Main;\n","// Entry point for the build script in your package.json\nimport Main from \"./packs/Main\";\n\nwindow.app = new Main();\n","/*\n * Google Analytics plug-in for HTML5 Player\n *\n * Example Usage:\n * var example_analytics = new HTML5PlayerGoogleAnalytics();\n * example_analytics.init({ version: 'classic' , audio: $('#audio') }); // omit 'version' property to default to 'universal'\n * Note Marketplace uses universal anaylics now.\n * Conceptually its probably easiest ot think about this piece of code as something that registers\n * event listeners (start, end and timeupdate) for the HTML5 audio player. Then we send a Google Analytics event on START,\n * FINISH and 25, 50 amd 75% the way through aka Quartiles.\n */\n(function(){\n\n 'use strict';\n\n function HTML5PlayerGoogleAnalytics(args){\n\n var self = this;\n\n /* Default to Google Analytics Universal API */\n this.ga_version = 'universal';\n //@todo rethink the use of isFirstPlay as a statemachine and make it its own object?\n this.isFirstPlay = true;\n this.lastsrc ='';\n this.quartile = 0;\n\n\n function checkSources() {\n self.isFirstPlay = (self.audioele.src === self.lastsrc ? false : true);\n self.lastsrc = self.audioele.src;\n }\n\n /* Return category 'Live Audio', 'On-Demand Audio' or in rare instances 'Underwriting' */\n function getCategory() {\n var cat;\n if(self.audioele.src.indexOf('stream.publicradio.org') > -1) {\n cat = 'Live Audio';\n }\n else {\n cat = 'On-Demand Audio';\n }\n return cat;\n }\n\n function audioSrcForReporting() {\n return self.audioele.src.replace('http://play.publicradio.org/api-2.0.1/o', '');\n }\n\n function percent_played() {\n return self.audioele.currentTime/self.audioele.duration;\n }\n\n /* Triggered every 100ms with position update data */\n function onPositionUpdate() {\n if(self.audioele.duration === Infinity) {\n return; // bail if it is live audio\n }\n var category = getCategory();\n var src = audioSrcForReporting();\n var percent = percent_played();\n var quartile = Math.floor((percent + 0.02) * 4);\n\n // Track quartiles played for static audio, but not underwriting.\n // Log 'QUARTILE-2', and 'QUARTILE-3', but not 'QUARTILE-1', or 'QUARTILE-4'.\n // We don't need to log QUARTILE-1 because START is the same thing.\n // We don't need to log QUARTILE-4 because FINISHED is the same thing.\n if (quartile > self.quartile && percent > 0 && percent !== 1) {\n\n self.quartile = quartile;\n\n if (quartile <= 3) {\n //console.log('About to call with: ' );\n //console.log({ category: category, action: 'QUARTILE-'+quartile, label: src});\n trackEvent({\n category: category,\n action: 'QUARTILE-'+quartile,\n label: src\n });\n }\n }\n\n }\n\n function onMediaFinished() {\n console.log('media finished');\n var category = getCategory();\n var src = audioSrcForReporting();\n //console.log('About to call with: ' );\n //console.log({ category: category, action: 'FINISHED', label: src});\n trackEvent({ category: category, action: 'FINISHED', label: src});\n self.isFirstPlay = true;\n }\n\n function onPlayPause() {\n var category = getCategory(), src = audioSrcForReporting();\n\n checkSources();\n\n // Track only the first 'PLAY' event as 'START' (we don't care about 'PAUSE' status)\n if ( self.isFirstPlay === true ) {\n //console.log('About to call with: ' );\n //console.log({ category: category, action: 'START', label: src});\n trackEvent({ category: category, action: 'START', label: src});\n }\n }\n\n /* Handle Google Universal or Classic API calls\n * @example trackEvent({ category: 'Live Audio' action: 'START', label: meta.identifier });\n * @example trackEvent({ category: 'On-Demand Audio' action: 'FINISHED', label: meta.identifier });\n */\n function trackEvent(event) {\n if(typeof window.ga === 'undefined') {\n return; // bail if no google analytics or ad blocker\n }\n // Test that an object was passed\n if (typeof event !== 'object') {\n console.error('object expected');\n return;\n }\n\n // Test that the object contains required attributes\n if (typeof event.category === 'undefined') {\n console.error('event category expected');\n return;\n }\n\n if (typeof event.action === 'undefined') {\n console.error('event action expected');\n return;\n }\n\n if (typeof event.label === 'undefined') {\n console.error('event label expected');\n return;\n }\n\n if (self.ga_version === 'universal') {\n\n window.ga('send', 'event', event.category, event.action, event.label, {'nonInteraction': 1});\n\n } else if (self.ga_version === 'classic') {\n\n window._gaq.push(['_trackEvent', event.category, event.action, event.label, undefined, true]);\n\n }\n\n }\n\n this.init = function(args) {\n\n // Set ga_version to 'universal' or 'classic'.\n // Events will be tracked using the proper Javascript API in trackEvent().\n if ( (typeof args.audio) === 'undefined' ) {\n console.error('Audio element must be passed in');\n }\n if( typeof args.version !== 'undefined') {\n // Otherwise use provided argument, whitelisting options 'universal' or 'classic'.\n self.ga_version = (args.version === 'universal' || args.version === 'classic') ? args.version : self.ga_version;\n }\n\n self.audioele = args.audio;\n self.audioele.addEventListener('timeupdate', onPositionUpdate);\n self.audioele.addEventListener('ended', onMediaFinished);\n self.audioele.addEventListener('play', onPlayPause);\n self.audioele.addEventListener('pause', onPlayPause);\n\n };\n }\n\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return HTML5PlayerGoogleAnalytics;\n });\n } else {\n window.HTML5PlayerGoogleAnalytics = HTML5PlayerGoogleAnalytics;\n }\n})();\n","(function() {\n 'use strict';\n\n // Constructor\n var FormatTime = function() {};\n\n // Formats an ugly time (in seconds) to a nice readable format\n // e.g. 125 > 2:05, or 4226 > 1:10:26\n FormatTime.prototype.toFormatted = function(timeInSeconds) {\n timeInSeconds = Math.round(timeInSeconds);\n\n var formattedTime = '';\n var formattedMinutes = '';\n var formattedSeconds = '';\n var hours = Math.floor(timeInSeconds / 3600);\n var minutes = Math.floor((timeInSeconds / 60) - (hours * 60));\n var seconds = timeInSeconds - (minutes * 60) - (hours * 3600);\n\n if (hours !== 0) {\n formattedTime = hours + ':';\n\n if (minutes < 10) {\n formattedMinutes = '0' + minutes;\n } else {\n formattedMinutes = minutes.toString();\n }\n } else {\n formattedMinutes = minutes.toString();\n }\n\n if (seconds < 10) {\n formattedSeconds = '0' + seconds;\n } else {\n formattedSeconds = seconds.toString();\n }\n\n formattedTime = formattedTime + formattedMinutes + ':' + formattedSeconds;\n\n return formattedTime;\n };\n\n // Removes formatting from a timestamp, converting it to seconds\n // e.g. 2:05 > 125, or 1:10:26 > 4226\n FormatTime.prototype.toSeconds = function(formattedTime) {\n var arrHms = formattedTime.split(':');\n var arrSmh = arrHms.reverse();\n var timeInSeconds = 0;\n var seconds = parseInt(arrSmh[0] || 0);\n var minutes = parseInt(arrSmh[1] * 60 || 0);\n var hours = parseInt(arrSmh[2] * 3600 || 0);\n\n timeInSeconds = hours + minutes + seconds;\n\n return timeInSeconds;\n };\n\n if ( typeof define === \"function\" && define.amd ) {\n define(function() {\n return FormatTime;\n });\n }\n else {\n window.FormatTime = FormatTime;\n }\n})();\n","(function() {\n 'use strict';\n\n // Constants\n var PLAYING_CLASS = 'is-playing';\n var PAUSED_CLASS = 'is-paused';\n var LOADING_CLASS = 'is-loading';\n var MUTED_CLASS = 'is-muted';\n\n // Allows jquery to be passed in through the constructor and scoped properly for normal usage\n var $;\n\n // Constructor\n var Player = function(jqueryLocal, $el, formatTime, Playlist) {\n // Set $ to passed-in jquery\n $ = jqueryLocal;\n\n // The containing DOM element\n this.$el = $el;\n\n // formatTime helper class\n this.formatTime = formatTime;\n\n //Playlist class\n this.Playlist = Playlist;\n\n // The playing/paused state of the Player\n this.isPlaying = false;\n\n // The src that will be used for audio\n this.src = this.$el.data('src');\n\n // A variable to store the previous volume the player was set at.\n this.storedVolume = 1;\n\n // References to the playlist\n this.playlistSelector = this.$el.data('playlist');\n this.$playlistElement = $(this.playlistSelector);\n // The playlist module, initialized later\n this.playlist;\n // Set to true when playlist is initialized\n this.hasPlaylist = false;\n };\n\n\n // -----------------------------\n // Initialized functions\n // -----------------------------\n\n // Initialize the module\n Player.prototype.init = function() {\n this.selectElements()\n .initPlaylist()\n .bindEventHandlers()\n .initTime()\n .displayCurrentVolume();\n\n return this;\n };\n\n // Descendant elements of the containing DOM element\n Player.prototype.selectElements = function() {\n this.audio = this.$el.find('audio')[0];\n // Controls\n this.$playButton = this.$el.find('.js-player-play');\n this.$skipForwardButton = this.$el.find('[data-skip-forward]');\n this.$skipBackButton = this.$el.find('[data-skip-back]');\n this.$visualPlayButton = this.$playButton.find('#apm_player_play');\n this.$visualPauseButton = this.$playButton.find('#apm_player_pause');\n this.$timeline = this.$el.find('.js-player-timeline');\n this.$timelineProgress = this.$timeline.find('.js-player-progress');\n this.$timelineBuffered = this.$timeline.find('.js-player-buffered');\n this.$volumeBar = this.$el.find('.js-player-volume');\n this.$currentVolume = this.$volumeBar.find('.js-player-volume-current');\n this.$muteButton = this.$el.find('.js-player-mute');\n // Info\n this.$time = this.$el.find('.js-player-time');\n this.$duration = this.$el.find('.js-player-duration');\n this.$currentTime = this.$el.find('.js-player-currentTime');\n this.$title = this.$el.find('.js-player-title');\n this.$artist = this.$el.find('.js-player-artist');\n\n return this;\n };\n\n // Setup and bind event handlers\n Player.prototype.bindEventHandlers = function() {\n // Jquery events\n this.$playButton.on('click', this.onPlayClick.bind(this));\n this.$skipForwardButton.on('click', this.onSkipForwardClick.bind(this));\n this.$skipBackButton.on('click', this.onSkipBackClick.bind(this));\n this.$timeline.on('click', this.onTimelineClick.bind(this));\n this.$volumeBar.on('click', this.onVolumeClick.bind(this));\n this.$muteButton.on('click', this.onMuteClick.bind(this));\n\n // Native javascript events\n this.audio.addEventListener('play', this.onAudioPlay.bind(this));\n this.audio.addEventListener('pause', this.onAudioPause.bind(this));\n this.audio.addEventListener('timeupdate', this.onAudioTimeupdate.bind(this));\n this.audio.addEventListener('waiting', this.onAudioWaiting.bind(this));\n this.audio.addEventListener('playing', this.onAudioPlaying.bind(this));\n this.audio.addEventListener('ended', this.onAudioEnded.bind(this));\n this.audio.addEventListener('volumechange', this.onVolumeChange.bind(this));\n this.audio.addEventListener('loadedmetadata', this.onLoadedMetadata.bind(this));\n this.audio.addEventListener('progress', this.onProgress.bind(this));\n\n return this;\n };\n\n Player.prototype.initTime = function() {\n this.displayCurrentTime();\n return this;\n };\n\n Player.prototype.initPlaylist = function() {\n if (this.$playlistElement.length) {\n this.playlist = new this.Playlist(this);\n this.playlist.init();\n this.hasPlaylist = true;\n }\n\n return this;\n };\n\n // -----------------------------\n // Event Handlers\n // -----------------------------\n\n Player.prototype.onPlayClick = function(e) {\n e.preventDefault();\n\n if (this.isPlaying === false) {\n if (this.audio.readyState === 0) {\n this.loadAudioFromSrc(this.src);\n }\n this.playAudio();\n } else {\n this.pauseAudio();\n if (this.audio.duration === Infinity) {\n this.unloadAudio();\n }\n }\n };\n\n Player.prototype.onSkipForwardClick = function(e) {\n var $target = $(e.currentTarget);\n var seconds = $target.data('skip-forward');\n\n e.preventDefault();\n\n if (this.audio.duration === Infinity) {\n return;\n }\n\n this.skipForward(seconds);\n };\n\n Player.prototype.onSkipBackClick = function(e) {\n var $target = $(e.currentTarget);\n var seconds = $target.data('skip-back');\n\n e.preventDefault();\n\n if (this.audio.duration === Infinity) {\n return;\n }\n\n this.skipBack(seconds);\n };\n\n Player.prototype.onTimelineClick = function(e) {\n var $target = $(e.currentTarget);\n var clickXPosition = e.pageX;\n var seconds = this.getSecondsByClickPosition($target, clickXPosition);\n\n e.preventDefault(e);\n\n this.seekTime(seconds);\n };\n\n Player.prototype.onVolumeClick = function(e) {\n var $target = $(e.currentTarget);\n var volume;\n\n if ($target.data('volume-direction') === 'h') {\n var clickXPosition = e.pageX;\n volume = this.getVolumeByHorizClickPosition($target, clickXPosition);\n } else {\n var clickYPosition = e.pageY;\n volume = this.getVolumeByVertClickPosition($target, clickYPosition);\n }\n\n e.preventDefault();\n\n this.changeVolume(volume);\n };\n\n Player.prototype.onMuteClick = function(e) {\n e.preventDefault();\n\n if (this.audio.volume !== 0) {\n this.muteAudio();\n } else {\n this.unmuteAudio();\n }\n };\n\n // HTMLMediaElement 'play' event fires when a request\n // to play the audio has occurred. Does not necessarily mean the\n // audio is actually playing. (see 'playing' event)\n Player.prototype.onAudioPlay = function() {\n this.isPlaying = true;\n this.displayPlayedState();\n };\n\n // HTMLMediaElement 'pause' event fires when the audio gets paused\n Player.prototype.onAudioPause = function() {\n this.isPlaying = false;\n this.displayPausedState();\n };\n\n // HTMLMediaElement 'timeupdate' event fires while the audio is playing\n // and the current time changes, usually several times per second\n Player.prototype.onAudioTimeupdate = function() {\n this.displayCurrentTime();\n };\n\n // HTMLMediaElement 'waiting' event fires when audio is downloading\n // or interrupted, such as when buffering at first play\n Player.prototype.onAudioWaiting = function() {\n this.displayBufferingState();\n };\n\n // HTMLMediaElement 'playing' event fires when audio has actually\n // begun playing (after being loaded)\n Player.prototype.onAudioPlaying = function() {\n this.displayPlayingState();\n };\n\n // HTMLMediaElement 'ended' event fires when audio playback has\n // finished for the current file\n Player.prototype.onAudioEnded = function() {\n this.displayStoppedState();\n if (this.hasPlaylist === true) {\n this.playNext();\n }\n };\n\n // HTMLMediaElement 'volumechange' event fires when the audio's\n // volume changes\n Player.prototype.onVolumeChange = function() {\n this.displayCurrentVolume();\n };\n\n // HTMLMediaElement 'onLoadedMetadata' event fires when the audio's\n // metadata has been downloaded\n Player.prototype.onLoadedMetadata = function() {\n this.displayDuration();\n };\n\n // HTMLMediaElement 'progress' event fires when any data\n // gets downloaded\n Player.prototype.onProgress = function() {\n this.displayTimeRanges();\n };\n\n // -----------------------------\n // Helpers\n // -----------------------------\n\n Player.prototype.loadAudioFromSrc = function(src) {\n this.audio.src = src;\n };\n\n Player.prototype.unloadAudio = function() {\n this.isPlaying = false;\n this.audio.src = '';\n this.displayStoppedState();\n };\n\n Player.prototype.playAudio = function() {\n this.pauseAllAudio();\n this.audio.play();\n };\n\n Player.prototype.pauseAudio = function(currentAudio) {\n if (typeof(currentAudio) !== 'undefined') {\n currentAudio.pause();\n } else {\n this.audio.pause();\n }\n };\n\n Player.prototype.pauseAllAudio = function() {\n // Pause any audio that may already be playing on the page.\n var self = this;\n $('audio').each(function() {\n self.pauseAudio(this);\n });\n };\n\n Player.prototype.playNext = function() {\n var nextSrc = this.getNextPlaylistSrc();\n var $nextItem;\n\n if (typeof(nextSrc) === 'undefined') return;\n $nextItem = this.findNext(nextSrc);\n this.playlist.populatePlayerInfo($nextItem.data('title'), $nextItem.data('artist'));\n this.loadAudioFromSrc(nextSrc);\n this.playAudio();\n };\n\n Player.prototype.findNext = function(src) {\n return $(\"li[data-src='\" + src +\"']\");\n };\n\n Player.prototype.getSecondsByClickPosition = function($element, clickXPosition) {\n var timelineOffset = $element.offset().left;\n var timelineWidth = $element.outerWidth();\n var positionInElement = clickXPosition - timelineOffset;\n var percent = positionInElement / timelineWidth;\n var time = this.audio.duration * percent;\n var seconds = Number(time.toFixed());\n\n return seconds;\n };\n\n Player.prototype.seekTime = function(seconds) {\n this.audio.currentTime = seconds;\n };\n\n Player.prototype.skipForward = function(seconds) {\n this.audio.currentTime = this.audio.currentTime + seconds;\n };\n\n Player.prototype.skipBack = function(seconds) {\n this.audio.currentTime = this.audio.currentTime - seconds;\n };\n\n Player.prototype.getVolumeByHorizClickPosition = function($element, clickXPosition) {\n var volumeBarOffset = $element.offset().left;\n var volumeBarWidth = $element.outerWidth();\n var positionInElement = clickXPosition - volumeBarOffset;\n var percent = positionInElement / volumeBarWidth;\n var volume = Number(percent.toFixed(2));\n\n return volume;\n };\n\n Player.prototype.getVolumeByVertClickPosition = function($element, clickYPosition) {\n var volumeBarOffset = $element.offset().top;\n var volumeBarHeight = $element.outerHeight();\n var positionInElement = clickYPosition - volumeBarOffset;\n var positionFromBottom = volumeBarHeight - positionInElement;\n var percent = positionFromBottom / volumeBarHeight;\n var volume = Number(percent.toFixed(2));\n\n return volume;\n };\n\n Player.prototype.getPlaylistItem = function() {\n var $item = this.playlist.$items.filter($('[data-src=\"' + $(this.audio).attr('src') + '\"]'));\n return $item;\n };\n\n Player.prototype.getNextPlaylistSrc = function() {\n var $item = this.playlist.$items.filter($('[data-src=\"' + $(this.audio).attr('src') + '\"]'));\n return $item.data('next');\n };\n\n Player.prototype.changeVolume = function(volume) {\n this.audio.volume = volume;\n };\n\n Player.prototype.muteAudio = function() {\n this.storedVolume = this.audio.volume;\n\n this.displayMutedState();\n this.changeVolume(0);\n };\n\n Player.prototype.unmuteAudio = function() {\n this.displayUnmutedState();\n if (this.storedVolume) {\n this.changeVolume(this.storedVolume);\n } else {\n this.changeVolume(1);\n }\n };\n\n // Displays the length of the audio file\n Player.prototype.displayDuration = function() {\n var duration;\n\n if (this.audio.duration !== Infinity) {\n duration = this.formatTime.toFormatted(this.audio.duration);\n this.$duration.html(duration);\n }\n };\n\n // Changes the current time numbers while playing\n Player.prototype.displayCurrentTime = function() {\n var currentTime = this.formatTime.toFormatted(this.audio.currentTime);\n this.$currentTime.html(currentTime);\n if (this.audio.duration === Infinity) {\n return;\n } else {\n this.updateTimelineProgress();\n }\n\n return this;\n };\n\n // Modifies timeline length based on progress\n Player.prototype.updateTimelineProgress = function() {\n var progress = (this.audio.currentTime / this.audio.duration) * 100;\n this.$timelineProgress.css('width', progress + '%');\n };\n\n // Show the portions of the file that have been downloaded\n // (i.e. 'buffered') on the timeline\n Player.prototype.displayTimeRanges = function() {\n if (this.isPlaying !== true) { return; }\n if (this.audio.duration === Infinity) { return; }\n\n for (var i = 0; i < this.audio.buffered.length; i++) {\n var currentBuffer = this.audio.buffered.length - 1 - i;\n\n if (this.audio.buffered.start(currentBuffer) < this.audio.currentTime) {\n var startX = this.audio.buffered.start(currentBuffer);\n var endX = this.audio.buffered.end(currentBuffer);\n var posXPercent = (startX / this.audio.duration) * 100;\n var widthPercent = (((endX - startX) / this.audio.duration) * 100);\n var $timeRanges = this.$timelineBuffered.children();\n var timeRangeCss = {\n 'left': posXPercent + '%',\n 'width': widthPercent + '%'\n };\n\n if ($timeRanges.eq(currentBuffer).length) {\n $timeRanges.eq(currentBuffer).css(timeRangeCss);\n } else {\n this.$timelineBuffered.append('
');\n $timeRanges.eq(currentBuffer).css(timeRangeCss);\n }\n }\n }\n };\n\n // Modifies the play/pause button state\n Player.prototype.displayPlayedState = function() {\n this.$el.removeClass(PAUSED_CLASS);\n this.$el.addClass(PLAYING_CLASS);\n\n if (this.hasPlaylist === true) {\n this.playlist.displayPlayedState(this.getPlaylistItem());\n }\n };\n\n // Modifies the play/pause button state\n Player.prototype.displayPausedState = function() {\n this.$el.removeClass(PLAYING_CLASS);\n this.$el.addClass(PAUSED_CLASS);\n\n if (this.hasPlaylist === true) {\n this.playlist.displayPausedState(this.getPlaylistItem());\n }\n };\n\n // Modifies the timeline\n Player.prototype.displayPlayingState = function() {\n this.removeBufferingState();\n\n if (this.hasPlaylist === true) {\n this.playlist.displayPlayingState(this.getPlaylistItem());\n }\n };\n\n // Modifies the timeline, button displays paused state\n Player.prototype.displayStoppedState = function() {\n this.$el.removeClass(PLAYING_CLASS);\n this.$el.removeClass(PAUSED_CLASS);\n this.removeBufferingState();\n\n if (this.hasPlaylist === true) {\n this.playlist.removeDisplayStates();\n }\n };\n\n // Adds buffering styles to timeline\n Player.prototype.displayBufferingState = function() {\n this.$el.addClass(LOADING_CLASS);\n\n if (this.hasPlaylist === true) {\n this.playlist.displayBufferingState(this.getPlaylistItem());\n }\n };\n\n // Removes buffering styles from timeline\n Player.prototype.removeBufferingState = function() {\n this.$el.removeClass(LOADING_CLASS);\n\n if (this.hasPlaylist === true) {\n this.playlist.removeBufferingState(this.getPlaylistItem());\n }\n };\n\n Player.prototype.displayCurrentVolume = function() {\n var volumePercent = this.audio.volume * 100;\n\n if (this.audio.volume === 0) {\n this.displayMutedState();\n } else {\n this.displayUnmutedState();\n }\n\n if (this.$volumeBar.data('volume-direction') === 'h') {\n this.$currentVolume.css('width', volumePercent + '%');\n } else {\n this.$currentVolume.css('height', volumePercent + '%');\n }\n\n return this;\n };\n\n Player.prototype.displayMutedState = function() {\n this.$el.addClass(MUTED_CLASS);\n };\n\n Player.prototype.displayUnmutedState = function() {\n this.$el.removeClass(MUTED_CLASS);\n };\n\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Player;\n });\n }\n else {\n window.Player = Player;\n }\n}());\n","(function() {\n // Required modules for page load\n 'use strict';\n\n\n // Constructor\n // The 'parent' argument passed in is the parent object from Player.js.\n // This script is only intended to be used with that Player.js.\n var Playlist = function(parent) {\n var $;\n this.player = parent;\n // The containing DOM element\n this.$el = this.player.$playlistElement;\n };\n\n // -----------------------------\n // Setup functions\n // -----------------------------\n\n Playlist.prototype.init = function() {\n this.selectElements()\n .setNextItem()\n .bindEventHandlers();\n };\n\n Playlist.prototype.selectElements = function() {\n this.$items = this.$el.find('.js-playlist-item');\n\n return this;\n };\n\n Playlist.prototype.setNextItem = function() {\n this.$items.each(function() {\n var $currentItem = $(this);\n var $nextItem = $(this).next();\n var nextSrc;\n\n if ($nextItem.length === 0) { return; }\n\n nextSrc = $nextItem.data('src');\n $currentItem.attr('data-next', nextSrc);\n });\n\n return this;\n };\n\n Playlist.prototype.bindEventHandlers = function() {\n this.$items.on('click', this.onItemClick.bind(this));\n\n return this;\n };\n\n // -----------------------------\n // Event Handlers\n // -----------------------------\n\n Playlist.prototype.onItemClick = function(e) {\n e.preventDefault();\n var $target = $(e.currentTarget);\n var src = $target.data('src');\n var title = $target.data('title');\n var artist = $target.data('artist');\n\n this.player.loadAudioFromSrc(src);\n this.player.playAudio();\n this.displayPlayedState($target);\n this.displayBufferingState($target);\n this.populatePlayerInfo(title, artist);\n };\n\n // -----------------------------\n // Helpers\n // -----------------------------\n\n Playlist.prototype.displayPlayedState = function($item) {\n this.removeDisplayStates();\n $item.addClass('is-playing');\n };\n\n Playlist.prototype.displayPlayingState = function($item) {\n this.removeBufferingState($item);\n this.removePausedState($item);\n };\n\n Playlist.prototype.displayPausedState = function($item) {\n $item.addClass('is-paused');\n };\n\n Playlist.prototype.removePausedState = function($item) {\n $item.removeClass('is-paused');\n };\n\n Playlist.prototype.displayBufferingState = function($item) {\n $item.addClass('is-loading');\n };\n\n Playlist.prototype.removeBufferingState = function($item) {\n $item.removeClass('is-loading');\n };\n\n Playlist.prototype.removeDisplayStates = function() {\n this.removeBufferingState(this.$items);\n this.$items.removeClass('is-active');\n this.$items.removeClass('is-paused');\n this.$items.removeClass('is-playing');\n };\n\n Playlist.prototype.populatePlayerInfo = function(title, artist) {\n this.player.$title.text(title);\n this.player.$artist.text(artist);\n };\n\n // Support Require.js\n if ( typeof define === \"function\" && define.amd ) {\n define(function() {\n return Playlist;\n });\n }\n else {\n window.Playlist = Playlist;\n }\n\n})();\n"],"names":["Menu","$el","this","toggleMenu","prototype","$","click","toggleClass","SearchBar","toggleSearchBar","focus","ACTIVE_CLASS","SearchBarMobile","$icon","toggleSearchBarMobile","self","on","val","length","removeClass","addClass","Video","loadPoster","poster","data","window","innerWidth","attr","ExpandToggle","toggle","each","idx","append","wrap","find","children","hasClass","appendTo","prev","text","Main","formatTime","FormatTime","init","document","getElementsByTagName","AudioAnalytics","audio","DataTable","language","aria","paginate","next","previous","info","search","searchPlaceholder","lengthChange","order","responsive","Player","Playlist","app","HTML5PlayerGoogleAnalytics","args","getCategory","audioele","src","indexOf","audioSrcForReporting","replace","onPositionUpdate","duration","Infinity","category","percent","currentTime","quartile","Math","floor","trackEvent","action","label","onMediaFinished","console","log","isFirstPlay","onPlayPause","lastsrc","event","ga","ga_version","_gaq","push","undefined","error","version","addEventListener","define","toFormatted","timeInSeconds","round","formattedTime","formattedMinutes","hours","minutes","seconds","toString","toSeconds","arrSmh","split","reverse","parseInt","PLAYING_CLASS","PAUSED_CLASS","LOADING_CLASS","MUTED_CLASS","jqueryLocal","isPlaying","storedVolume","playlistSelector","$playlistElement","playlist","hasPlaylist","selectElements","initPlaylist","bindEventHandlers","initTime","displayCurrentVolume","$playButton","$skipForwardButton","$skipBackButton","$visualPlayButton","$visualPauseButton","$timeline","$timelineProgress","$timelineBuffered","$volumeBar","$currentVolume","$muteButton","$time","$duration","$currentTime","$title","$artist","onPlayClick","bind","onSkipForwardClick","onSkipBackClick","onTimelineClick","onVolumeClick","onMuteClick","onAudioPlay","onAudioPause","onAudioTimeupdate","onAudioWaiting","onAudioPlaying","onAudioEnded","onVolumeChange","onLoadedMetadata","onProgress","displayCurrentTime","e","preventDefault","readyState","loadAudioFromSrc","playAudio","pauseAudio","unloadAudio","currentTarget","skipForward","skipBack","$target","clickXPosition","pageX","getSecondsByClickPosition","seekTime","volume","getVolumeByHorizClickPosition","clickYPosition","pageY","getVolumeByVertClickPosition","changeVolume","muteAudio","unmuteAudio","displayPlayedState","displayPausedState","displayBufferingState","displayPlayingState","displayStoppedState","playNext","displayDuration","displayTimeRanges","pauseAllAudio","play","currentAudio","pause","$nextItem","nextSrc","getNextPlaylistSrc","findNext","populatePlayerInfo","$element","offset","left","outerWidth","time","Number","toFixed","volumeBarOffset","volumeBarWidth","top","volumeBarHeight","outerHeight","getPlaylistItem","$items","filter","displayMutedState","displayUnmutedState","html","updateTimelineProgress","progress","css","i","buffered","currentBuffer","start","startX","endX","end","posXPercent","widthPercent","$timeRanges","timeRangeCss","eq","removeBufferingState","removeDisplayStates","volumePercent","parent","player","setNextItem","$currentItem","onItemClick","title","artist","$item","removePausedState"],"sourceRoot":""}