@internetarchive/bookreader 5.0.0-84 → 5.0.0-86
Sign up to get free protection for your applications and to get access to all the features.
- package/BookReader/BookReader.js +1 -1
- package/BookReader/plugins/plugin.chapters.js +1 -1
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +1 -1
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +1 -1
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/src/plugins/plugin.chapters.js +2 -2
- package/src/plugins/plugin.text_selection.js +6 -0
- package/src/plugins/search/plugin.search.js +3 -1
- package/src/plugins/tts/PageChunk.js +4 -1
- package/tests/jest/plugins/plugin.text_selection.test.js +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plugins/plugin.tts.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/tts/PageChunk.js","webpack://@internetarchive/bookreader/./src/plugins/tts/PageChunkIterator.js","webpack://@internetarchive/bookreader/./src/plugins/tts/utils.js","webpack://@internetarchive/bookreader/./src/plugins/tts/AbstractTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/FestivalTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/WebTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/plugin.tts.js","webpack://@internetarchive/bookreader/./src/plugins/tts/tooltip_dict.js","webpack://@internetarchive/bookreader/./node_modules/iso-language-codes/js/data.js","webpack://@internetarchive/bookreader/./node_modules/jquery.browser/dist/jquery.browser.js","webpack://@internetarchive/bookreader/./node_modules/soundmanager2/script/soundmanager2.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js"],"sourcesContent":["/**\n * Class to manage a 'chunk' (approximately a paragraph) of text on a page.\n */\nexport default class PageChunk {\n /**\n * @param {number} leafIndex\n * @param {number} chunkIndex\n * @param {string} text\n * @param {DJVURect[]} lineRects\n */\n constructor(leafIndex, chunkIndex, text, lineRects) {\n this.leafIndex = leafIndex;\n this.chunkIndex = chunkIndex;\n this.text = text;\n this.lineRects = lineRects;\n }\n\n /**\n * @param {string} server\n * @param {string} bookPath\n * @param {number} leafIndex\n * @return {Promise<PageChunk[]>}\n */\n static async fetch(server, bookPath, leafIndex) {\n const chunks = await $.ajax({\n type: 'GET',\n url: `https://${server}/BookReader/BookReaderGetTextWrapper.php`,\n dataType:'jsonp',\n cache: true,\n data: {\n path: `${bookPath}_djvu.xml`,\n page: leafIndex,\n },\n });\n return PageChunk._fromTextWrapperResponse(leafIndex, chunks);\n }\n\n /**\n * Convert the response from BookReaderGetTextWrapper.php into a {@link PageChunk} instance\n * @param {number} leafIndex\n * @param {Array<[String, ...DJVURect[]]>} chunksResponse\n * @return {PageChunk[]}\n */\n static _fromTextWrapperResponse(leafIndex, chunksResponse) {\n return chunksResponse.map((c, i) => {\n const correctedLineRects = PageChunk._fixChunkRects(c.slice(1));\n const correctedText = PageChunk._removeDanglingHyphens(c[0]);\n return new PageChunk(leafIndex, i, correctedText, correctedLineRects);\n });\n }\n\n /**\n * @private\n * Sometimes the first rectangle will be ridiculously wide/tall. Find those and fix them\n * *NOTE*: Modifies the original array and returns it.\n * *NOTE*: This should probably be fixed on the petabox side, and then removed here\n * Has 2 problems:\n * - If the rect is the last rect on the page (and hence the only rect in the array),\n * the rect's size isn't fixed\n * - Because this relies on the second rect, there's a chance it won't be the right\n * width\n * @param {DJVURect[]} rects\n * @return {DJVURect[]}\n */\n static _fixChunkRects(rects) {\n if (rects.length < 2) return rects;\n\n const [firstRect, secondRect] = rects;\n const [left, bottom, right] = firstRect;\n const width = right - left;\n const secondHeight = secondRect[1] - secondRect[3];\n const secondWidth = secondRect[2] - secondRect[0];\n const secondRight = secondRect[2];\n\n if (width > secondWidth * 30) {\n // Set the end to be the same\n firstRect[2] = secondRight;\n // And the top to be the same height\n firstRect[3] = bottom - secondHeight;\n }\n\n return rects;\n }\n\n /**\n * Remove \"dangling\" hyphens from read aloud text to avoid TTS stuttering\n * @param {string} text\n * @return {string}\n */\n static _removeDanglingHyphens(text) {\n // Some books mis-OCR a dangling hyphen as a ¬ (mathematical not sign) . Since in math\n // the not sign should not appear followed by a space, we think we can safely assume\n // this should be replaced.\n return text.replace(/[-¬]\\s+/g, '');\n }\n}\n\n/**\n * @typedef {[number, number, number, number]} DJVURect\n * coords are in l,b,r,t order\n */\n","import PageChunk from './PageChunk.js';\n\n/**\n * Class that iterates over the page chunks of a book; caching/buffering\n * as much as possible to try to ensure a smooth experience.\n */\nexport default class PageChunkIterator {\n /**\n * @param {number} pageCount total number of pages\n * @param {number} start page to start on\n * @param {PageChunkIteratorOptions} opts\n */\n constructor(pageCount, start, opts) {\n this.pageCount = pageCount;\n this.opts = Object.assign({}, DEFAULT_OPTS, opts);\n /** Position in the chunk sequence */\n this._cursor = { page: start, chunk: 0 };\n /** @type {Object<number, PageChunk[]>} leaf index -> chunks*/\n this._bufferedPages = {};\n /** @type {Object<number, PromiseLike<PageChunk[]>} leaf index -> chunks*/\n this._bufferingPages = {};\n /**\n * @type {Promise} promise that manages cursor modifications so that they\n * happen in order triggered as opposed to order the server responds\n **/\n this._cursorLock = Promise.resolve();\n }\n\n /**\n * Get the next chunk\n * @return {PromiseLike<\"__PageChunkIterator.AT_END__\" | PageChunk>}\n */\n next() {\n return this._cursorLock = this._cursorLock\n .then(() => this._nextUncontrolled());\n }\n\n /**\n * Sends the cursor back 1\n * @return {Promise}\n **/\n decrement() {\n return this._cursorLock = this._cursorLock\n .then(() => this._decrementUncontrolled());\n }\n\n /**\n * Gets without ensuring synchronization. Since this iterator has a lot of async\n * code, calling e.g. \"next\" twice (before the first call to next has finished)\n * would cause the system to be in a weird state. To avoid that, we make sure calls\n * to next and decrement (functions that modify the cursor) are synchronized,\n * so that regardless how long it takes for one to respond, they'll always be executed\n * in the correct order.\n * @return {PromiseLike<\"__PageChunkIterator.AT_END__\" | PageChunk>}\n */\n async _nextUncontrolled() {\n if (this._cursor.page == this.pageCount) {\n return Promise.resolve(PageChunkIterator.AT_END);\n }\n this._recenterBuffer(this._cursor.page);\n const chunks = await this._fetchPageChunks(this._cursor.page);\n if (this._cursor.chunk == chunks.length) {\n this._cursor.page++;\n this._cursor.chunk = 0;\n return this._nextUncontrolled();\n }\n return chunks[this._cursor.chunk++];\n }\n\n /**\n * Decrements without ensuring synchronization. (See {@link PageChunkIterator._nextUncontrolled});\n * @return {Promise}\n */\n _decrementUncontrolled() {\n let cursorChangePromise = Promise.resolve();\n\n if (this._cursor.chunk > 0) {\n this._cursor.chunk--;\n } else if (this._cursor.page > 0) {\n this._cursor.page--;\n // Go back possibly multiple pages, because pages can be blank\n cursorChangePromise = this._fetchPageChunks(this._cursor.page)\n .then(prevPageChunks => {\n if (prevPageChunks.length == 0) return this._decrementUncontrolled();\n else this._cursor.chunk = prevPageChunks.length - 1;\n });\n }\n\n return cursorChangePromise\n .then(() => this._fetchPageChunks(this._cursor.page));\n }\n\n /**\n * Recenter the buffer around the provided page index\n * @param {number} index\n */\n _recenterBuffer(index) {\n const start = Math.max(0, index - this.opts.pageBufferSize);\n const end = Math.min(this.pageCount, index + this.opts.pageBufferSize + 1);\n for (let i = start; i < end; i++) {\n this._fetchPageChunks(i);\n }\n\n this._removePageFromBuffer(start - 1);\n this._removePageFromBuffer(end + 1);\n }\n\n /**\n * @param {number} index\n */\n _removePageFromBuffer(index) {\n delete this._bufferingPages[index];\n delete this._bufferedPages[index];\n }\n\n /**\n * Fetches the chunks on a page; checks the buffer, so it won't make unnecessary\n * requests if it's called multiple times for the same index.\n * @param {number} index\n * @return {Promise<PageChunk[]>}\n */\n _fetchPageChunks(index) {\n if (index in this._bufferingPages) return this._bufferingPages[index];\n if (index in this._bufferedPages) return Promise.resolve(this._bufferedPages[index]);\n\n this._bufferingPages[index] = this._fetchPageChunksDirect(index)\n .then(chunks => {\n delete this._bufferingPages[index];\n this._bufferedPages[index] = chunks;\n return chunks;\n });\n\n return this._bufferingPages[index];\n }\n\n /**\n * Fetches a page without checking buffer\n * @param {number} index\n */\n _fetchPageChunksDirect(index) {\n return PageChunk.fetch(this.opts.server, this.opts.bookPath, index);\n }\n}\n\nPageChunkIterator.AT_END = \"__PageChunkIterator.AT_END__\";\n\n/** @type {PageChunkIteratorOptions} */\nconst DEFAULT_OPTS = {\n server: null,\n bookPath: null,\n pageBufferSize: 2,\n};\n\n/**\n * @typedef {Object} PageChunkIteratorOptions\n * @property {string} server\n * @property {string} bookPath\n * @property {number} [pageBufferSize] number of pages to buffer before/after the current page\n */\n","import langs from 'iso-language-codes/js/data.js';\n\n/**\n * Use regex to approximate word count in a string\n * @param {string} text\n * @return {number}\n */\nexport function approximateWordCount(text) {\n const m = text.match(/\\S+/g);\n return m ? m.length : 0;\n}\n\n/**\n * Checks whether the current browser is on android\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isAndroid(userAgent = navigator.userAgent) {\n return /android/i.test(userAgent);\n}\n\n/**\n * @typedef {string} ISO6391\n * Language code in ISO 639-1 format. e.g. en, fr, zh\n **/\n\n/** Each lang is an array, with each index mapping to a different property */\nconst COLUMN_TO_LANG_INDEX = {\n 'Name': 0,\n 'Endonym': 1,\n 'ISO 639-1': 2,\n 'ISO 639-2/T': 3,\n 'ISO 639-2/B': 4,\n};\n\n/**\n * @param {string} language in some format\n * @return {ISO6391?}\n */\nexport function toISO6391(language) {\n if (!language) return null;\n language = language.toLowerCase();\n\n return searchForISO6391(language, ['ISO 639-1']) ||\n searchForISO6391(language, ['ISO 639-2/B']) ||\n searchForISO6391(language, ['ISO 639-2/T', 'Endonym', 'Name']);\n}\n\n/**\n * Searches for the given long in the given columns.\n * @param {string} language\n * @param {Array<keyof COLUMN_TO_LANG_INDEX>} columnsToSearch\n * @return {ISO6391?}\n */\nfunction searchForISO6391(language, columnsToSearch) {\n for (let i = 0; i < langs.length; i++) {\n for (let colI = 0; colI < columnsToSearch.length; colI++) {\n const column = columnsToSearch[colI];\n const columnValue = langs[i][COLUMN_TO_LANG_INDEX[column]];\n if (columnValue.split(', ').map(x => x.toLowerCase()).indexOf(language) != -1) {\n return langs[i][COLUMN_TO_LANG_INDEX['ISO 639-1']];\n }\n }\n }\n return null;\n}\n\n/**\n * Checks whether the current browser supports localStorage or\n * if the current context has access to it.\n * @return {boolean}\n */\nexport function hasLocalStorage() {\n try {\n return !!window.localStorage;\n } catch (e) {\n // Will throw in sandboxed iframe\n // DOMException: Window.localStorage getter: Forbidden in a sandboxed document without the 'allow-same-origin' flag.\n return false;\n }\n}\n","import PageChunkIterator from './PageChunkIterator.js';\nimport { hasLocalStorage } from './utils.js';\n/** @typedef {import('./utils.js').ISO6391} ISO6391 */\n/** @typedef {import('./PageChunk.js')} PageChunk */\n\n/**\n * @export\n * @typedef {Object} TTSEngineOptions\n * @property {String} server\n * @property {String} bookPath\n * @property {ISO6391} bookLanguage\n * @property {Function} onLoadingStart\n * @property {Function} onLoadingComplete\n * @property {Function} onDone called when the entire book is done\n * @property {function(PageChunk): PromiseLike} beforeChunkPlay will delay the playing of the chunk\n * @property {function(PageChunk): void} afterChunkPlay fires once a chunk has fully finished\n */\n\n/**\n * @typedef {Object} AbstractTTSSound\n * @property {PageChunk} chunk\n * @property {boolean} loaded\n * @property {number} rate\n * @property {SpeechSynthesisVoice} voice\n * @property {(callback: Function) => void} load\n * @property {() => PromiseLike} play\n * @property {() => Promise} stop\n * @property {() => void} pause\n * @property {() => void} resume\n * @property {() => void} finish force the sound to 'finish'\n * @property {number => void} setPlaybackRate\n * @property {SpeechSynthesisVoice => void} setVoice\n **/\n\n/** Handling bookreader's text-to-speech */\nexport default class AbstractTTSEngine {\n /**\n * @protected\n * @param {TTSEngineOptions} options\n */\n constructor(options) {\n this.playing = false;\n this.paused = false;\n this.opts = options;\n /** @type {PageChunkIterator} */\n this._chunkIterator = null;\n /** @type {AbstractTTSSound} */\n this.activeSound = null;\n this.playbackRate = 1;\n /** Events we can bind to */\n this.events = $({});\n /** @type {SpeechSynthesisVoice} */\n this.voice = null;\n // Listen for voice changes (fired by subclasses)\n this.events.on('voiceschanged', this.updateBestVoice);\n this.events.trigger('voiceschanged');\n }\n\n /**\n * @abstract\n * @return {boolean}\n */\n static isSupported() { throw new Error(\"Unimplemented abstract class\"); }\n\n /**\n * @abstract\n * @return {SpeechSynthesisVoice[]}\n */\n getVoices() { throw new Error(\"Unimplemented abstract class\"); }\n\n /** @abstract */\n init() { return null; }\n\n updateBestVoice = () => {\n this.voice = AbstractTTSEngine.getBestBookVoice(this.getVoices(), this.opts.bookLanguage);\n }\n\n /**\n * @param {number} leafIndex\n * @param {number} numLeafs total number of leafs in the current book\n */\n start(leafIndex, numLeafs) {\n this.playing = true;\n this.paused = false;\n this.opts.onLoadingStart();\n\n this._chunkIterator = new PageChunkIterator(numLeafs, leafIndex, {\n server: this.opts.server,\n bookPath: this.opts.bookPath,\n pageBufferSize: 5,\n });\n\n this.step();\n this.events.trigger('start');\n }\n\n stop() {\n if (this.activeSound) this.activeSound.stop();\n this.playing = false;\n this.paused = true;\n this._chunkIterator = null;\n this.activeSound = null;\n this.events.trigger('stop');\n }\n\n /** @public */\n pause() {\n const fireEvent = !this.paused && this.activeSound;\n this.paused = true;\n if (this.activeSound) this.activeSound.pause();\n if (fireEvent) this.events.trigger('pause');\n }\n\n /** @public */\n resume() {\n const fireEvent = this.paused && this.activeSound;\n this.paused = false;\n if (this.activeSound) this.activeSound.resume();\n if (fireEvent) this.events.trigger('resume');\n }\n\n togglePlayPause() {\n if (this.paused) this.resume();\n else this.pause();\n }\n\n /** @public */\n jumpForward() {\n if (this.activeSound) this.activeSound.finish();\n }\n\n /** @public */\n async jumpBackward() {\n await Promise.all([\n this.activeSound.stop(),\n this._chunkIterator.decrement()\n .then(() => this._chunkIterator.decrement()),\n ]);\n this.step();\n }\n\n /** @param {string} voiceURI */\n setVoice(voiceURI) {\n // if the user actively selects a voice, don't re-choose best voice anymore\n // MS Edge fires voices changed randomly very often\n this.events.off('voiceschanged', this.updateBestVoice);\n this.voice = this.getVoices().find(voice => voice.voiceURI === voiceURI);\n // if the current book has a language set, store the selected voice with the book language as a suffix\n if (this.opts.bookLanguage && hasLocalStorage()) {\n localStorage.setItem(`BRtts-voice-${this.opts.bookLanguage}`, this.voice.voiceURI);\n }\n if (this.activeSound) this.activeSound.setVoice(this.voice);\n }\n\n /** @param {number} newRate */\n setPlaybackRate(newRate) {\n this.playbackRate = newRate;\n if (this.activeSound) this.activeSound.setPlaybackRate(newRate);\n }\n\n /** @private */\n async step() {\n const chunk = await this._chunkIterator.next();\n if (chunk == PageChunkIterator.AT_END) {\n this.stop();\n this.opts.onDone();\n return;\n }\n this.opts.onLoadingStart();\n const sound = this.createSound(chunk);\n sound.chunk = chunk;\n sound.rate = this.playbackRate;\n sound.voice = this.voice;\n sound.load(() => this.opts.onLoadingComplete());\n\n this.opts.onLoadingComplete();\n\n await this.opts.beforeChunkPlay(chunk);\n\n if (!this.playing) return;\n\n const playPromise = await this.playSound(sound)\n .then(()=> this.opts.afterChunkPlay(sound.chunk));\n\n if (this.paused) this.pause();\n await playPromise;\n\n if (this.playing) return this.step();\n }\n\n /**\n * @abstract\n * @param {PageChunk} chunk\n * @return {AbstractTTSSound}\n */\n createSound(chunk) { throw new Error(\"Unimplemented abstract class\"); }\n\n /**\n * @param {AbstractTTSSound} sound\n * @return {PromiseLike} promise called once playing finished\n */\n playSound(sound) {\n this.activeSound = sound;\n if (!this.activeSound.loaded) this.opts.onLoadingStart();\n return this.activeSound.play();\n }\n\n /** Convenience wrapper for {@see AbstractTTSEngine.getBestVoice} */\n getBestVoice() {\n return AbstractTTSEngine.getBestBookVoice(this.getVoices(), this.opts.bookLanguage);\n }\n\n /**\n * @private\n * Find the best voice to use given the available voices, the book language, and the user's\n * languages.\n * @param {SpeechSynthesisVoice[]} voices\n * @param {ISO6391} bookLanguage\n * @param {string[]} userLanguages languages in BCP47 format (e.g. en-US). Ordered by preference.\n * @return {SpeechSynthesisVoice | undefined}\n */\n static getBestBookVoice(voices, bookLanguage, userLanguages = navigator.languages) {\n const bookLangVoices = voices.filter(v => v.lang.startsWith(bookLanguage));\n // navigator.languages browser support isn't great yet, so get just 1 language otherwise\n // Sample navigator.languages: [\"en-CA\", \"fr-CA\", \"fr\", \"en-US\", \"en\", \"de-DE\", \"de\"]\n userLanguages = userLanguages || (navigator.language ? [navigator.language] : []);\n\n // user languages that match the book language\n const matchingUserLangs = userLanguages.filter(lang => lang.startsWith(bookLanguage));\n\n // First try to find the last chosen voice from localStorage for the current book language\n return AbstractTTSEngine.getMatchingStoredVoice(bookLangVoices, bookLanguage)\n // Try to find voices that intersect these two sets\n || AbstractTTSEngine.getMatchingVoice(matchingUserLangs, bookLangVoices)\n // no user languages match the books; let's return the best voice for the book language\n || (bookLangVoices.find(v => v.default) || bookLangVoices[0])\n // No voices match the book language? let's find a voice in the user's language\n // and ignore book lang\n || AbstractTTSEngine.getMatchingVoice(userLanguages, voices)\n // C'mon! Ok, just read with whatever we got!\n || (voices.find(v => v.default) || voices[0]);\n }\n\n /**\n * @private\n * Get the voice last selected by the user for the book language from localStorage.\n * Returns undefined if no voice is stored or found.\n * @param {SpeechSynthesisVoice[]} voices browser voices to choose from\n * @param {ISO6391} bookLanguage book language to look for\n * @return {SpeechSynthesisVoice | undefined}\n */\n static getMatchingStoredVoice(voices, bookLanguage) {\n const storedVoice = hasLocalStorage() && localStorage.getItem(`BRtts-voice-${bookLanguage}`);\n return (storedVoice ? voices.find(v => v.voiceURI === storedVoice) : undefined);\n }\n\n /**\n * @private\n * Get the best voice that matches one of the BCP47 languages (order by preference)\n * @param {string[]} languages in BCP 47 format (e.g. 'en-US', or 'en'); ordered by preference\n * @param {SpeechSynthesisVoice[]} voices voices to choose from\n * @return {SpeechSynthesisVoice | undefined}\n */\n static getMatchingVoice(languages, voices) {\n for (const lang of languages) {\n // Chrome Android was returning voice languages like `en_US` instead of `en-US`\n const matchingVoices = voices.filter(v => v.lang.replace('_', '-').startsWith(lang));\n if (matchingVoices.length) {\n return matchingVoices.find(v => v.default) || matchingVoices[0];\n }\n }\n }\n}\n","import AbstractTTSEngine from './AbstractTTSEngine.js';\nimport { sleep } from '../../BookReader/utils.js';\n/* global soundManager */\nimport 'soundmanager2';\nimport 'jquery.browser';\n\n/** @typedef {import(\"./AbstractTTSEngine.js\").TTSEngineOptions} TTSEngineOptions */\n/** @typedef {import(\"./AbstractTTSEngine.js\").AbstractTTSSound} AbstractTTSSound */\n\n/**\n * @extends AbstractTTSEngine\n * TTS using Festival endpoint\n **/\nexport default class FestivalTTSEngine extends AbstractTTSEngine {\n /** @override */\n static isSupported() {\n return typeof(soundManager) !== 'undefined' && soundManager.supported();\n }\n\n /** @param {TTSEngineOptions} options */\n constructor(options) {\n super(options);\n // $.browsers is sometimes undefined on some Android browsers :/\n // Likely related to when $.browser was moved to npm\n /** @type {'mp3' | 'ogg'} format of audio to get */\n this.audioFormat = $.browser?.mozilla ? 'ogg' : 'mp3'; //eslint-disable-line no-jquery/no-browser\n }\n\n /** @override */\n getVoices() {\n return [\n { default: true, lang: \"en-US\", localService: false, name: \"Festival - English (US)\", voiceURI: null },\n ];\n }\n\n /** @override */\n init() {\n // setup sound manager\n soundManager.setup({\n debugMode: false,\n // Note, there's a bug in Chrome regarding range requests.\n // Flash is used as a workaround.\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=505707\n preferFlash: true,\n url: '/bookreader/BookReader/soundmanager/swf',\n useHTML5Audio: true,\n //flash 8 version of swf is buggy when calling play() on a sound that is still loading\n flashVersion: 9,\n });\n }\n\n /**\n * @override\n * @param {number} leafIndex\n * @param {number} numLeafs total number of leafs in the current book\n */\n start(leafIndex, numLeafs) {\n let promise = null;\n\n // Hack for iOS\n if (navigator.userAgent.match(/mobile/i)) {\n promise = this.iOSCaptureUserIntentHack();\n }\n\n promise = promise || Promise.resolve();\n promise.then(() => super.start(leafIndex, numLeafs));\n }\n\n /** @override */\n createSound(chunk) {\n return new FestivalTTSSound(this.getSoundUrl(chunk.text));\n }\n\n /**\n * @private\n * Get URL for audio that says this text\n * @param {String} dataString the thing to say\n * @return {String} url\n */\n getSoundUrl(dataString) {\n return 'https://' + this.opts.server + '/BookReader/BookReaderGetTTS.php?string='\n + encodeURIComponent(dataString)\n + '&format=.' + this.audioFormat;\n }\n\n /**\n * @private\n * Security restrictions require playback to be triggered\n * by a user click/touch. This intention gets lost in the async calls\n * on iOS, but, for some reason, if we start the audio here, it works.\n * See https://stackoverflow.com/questions/12206631/html5-audio-cant-play-through-javascript-unless-triggered-manually-once\n * @return {PromiseLike}\n */\n async iOSCaptureUserIntentHack() {\n const sound = soundManager.createSound({ url: SILENCE_1MS[this.audioFormat] });\n await new Promise(res => sound.play({onfinish: res}));\n sound.destruct();\n }\n}\n\n/** @extends AbstractTTSSound */\nclass FestivalTTSSound {\n /** @param {string} soundUrl **/\n constructor(soundUrl) {\n this.soundUrl = soundUrl;\n /** @type {SMSound} */\n this.sound = null;\n this.rate = 1;\n /** @type {function} calling this resolves the \"play\" promise */\n this._finishResolver = null;\n }\n\n get loaded() {\n return this.sound && this.sound.loaded;\n }\n\n load(onload) {\n this.sound = soundManager.createSound({\n url: this.soundUrl,\n // API recommended, but only fires once play started on safari\n onload: () => {\n if (this.rate != 1) this.sound.setPlaybackRate(this.rate);\n onload();\n },\n onresume: async () => {\n await sleep(25);\n if (this.rate != 1) this.sound.setPlaybackRate(this.rate);\n },\n });\n return this.sound.load();\n }\n\n async play() {\n await new Promise(res => {\n this._finishResolver = res;\n this.sound.play({ onfinish: res });\n });\n this.sound.destruct();\n }\n\n /** @override */\n stop() {\n this.sound.stop();\n return Promise.resolve();\n }\n\n /** @override */\n pause() { this.sound.pause(); }\n /** @override */\n resume() { this.sound.resume(); }\n /** @override */\n setPlaybackRate(rate) {\n this.rate = rate;\n this.sound.setPlaybackRate(rate);\n }\n\n /** @override */\n finish() {\n this.sound.stop();\n this._finishResolver();\n }\n}\n\n/** Needed to capture the audio context for iOS hack. Generated using Audacity. */\nconst SILENCE_1MS = {\n mp3: 'data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA//////////////////////////////////////////////////////////////////8AAAAeTEFNRTMuOTlyBJwAAAAAAAAAADUgJAaUQQABrgAAAnHIf8sZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sQxAADwlwBKGAAACAAAD/AAAAEAAAAH///////////////+UBAMExBTUUzLjk5LjOqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xDEIAPAAAGkAAAAIAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==',\n ogg: 'data:audio/ogg;base64,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',\n};\n","/* global br */\nimport { isChrome, isFirefox } from '../../util/browserSniffing.js';\nimport { isAndroid } from './utils.js';\nimport { promisifyEvent, sleep } from '../../BookReader/utils.js';\nimport AbstractTTSEngine from './AbstractTTSEngine.js';\n/** @typedef {import(\"./AbstractTTSEngine.js\").PageChunk} PageChunk */\n/** @typedef {import(\"./AbstractTTSEngine.js\").AbstractTTSSound} AbstractTTSSound */\n/** @typedef {import(\"./AbstractTTSEngine.js\").TTSEngineOptions} TTSEngineOptions */\n\n/**\n * @extends AbstractTTSEngine\n * TTS using Web Speech APIs\n **/\nexport default class WebTTSEngine extends AbstractTTSEngine {\n static isSupported() {\n return typeof(window.speechSynthesis) !== 'undefined' && !/samsungbrowser/i.test(navigator.userAgent);\n }\n\n /** @param {TTSEngineOptions} options */\n constructor(options) {\n super(options);\n\n // SAFARI doesn't have addEventListener on speechSynthesis\n if (speechSynthesis.addEventListener) {\n speechSynthesis.addEventListener('voiceschanged', () => this.events.trigger('voiceschanged'));\n }\n }\n\n /** @override */\n start(leafIndex, numLeafs) {\n // Need to run in this function to capture user intent to start playing audio\n if ('mediaSession' in navigator) {\n const audio = new Audio(SILENCE_6S_MP3);\n audio.loop = true;\n\n this.events.on('pause', () => audio.pause());\n this.events.on('resume', () => audio.play());\n // apparently this is what you need to do to make the media session notification go away\n // See https://developers.google.com/web/updates/2017/02/media-session#implementation_notes\n this.events.on('stop', () => audio.src = '');\n audio.play().then(() => {\n navigator.mediaSession.metadata = new MediaMetadata({\n title: br.bookTitle,\n artist: br.options.metadata.filter(m => m.label == 'Author').map(m => m.value)[0],\n // album: 'The Ultimate Collection (Remastered)',\n artwork: [\n { src: br.options.thumbnail, type: 'image/jpg' },\n ],\n });\n\n navigator.mediaSession.setActionHandler('play', () => {\n audio.play();\n this.resume();\n });\n navigator.mediaSession.setActionHandler('pause', () => {\n audio.pause();\n this.pause();\n });\n\n // navigator.mediaSession.setActionHandler('seekbackward', () => this.jumpBackward());\n // navigator.mediaSession.setActionHandler('seekforward', () => this.jumpForward());\n // Some devices only support the previoustrack/nexttrack (e.g. Win10), so show those.\n // Android devices do support the seek actions, but we don't want to show both buttons\n // and have them do the same thing.\n navigator.mediaSession.setActionHandler('previoustrack', () => this.jumpBackward());\n navigator.mediaSession.setActionHandler('nexttrack', () => this.jumpForward());\n });\n }\n\n return super.start(leafIndex, numLeafs);\n }\n\n /** @override */\n getVoices() {\n const voices = speechSynthesis.getVoices();\n if (voices.filter(v => v.default).length != 1) {\n // iOS bug where the default system voice is sometimes\n // missing from the list\n voices.unshift({\n voiceURI: 'bookreader.SystemDefault',\n name: 'System Default',\n // Not necessarily true, but very likely\n lang: navigator.language,\n default: true,\n localService: true,\n });\n }\n return voices;\n }\n\n /** @override */\n createSound(chunk) {\n return new WebTTSSound(chunk.text);\n }\n}\n\n/** @extends AbstractTTSSound */\nexport class WebTTSSound {\n /** @param {string} text **/\n constructor(text) {\n this.text = text;\n this.loaded = false;\n this.paused = false;\n this.started = false;\n /** Whether the audio was stopped with a .stop() call */\n this.stopped = false;\n this.rate = 1;\n\n /** @type {SpeechSynthesisUtterance} */\n this.utterance = null;\n\n /** @type {SpeechSynthesisVoice} */\n this.voice = null;\n\n this._lastEvents = {\n /** @type {SpeechSynthesisEvent} */\n pause: null,\n /** @type {SpeechSynthesisEvent} */\n boundary: null,\n /** @type {SpeechSynthesisEvent} */\n start: null,\n };\n\n /** Store where we are in the text. Only works on some browsers. */\n this._charIndex = 0;\n\n /** @type {Function} resolve function called when playback finished */\n this._finishResolver = null;\n\n /** @type {Promise} promise resolved by _finishResolver */\n this._finishPromise = null;\n }\n\n /** @override **/\n load(onload) {\n this.loaded = false;\n this.started = false;\n\n this.utterance = new SpeechSynthesisUtterance(this.text.slice(this._charIndex));\n // iOS bug where the default system voice is sometimes\n // missing from the list\n if (this.voice?.voiceURI !== 'bookreader.SystemDefault') {\n this.utterance.voice = this.voice;\n }\n // Need to also set lang (for some reason); won't set voice on Chrome@Android otherwise\n if (this.voice) this.utterance.lang = this.voice.lang;\n this.utterance.rate = this.rate;\n\n // Useful for debugging things\n if (location.toString().indexOf('_debugReadAloud=true') != -1) {\n this.utterance.addEventListener('pause', () => console.log('pause'));\n this.utterance.addEventListener('resume', () => console.log('resume'));\n this.utterance.addEventListener('start', () => console.log('start'));\n this.utterance.addEventListener('end', () => console.log('end'));\n this.utterance.addEventListener('error', () => console.log('error'));\n this.utterance.addEventListener('boundary', () => console.log('boundary'));\n this.utterance.addEventListener('mark', () => console.log('mark'));\n this.utterance.addEventListener('finish', () => console.log('finish'));\n }\n\n // Keep track of the speech synthesis events that come in; they have useful info\n // about progress (like charIndex)\n this.utterance.addEventListener('start', ev => this._lastEvents.start = ev);\n this.utterance.addEventListener('boundary', ev => this._lastEvents.boundary = ev);\n this.utterance.addEventListener('pause', ev => this._lastEvents.pause = ev);\n\n // Update our state\n this.utterance.addEventListener('start', () => {\n this.started = true;\n this.stopped = false;\n this.paused = false;\n });\n this.utterance.addEventListener('pause', () => this.paused = true);\n this.utterance.addEventListener('resume', () => this.paused = false);\n this.utterance.addEventListener('end', ev => {\n if (!this.paused && !this.stopped) {\n // Trigger a new event, finish, which only fires when audio fully completed\n this.utterance.dispatchEvent(new CustomEvent('finish', ev));\n }\n });\n this.loaded = true;\n onload && onload();\n }\n\n /**\n * Run whenever properties have changed. Tries to restart in the same spot it\n * left off.\n * @return {Promise<void>}\n */\n async reload() {\n // We'll restore the pause state, so copy it here\n const wasPaused = this.paused;\n // Use recent event to determine where we'll restart from\n // Browser support for this is mixed, but it degrades to restarting the chunk\n // and that's ok\n const recentEvent = this._lastEvents.boundary || this._lastEvents.pause;\n if (recentEvent) {\n this._charIndex = this.text.indexOf(recentEvent.target.text) + recentEvent.charIndex;\n }\n\n // We can't modify the utterance object, so we have to make a new one\n await this.stop();\n this.load();\n // Instead of playing and immediately pausing, we don't start playing. Note\n // this is a requirement because pause doesn't work consistently across\n // browsers.\n if (!wasPaused) this.play();\n }\n\n play() {\n this._finishPromise = this._finishPromise || new Promise(res => this._finishResolver = res);\n this.utterance.addEventListener('finish', this._finishResolver);\n\n // clear the queue\n speechSynthesis.cancel();\n // reset pause state\n speechSynthesis.resume();\n // Speak\n speechSynthesis.speak(this.utterance);\n\n const isLocalVoice = this.utterance.voice && this.utterance.voice.localService;\n if (isChrome() && !isLocalVoice) this._chromePausingBugFix();\n\n return this._finishPromise;\n }\n\n /** @return {Promise} */\n stop() {\n // 'end' won't fire if already stopped\n let endPromise = Promise.resolve();\n if (!this.stopped) {\n endPromise = Promise.race([\n promisifyEvent(this.utterance, 'end'),\n // Safari triggers an error when you call cancel mid-sound\n promisifyEvent(this.utterance, 'error'),\n ]);\n }\n this.stopped = true;\n speechSynthesis.cancel();\n return endPromise;\n }\n\n async finish() {\n await this.stop();\n this.utterance.dispatchEvent(new Event('finish'));\n }\n\n /**\n * @override\n * Will fire a pause event unless already paused\n **/\n async pause() {\n if (this.paused) return;\n\n const pausePromise = promisifyEvent(this.utterance, 'pause');\n speechSynthesis.pause();\n\n // There are a few awful browser cases:\n // 1. Pause works and fires\n // 2. Pause doesn't work and doesn't fire\n // 3. Pause works but doesn't fire\n const pauseMightNotWork = (isFirefox() && isAndroid());\n const pauseMightNotFire = isChrome() || pauseMightNotWork;\n\n if (pauseMightNotFire) {\n // wait for it just in case\n const timeoutPromise = sleep(100).then(() => 'timeout');\n const result = await Promise.race([pausePromise, timeoutPromise]);\n // We got our pause event; nothing to do!\n if (result != 'timeout') return;\n\n this.utterance.dispatchEvent(new CustomEvent('pause', this._lastEvents.start));\n\n // if pause might not work, then we'll stop entirely and restart later\n if (pauseMightNotWork) this.stop();\n }\n }\n\n async resume() {\n if (!this.started) {\n this.play();\n return;\n }\n\n if (!this.paused) return;\n\n // Browser cases:\n // 1. Resume works + fires\n // 2. Resume works + doesn't fire (Chrome Desktop)\n // 3. Resume doesn't work + doesn't fire (Chrome/FF Android)\n const resumeMightNotWork = (isChrome() && isAndroid()) || (isFirefox() && isAndroid());\n const resumeMightNotFire = isChrome() || resumeMightNotWork;\n\n // Try resume\n const resumePromise = promisifyEvent(this.utterance, 'resume');\n speechSynthesis.resume();\n\n if (resumeMightNotFire) {\n const result = await Promise.race([resumePromise, sleep(100).then(() => 'timeout')]);\n\n if (result != 'timeout') return;\n\n this.utterance.dispatchEvent(new CustomEvent('resume', {}));\n if (resumeMightNotWork) {\n await this.reload();\n this.play();\n }\n }\n }\n\n setPlaybackRate(rate) {\n this.rate = rate;\n this.reload();\n }\n\n /** @param {SpeechSynthesisVoice} voice */\n setVoice(voice) {\n this.voice = voice;\n this.reload();\n }\n /**\n * @private\n * Chrome has a bug where it only plays 15 seconds of TTS and then\n * suddenly stops (see https://bugs.chromium.org/p/chromium/issues/detail?id=679437 )\n * We avoid this (as described here: https://bugs.chromium.org/p/chromium/issues/detail?id=679437#c15 )\n * by pausing after 14 seconds and ~instantly resuming.\n */\n async _chromePausingBugFix() {\n const timeoutPromise = sleep(14000).then(() => 'timeout');\n const pausePromise = promisifyEvent(this.utterance, 'pause').then(() => 'paused');\n const endPromise = promisifyEvent(this.utterance, 'end').then(() => 'ended');\n const result = await Promise.race([timeoutPromise, pausePromise, endPromise]);\n if (location.toString().indexOf('_debugReadAloud=true') != -1) {\n console.log(`CHROME-PAUSE-HACK: ${result}`);\n }\n switch (result) {\n case 'ended':\n // audio was stopped/finished; nothing to do\n break;\n case 'paused':\n // audio was paused; wait for resume\n // Chrome won't let you resume the audio if 14s have passed 🤷\n // We could do the same as before (but resume+pause instead of pause+resume),\n // but that means we'd _constantly_ be running in the background. So in that\n // case, let's just restart the chunk\n await Promise.race([\n promisifyEvent(this.utterance, 'resume'),\n sleep(14000).then(() => 'timeout'),\n ]);\n result == 'timeout' ? this.reload() : this._chromePausingBugFix();\n break;\n case 'timeout':\n // We hit Chrome's secret cut off time. Pause/resume\n // to be able to keep TTS-ing\n speechSynthesis.pause();\n await sleep(25);\n speechSynthesis.resume();\n this._chromePausingBugFix();\n break;\n }\n }\n}\n\n/**\n * According to https://developers.google.com/web/updates/2017/02/media-session#implementation_notes , it needs to be at least 5 seconds\n * long to allow usage of the media sessions api\n */\nconst SILENCE_6S_MP3 = 'data:audio/mp3;base64,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';\n","/* global BookReader */\n/**\n * Plugin for Text to Speech in BookReader\n */\nimport FestivalTTSEngine from './FestivalTTSEngine.js';\nimport WebTTSEngine from './WebTTSEngine.js';\nimport { toISO6391, approximateWordCount } from './utils.js';\nimport { en as tooltips } from './tooltip_dict.js';\nimport { renderBoxesInPageContainerLayer } from '../../BookReader/PageContainer.js';\n/** @typedef {import('./PageChunk.js').default} PageChunk */\n/** @typedef {import(\"./AbstractTTSEngine.js\").default} AbstractTTSEngine */\n\n// Default options for TTS\njQuery.extend(BookReader.defaultOptions, {\n server: 'ia600609.us.archive.org',\n bookPath: '',\n enableTtsPlugin: true,\n});\n\n// Extend the constructor to add TTS properties\nBookReader.prototype.setup = (function (super_) {\n return function (options) {\n super_.call(this, options);\n\n if (this.options.enableTtsPlugin) {\n /** @type { {[pageIndex: number]: Array<{ l: number, r: number, t: number, b: number }>} } */\n this._ttsBoxesByIndex = {};\n\n let TTSEngine = WebTTSEngine.isSupported() ? WebTTSEngine :\n FestivalTTSEngine.isSupported() ? FestivalTTSEngine :\n null;\n\n if (/_forceTTSEngine=(festival|web)/.test(location.toString())) {\n const engineName = location.toString().match(/_forceTTSEngine=(festival|web)/)[1];\n TTSEngine = { festival: FestivalTTSEngine, web: WebTTSEngine }[engineName];\n }\n\n if (TTSEngine) {\n /** @type {AbstractTTSEngine} */\n this.ttsEngine = new TTSEngine({\n server: options.server,\n bookPath: options.bookPath,\n bookLanguage: toISO6391(options.bookLanguage),\n onLoadingStart: this.showProgressPopup.bind(this, 'Loading audio...'),\n onLoadingComplete: this.removeProgressPopup.bind(this),\n onDone: this.ttsStop.bind(this),\n beforeChunkPlay: this.ttsBeforeChunkPlay.bind(this),\n afterChunkPlay: this.ttsSendChunkFinishedAnalyticsEvent.bind(this),\n });\n }\n }\n };\n})(BookReader.prototype.setup);\n\nBookReader.prototype.init = (function(super_) {\n return function() {\n if (this.options.enableTtsPlugin) {\n // Bind to events\n\n this.bind(BookReader.eventNames.PostInit, () => {\n this.$('.BRicon.read').click(() => {\n this.ttsToggle();\n return false;\n });\n if (this.ttsEngine) {\n this.ttsEngine.init();\n if (/[?&]_autoReadAloud=show/.test(location.toString())) {\n this.ttsStart(false); // false flag is to initiate read aloud controls\n }\n }\n });\n\n // This is fired when the hash changes by one of the other plugins!\n // i.e. it will fire every time the page changes -_-\n // this.bind(BookReader.eventNames.stop, function(e, br) {\n // this.ttsStop();\n // }.bind(this));\n }\n super_.call(this);\n };\n})(BookReader.prototype.init);\n\n/** @override */\nBookReader.prototype._createPageContainer = (function (super_) {\n return function (index) {\n const pageContainer = super_.call(this, index);\n if (this.options.enableTtsPlugin && pageContainer.page && index in this._ttsBoxesByIndex) {\n const pageIndex = pageContainer.page.index;\n renderBoxesInPageContainerLayer('ttsHiliteLayer', this._ttsBoxesByIndex[pageIndex], pageContainer.page, pageContainer.$container[0]);\n }\n return pageContainer;\n };\n})(BookReader.prototype._createPageContainer);\n\n// Extend buildMobileDrawerElement\nBookReader.prototype.buildMobileDrawerElement = (function (super_) {\n return function () {\n const $el = super_.call(this);\n if (this.options.enableTtsPlugin && this.ttsEngine) {\n $el.find('.BRmobileMenu__moreInfoRow').after($(`\n <li>\n <span>\n <span class=\"DrawerIconWrapper\"><img class=\"DrawerIcon\" src=\"${this.imagesBaseURL}icon_speaker_open.svg\" alt=\"info-speaker\"/></span>\n Read Aloud\n </span>\n <div>\n <span class=\"larger\">Press to toggle read aloud</span>\n <br/>\n <button class=\"BRicon read\"></button>\n </div>\n </li>`));\n }\n return $el;\n };\n})(BookReader.prototype.buildMobileDrawerElement);\n\n// Extend initNavbar\nBookReader.prototype.initNavbar = (function (super_) {\n return function () {\n const $el = super_.call(this);\n if (this.options.enableTtsPlugin && this.ttsEngine) {\n this.refs.$BRReadAloudToolbar = $(`\n <ul class=\"read-aloud\">\n <li>\n <select class=\"playback-speed\" name=\"playback-speed\" title=\"${tooltips.playbackSpeed}\">\n <option value=\"0.25\">0.25x</option>\n <option value=\"0.5\">0.5x</option>\n <option value=\"0.75\">0.75x</option>\n <option value=\"1.0\" selected>1.0x</option>\n <option value=\"1.25\">1.25x</option>\n <option value=\"1.5\">1.5x</option>\n <option value=\"1.75\">1.75x</option>\n <option value=\"2\">2x</option>\n </select>\n </li>\n <li>\n <button type=\"button\" name=\"review\" title=\"${tooltips.review}\">\n <div class=\"icon icon-review\"></div>\n </button>\n </li>\n <li>\n <button type=\"button\" name=\"play\" title=\"${tooltips.play}\">\n <div class=\"icon icon-play\"></div>\n <div class=\"icon icon-pause\"></div>\n </button>\n </li>\n <li>\n <button type=\"button\" name=\"advance\" title=\"${tooltips.advance}\">\n <div class=\"icon icon-advance\"></div>\n </button>\n </li>\n <li>\n <select class=\"playback-voices\" name=\"playback-voice\" style=\"display: none\" title=\"Change read aloud voices\">\n </select>\n </li>\n </ul>\n `);\n\n $el.find('.BRcontrols').prepend(this.refs.$BRReadAloudToolbar);\n\n const renderVoiceOption = (voices) => {\n return voices.map(voice =>\n `<option value=\"${voice.voiceURI}\">${voice.lang} - ${voice.name}</option>`).join('');\n };\n\n const voiceSortOrder = (a,b) => `${a.lang} - ${a.name}`.localeCompare(`${b.lang} - ${b.name}`);\n\n const renderVoicesMenu = (voicesMenu) => {\n voicesMenu.empty();\n const bookLanguage = this.ttsEngine.opts.bookLanguage;\n const bookLanguages = this.ttsEngine.getVoices().filter(v => v.lang.startsWith(bookLanguage)).sort(voiceSortOrder);\n const otherLanguages = this.ttsEngine.getVoices().filter(v => !v.lang.startsWith(bookLanguage)).sort(voiceSortOrder);\n\n if (this.ttsEngine.getVoices().length > 1) {\n voicesMenu.append($(`<optgroup label=\"Book Language (${bookLanguage})\"> ${renderVoiceOption(bookLanguages)} </optgroup>`));\n voicesMenu.append($(`<optgroup label=\"Other Languages\"> ${renderVoiceOption(otherLanguages)} </optgroup>`));\n\n voicesMenu.val(this.ttsEngine.voice.voiceURI);\n voicesMenu.show();\n } else {\n voicesMenu.hide();\n }\n };\n\n const voicesMenu = this.refs.$BRReadAloudToolbar.find('[name=playback-voice]');\n renderVoicesMenu(voicesMenu);\n voicesMenu.on(\"change\", ev => this.ttsEngine.setVoice(voicesMenu.val()));\n this.ttsEngine.events.on('pause resume start', () => this.ttsUpdateState());\n this.ttsEngine.events.on('voiceschanged', () => renderVoicesMenu(voicesMenu));\n this.refs.$BRReadAloudToolbar.find('[name=play]').on(\"click\", this.ttsPlayPause.bind(this));\n this.refs.$BRReadAloudToolbar.find('[name=advance]').on(\"click\", this.ttsJumpForward.bind(this));\n this.refs.$BRReadAloudToolbar.find('[name=review]').on(\"click\", this.ttsJumpBackward.bind(this));\n const $rateSelector = this.refs.$BRReadAloudToolbar.find('select[name=\"playback-speed\"]');\n $rateSelector.on(\"change\", ev => this.ttsEngine.setPlaybackRate(parseFloat($rateSelector.val())));\n $(`<li>\n <button class=\"BRicon read js-tooltip\" title=\"${tooltips.readAloud}\">\n <div class=\"icon icon-read-aloud\"></div>\n <span class=\"BRtooltip\">${tooltips.readAloud}</span>\n </button>\n </li>`).insertBefore($el.find('.BRcontrols .BRicon.zoom_out').closest('li'));\n }\n return $el;\n };\n})(BookReader.prototype.initNavbar);\n\n// ttsToggle()\n//______________________________________________________________________________\nBookReader.prototype.ttsToggle = function () {\n if (this.autoStop) this.autoStop();\n if (this.ttsEngine.playing) {\n this.ttsStop();\n } else {\n this.ttsStart();\n }\n};\n\n// ttsStart(\n//______________________________________________________________________________\nBookReader.prototype.ttsStart = function (startTTSEngine = true) {\n if (this.constModeThumb == this.mode)\n this.switchMode(this.constMode1up);\n\n this.refs.$BRReadAloudToolbar.addClass('visible');\n this.$('.BRicon.read').addClass('unread active');\n this.ttsSendAnalyticsEvent('Start');\n if (startTTSEngine)\n this.ttsEngine.start(this.currentIndex(), this.book.getNumLeafs());\n};\n\nBookReader.prototype.ttsJumpForward = function () {\n if (this.ttsEngine.paused) {\n this.ttsEngine.resume();\n }\n this.ttsEngine.jumpForward();\n};\n\nBookReader.prototype.ttsJumpBackward = function () {\n if (this.ttsEngine.paused) {\n this.ttsEngine.resume();\n }\n this.ttsEngine.jumpBackward();\n};\n\nBookReader.prototype.ttsUpdateState = function() {\n const isPlaying = !(this.ttsEngine.paused || !this.ttsEngine.playing);\n this.$('.read-aloud [name=play]').toggleClass('playing', isPlaying);\n};\n\nBookReader.prototype.ttsPlayPause = function() {\n if (!this.ttsEngine.playing) {\n this.ttsToggle();\n } else {\n this.ttsEngine.togglePlayPause();\n this.ttsUpdateState();\n }\n};\n\n// ttsStop()\n//______________________________________________________________________________\nBookReader.prototype.ttsStop = function () {\n this.refs.$BRReadAloudToolbar.removeClass('visible');\n this.$('.BRicon.read').removeClass('unread active');\n this.ttsSendAnalyticsEvent('Stop');\n this.ttsEngine.stop();\n this.ttsRemoveHilites();\n this.removeProgressPopup();\n};\n\n/**\n * @param {PageChunk} chunk\n * @return {PromiseLike<void>} returns once the flip is done\n */\nBookReader.prototype.ttsBeforeChunkPlay = async function(chunk) {\n await this.ttsMaybeFlipToIndex(chunk.leafIndex);\n this.ttsHighlightChunk(chunk);\n this.ttsScrollToChunk(chunk);\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsSendChunkFinishedAnalyticsEvent = function(chunk) {\n this.ttsSendAnalyticsEvent('ChunkFinished-Words', approximateWordCount(chunk.text));\n};\n\n/**\n * Flip the page if the provided leaf index is not visible\n * @param {Number} leafIndex\n */\nBookReader.prototype.ttsMaybeFlipToIndex = async function (leafIndex) {\n if (this.constMode2up != this.mode) {\n this.jumpToIndex(leafIndex);\n } else {\n await this._modes.mode2Up.mode2UpLit.jumpToIndex(leafIndex);\n }\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsHighlightChunk = function(chunk) {\n // The poorly-named variable leafIndex\n const pageIndex = chunk.leafIndex;\n\n this.ttsRemoveHilites();\n\n // group by index; currently only possible to have chunks on one page :/\n this._ttsBoxesByIndex = {\n [pageIndex]: chunk.lineRects.map(([l, b, r, t]) => ({l, r, b, t})),\n };\n\n // update any already created pages\n for (const [pageIndexString, boxes] of Object.entries(this._ttsBoxesByIndex)) {\n const pageIndex = parseFloat(pageIndexString);\n const page = this.book.getPage(pageIndex);\n const pageContainers = this.getActivePageContainerElementsForIndex(pageIndex);\n pageContainers.forEach(container => renderBoxesInPageContainerLayer('ttsHiliteLayer', boxes, page, container));\n }\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsScrollToChunk = function(chunk) {\n // It behaves weird if used in thumb mode\n if (this.constModeThumb == this.mode) return;\n\n $(`.pagediv${chunk.leafIndex} .ttsHiliteLayer rect`).last()?.[0]?.scrollIntoView({\n // Only vertically center the highlight if we're in 1up or in full screen. In\n // 2up, if we're not fullscreen, the whole body gets scrolled around to try to\n // center the highlight 🙄 See:\n // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move/11041376\n // Note: nearest doesn't quite work great, because the ReadAloud toolbar is now\n // full-width, and covers up the last line of the highlight.\n block: this.constMode1up == this.mode || this.isFullscreenActive ? 'center' : 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n};\n\n// ttsRemoveHilites()\n//______________________________________________________________________________\nBookReader.prototype.ttsRemoveHilites = function () {\n $(this.getActivePageContainerElements()).find('.ttsHiliteLayer').remove();\n this._ttsBoxesByIndex = {};\n};\n\n/**\n * @private\n * Send an analytics event with an optional value. Also attaches the book's language.\n * @param {string} action\n * @param {number} [value]\n */\nBookReader.prototype.ttsSendAnalyticsEvent = function(action, value) {\n if (this.archiveAnalyticsSendEvent) {\n const extraValues = {};\n const mediaLanguage = this.ttsEngine.opts.bookLanguage;\n if (mediaLanguage) extraValues.mediaLanguage = mediaLanguage;\n this.archiveAnalyticsSendEvent('BRReadAloud', action, value, extraValues);\n }\n};\n","export const en = {\n advance: 'Advance 10 seconds',\n play: 'Play',\n playbackSpeed: 'Playback speed',\n readAloud: 'Read this book aloud',\n review: 'Review 10 seconds',\n};\n\nexport const es = {\n advance: 'Avance 10 segundos',\n play: 'Jugar',\n playbackSpeed: 'Velocidad de reproducción',\n readAloud: 'Lee este libro en voz alta',\n review: 'Revisar 10 segundos',\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\nvar _default = [['Serbian', 'српски језик', 'sr', 'srp', 'srp'], ['Romanian, Moldavian, Moldovan', 'Română', 'ro', 'ron', 'rum'], ['Sichuan Yi, Nuosu', 'ꆈꌠ꒿ Nuosuhxop', 'ii', 'iii', 'iii'], ['Tahitian', 'Reo Tahiti', 'ty', 'tah', 'tah'], ['Tagalog', 'Wikang Tagalog', 'tl', 'tgl', 'tgl'], ['Yiddish', 'ייִדיש', 'yi', 'yid', 'yid'], ['Akan', 'Akan', 'ak', 'aka', 'aka'], ['Malay', 'Bahasa Melayu, بهاس ملايو', 'ms', 'msa', 'may'], ['Arabic', 'العربية', 'ar', 'ara', 'ara'], ['Norwegian', 'Norsk', 'no', 'nor', 'nor'], ['Ojibwa', 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'oj', 'oji', 'oji'], ['Fulah', 'Fulfulde, Pulaar, Pular', 'ff', 'ful', 'ful'], ['Persian', 'فارسی', 'fa', 'fas', 'per'], ['Albanian', 'Shqip', 'sq', 'sqi', 'alb'], ['Aymara', 'aymar aru', 'ay', 'aym', 'aym'], ['Azerbaijani', 'azərbaycan dili', 'az', 'aze', 'aze'], ['Chinese', '中文 (Zhōngwén), 汉语, 漢語', 'zh', 'zho', 'chi'], ['Cree', 'ᓀᐦᐃᔭᐍᐏᐣ', 'cr', 'cre', 'cre'], ['Estonian', 'eesti, eesti keel', 'et', 'est', 'est'], ['Guaraní', 'Avañe\\'ẽ', 'gn', 'grn', 'grn'], ['Inupiaq', 'Iñupiaq, Iñupiatun', 'ik', 'ipk', 'ipk'], ['Inuktitut', 'ᐃᓄᒃᑎᑐᑦ', 'iu', 'iku', 'iku'], ['Kanuri', 'Kanuri', 'kr', 'kau', 'kau'], ['Komi', 'коми кыв', 'kv', 'kom', 'kom'], ['Kongo', 'Kikongo', 'kg', 'kon', 'kon'], ['Kurdish', 'Kurdî, کوردی', 'ku', 'kur', 'kur'], ['Latvian', 'latviešu valoda', 'lv', 'lav', 'lav'], ['Malagasy', 'fiteny malagasy', 'mg', 'mlg', 'mlg'], ['Mongolian', 'Монгол хэл', 'mn', 'mon', 'mon'], ['Oromo', 'Afaan Oromoo', 'om', 'orm', 'orm'], ['Pashto, Pushto', 'پښتو', 'ps', 'pus', 'pus'], ['Quechua', 'Runa Simi, Kichwa', 'qu', 'que', 'que'], ['Sardinian', 'sardu', 'sc', 'srd', 'srd'], ['Swahili', 'Kiswahili', 'sw', 'swa', 'swa'], ['Uzbek', 'Oʻzbek, Ўзбек, أۇزبېك', 'uz', 'uzb', 'uzb'], ['Zhuang, Chuang', 'Saɯ cueŋƅ, Saw cuengh', 'za', 'zha', 'zha'], ['Bislama', 'Bislama', 'bi', 'bis', 'bis'], ['Norwegian Bokmål', 'Norsk Bokmål', 'nb', 'nob', 'nob'], ['Norwegian Nynorsk', 'Norsk Nynorsk', 'nn', 'nno', 'nno'], ['Indonesian', 'Bahasa Indonesia', 'id', 'ind', 'ind'], ['Twi', 'Twi', 'tw', 'twi', 'twi'], ['Esperanto', 'Esperanto', 'eo', 'epo', 'epo'], ['Interlingua', 'Interlingua', 'ia', 'ina', 'ina'], ['Interlingue', 'Originally called Occidental; then Interlingue after WWII', 'ie', 'ile', 'ile'], ['Ido', 'Ido', 'io', 'ido', 'ido'], ['Volapük', 'Volapük', 'vo', 'vol', 'vol'], ['Bihari languages', 'भोजपुरी', 'bh', 'bih', 'bih'], ['Hebrew (modern)', 'עברית', 'he', 'heb', 'heb'], ['Sanskrit', 'संस्कृतम्', 'sa', 'san', 'san'], ['Church Slavic, Church Slavonic, Old Church Slavonic, Old Slavonic, Old Bulgarian', 'ѩзыкъ словѣньскъ', 'cu', 'chu', 'chu'], ['Pali', 'पाऴि', 'pi', 'pli', 'pli'], ['Avestan', 'avesta', 'ae', 'ave', 'ave'], ['Latin', 'latine, lingua latina', 'la', 'lat', 'lat'], ['Armenian', 'Հայերեն', 'hy', 'hye', 'arm'], ['Swati', 'SiSwati', 'ss', 'ssw', 'ssw'], ['Tibetan', 'བོད་ཡིག', 'bo', 'bod', 'tib'], ['South Ndebele', 'isiNdebele', 'nr', 'nbl', 'nbl'], ['Slovene', 'Slovenski Jezik, Slovenščina', 'sl', 'slv', 'slv'], ['Oriya', 'ଓଡ଼ିଆ', 'or', 'ori', 'ori'], ['North Ndebele', 'isiNdebele', 'nd', 'nde', 'nde'], ['Nauru', 'Dorerin Naoero', 'na', 'nau', 'nau'], ['Maori', 'te reo Māori', 'mi', 'mri', 'mao'], ['Marathi', 'मराठी', 'mr', 'mar', 'mar'], ['Luba-Katanga', 'Kiluba', 'lu', 'lub', 'lub'], ['Rundi', 'Ikirundi', 'rn', 'run', 'run'], ['Central Khmer', 'ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ', 'km', 'khm', 'khm'], ['Western Frisian', 'Frysk', 'fy', 'fry', 'fry'], ['Bengali', 'বাংলা', 'bn', 'ben', 'ben'], ['Avaric', 'авар мацӀ, магӀарул мацӀ', 'av', 'ava', 'ava'], ['Abkhazian', 'аҧсуа бызшәа, аҧсшәа', 'ab', 'abk', 'abk'], ['Afar', 'Afaraf', 'aa', 'aar', 'aar'], ['Afrikaans', 'Afrikaans', 'af', 'afr', 'afr'], ['Amharic', 'አማርኛ', 'am', 'amh', 'amh'], ['Aragonese', 'aragonés', 'an', 'arg', 'arg'], ['Assamese', 'অসমীয়া', 'as', 'asm', 'asm'], ['Bambara', 'bamanankan', 'bm', 'bam', 'bam'], ['Bashkir', 'башҡорт теле', 'ba', 'bak', 'bak'], ['Basque', 'euskara, euskera', 'eu', 'eus', 'baq'], ['Belarusian', 'беларуская мова', 'be', 'bel', 'bel'], ['Bosnian', 'bosanski jezik', 'bs', 'bos', 'bos'], ['Breton', 'brezhoneg', 'br', 'bre', 'bre'], ['Bulgarian', 'български език', 'bg', 'bul', 'bul'], ['Burmese', 'ဗမာစာ', 'my', 'mya', 'bur'], ['Catalan, Valencian', 'català, valencià', 'ca', 'cat', 'cat'], ['Chamorro', 'Chamoru', 'ch', 'cha', 'cha'], ['Chechen', 'нохчийн мотт', 'ce', 'che', 'che'], ['Chichewa, Chewa, Nyanja', 'chiCheŵa, chinyanja', 'ny', 'nya', 'nya'], ['Chuvash', 'чӑваш чӗлхи', 'cv', 'chv', 'chv'], ['Cornish', 'Kernewek', 'kw', 'cor', 'cor'], ['Corsican', 'corsu, lingua corsa', 'co', 'cos', 'cos'], ['Croatian', 'hrvatski jezik', 'hr', 'hrv', 'hrv'], ['Czech', 'čeština, český jazyk', 'cs', 'ces', 'cze'], ['Danish', 'dansk', 'da', 'dan', 'dan'], ['Divehi, Dhivehi, Maldivian', 'ދިވެހި', 'dv', 'div', 'div'], ['Dutch, Flemish', 'Nederlands, Vlaams', 'nl', 'nld', 'dut'], ['Dzongkha', 'རྫོང་ཁ', 'dz', 'dzo', 'dzo'], ['English', 'English', 'en', 'eng', 'eng'], ['Ewe', 'Eʋegbe', 'ee', 'ewe', 'ewe'], ['Faroese', 'føroyskt', 'fo', 'fao', 'fao'], ['Fijian', 'vosa Vakaviti', 'fj', 'fij', 'fij'], ['Finnish', 'suomi, suomen kieli', 'fi', 'fin', 'fin'], ['French', 'français, langue française', 'fr', 'fra', 'fre'], ['Galician', 'Galego', 'gl', 'glg', 'glg'], ['Georgian', 'ქართული', 'ka', 'kat', 'geo'], ['German', 'Deutsch', 'de', 'deu', 'ger'], ['Greek (modern)', 'ελληνικά', 'el', 'ell', 'gre'], ['Gujarati', 'ગુજરાતી', 'gu', 'guj', 'guj'], ['Haitian, Haitian Creole', 'Kreyòl ayisyen', 'ht', 'hat', 'hat'], ['Hausa', '(Hausa) هَوُسَ', 'ha', 'hau', 'hau'], ['Herero', 'Otjiherero', 'hz', 'her', 'her'], ['Hindi', 'हिन्दी, हिंदी', 'hi', 'hin', 'hin'], ['Hiri Motu', 'Hiri Motu', 'ho', 'hmo', 'hmo'], ['Hungarian', 'magyar', 'hu', 'hun', 'hun'], ['Irish', 'Gaeilge', 'ga', 'gle', 'gle'], ['Igbo', 'Asụsụ Igbo', 'ig', 'ibo', 'ibo'], ['Icelandic', 'Íslenska', 'is', 'isl', 'ice'], ['Italian', 'Italiano', 'it', 'ita', 'ita'], ['Japanese', '日本語 (にほんご)', 'ja', 'jpn', 'jpn'], ['Javanese', 'ꦧꦱꦗꦮ, Basa Jawa', 'jv', 'jav', 'jav'], ['Kalaallisut, Greenlandic', 'kalaallisut, kalaallit oqaasii', 'kl', 'kal', 'kal'], ['Kannada', 'ಕನ್ನಡ', 'kn', 'kan', 'kan'], ['Kashmiri', 'कश्मीरी, كشميري', 'ks', 'kas', 'kas'], ['Kazakh', 'қазақ тілі', 'kk', 'kaz', 'kaz'], ['Kikuyu, Gikuyu', 'Gĩkũyũ', 'ki', 'kik', 'kik'], ['Kinyarwanda', 'Ikinyarwanda', 'rw', 'kin', 'kin'], ['Kirghiz, Kyrgyz', 'Кыргызча, Кыргыз тили', 'ky', 'kir', 'kir'], ['Korean', '한국어', 'ko', 'kor', 'kor'], ['Kuanyama, Kwanyama', 'Kuanyama', 'kj', 'kua', 'kua'], ['Luxembourgish, Letzeburgesch', 'Lëtzebuergesch', 'lb', 'ltz', 'ltz'], ['Ganda', 'Luganda', 'lg', 'lug', 'lug'], ['Limburgan, Limburger, Limburgish', 'Limburgs', 'li', 'lim', 'lim'], ['Lingala', 'Lingála', 'ln', 'lin', 'lin'], ['Lao', 'ພາສາລາວ', 'lo', 'lao', 'lao'], ['Lithuanian', 'lietuvių kalba', 'lt', 'lit', 'lit'], ['Manx', 'Gaelg, Gailck', 'gv', 'glv', 'glv'], ['Macedonian', 'македонски јазик', 'mk', 'mkd', 'mac'], ['Malayalam', 'മലയാളം', 'ml', 'mal', 'mal'], ['Maltese', 'Malti', 'mt', 'mlt', 'mlt'], ['Marshallese', 'Kajin M̧ajeļ', 'mh', 'mah', 'mah'], ['Navajo, Navaho', 'Diné bizaad', 'nv', 'nav', 'nav'], ['Nepali', 'नेपाली', 'ne', 'nep', 'nep'], ['Ndonga', 'Owambo', 'ng', 'ndo', 'ndo'], ['Occitan', 'occitan, lenga d\\'òc', 'oc', 'oci', 'oci'], ['Ossetian, Ossetic', 'ирон æвзаг', 'os', 'oss', 'oss'], ['Panjabi, Punjabi', 'ਪੰਜਾਬੀ', 'pa', 'pan', 'pan'], ['Polish', 'język polski, polszczyzna', 'pl', 'pol', 'pol'], ['Portuguese', 'Português', 'pt', 'por', 'por'], ['Romansh', 'Rumantsch Grischun', 'rm', 'roh', 'roh'], ['Russian', 'русский', 'ru', 'rus', 'rus'], ['Sindhi', 'सिन्धी, سنڌي، سندھی', 'sd', 'snd', 'snd'], ['Northern Sami', 'Davvisámegiella', 'se', 'sme', 'sme'], ['Samoan', 'gagana fa\\'a Samoa', 'sm', 'smo', 'smo'], ['Sango', 'yângâ tî sängö', 'sg', 'sag', 'sag'], ['Gaelic, Scottish Gaelic', 'Gàidhlig', 'gd', 'gla', 'gla'], ['Shona', 'chiShona', 'sn', 'sna', 'sna'], ['Sinhala, Sinhalese', 'සිංහල', 'si', 'sin', 'sin'], ['Slovak', 'Slovenčina, Slovenský Jazyk', 'sk', 'slk', 'slo'], ['Somali', 'Soomaaliga, af Soomaali', 'so', 'som', 'som'], ['Southern Sotho', 'Sesotho', 'st', 'sot', 'sot'], ['Spanish, Castilian', 'Español', 'es', 'spa', 'spa'], ['Sundanese', 'Basa Sunda', 'su', 'sun', 'sun'], ['Swedish', 'Svenska', 'sv', 'swe', 'swe'], ['Tamil', 'தமிழ்', 'ta', 'tam', 'tam'], ['Telugu', 'తెలుగు', 'te', 'tel', 'tel'], ['Tajik', 'тоҷикӣ, toçikī, تاجیکی', 'tg', 'tgk', 'tgk'], ['Thai', 'ไทย', 'th', 'tha', 'tha'], ['Tigrinya', 'ትግርኛ', 'ti', 'tir', 'tir'], ['Turkmen', 'Türkmen, Түркмен', 'tk', 'tuk', 'tuk'], ['Tswana', 'Setswana', 'tn', 'tsn', 'tsn'], ['Tongan (Tonga Islands)', 'Faka Tonga', 'to', 'ton', 'ton'], ['Turkish', 'Türkçe', 'tr', 'tur', 'tur'], ['Tsonga', 'Xitsonga', 'ts', 'tso', 'tso'], ['Tatar', 'татар теле, tatar tele', 'tt', 'tat', 'tat'], ['Uighur, Uyghur', 'ئۇيغۇرچە, Uyghurche', 'ug', 'uig', 'uig'], ['Ukrainian', 'Українська', 'uk', 'ukr', 'ukr'], ['Urdu', 'اردو', 'ur', 'urd', 'urd'], ['Venda', 'Tshivenḓa', 've', 'ven', 'ven'], ['Vietnamese', 'Tiếng Việt', 'vi', 'vie', 'vie'], ['Walloon', 'Walon', 'wa', 'wln', 'wln'], ['Welsh', 'Cymraeg', 'cy', 'cym', 'wel'], ['Wolof', 'Wollof', 'wo', 'wol', 'wol'], ['Xhosa', 'isiXhosa', 'xh', 'xho', 'xho'], ['Yoruba', 'Yorùbá', 'yo', 'yor', 'yor'], ['Zulu', 'isiZulu', 'zu', 'zul', 'zul']];\nexports[\"default\"] = _default;","/*!\n * jQuery Browser Plugin 0.1.0\n * https://github.com/gabceb/jquery-browser-plugin\n *\n * Original jquery-browser code Copyright 2005, 2015 jQuery Foundation, Inc. and other contributors\n * http://jquery.org/license\n *\n * Modifications Copyright 2015 Gabriel Cebrian\n * https://github.com/gabceb\n *\n * Released under the MIT license\n *\n * Date: 05-07-2015\n */\n/*global window: false */\n\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['jquery'], function ($) {\n return factory($);\n });\n } else if (typeof module === 'object' && typeof module.exports === 'object') {\n // Node-like environment\n module.exports = factory(require('jquery'));\n } else {\n // Browser globals\n factory(window.jQuery);\n }\n}(function(jQuery) {\n \"use strict\";\n\n function uaMatch( ua ) {\n // If an UA is not provided, default to the current browser UA.\n if ( ua === undefined ) {\n ua = window.navigator.userAgent;\n }\n ua = ua.toLowerCase();\n\n var match = /(edge)\\/([\\w.]+)/.exec( ua ) ||\n /(opr)[\\/]([\\w.]+)/.exec( ua ) ||\n /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(iemobile)[\\/]([\\w.]+)/.exec( ua ) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(msie) ([\\w.]+)/.exec( ua ) ||\n ua.indexOf(\"trident\") >= 0 && /(rv)(?::| )([\\w.]+)/.exec( ua ) ||\n ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n [];\n\n var platform_match = /(ipad)/.exec( ua ) ||\n /(ipod)/.exec( ua ) ||\n /(windows phone)/.exec( ua ) ||\n /(iphone)/.exec( ua ) ||\n /(kindle)/.exec( ua ) ||\n /(silk)/.exec( ua ) ||\n /(android)/.exec( ua ) ||\n /(win)/.exec( ua ) ||\n /(mac)/.exec( ua ) ||\n /(linux)/.exec( ua ) ||\n /(cros)/.exec( ua ) ||\n /(playbook)/.exec( ua ) ||\n /(bb)/.exec( ua ) ||\n /(blackberry)/.exec( ua ) ||\n [];\n\n var browser = {},\n matched = {\n browser: match[ 5 ] || match[ 3 ] || match[ 1 ] || \"\",\n version: match[ 2 ] || match[ 4 ] || \"0\",\n versionNumber: match[ 4 ] || match[ 2 ] || \"0\",\n platform: platform_match[ 0 ] || \"\"\n };\n\n if ( matched.browser ) {\n browser[ matched.browser ] = true;\n browser.version = matched.version;\n browser.versionNumber = parseInt(matched.versionNumber, 10);\n }\n\n if ( matched.platform ) {\n browser[ matched.platform ] = true;\n }\n\n // These are all considered mobile platforms, meaning they run a mobile browser\n if ( browser.android || browser.bb || browser.blackberry || browser.ipad || browser.iphone ||\n browser.ipod || browser.kindle || browser.playbook || browser.silk || browser[ \"windows phone\" ]) {\n browser.mobile = true;\n }\n\n // These are all considered desktop platforms, meaning they run a desktop browser\n if ( browser.cros || browser.mac || browser.linux || browser.win ) {\n browser.desktop = true;\n }\n\n // Chrome, Opera 15+ and Safari are webkit based browsers\n if ( browser.chrome || browser.opr || browser.safari ) {\n browser.webkit = true;\n }\n\n // IE11 has a new token so we will assign it msie to avoid breaking changes\n if ( browser.rv || browser.iemobile) {\n var ie = \"msie\";\n\n matched.browser = ie;\n browser[ie] = true;\n }\n\n // Edge is officially known as Microsoft Edge, so rewrite the key to match\n if ( browser.edge ) {\n delete browser.edge;\n var msedge = \"msedge\";\n\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Blackberry browsers are marked as Safari on BlackBerry\n if ( browser.safari && browser.blackberry ) {\n var blackberry = \"blackberry\";\n\n matched.browser = blackberry;\n browser[blackberry] = true;\n }\n\n // Playbook browsers are marked as Safari on Playbook\n if ( browser.safari && browser.playbook ) {\n var playbook = \"playbook\";\n\n matched.browser = playbook;\n browser[playbook] = true;\n }\n\n // BB10 is a newer OS version of BlackBerry\n if ( browser.bb ) {\n var bb = \"blackberry\";\n\n matched.browser = bb;\n browser[bb] = true;\n }\n\n // Opera 15+ are identified as opr\n if ( browser.opr ) {\n var opera = \"opera\";\n\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock Android browsers are marked as Safari on Android.\n if ( browser.safari && browser.android ) {\n var android = \"android\";\n\n matched.browser = android;\n browser[android] = true;\n }\n\n // Kindle browsers are marked as Safari on Kindle\n if ( browser.safari && browser.kindle ) {\n var kindle = \"kindle\";\n\n matched.browser = kindle;\n browser[kindle] = true;\n }\n\n // Kindle Silk browsers are marked as Safari on Kindle\n if ( browser.safari && browser.silk ) {\n var silk = \"silk\";\n\n matched.browser = silk;\n browser[silk] = true;\n }\n\n // Assign the name and platform variable\n browser.name = matched.browser;\n browser.platform = matched.platform;\n return browser;\n }\n\n // Run the matching process, also assign the function to the returned object\n // for manual, jQuery-free use if desired\n window.jQBrowser = uaMatch( window.navigator.userAgent );\n window.jQBrowser.uaMatch = uaMatch;\n\n // Only assign to jQuery.browser if jQuery is loaded\n if ( jQuery ) {\n jQuery.browser = window.jQBrowser;\n }\n\n return window.jQBrowser;\n}));\n","/** @license\r\n *\r\n * SoundManager 2: JavaScript Sound for the Web\r\n * ----------------------------------------------\r\n * http://schillmania.com/projects/soundmanager2/\r\n *\r\n * Copyright (c) 2007, Scott Schiller. All rights reserved.\r\n * Code provided under the BSD License:\r\n * http://schillmania.com/projects/soundmanager2/license.txt\r\n *\r\n * V2.97a.20170601\r\n */\r\n\r\n/**\r\n * About this file\r\n * -------------------------------------------------------------------------------------\r\n * This is the fully-commented source version of the SoundManager 2 API,\r\n * recommended for use during development and testing.\r\n *\r\n * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)\r\n * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion\r\n * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)\r\n *\r\n * You may notice <d> and </d> comments in this source; these are delimiters for\r\n * debug blocks which are removed in the -nodebug builds, further optimizing code size.\r\n *\r\n * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)\r\n */\r\n\r\n(function SM2(window, _undefined) {\r\n\r\n/* global Audio, document, window, navigator, define, module, SM2_DEFER, opera, setTimeout, setInterval, clearTimeout, sm2Debugger */\r\n\r\n'use strict';\r\n\r\nif (!window || !window.document) {\r\n\r\n // Don't cross the [environment] streams. SM2 expects to be running in a browser, not under node.js etc.\r\n // Additionally, if a browser somehow manages to fail this test, as Egon said: \"It would be bad.\"\r\n\r\n throw new Error('SoundManager requires a browser with window and document objects.');\r\n\r\n}\r\n\r\nvar soundManager = null;\r\n\r\n/**\r\n * The SoundManager constructor.\r\n *\r\n * @constructor\r\n * @param {string} smURL Optional: Path to SWF files\r\n * @param {string} smID Optional: The ID to use for the SWF container element\r\n * @this {SoundManager}\r\n * @return {SoundManager} The new SoundManager instance\r\n */\r\n\r\nfunction SoundManager(smURL, smID) {\r\n\r\n /**\r\n * soundManager configuration options list\r\n * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)\r\n * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})\r\n */\r\n\r\n this.setupOptions = {\r\n\r\n url: (smURL || null), // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/\r\n flashVersion: 8, // flash build to use (8 or 9.) Some API features require 9.\r\n debugMode: true, // enable debugging output (console.log() with HTML fallback)\r\n debugFlash: false, // enable debugging output inside SWF, troubleshoot Flash/browser issues\r\n useConsole: true, // use console.log() if available (otherwise, writes to #soundmanager-debug element)\r\n consoleOnly: true, // if console is being used, do not create/write to #soundmanager-debug\r\n waitForWindowLoad: false, // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r\n bgColor: '#ffffff', // SWF background color. N/A when wmode = 'transparent'\r\n useHighPerformance: false, // position:fixed flash movie can help increase js/flash speed, minimize lag\r\n flashPollingInterval: null, // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.\r\n html5PollingInterval: null, // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.\r\n flashLoadTimeout: 1000, // msec to wait for flash movie to load before failing (0 = infinity)\r\n wmode: null, // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)\r\n allowScriptAccess: 'always', // for scripting the SWF (object/embed property), 'always' or 'sameDomain'\r\n useFlashBlock: false, // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.\r\n useHTML5Audio: true, // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (MP3/MP4 support varies.) Ideally, transparent vs. Flash API where possible.\r\n forceUseGlobalHTML5Audio: false, // if true, a single Audio() object is used for all sounds - and only one can play at a time.\r\n ignoreMobileRestrictions: false, // if true, SM2 will not apply global HTML5 audio rules to mobile UAs. iOS > 7 and WebViews may allow multiple Audio() instances.\r\n html5Test: /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.\r\n preferFlash: false, // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.\r\n noSWFCache: false, // if true, appends ?ts={date} to break aggressive SWF caching.\r\n idPrefix: 'sound' // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.\r\n\r\n };\r\n\r\n this.defaultOptions = {\r\n\r\n /**\r\n * the default configuration for sound objects made with createSound() and related methods\r\n * eg., volume, auto-load behaviour and so forth\r\n */\r\n\r\n autoLoad: false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r\n autoPlay: false, // enable playing of file as soon as possible (much faster if \"stream\" is true)\r\n from: null, // position to start playback within a sound (msec), default = beginning\r\n loops: 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)\r\n onid3: null, // callback function for \"ID3 data is added/available\"\r\n onerror: null, // callback function for \"load failed\" (or, playback/network/decode error under HTML5.)\r\n onload: null, // callback function for \"load finished\"\r\n whileloading: null, // callback function for \"download progress update\" (X of Y bytes received)\r\n onplay: null, // callback for \"play\" start\r\n onpause: null, // callback for \"pause\"\r\n onresume: null, // callback for \"resume\" (pause toggle)\r\n whileplaying: null, // callback during play (position update)\r\n onposition: null, // object containing times and function callbacks for positions of interest\r\n onstop: null, // callback for \"user stop\"\r\n onfinish: null, // callback function for \"sound finished playing\"\r\n multiShot: true, // let sounds \"restart\" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r\n multiShotEvents: false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled\r\n position: null, // offset (milliseconds) to seek to within loaded sound data.\r\n pan: 0, // \"pan\" settings, left-to-right, -100 to 100\r\n playbackRate: 1, // rate at which to play the sound (HTML5-only)\r\n stream: true, // allows playing before entire file has loaded (recommended)\r\n to: null, // position to end playback within a sound (msec), default = end\r\n type: null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3\r\n usePolicyFile: false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)\r\n volume: 100 // self-explanatory. 0-100, the latter being the max.\r\n\r\n };\r\n\r\n this.flash9Options = {\r\n\r\n /**\r\n * flash 9-only options,\r\n * merged into defaultOptions if flash 9 is being used\r\n */\r\n\r\n onfailure: null, // callback function for when playing fails (Flash 9, MovieStar + RTMP-only)\r\n isMovieStar: null, // \"MovieStar\" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r\n usePeakData: false, // enable left/right channel peak (level) data\r\n useWaveformData: false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.\r\n useEQData: false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.\r\n onbufferchange: null, // callback for \"isBuffering\" property change\r\n ondataerror: null // callback for waveform/eq data access error (flash playing audio in other tabs/domains)\r\n\r\n };\r\n\r\n this.movieStarOptions = {\r\n\r\n /**\r\n * flash 9.0r115+ MPEG4 audio options,\r\n * merged into defaultOptions if flash 9+movieStar mode is enabled\r\n */\r\n\r\n bufferTime: 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)\r\n serverURL: null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants\r\n onconnect: null, // rtmp: callback for connection to flash media server\r\n duration: null // rtmp: song duration (msec)\r\n\r\n };\r\n\r\n this.audioFormats = {\r\n\r\n /**\r\n * determines HTML5 support + flash requirements.\r\n * if no support (via flash and/or HTML5) for a \"required\" format, SM2 will fail to start.\r\n * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)\r\n */\r\n\r\n mp3: {\r\n type: ['audio/mpeg; codecs=\"mp3\"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],\r\n required: true\r\n },\r\n\r\n mp4: {\r\n related: ['aac', 'm4a', 'm4b'], // additional formats under the MP4 container\r\n type: ['audio/mp4; codecs=\"mp4a.40.2\"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],\r\n required: false\r\n },\r\n\r\n ogg: {\r\n type: ['audio/ogg; codecs=vorbis'],\r\n required: false\r\n },\r\n\r\n opus: {\r\n type: ['audio/ogg; codecs=opus', 'audio/opus'],\r\n required: false\r\n },\r\n\r\n wav: {\r\n type: ['audio/wav; codecs=\"1\"', 'audio/wav', 'audio/wave', 'audio/x-wav'],\r\n required: false\r\n },\r\n\r\n flac: {\r\n type: ['audio/flac'],\r\n required: false\r\n }\r\n\r\n };\r\n\r\n // HTML attributes (id + class names) for the SWF container\r\n\r\n this.movieID = 'sm2-container';\r\n this.id = (smID || 'sm2movie');\r\n\r\n this.debugID = 'soundmanager-debug';\r\n this.debugURLParam = /([#?&])debug=1/i;\r\n\r\n // dynamic attributes\r\n\r\n this.versionNumber = 'V2.97a.20170601';\r\n this.version = null;\r\n this.movieURL = null;\r\n this.altURL = null;\r\n this.swfLoaded = false;\r\n this.enabled = false;\r\n this.oMC = null;\r\n this.sounds = {};\r\n this.soundIDs = [];\r\n this.muted = false;\r\n this.didFlashBlock = false;\r\n this.filePattern = null;\r\n\r\n this.filePatterns = {\r\n flash8: /\\.mp3(\\?.*)?$/i,\r\n flash9: /\\.mp3(\\?.*)?$/i\r\n };\r\n\r\n // support indicators, set at init\r\n\r\n this.features = {\r\n buffering: false,\r\n peakData: false,\r\n waveformData: false,\r\n eqData: false,\r\n movieStar: false\r\n };\r\n\r\n // flash sandbox info, used primarily in troubleshooting\r\n\r\n this.sandbox = {\r\n // <d>\r\n type: null,\r\n types: {\r\n remote: 'remote (domain-based) rules',\r\n localWithFile: 'local with file access (no internet access)',\r\n localWithNetwork: 'local with network (internet access only, no local access)',\r\n localTrusted: 'local, trusted (local+internet access)'\r\n },\r\n description: null,\r\n noRemote: null,\r\n noLocal: null\r\n // </d>\r\n };\r\n\r\n /**\r\n * format support (html5/flash)\r\n * stores canPlayType() results based on audioFormats.\r\n * eg. { mp3: boolean, mp4: boolean }\r\n * treat as read-only.\r\n */\r\n\r\n this.html5 = {\r\n usingFlash: null // set if/when flash fallback is needed\r\n };\r\n\r\n // file type support hash\r\n this.flash = {};\r\n\r\n // determined at init time\r\n this.html5Only = false;\r\n\r\n // used for special cases (eg. iPad/iPhone/palm OS?)\r\n this.ignoreFlash = false;\r\n\r\n /**\r\n * a few private internals (OK, a lot. :D)\r\n */\r\n\r\n var SMSound,\r\n sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],\r\n canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5ErrorCodes, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, didSetup, msecScale = 1000,\r\n is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie|trident/i),\r\n isWebkit = ua.match(/webkit/i),\r\n isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)),\r\n isOpera = (ua.match(/opera/i)),\r\n mobileHTML5 = (ua.match(/(mobile|pre\\/|xoom)/i) || is_iDevice || isAndroid),\r\n isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS\\sX\\s10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, \"Silk\") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159\r\n hasConsole = (window.console !== _undefined && console.log !== _undefined),\r\n isFocused = (doc.hasFocus !== _undefined ? doc.hasFocus() : null),\r\n tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())),\r\n okToDisable = !tryInitOnFocus,\r\n flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i,\r\n emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)\r\n emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading\r\n overHTTP = (doc.location ? doc.location.protocol.match(/http/i) : null),\r\n http = (!overHTTP ? '//' : ''),\r\n // mp3, mp4, aac etc.\r\n netStreamMimeTypes = /^\\s*audio\\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\\s*(?:$|;)/i,\r\n // Flash v9.0r115+ \"moviestar\" formats\r\n netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],\r\n netStreamPattern = new RegExp('\\\\.(' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n this.mimePattern = /^\\s*audio\\/(?:x-)?(?:mp(?:eg|3))\\s*(?:$|;)/i; // default mp3 set\r\n\r\n // use altURL if not \"online\"\r\n this.useAltURL = !overHTTP;\r\n\r\n swfCSS = {\r\n swfBox: 'sm2-object-box',\r\n swfDefault: 'movieContainer',\r\n swfError: 'swf_error', // SWF loaded, but SM2 couldn't start (other error)\r\n swfTimedout: 'swf_timedout',\r\n swfLoaded: 'swf_loaded',\r\n swfUnblocked: 'swf_unblocked', // or loaded OK\r\n sm2Debug: 'sm2_debug',\r\n highPerf: 'high_performance',\r\n flashDebug: 'flash_debug'\r\n };\r\n\r\n /**\r\n * HTML5 error codes, per W3C\r\n * Error code 1, MEDIA_ERR_ABORTED: Client aborted download at user's request.\r\n * Error code 2, MEDIA_ERR_NETWORK: A network error of some description caused the user agent to stop fetching the media resource, after the resource was established to be usable.\r\n * Error code 3, MEDIA_ERR_DECODE: An error of some description occurred while decoding the media resource, after the resource was established to be usable.\r\n * Error code 4, MEDIA_ERR_SRC_NOT_SUPPORTED: Media (audio file) not supported (\"not usable.\")\r\n * Reference: https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n */\r\n html5ErrorCodes = [\r\n null,\r\n 'MEDIA_ERR_ABORTED',\r\n 'MEDIA_ERR_NETWORK',\r\n 'MEDIA_ERR_DECODE',\r\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\r\n ];\r\n\r\n /**\r\n * basic HTML5 Audio() support test\r\n * try...catch because of IE 9 \"not implemented\" nonsense\r\n * https://github.com/Modernizr/Modernizr/issues/224\r\n */\r\n\r\n this.hasHTML5 = (function() {\r\n try {\r\n // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.\r\n return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);\r\n } catch(e) {\r\n return false;\r\n }\r\n }());\r\n\r\n /**\r\n * Public SoundManager API\r\n * -----------------------\r\n */\r\n\r\n /**\r\n * Configures top-level soundManager properties.\r\n *\r\n * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }\r\n * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.\r\n */\r\n\r\n this.setup = function(options) {\r\n\r\n var noURL = (!sm2.url);\r\n\r\n // warn if flash options have already been applied\r\n\r\n if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {\r\n complain(str('setupLate'));\r\n }\r\n\r\n // TODO: defer: true?\r\n\r\n assign(options);\r\n\r\n if (!useGlobalHTML5Audio) {\r\n\r\n if (mobileHTML5) {\r\n\r\n // force the singleton HTML5 pattern on mobile, by default.\r\n if (!sm2.setupOptions.ignoreMobileRestrictions || sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n messages.push(strings.globalHTML5);\r\n useGlobalHTML5Audio = true;\r\n }\r\n\r\n } else if (sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n\r\n // only apply singleton HTML5 on desktop if forced.\r\n messages.push(strings.globalHTML5);\r\n useGlobalHTML5Audio = true;\r\n\r\n }\r\n\r\n }\r\n\r\n if (!didSetup && mobileHTML5) {\r\n\r\n if (sm2.setupOptions.ignoreMobileRestrictions) {\r\n\r\n messages.push(strings.ignoreMobile);\r\n\r\n } else {\r\n\r\n // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.\r\n\r\n // <d>\r\n if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {\r\n // notify that defaults are being changed.\r\n sm2._wD(strings.mobileUA);\r\n }\r\n // </d>\r\n\r\n sm2.setupOptions.useHTML5Audio = true;\r\n sm2.setupOptions.preferFlash = false;\r\n\r\n if (is_iDevice) {\r\n\r\n // no flash here.\r\n sm2.ignoreFlash = true;\r\n\r\n } else if ((isAndroid && !ua.match(/android\\s2\\.3/i)) || !isAndroid) {\r\n\r\n /**\r\n * Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence.\r\n * Common use case: exiting sound onfinish() -> createSound() -> play()\r\n * Presuming similar restrictions for other mobile, non-Android, non-iOS devices.\r\n */\r\n\r\n // <d>\r\n sm2._wD(strings.globalHTML5);\r\n // </d>\r\n\r\n useGlobalHTML5Audio = true;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // special case 1: \"Late setup\". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.\r\n\r\n if (options) {\r\n\r\n if (noURL && didDCLoaded && options.url !== _undefined) {\r\n sm2.beginDelayedInit();\r\n }\r\n\r\n // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.\r\n\r\n if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {\r\n setTimeout(domContentLoaded, 1);\r\n }\r\n\r\n }\r\n\r\n didSetup = true;\r\n\r\n return sm2;\r\n\r\n };\r\n\r\n this.ok = function() {\r\n\r\n return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));\r\n\r\n };\r\n\r\n this.supported = this.ok; // legacy\r\n\r\n this.getMovie = function(movie_id) {\r\n\r\n // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version\r\n return id(movie_id) || doc[movie_id] || window[movie_id];\r\n\r\n };\r\n\r\n /**\r\n * Creates a SMSound sound object instance. Can also be overloaded, e.g., createSound('mySound', '/some.mp3');\r\n *\r\n * @param {object} oOptions Sound options (at minimum, url parameter is required.)\r\n * @return {object} SMSound The new SMSound object.\r\n */\r\n\r\n this.createSound = function(oOptions, _url) {\r\n\r\n var cs, cs_string, options, oSound = null;\r\n\r\n // <d>\r\n cs = sm + '.createSound(): ';\r\n cs_string = cs + str(!didInit ? 'notReady' : 'notOK');\r\n // </d>\r\n\r\n if (!didInit || !sm2.ok()) {\r\n complain(cs_string);\r\n return false;\r\n }\r\n\r\n if (_url !== _undefined) {\r\n // function overloading in JS! :) ... assume simple createSound(id, url) use case.\r\n oOptions = {\r\n id: oOptions,\r\n url: _url\r\n };\r\n }\r\n\r\n // inherit from defaultOptions\r\n options = mixin(oOptions);\r\n\r\n options.url = parseURL(options.url);\r\n\r\n // generate an id, if needed.\r\n if (options.id === _undefined) {\r\n options.id = sm2.setupOptions.idPrefix + (idCounter++);\r\n }\r\n\r\n // <d>\r\n if (options.id.toString().charAt(0).match(/^[0-9]$/)) {\r\n sm2._wD(cs + str('badID', options.id), 2);\r\n }\r\n\r\n sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);\r\n // </d>\r\n\r\n if (idCheck(options.id, true)) {\r\n sm2._wD(cs + options.id + ' exists', 1);\r\n return sm2.sounds[options.id];\r\n }\r\n\r\n function make() {\r\n\r\n options = loopFix(options);\r\n sm2.sounds[options.id] = new SMSound(options);\r\n sm2.soundIDs.push(options.id);\r\n return sm2.sounds[options.id];\r\n\r\n }\r\n\r\n if (html5OK(options)) {\r\n\r\n oSound = make();\r\n // <d>\r\n if (!sm2.html5Only) {\r\n sm2._wD(options.id + ': Using HTML5');\r\n }\r\n // </d>\r\n oSound._setup_html5(options);\r\n\r\n } else {\r\n\r\n if (sm2.html5Only) {\r\n sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');\r\n return make();\r\n }\r\n\r\n // TODO: Move HTML5/flash checks into generic URL parsing/handling function.\r\n\r\n if (sm2.html5.usingFlash && options.url && options.url.match(/data:/i)) {\r\n // data: URIs not supported by Flash, either.\r\n sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');\r\n return make();\r\n }\r\n\r\n if (fV > 8) {\r\n if (options.isMovieStar === null) {\r\n // attempt to detect MPEG-4 formats\r\n options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));\r\n }\r\n // <d>\r\n if (options.isMovieStar) {\r\n sm2._wD(cs + 'using MovieStar handling');\r\n if (options.loops > 1) {\r\n _wDS('noNSLoop');\r\n }\r\n }\r\n // </d>\r\n }\r\n\r\n options = policyFix(options, cs);\r\n oSound = make();\r\n\r\n if (fV === 8) {\r\n flash._createSound(options.id, options.loops || 1, options.usePolicyFile);\r\n } else {\r\n flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar ? options.bufferTime : false), options.loops || 1, options.serverURL, options.duration || null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);\r\n if (!options.serverURL) {\r\n // We are connected immediately\r\n oSound.connected = true;\r\n if (options.onconnect) {\r\n options.onconnect.apply(oSound);\r\n }\r\n }\r\n }\r\n\r\n if (!options.serverURL && (options.autoLoad || options.autoPlay)) {\r\n // call load for non-rtmp streams\r\n oSound.load(options);\r\n }\r\n\r\n }\r\n\r\n // rtmp will play in onconnect\r\n if (!options.serverURL && options.autoPlay) {\r\n oSound.play();\r\n }\r\n\r\n return oSound;\r\n\r\n };\r\n\r\n /**\r\n * Destroys a SMSound sound object instance.\r\n *\r\n * @param {string} sID The ID of the sound to destroy\r\n */\r\n\r\n this.destroySound = function(sID, _bFromSound) {\r\n\r\n // explicitly destroy a sound before normal page unload, etc.\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n var oS = sm2.sounds[sID], i;\r\n\r\n oS.stop();\r\n\r\n // Disable all callbacks after stop(), when the sound is being destroyed\r\n oS._iO = {};\r\n\r\n oS.unload();\r\n\r\n for (i = 0; i < sm2.soundIDs.length; i++) {\r\n if (sm2.soundIDs[i] === sID) {\r\n sm2.soundIDs.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n if (!_bFromSound) {\r\n // ignore if being called from SMSound instance\r\n oS.destruct(true);\r\n }\r\n\r\n oS = null;\r\n delete sm2.sounds[sID];\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Calls the load() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {object} oOptions Optional: Sound options\r\n */\r\n\r\n this.load = function(sID, oOptions) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].load(oOptions);\r\n\r\n };\r\n\r\n /**\r\n * Calls the unload() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n */\r\n\r\n this.unload = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].unload();\r\n\r\n };\r\n\r\n /**\r\n * Calls the onPosition() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nPosition The position to watch for\r\n * @param {function} oMethod The relevant callback to fire\r\n * @param {object} oScope Optional: The scope to apply the callback to\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.onPosition = function(sID, nPosition, oMethod, oScope) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);\r\n\r\n };\r\n\r\n // legacy/backwards-compability: lower-case method name\r\n this.onposition = this.onPosition;\r\n\r\n /**\r\n * Calls the clearOnPosition() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nPosition The position to watch for\r\n * @param {function} oMethod Optional: The relevant callback to fire\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.clearOnPosition = function(sID, nPosition, oMethod) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);\r\n\r\n };\r\n\r\n /**\r\n * Calls the play() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {object} oOptions Optional: Sound options\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.play = function(sID, oOptions) {\r\n\r\n var result = null,\r\n // legacy function-overloading use case: play('mySound', '/path/to/some.mp3');\r\n overloaded = (oOptions && !(oOptions instanceof Object));\r\n\r\n if (!didInit || !sm2.ok()) {\r\n complain(sm + '.play(): ' + str(!didInit ? 'notReady' : 'notOK'));\r\n return false;\r\n }\r\n\r\n if (!idCheck(sID, overloaded)) {\r\n\r\n // no sound found for the given ID. Bail.\r\n if (!overloaded) return false;\r\n\r\n if (overloaded) {\r\n oOptions = {\r\n url: oOptions\r\n };\r\n }\r\n\r\n if (oOptions && oOptions.url) {\r\n // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});\r\n sm2._wD(sm + '.play(): Attempting to create \"' + sID + '\"', 1);\r\n oOptions.id = sID;\r\n result = sm2.createSound(oOptions).play();\r\n }\r\n\r\n } else if (overloaded) {\r\n\r\n // existing sound object case\r\n oOptions = {\r\n url: oOptions\r\n };\r\n\r\n }\r\n\r\n if (result === null) {\r\n // default case\r\n result = sm2.sounds[sID].play(oOptions);\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n // just for convenience\r\n this.start = this.play;\r\n\r\n /**\r\n * Calls the setPlaybackRate() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPlaybackRate = function(sID, rate, allowOverride) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setPlaybackRate(rate, allowOverride);\r\n\r\n };\r\n\r\n /**\r\n * Calls the setPosition() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nMsecOffset Position (milliseconds)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPosition = function(sID, nMsecOffset) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setPosition(nMsecOffset);\r\n\r\n };\r\n\r\n /**\r\n * Calls the stop() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.stop = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n sm2._wD(sm + '.stop(' + sID + ')', 1);\r\n\r\n return sm2.sounds[sID].stop();\r\n\r\n };\r\n\r\n /**\r\n * Stops all currently-playing sounds.\r\n */\r\n\r\n this.stopAll = function() {\r\n\r\n var oSound;\r\n sm2._wD(sm + '.stopAll()', 1);\r\n\r\n for (oSound in sm2.sounds) {\r\n if (sm2.sounds.hasOwnProperty(oSound)) {\r\n // apply only to sound objects\r\n sm2.sounds[oSound].stop();\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Calls the pause() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.pause = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].pause();\r\n\r\n };\r\n\r\n /**\r\n * Pauses all currently-playing sounds.\r\n */\r\n\r\n this.pauseAll = function() {\r\n\r\n var i;\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].pause();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Calls the resume() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.resume = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].resume();\r\n\r\n };\r\n\r\n /**\r\n * Resumes all currently-paused sounds.\r\n */\r\n\r\n this.resumeAll = function() {\r\n\r\n var i;\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].resume();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Calls the togglePause() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.togglePause = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].togglePause();\r\n\r\n };\r\n\r\n /**\r\n * Calls the setPan() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nPan The pan value (-100 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPan = function(sID, nPan) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setPan(nPan);\r\n\r\n };\r\n\r\n /**\r\n * Calls the setVolume() method of a SMSound object by ID\r\n * Overloaded case: pass only volume argument eg., setVolume(50) to apply to all sounds.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nVol The volume value (0 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setVolume = function(sID, nVol) {\r\n\r\n // setVolume(50) function overloading case - apply to all sounds\r\n\r\n var i, j;\r\n\r\n if (sID !== _undefined && !isNaN(sID) && nVol === _undefined) {\r\n for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n sm2.sounds[sm2.soundIDs[i]].setVolume(sID);\r\n }\r\n return false;\r\n }\r\n\r\n // setVolume('mySound', 50) case\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setVolume(nVol);\r\n\r\n };\r\n\r\n /**\r\n * Calls the mute() method of either a single SMSound object by ID, or all sound objects.\r\n *\r\n * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n */\r\n\r\n this.mute = function(sID) {\r\n\r\n var i = 0;\r\n\r\n if (sID instanceof String) {\r\n sID = null;\r\n }\r\n\r\n if (!sID) {\r\n\r\n sm2._wD(sm + '.mute(): Muting all sounds');\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].mute();\r\n }\r\n sm2.muted = true;\r\n\r\n } else {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n sm2._wD(sm + '.mute(): Muting \"' + sID + '\"');\r\n return sm2.sounds[sID].mute();\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Mutes all sounds.\r\n */\r\n\r\n this.muteAll = function() {\r\n\r\n sm2.mute();\r\n\r\n };\r\n\r\n /**\r\n * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.\r\n *\r\n * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n */\r\n\r\n this.unmute = function(sID) {\r\n\r\n var i;\r\n\r\n if (sID instanceof String) {\r\n sID = null;\r\n }\r\n\r\n if (!sID) {\r\n\r\n sm2._wD(sm + '.unmute(): Unmuting all sounds');\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].unmute();\r\n }\r\n sm2.muted = false;\r\n\r\n } else {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n sm2._wD(sm + '.unmute(): Unmuting \"' + sID + '\"');\r\n\r\n return sm2.sounds[sID].unmute();\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Unmutes all sounds.\r\n */\r\n\r\n this.unmuteAll = function() {\r\n\r\n sm2.unmute();\r\n\r\n };\r\n\r\n /**\r\n * Calls the toggleMute() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.toggleMute = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].toggleMute();\r\n\r\n };\r\n\r\n /**\r\n * Retrieves the memory used by the flash plugin.\r\n *\r\n * @return {number} The amount of memory in use\r\n */\r\n\r\n this.getMemoryUse = function() {\r\n\r\n // flash-only\r\n var ram = 0;\r\n\r\n if (flash && fV !== 8) {\r\n ram = parseInt(flash._getMemoryUse(), 10);\r\n }\r\n\r\n return ram;\r\n\r\n };\r\n\r\n /**\r\n * Undocumented: NOPs soundManager and all SMSound objects.\r\n */\r\n\r\n this.disable = function(bNoDisable) {\r\n\r\n // destroy all functions\r\n var i;\r\n\r\n if (bNoDisable === _undefined) {\r\n bNoDisable = false;\r\n }\r\n\r\n // already disabled?\r\n if (disabled) return false;\r\n\r\n disabled = true;\r\n\r\n _wDS('shutdown', 1);\r\n\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n disableObject(sm2.sounds[sm2.soundIDs[i]]);\r\n }\r\n\r\n disableObject(sm2);\r\n\r\n // fire \"complete\", despite fail\r\n initComplete(bNoDisable);\r\n\r\n event.remove(window, 'load', initUserOnload);\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Determines playability of a MIME type, eg. 'audio/mp3'.\r\n */\r\n\r\n this.canPlayMIME = function(sMIME) {\r\n\r\n var result;\r\n\r\n if (sm2.hasHTML5) {\r\n result = html5CanPlay({\r\n type: sMIME\r\n });\r\n }\r\n\r\n if (!result && needsFlash) {\r\n // if flash 9, test netStream (movieStar) types as well.\r\n result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less \"weird\" (per JSLint)\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Determines playability of a URL based on audio support.\r\n *\r\n * @param {string} sURL The URL to test\r\n * @return {boolean} URL playability\r\n */\r\n\r\n this.canPlayURL = function(sURL) {\r\n\r\n var result;\r\n\r\n if (sm2.hasHTML5) {\r\n result = html5CanPlay({\r\n url: sURL\r\n });\r\n }\r\n\r\n if (!result && needsFlash) {\r\n result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Determines playability of an HTML DOM <a> object (or similar object literal) based on audio support.\r\n *\r\n * @param {object} oLink an HTML DOM <a> object or object literal including href and/or type attributes\r\n * @return {boolean} URL playability\r\n */\r\n\r\n this.canPlayLink = function(oLink) {\r\n\r\n if (oLink.type !== _undefined && oLink.type && sm2.canPlayMIME(oLink.type)) return true;\r\n\r\n return sm2.canPlayURL(oLink.href);\r\n\r\n };\r\n\r\n /**\r\n * Retrieves a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.getSoundById = function(sID, _suppressDebug) {\r\n\r\n if (!sID) return null;\r\n\r\n var result = sm2.sounds[sID];\r\n\r\n // <d>\r\n if (!result && !_suppressDebug) {\r\n sm2._wD(sm + '.getSoundById(): Sound \"' + sID + '\" not found.', 2);\r\n }\r\n // </d>\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Queues a callback for execution when SoundManager has successfully initialized.\r\n *\r\n * @param {function} oMethod The callback method to fire\r\n * @param {object} oScope Optional: The scope to apply to the callback\r\n */\r\n\r\n this.onready = function(oMethod, oScope) {\r\n\r\n var sType = 'onready',\r\n result = false;\r\n\r\n if (typeof oMethod === 'function') {\r\n\r\n // <d>\r\n if (didInit) {\r\n sm2._wD(str('queue', sType));\r\n }\r\n // </d>\r\n\r\n if (!oScope) {\r\n oScope = window;\r\n }\r\n\r\n addOnEvent(sType, oMethod, oScope);\r\n processOnEvents();\r\n\r\n result = true;\r\n\r\n } else {\r\n\r\n throw str('needFunction', sType);\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Queues a callback for execution when SoundManager has failed to initialize.\r\n *\r\n * @param {function} oMethod The callback method to fire\r\n * @param {object} oScope Optional: The scope to apply to the callback\r\n */\r\n\r\n this.ontimeout = function(oMethod, oScope) {\r\n\r\n var sType = 'ontimeout',\r\n result = false;\r\n\r\n if (typeof oMethod === 'function') {\r\n\r\n // <d>\r\n if (didInit) {\r\n sm2._wD(str('queue', sType));\r\n }\r\n // </d>\r\n\r\n if (!oScope) {\r\n oScope = window;\r\n }\r\n\r\n addOnEvent(sType, oMethod, oScope);\r\n processOnEvents({ type: sType });\r\n\r\n result = true;\r\n\r\n } else {\r\n\r\n throw str('needFunction', sType);\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Writes console.log()-style debug output to a console or in-browser element.\r\n * Applies when debugMode = true\r\n *\r\n * @param {string} sText The console message\r\n * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.\r\n */\r\n\r\n this._writeDebug = function(sText, sTypeOrObject) {\r\n\r\n // pseudo-private console.log()-style output\r\n // <d>\r\n\r\n var sDID = 'soundmanager-debug', o, oItem;\r\n\r\n if (!sm2.setupOptions.debugMode) return false;\r\n\r\n if (hasConsole && sm2.useConsole) {\r\n if (sTypeOrObject && typeof sTypeOrObject === 'object') {\r\n // object passed; dump to console.\r\n console.log(sText, sTypeOrObject);\r\n } else if (debugLevels[sTypeOrObject] !== _undefined) {\r\n console[debugLevels[sTypeOrObject]](sText);\r\n } else {\r\n console.log(sText);\r\n }\r\n if (sm2.consoleOnly) return true;\r\n }\r\n\r\n o = id(sDID);\r\n\r\n if (!o) return false;\r\n\r\n oItem = doc.createElement('div');\r\n\r\n if (++wdCount % 2 === 0) {\r\n oItem.className = 'sm2-alt';\r\n }\r\n\r\n if (sTypeOrObject === _undefined) {\r\n sTypeOrObject = 0;\r\n } else {\r\n sTypeOrObject = parseInt(sTypeOrObject, 10);\r\n }\r\n\r\n oItem.appendChild(doc.createTextNode(sText));\r\n\r\n if (sTypeOrObject) {\r\n if (sTypeOrObject >= 2) {\r\n oItem.style.fontWeight = 'bold';\r\n }\r\n if (sTypeOrObject === 3) {\r\n oItem.style.color = '#ff3333';\r\n }\r\n }\r\n\r\n // top-to-bottom\r\n // o.appendChild(oItem);\r\n\r\n // bottom-to-top\r\n o.insertBefore(oItem, o.firstChild);\r\n\r\n o = null;\r\n // </d>\r\n\r\n return true;\r\n\r\n };\r\n\r\n // <d>\r\n // last-resort debugging option\r\n if (wl.indexOf('sm2-debug=alert') !== -1) {\r\n this._writeDebug = function(sText) {\r\n window.alert(sText);\r\n };\r\n }\r\n // </d>\r\n\r\n // alias\r\n this._wD = this._writeDebug;\r\n\r\n /**\r\n * Provides debug / state information on all SMSound objects.\r\n */\r\n\r\n this._debug = function() {\r\n\r\n // <d>\r\n var i, j;\r\n _wDS('currentObj', 1);\r\n\r\n for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n sm2.sounds[sm2.soundIDs[i]]._debug();\r\n }\r\n // </d>\r\n\r\n };\r\n\r\n /**\r\n * Restarts and re-initializes the SoundManager instance.\r\n *\r\n * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.\r\n * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).\r\n * @return {object} soundManager The soundManager instance.\r\n */\r\n\r\n this.reboot = function(resetEvents, excludeInit) {\r\n\r\n // reset some (or all) state, and re-init unless otherwise specified.\r\n\r\n // <d>\r\n if (sm2.soundIDs.length) {\r\n sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');\r\n }\r\n // </d>\r\n\r\n var i, j, k;\r\n\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].destruct();\r\n }\r\n\r\n // trash ze flash (remove from the DOM)\r\n\r\n if (flash) {\r\n\r\n try {\r\n\r\n if (isIE) {\r\n oRemovedHTML = flash.innerHTML;\r\n }\r\n\r\n oRemoved = flash.parentNode.removeChild(flash);\r\n\r\n } catch(e) {\r\n\r\n // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.\r\n\r\n _wDS('badRemove', 2);\r\n\r\n }\r\n\r\n }\r\n\r\n // actually, force recreate of movie.\r\n\r\n oRemovedHTML = oRemoved = needsFlash = flash = null;\r\n\r\n sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;\r\n\r\n sm2.soundIDs = [];\r\n sm2.sounds = {};\r\n\r\n idCounter = 0;\r\n didSetup = false;\r\n\r\n if (!resetEvents) {\r\n // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init\r\n for (i in on_queue) {\r\n if (on_queue.hasOwnProperty(i)) {\r\n for (j = 0, k = on_queue[i].length; j < k; j++) {\r\n on_queue[i][j].fired = false;\r\n }\r\n }\r\n }\r\n } else {\r\n // remove all callbacks entirely\r\n on_queue = [];\r\n }\r\n\r\n // <d>\r\n if (!excludeInit) {\r\n sm2._wD(sm + ': Rebooting...');\r\n }\r\n // </d>\r\n\r\n // reset HTML5 and flash canPlay test results\r\n\r\n sm2.html5 = {\r\n usingFlash: null\r\n };\r\n\r\n sm2.flash = {};\r\n\r\n // reset device-specific HTML/flash mode switches\r\n\r\n sm2.html5Only = false;\r\n sm2.ignoreFlash = false;\r\n\r\n window.setTimeout(function() {\r\n\r\n // by default, re-init\r\n\r\n if (!excludeInit) {\r\n sm2.beginDelayedInit();\r\n }\r\n\r\n }, 20);\r\n\r\n return sm2;\r\n\r\n };\r\n\r\n this.reset = function() {\r\n\r\n /**\r\n * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.\r\n * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().\r\n * @return {object} soundManager The soundManager instance.\r\n */\r\n\r\n _wDS('reset');\r\n\r\n return sm2.reboot(true, true);\r\n\r\n };\r\n\r\n /**\r\n * Undocumented: Determines the SM2 flash movie's load progress.\r\n *\r\n * @return {number or null} Percent loaded, or if invalid/unsupported, null.\r\n */\r\n\r\n this.getMoviePercent = function() {\r\n\r\n /**\r\n * Interesting syntax notes...\r\n * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof \"function\" nor instanceof Function, but are still valid.\r\n * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw \"object doesn't support this property or method\".\r\n * Thus, 'in' syntax must be used.\r\n */\r\n\r\n return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null);\r\n\r\n };\r\n\r\n /**\r\n * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().\r\n */\r\n\r\n this.beginDelayedInit = function() {\r\n\r\n windowLoaded = true;\r\n domContentLoaded();\r\n\r\n setTimeout(function() {\r\n\r\n if (initPending) return false;\r\n\r\n createMovie();\r\n initMovie();\r\n initPending = true;\r\n\r\n return true;\r\n\r\n }, 20);\r\n\r\n delayWaitForEI();\r\n\r\n };\r\n\r\n /**\r\n * Destroys the SoundManager instance and all SMSound instances.\r\n */\r\n\r\n this.destruct = function() {\r\n\r\n sm2._wD(sm + '.destruct()');\r\n sm2.disable(true);\r\n\r\n };\r\n\r\n /**\r\n * SMSound() (sound object) constructor\r\n * ------------------------------------\r\n *\r\n * @param {object} oOptions Sound options (id and url are required attributes)\r\n * @return {SMSound} The new SMSound object\r\n */\r\n\r\n SMSound = function(oOptions) {\r\n\r\n var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;\r\n\r\n lastHTML5State = {\r\n // tracks duration + position (time)\r\n duration: null,\r\n time: null\r\n };\r\n\r\n this.id = oOptions.id;\r\n\r\n // legacy\r\n this.sID = this.id;\r\n\r\n this.url = oOptions.url;\r\n this.options = mixin(oOptions);\r\n\r\n // per-play-instance-specific options\r\n this.instanceOptions = this.options;\r\n\r\n // short alias\r\n this._iO = this.instanceOptions;\r\n\r\n // assign property defaults\r\n this.pan = this.options.pan;\r\n this.volume = this.options.volume;\r\n\r\n // whether or not this object is using HTML5\r\n this.isHTML5 = false;\r\n\r\n // internal HTML5 Audio() object reference\r\n this._a = null;\r\n\r\n // for flash 8 special-case createSound() without url, followed by load/play with url case\r\n urlOmitted = (!this.url);\r\n\r\n /**\r\n * SMSound() public methods\r\n * ------------------------\r\n */\r\n\r\n this.id3 = {};\r\n\r\n /**\r\n * Writes SMSound object parameters to debug console\r\n */\r\n\r\n this._debug = function() {\r\n\r\n // <d>\r\n sm2._wD(s.id + ': Merged options:', s.options);\r\n // </d>\r\n\r\n };\r\n\r\n /**\r\n * Begins loading a sound per its *url*.\r\n *\r\n * @param {object} options Optional: Sound options\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.load = function(options) {\r\n\r\n var oSound = null, instanceOptions;\r\n\r\n if (options !== _undefined) {\r\n s._iO = mixin(options, s.options);\r\n } else {\r\n options = s.options;\r\n s._iO = options;\r\n if (lastURL && lastURL !== s.url) {\r\n _wDS('manURL');\r\n s._iO.url = s.url;\r\n s.url = null;\r\n }\r\n }\r\n\r\n if (!s._iO.url) {\r\n s._iO.url = s.url;\r\n }\r\n\r\n s._iO.url = parseURL(s._iO.url);\r\n\r\n // ensure we're in sync\r\n s.instanceOptions = s._iO;\r\n\r\n // local shortcut\r\n instanceOptions = s._iO;\r\n\r\n sm2._wD(s.id + ': load (' + instanceOptions.url + ')');\r\n\r\n if (!instanceOptions.url && !s.url) {\r\n sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);\r\n return s;\r\n }\r\n\r\n // <d>\r\n if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {\r\n // flash 8 load() -> play() won't work before onload has fired.\r\n sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);\r\n }\r\n // </d>\r\n\r\n if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {\r\n _wDS('onURL', 1);\r\n // if loaded and an onload() exists, fire immediately.\r\n if (s.readyState === 3 && instanceOptions.onload) {\r\n // assume success based on truthy duration.\r\n wrapCallback(s, function() {\r\n instanceOptions.onload.apply(s, [(!!s.duration)]);\r\n });\r\n }\r\n return s;\r\n }\r\n\r\n // reset a few state properties\r\n\r\n s.loaded = false;\r\n s.readyState = 1;\r\n s.playState = 0;\r\n s.id3 = {};\r\n\r\n // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.\r\n\r\n if (html5OK(instanceOptions)) {\r\n\r\n oSound = s._setup_html5(instanceOptions);\r\n\r\n if (!oSound._called_load) {\r\n\r\n s._html5_canplay = false;\r\n\r\n // TODO: review called_load / html5_canplay logic\r\n\r\n // if url provided directly to load(), assign it here.\r\n\r\n if (s.url !== instanceOptions.url) {\r\n\r\n sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);\r\n\r\n s._a.src = instanceOptions.url;\r\n\r\n // TODO: review / re-apply all relevant options (volume, loop, onposition etc.)\r\n\r\n // reset position for new URL\r\n s.setPosition(0);\r\n\r\n }\r\n\r\n // given explicit load call, try to preload.\r\n\r\n // early HTML5 implementation (non-standard)\r\n s._a.autobuffer = 'auto';\r\n\r\n // standard property, values: none / metadata / auto\r\n // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx\r\n s._a.preload = 'auto';\r\n\r\n s._a._called_load = true;\r\n\r\n } else {\r\n\r\n sm2._wD(s.id + ': Ignoring request to load again');\r\n\r\n }\r\n\r\n } else {\r\n\r\n if (sm2.html5Only) {\r\n sm2._wD(s.id + ': No flash support. Exiting.');\r\n return s;\r\n }\r\n\r\n if (s._iO.url && s._iO.url.match(/data:/i)) {\r\n // data: URIs not supported by Flash, either.\r\n sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');\r\n return s;\r\n }\r\n\r\n try {\r\n s.isHTML5 = false;\r\n s._iO = policyFix(loopFix(instanceOptions));\r\n // if we have \"position\", disable auto-play as we'll be seeking to that position at onload().\r\n if (s._iO.autoPlay && (s._iO.position || s._iO.from)) {\r\n sm2._wD(s.id + ': Disabling autoPlay because of non-zero offset case');\r\n s._iO.autoPlay = false;\r\n }\r\n // re-assign local shortcut\r\n instanceOptions = s._iO;\r\n if (fV === 8) {\r\n flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);\r\n } else {\r\n flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops || 1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);\r\n }\r\n } catch(e) {\r\n _wDS('smError', 2);\r\n debugTS('onload', false);\r\n catchError({\r\n type: 'SMSOUND_LOAD_JS_EXCEPTION',\r\n fatal: true\r\n });\r\n }\r\n\r\n }\r\n\r\n // after all of this, ensure sound url is up to date.\r\n s.url = instanceOptions.url;\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Unloads a sound, canceling any open HTTP requests.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.unload = function() {\r\n\r\n // Flash 8/AS2 can't \"close\" a stream - fake it by loading an empty URL\r\n // Flash 9/AS3: Close stream, preventing further load\r\n // HTML5: Most UAs will use empty URL\r\n\r\n if (s.readyState !== 0) {\r\n\r\n sm2._wD(s.id + ': unload()');\r\n\r\n if (!s.isHTML5) {\r\n\r\n if (fV === 8) {\r\n flash._unload(s.id, emptyURL);\r\n } else {\r\n flash._unload(s.id);\r\n }\r\n\r\n } else {\r\n\r\n stop_html5_timer();\r\n\r\n if (s._a) {\r\n\r\n s._a.pause();\r\n\r\n // update empty URL, too\r\n lastURL = html5Unload(s._a);\r\n\r\n }\r\n\r\n }\r\n\r\n // reset load/status flags\r\n resetProperties();\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Unloads and destroys a sound.\r\n */\r\n\r\n this.destruct = function(_bFromSM) {\r\n\r\n sm2._wD(s.id + ': Destruct');\r\n\r\n if (!s.isHTML5) {\r\n\r\n // kill sound within Flash\r\n // Disable the onfailure handler\r\n s._iO.onfailure = null;\r\n flash._destroySound(s.id);\r\n\r\n } else {\r\n\r\n stop_html5_timer();\r\n\r\n if (s._a) {\r\n s._a.pause();\r\n html5Unload(s._a);\r\n if (!useGlobalHTML5Audio) {\r\n remove_html5_events();\r\n }\r\n // break obvious circular reference\r\n s._a._s = null;\r\n s._a = null;\r\n }\r\n\r\n }\r\n\r\n if (!_bFromSM) {\r\n // ensure deletion from controller\r\n sm2.destroySound(s.id, true);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Begins playing a sound.\r\n *\r\n * @param {object} options Optional: Sound options\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.play = function(options, _updatePlayState) {\r\n\r\n var fN, allowMulti, a, onready,\r\n audioClone, onended, oncanplay,\r\n startOK = true;\r\n\r\n // <d>\r\n fN = s.id + ': play(): ';\r\n // </d>\r\n\r\n // default to true\r\n _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);\r\n\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n // first, use local URL (if specified)\r\n if (s.url) {\r\n s._iO.url = s.url;\r\n }\r\n\r\n // mix in any options defined at createSound()\r\n s._iO = mixin(s._iO, s.options);\r\n\r\n // mix in any options specific to this method\r\n s._iO = mixin(options, s._iO);\r\n\r\n s._iO.url = parseURL(s._iO.url);\r\n\r\n s.instanceOptions = s._iO;\r\n\r\n // RTMP-only\r\n if (!s.isHTML5 && s._iO.serverURL && !s.connected) {\r\n if (!s.getAutoPlay()) {\r\n sm2._wD(fN + ' Netstream not connected yet - setting autoPlay');\r\n s.setAutoPlay(true);\r\n }\r\n // play will be called in onconnect()\r\n return s;\r\n }\r\n\r\n if (html5OK(s._iO)) {\r\n s._setup_html5(s._iO);\r\n start_html5_timer();\r\n }\r\n\r\n if (s.playState === 1 && !s.paused) {\r\n\r\n allowMulti = s._iO.multiShot;\r\n\r\n if (!allowMulti) {\r\n\r\n sm2._wD(fN + 'Already playing (one-shot)', 1);\r\n\r\n if (s.isHTML5) {\r\n // go back to original position.\r\n s.setPosition(s._iO.position);\r\n }\r\n\r\n return s;\r\n\r\n }\r\n\r\n sm2._wD(fN + 'Already playing (multi-shot)', 1);\r\n\r\n }\r\n\r\n // edge case: play() with explicit URL parameter\r\n if (options.url && options.url !== s.url) {\r\n\r\n // special case for createSound() followed by load() / play() with url; avoid double-load case.\r\n if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {\r\n\r\n urlOmitted = false;\r\n\r\n } else {\r\n\r\n // load using merged options\r\n s.load(s._iO);\r\n\r\n }\r\n\r\n }\r\n\r\n if (!s.loaded) {\r\n\r\n if (s.readyState === 0) {\r\n\r\n sm2._wD(fN + 'Attempting to load');\r\n\r\n // try to get this sound playing ASAP\r\n if (!s.isHTML5 && !sm2.html5Only) {\r\n\r\n // flash: assign directly because setAutoPlay() increments the instanceCount\r\n s._iO.autoPlay = true;\r\n s.load(s._iO);\r\n\r\n } else if (s.isHTML5) {\r\n\r\n // iOS needs this when recycling sounds, loading a new URL on an existing object.\r\n s.load(s._iO);\r\n\r\n } else {\r\n\r\n sm2._wD(fN + 'Unsupported type. Exiting.');\r\n\r\n return s;\r\n\r\n }\r\n\r\n // HTML5 hack - re-set instanceOptions?\r\n s.instanceOptions = s._iO;\r\n\r\n } else if (s.readyState === 2) {\r\n\r\n sm2._wD(fN + 'Could not load - exiting', 2);\r\n\r\n return s;\r\n\r\n } else {\r\n\r\n sm2._wD(fN + 'Loading - attempting to play...');\r\n\r\n }\r\n\r\n } else {\r\n\r\n // \"play()\"\r\n sm2._wD(fN.substr(0, fN.lastIndexOf(':')));\r\n\r\n }\r\n\r\n if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {\r\n // flash 9 needs a position reset if play() is called while at the end of a sound.\r\n sm2._wD(fN + 'Sound at end, resetting to position: 0');\r\n options.position = 0;\r\n }\r\n\r\n /**\r\n * Streams will pause when their buffer is full if they are being loaded.\r\n * In this case paused is true, but the song hasn't started playing yet.\r\n * If we just call resume() the onplay() callback will never be called.\r\n * So only call resume() if the position is > 0.\r\n * Another reason is because options like volume won't have been applied yet.\r\n * For normal sounds, just resume.\r\n */\r\n\r\n if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {\r\n\r\n // https://gist.github.com/37b17df75cc4d7a90bf6\r\n sm2._wD(fN + 'Resuming from paused state', 1);\r\n s.resume();\r\n\r\n } else {\r\n\r\n s._iO = mixin(options, s._iO);\r\n\r\n /**\r\n * Preload in the event of play() with position under Flash,\r\n * or from/to parameters and non-RTMP case\r\n */\r\n if (((!s.isHTML5 && s._iO.position !== null && s._iO.position > 0) || (s._iO.from !== null && s._iO.from > 0) || s._iO.to !== null) && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {\r\n\r\n onready = function() {\r\n // sound \"canplay\" or onload()\r\n // re-apply position/from/to to instance options, and start playback\r\n s._iO = mixin(options, s._iO);\r\n s.play(s._iO);\r\n };\r\n\r\n // HTML5 needs to at least have \"canplay\" fired before seeking.\r\n if (s.isHTML5 && !s._html5_canplay) {\r\n\r\n // this hasn't been loaded yet. load it first, and then do this again.\r\n sm2._wD(fN + 'Beginning load for non-zero offset case');\r\n\r\n s.load({\r\n // note: custom HTML5-only event added for from/to implementation.\r\n _oncanplay: onready\r\n });\r\n\r\n } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {\r\n\r\n // to be safe, preload the whole thing in Flash.\r\n\r\n sm2._wD(fN + 'Preloading for non-zero offset case');\r\n\r\n s.load({\r\n onload: onready\r\n });\r\n\r\n }\r\n\r\n // otherwise, we're ready to go. re-apply local options, and continue\r\n\r\n s._iO = applyFromTo();\r\n\r\n }\r\n\r\n // sm2._wD(fN + 'Starting to play');\r\n\r\n // increment instance counter, where enabled + supported\r\n if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {\r\n s.instanceCount++;\r\n }\r\n\r\n // if first play and onposition parameters exist, apply them now\r\n if (s._iO.onposition && s.playState === 0) {\r\n attachOnPosition(s);\r\n }\r\n\r\n s.playState = 1;\r\n s.paused = false;\r\n\r\n s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);\r\n\r\n if (!s.isHTML5) {\r\n s._iO = policyFix(loopFix(s._iO));\r\n }\r\n\r\n if (s._iO.onplay && _updatePlayState) {\r\n s._iO.onplay.apply(s);\r\n onplay_called = true;\r\n }\r\n\r\n s.setVolume(s._iO.volume, true);\r\n s.setPan(s._iO.pan, true);\r\n\r\n if (s._iO.playbackRate !== 1) {\r\n s.setPlaybackRate(s._iO.playbackRate);\r\n }\r\n\r\n if (!s.isHTML5) {\r\n\r\n startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);\r\n\r\n if (fV === 9 && !startOK) {\r\n // edge case: no sound hardware, or 32-channel flash ceiling hit.\r\n // applies only to Flash 9, non-NetStream/MovieStar sounds.\r\n // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29\r\n sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);\r\n if (s._iO.onplayerror) {\r\n s._iO.onplayerror.apply(s);\r\n }\r\n\r\n }\r\n\r\n } else if (s.instanceCount < 2) {\r\n\r\n // HTML5 single-instance case\r\n\r\n start_html5_timer();\r\n\r\n a = s._setup_html5();\r\n\r\n s.setPosition(s._iO.position);\r\n\r\n a.play();\r\n\r\n } else {\r\n\r\n // HTML5 multi-shot case\r\n\r\n sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');\r\n\r\n audioClone = new Audio(s._iO.url);\r\n\r\n onended = function() {\r\n event.remove(audioClone, 'ended', onended);\r\n s._onfinish(s);\r\n // cleanup\r\n html5Unload(audioClone);\r\n audioClone = null;\r\n };\r\n\r\n oncanplay = function() {\r\n event.remove(audioClone, 'canplay', oncanplay);\r\n try {\r\n audioClone.currentTime = s._iO.position / msecScale;\r\n } catch(err) {\r\n complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position / msecScale));\r\n }\r\n audioClone.play();\r\n };\r\n\r\n event.add(audioClone, 'ended', onended);\r\n\r\n // apply volume to clones, too\r\n if (s._iO.volume !== _undefined) {\r\n audioClone.volume = Math.max(0, Math.min(1, s._iO.volume / 100));\r\n }\r\n\r\n // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.\r\n if (s.muted) {\r\n audioClone.muted = true;\r\n }\r\n\r\n if (s._iO.position) {\r\n // HTML5 audio can't seek before onplay() event has fired.\r\n // wait for canplay, then seek to position and start playback.\r\n event.add(audioClone, 'canplay', oncanplay);\r\n } else {\r\n // begin playback at currentTime: 0\r\n audioClone.play();\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n // just for convenience\r\n this.start = this.play;\r\n\r\n /**\r\n * Stops playing a sound (and optionally, all sounds)\r\n *\r\n * @param {boolean} bAll Optional: Whether to stop all sounds\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.stop = function(bAll) {\r\n\r\n var instanceOptions = s._iO,\r\n originalPosition;\r\n\r\n if (s.playState === 1) {\r\n\r\n sm2._wD(s.id + ': stop()');\r\n\r\n s._onbufferchange(0);\r\n s._resetOnPosition(0);\r\n s.paused = false;\r\n\r\n if (!s.isHTML5) {\r\n s.playState = 0;\r\n }\r\n\r\n // remove onPosition listeners, if any\r\n detachOnPosition();\r\n\r\n // and \"to\" position, if set\r\n if (instanceOptions.to) {\r\n s.clearOnPosition(instanceOptions.to);\r\n }\r\n\r\n if (!s.isHTML5) {\r\n\r\n flash._stop(s.id, bAll);\r\n\r\n // hack for netStream: just unload\r\n if (instanceOptions.serverURL) {\r\n s.unload();\r\n }\r\n\r\n } else if (s._a) {\r\n\r\n originalPosition = s.position;\r\n\r\n // act like Flash, though\r\n s.setPosition(0);\r\n\r\n // hack: reflect old position for onstop() (also like Flash)\r\n s.position = originalPosition;\r\n\r\n // html5 has no stop()\r\n // NOTE: pausing means iOS requires interaction to resume.\r\n s._a.pause();\r\n\r\n s.playState = 0;\r\n\r\n // and update UI\r\n s._onTimer();\r\n\r\n stop_html5_timer();\r\n\r\n }\r\n\r\n s.instanceCount = 0;\r\n s._iO = {};\r\n\r\n if (instanceOptions.onstop) {\r\n instanceOptions.onstop.apply(s);\r\n }\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Undocumented/internal: Sets autoPlay for RTMP.\r\n *\r\n * @param {boolean} autoPlay state\r\n */\r\n\r\n this.setAutoPlay = function(autoPlay) {\r\n\r\n sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));\r\n s._iO.autoPlay = autoPlay;\r\n\r\n if (!s.isHTML5) {\r\n flash._setAutoPlay(s.id, autoPlay);\r\n if (autoPlay) {\r\n // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)\r\n if (!s.instanceCount && s.readyState === 1) {\r\n s.instanceCount++;\r\n sm2._wD(s.id + ': Incremented instance count to ' + s.instanceCount);\r\n }\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Undocumented/internal: Returns the autoPlay boolean.\r\n *\r\n * @return {boolean} The current autoPlay value\r\n */\r\n\r\n this.getAutoPlay = function() {\r\n\r\n return s._iO.autoPlay;\r\n\r\n };\r\n\r\n /**\r\n * Sets the playback rate of a sound (HTML5-only.)\r\n *\r\n * @param {number} playbackRate (+/-)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPlaybackRate = function(playbackRate) {\r\n\r\n // Per Mozilla, limit acceptable values to prevent playback from stopping (unless allowOverride is truthy.)\r\n // https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained\r\n var normalizedRate = Math.max(0.5, Math.min(4, playbackRate));\r\n\r\n // <d>\r\n if (normalizedRate !== playbackRate) {\r\n sm2._wD(s.id + ': setPlaybackRate(' + playbackRate + '): limiting rate to ' + normalizedRate, 2);\r\n }\r\n // </d>\r\n\r\n if (s.isHTML5) {\r\n try {\r\n s._iO.playbackRate = normalizedRate;\r\n s._a.playbackRate = normalizedRate;\r\n } catch(e) {\r\n sm2._wD(s.id + ': setPlaybackRate(' + normalizedRate + ') failed: ' + e.message, 2);\r\n }\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Sets the position of a sound.\r\n *\r\n * @param {number} nMsecOffset Position (milliseconds)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPosition = function(nMsecOffset) {\r\n\r\n if (nMsecOffset === _undefined) {\r\n nMsecOffset = 0;\r\n }\r\n\r\n var position, position1K,\r\n // Use the duration from the instance options, if we don't have a track duration yet.\r\n // position >= 0 and <= current available (loaded) duration\r\n offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));\r\n\r\n s.position = offset;\r\n position1K = s.position / msecScale;\r\n s._resetOnPosition(s.position);\r\n s._iO.position = offset;\r\n\r\n if (!s.isHTML5) {\r\n\r\n position = (fV === 9 ? s.position : position1K);\r\n\r\n if (s.readyState && s.readyState !== 2) {\r\n // if paused or not playing, will not resume (by playing)\r\n flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);\r\n }\r\n\r\n } else if (s._a) {\r\n\r\n // Set the position in the canplay handler if the sound is not ready yet\r\n if (s._html5_canplay) {\r\n\r\n if (s._a.currentTime.toFixed(3) !== position1K.toFixed(3)) {\r\n\r\n /**\r\n * DOM/JS errors/exceptions to watch out for:\r\n * if seek is beyond (loaded?) position, \"DOM exception 11\"\r\n * \"INDEX_SIZE_ERR\": DOM exception 1\r\n */\r\n sm2._wD(s.id + ': setPosition(' + position1K + ')');\r\n\r\n try {\r\n s._a.currentTime = position1K;\r\n if (s.playState === 0 || s.paused) {\r\n // allow seek without auto-play/resume\r\n s._a.pause();\r\n }\r\n } catch(e) {\r\n sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);\r\n }\r\n\r\n }\r\n\r\n } else if (position1K) {\r\n\r\n // warn on non-zero seek attempts\r\n sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);\r\n return s;\r\n\r\n }\r\n\r\n if (s.paused) {\r\n\r\n // if paused, refresh UI right away by forcing update\r\n s._onTimer(true);\r\n\r\n }\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Pauses sound playback.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.pause = function(_bCallFlash) {\r\n\r\n if (s.paused || (s.playState === 0 && s.readyState !== 1)) return s;\r\n\r\n sm2._wD(s.id + ': pause()');\r\n s.paused = true;\r\n\r\n if (!s.isHTML5) {\r\n if (_bCallFlash || _bCallFlash === _undefined) {\r\n flash._pause(s.id, s._iO.multiShot);\r\n }\r\n } else {\r\n s._setup_html5().pause();\r\n stop_html5_timer();\r\n }\r\n\r\n if (s._iO.onpause) {\r\n s._iO.onpause.apply(s);\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Resumes sound playback.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n /**\r\n * When auto-loaded streams pause on buffer full they have a playState of 0.\r\n * We need to make sure that the playState is set to 1 when these streams \"resume\".\r\n * When a paused stream is resumed, we need to trigger the onplay() callback if it\r\n * hasn't been called already. In this case since the sound is being played for the\r\n * first time, I think it's more appropriate to call onplay() rather than onresume().\r\n */\r\n\r\n this.resume = function() {\r\n\r\n var instanceOptions = s._iO;\r\n\r\n if (!s.paused) return s;\r\n\r\n sm2._wD(s.id + ': resume()');\r\n s.paused = false;\r\n s.playState = 1;\r\n\r\n if (!s.isHTML5) {\r\n\r\n if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {\r\n // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.\r\n s.setPosition(s.position);\r\n }\r\n\r\n // flash method is toggle-based (pause/resume)\r\n flash._pause(s.id, instanceOptions.multiShot);\r\n\r\n } else {\r\n\r\n s._setup_html5().play();\r\n start_html5_timer();\r\n\r\n }\r\n\r\n if (!onplay_called && instanceOptions.onplay) {\r\n\r\n instanceOptions.onplay.apply(s);\r\n onplay_called = true;\r\n\r\n } else if (instanceOptions.onresume) {\r\n\r\n instanceOptions.onresume.apply(s);\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Toggles sound playback.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.togglePause = function() {\r\n\r\n sm2._wD(s.id + ': togglePause()');\r\n\r\n if (s.playState === 0) {\r\n s.play({\r\n position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)\r\n });\r\n return s;\r\n }\r\n\r\n if (s.paused) {\r\n s.resume();\r\n } else {\r\n s.pause();\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Sets the panning (L-R) effect.\r\n *\r\n * @param {number} nPan The pan value (-100 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPan = function(nPan, bInstanceOnly) {\r\n\r\n if (nPan === _undefined) {\r\n nPan = 0;\r\n }\r\n\r\n if (bInstanceOnly === _undefined) {\r\n bInstanceOnly = false;\r\n }\r\n\r\n if (!s.isHTML5) {\r\n flash._setPan(s.id, nPan);\r\n } // else { no HTML5 pan? }\r\n\r\n s._iO.pan = nPan;\r\n\r\n if (!bInstanceOnly) {\r\n s.pan = nPan;\r\n s.options.pan = nPan;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Sets the volume.\r\n *\r\n * @param {number} nVol The volume value (0 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setVolume = function(nVol, _bInstanceOnly) {\r\n\r\n /**\r\n * Note: Setting volume has no effect on iOS \"special snowflake\" devices.\r\n * Hardware volume control overrides software, and volume\r\n * will always return 1 per Apple docs. (iOS 4 + 5.)\r\n * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html\r\n */\r\n\r\n if (nVol === _undefined) {\r\n nVol = 100;\r\n }\r\n\r\n if (_bInstanceOnly === _undefined) {\r\n _bInstanceOnly = false;\r\n }\r\n\r\n if (!s.isHTML5) {\r\n\r\n flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted ? 0 : nVol);\r\n\r\n } else if (s._a) {\r\n\r\n if (sm2.muted && !s.muted) {\r\n s.muted = true;\r\n s._a.muted = true;\r\n }\r\n\r\n // valid range for native HTML5 Audio(): 0-1\r\n s._a.volume = Math.max(0, Math.min(1, nVol / 100));\r\n\r\n }\r\n\r\n s._iO.volume = nVol;\r\n\r\n if (!_bInstanceOnly) {\r\n s.volume = nVol;\r\n s.options.volume = nVol;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Mutes the sound.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.mute = function() {\r\n\r\n s.muted = true;\r\n\r\n if (!s.isHTML5) {\r\n flash._setVolume(s.id, 0);\r\n } else if (s._a) {\r\n s._a.muted = true;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Unmutes the sound.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.unmute = function() {\r\n\r\n s.muted = false;\r\n var hasIO = (s._iO.volume !== _undefined);\r\n\r\n if (!s.isHTML5) {\r\n flash._setVolume(s.id, hasIO ? s._iO.volume : s.options.volume);\r\n } else if (s._a) {\r\n s._a.muted = false;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Toggles the muted state of a sound.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.toggleMute = function() {\r\n\r\n return (s.muted ? s.unmute() : s.mute());\r\n\r\n };\r\n\r\n /**\r\n * Registers a callback to be fired when a sound reaches a given position during playback.\r\n *\r\n * @param {number} nPosition The position to watch for\r\n * @param {function} oMethod The relevant callback to fire\r\n * @param {object} oScope Optional: The scope to apply the callback to\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.onPosition = function(nPosition, oMethod, oScope) {\r\n\r\n // TODO: basic dupe checking?\r\n\r\n onPositionItems.push({\r\n position: parseInt(nPosition, 10),\r\n method: oMethod,\r\n scope: (oScope !== _undefined ? oScope : s),\r\n fired: false\r\n });\r\n\r\n return s;\r\n\r\n };\r\n\r\n // legacy/backwards-compability: lower-case method name\r\n this.onposition = this.onPosition;\r\n\r\n /**\r\n * Removes registered callback(s) from a sound, by position and/or callback.\r\n *\r\n * @param {number} nPosition The position to clear callback(s) for\r\n * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.clearOnPosition = function(nPosition, oMethod) {\r\n\r\n var i;\r\n\r\n nPosition = parseInt(nPosition, 10);\r\n\r\n if (isNaN(nPosition)) {\r\n // safety check\r\n return;\r\n }\r\n\r\n for (i = 0; i < onPositionItems.length; i++) {\r\n\r\n if (nPosition === onPositionItems[i].position) {\r\n // remove this item if no method was specified, or, if the method matches\r\n\r\n if (!oMethod || (oMethod === onPositionItems[i].method)) {\r\n\r\n if (onPositionItems[i].fired) {\r\n // decrement \"fired\" counter, too\r\n onPositionFired--;\r\n }\r\n\r\n onPositionItems.splice(i, 1);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n this._processOnPosition = function() {\r\n\r\n var i, item, j = onPositionItems.length;\r\n\r\n if (!j || !s.playState || onPositionFired >= j) return false;\r\n\r\n for (i = j - 1; i >= 0; i--) {\r\n\r\n item = onPositionItems[i];\r\n\r\n if (!item.fired && s.position >= item.position) {\r\n\r\n item.fired = true;\r\n onPositionFired++;\r\n item.method.apply(item.scope, [item.position]);\r\n\r\n // reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.\r\n j = onPositionItems.length;\r\n\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n this._resetOnPosition = function(nPosition) {\r\n\r\n // reset \"fired\" for items interested in this position\r\n var i, item, j = onPositionItems.length;\r\n\r\n if (!j) return false;\r\n\r\n for (i = j - 1; i >= 0; i--) {\r\n\r\n item = onPositionItems[i];\r\n\r\n if (item.fired && nPosition <= item.position) {\r\n item.fired = false;\r\n onPositionFired--;\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * SMSound() private internals\r\n * --------------------------------\r\n */\r\n\r\n applyFromTo = function() {\r\n\r\n var instanceOptions = s._iO,\r\n f = instanceOptions.from,\r\n t = instanceOptions.to,\r\n start, end;\r\n\r\n end = function() {\r\n\r\n // end has been reached.\r\n sm2._wD(s.id + ': \"To\" time of ' + t + ' reached.');\r\n\r\n // detach listener\r\n s.clearOnPosition(t, end);\r\n\r\n // stop should clear this, too\r\n s.stop();\r\n\r\n };\r\n\r\n start = function() {\r\n\r\n sm2._wD(s.id + ': Playing \"from\" ' + f);\r\n\r\n // add listener for end\r\n if (t !== null && !isNaN(t)) {\r\n s.onPosition(t, end);\r\n }\r\n\r\n };\r\n\r\n if (f !== null && !isNaN(f)) {\r\n\r\n // apply to instance options, guaranteeing correct start position.\r\n instanceOptions.position = f;\r\n\r\n // multiShot timing can't be tracked, so prevent that.\r\n instanceOptions.multiShot = false;\r\n\r\n start();\r\n\r\n }\r\n\r\n // return updated instanceOptions including starting position\r\n return instanceOptions;\r\n\r\n };\r\n\r\n attachOnPosition = function() {\r\n\r\n var item,\r\n op = s._iO.onposition;\r\n\r\n // attach onposition things, if any, now.\r\n\r\n if (op) {\r\n\r\n for (item in op) {\r\n if (op.hasOwnProperty(item)) {\r\n s.onPosition(parseInt(item, 10), op[item]);\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n detachOnPosition = function() {\r\n\r\n var item,\r\n op = s._iO.onposition;\r\n\r\n // detach any onposition()-style listeners.\r\n\r\n if (op) {\r\n\r\n for (item in op) {\r\n if (op.hasOwnProperty(item)) {\r\n s.clearOnPosition(parseInt(item, 10));\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n start_html5_timer = function() {\r\n\r\n if (s.isHTML5) {\r\n startTimer(s);\r\n }\r\n\r\n };\r\n\r\n stop_html5_timer = function() {\r\n\r\n if (s.isHTML5) {\r\n stopTimer(s);\r\n }\r\n\r\n };\r\n\r\n resetProperties = function(retainPosition) {\r\n\r\n if (!retainPosition) {\r\n onPositionItems = [];\r\n onPositionFired = 0;\r\n }\r\n\r\n onplay_called = false;\r\n\r\n s._hasTimer = null;\r\n s._a = null;\r\n s._html5_canplay = false;\r\n s.bytesLoaded = null;\r\n s.bytesTotal = null;\r\n s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);\r\n s.durationEstimate = null;\r\n s.buffered = [];\r\n\r\n // legacy: 1D array\r\n s.eqData = [];\r\n\r\n s.eqData.left = [];\r\n s.eqData.right = [];\r\n\r\n s.failures = 0;\r\n s.isBuffering = false;\r\n s.instanceOptions = {};\r\n s.instanceCount = 0;\r\n s.loaded = false;\r\n s.metadata = {};\r\n\r\n // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r\n s.readyState = 0;\r\n\r\n s.muted = false;\r\n s.paused = false;\r\n\r\n s.peakData = {\r\n left: 0,\r\n right: 0\r\n };\r\n\r\n s.waveformData = {\r\n left: [],\r\n right: []\r\n };\r\n\r\n s.playState = 0;\r\n s.position = null;\r\n\r\n s.id3 = {};\r\n\r\n };\r\n\r\n resetProperties();\r\n\r\n /**\r\n * Pseudo-private SMSound internals\r\n * --------------------------------\r\n */\r\n\r\n this._onTimer = function(bForce) {\r\n\r\n /**\r\n * HTML5-only _whileplaying() etc.\r\n * called from both HTML5 native events, and polling/interval-based timers\r\n * mimics flash and fires only when time/duration change, so as to be polling-friendly\r\n */\r\n\r\n var duration, isNew = false, time, x = {};\r\n\r\n if (s._hasTimer || bForce) {\r\n\r\n // TODO: May not need to track readyState (1 = loading)\r\n\r\n if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {\r\n\r\n duration = s._get_html5_duration();\r\n\r\n if (duration !== lastHTML5State.duration) {\r\n\r\n lastHTML5State.duration = duration;\r\n s.duration = duration;\r\n isNew = true;\r\n\r\n }\r\n\r\n // TODO: investigate why this goes wack if not set/re-set each time.\r\n s.durationEstimate = s.duration;\r\n\r\n time = (s._a.currentTime * msecScale || 0);\r\n\r\n if (time !== lastHTML5State.time) {\r\n\r\n lastHTML5State.time = time;\r\n isNew = true;\r\n\r\n }\r\n\r\n if (isNew || bForce) {\r\n\r\n s._whileplaying(time, x, x, x, x);\r\n\r\n }\r\n\r\n }/* else {\r\n\r\n // sm2._wD('_onTimer: Warn for \"'+s.id+'\": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));\r\n\r\n return false;\r\n\r\n }*/\r\n\r\n }\r\n\r\n return isNew;\r\n\r\n };\r\n\r\n this._get_html5_duration = function() {\r\n\r\n var instanceOptions = s._iO,\r\n // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null\r\n d = (s._a && s._a.duration ? s._a.duration * msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),\r\n result = (d && !isNaN(d) && d !== Infinity ? d : null);\r\n\r\n return result;\r\n\r\n };\r\n\r\n this._apply_loop = function(a, nLoops) {\r\n\r\n /**\r\n * boolean instead of \"loop\", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop\r\n * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.\r\n */\r\n\r\n // <d>\r\n if (!a.loop && nLoops > 1) {\r\n sm2._wD('Note: Native HTML5 looping is infinite.', 1);\r\n }\r\n // </d>\r\n\r\n a.loop = (nLoops > 1 ? 'loop' : '');\r\n\r\n };\r\n\r\n this._setup_html5 = function(options) {\r\n\r\n var instanceOptions = mixin(s._iO, options),\r\n a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,\r\n dURL = decodeURI(instanceOptions.url),\r\n sameURL;\r\n\r\n /**\r\n * \"First things first, I, Poppa...\" (reset the previous state of the old sound, if playing)\r\n * Fixes case with devices that can only play one sound at a time\r\n * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state\r\n */\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n if (dURL === decodeURI(lastGlobalHTML5URL)) {\r\n // global HTML5 audio: re-use of URL\r\n sameURL = true;\r\n }\r\n\r\n } else if (dURL === decodeURI(lastURL)) {\r\n\r\n // options URL is the same as the \"last\" URL, and we used (loaded) it\r\n sameURL = true;\r\n\r\n }\r\n\r\n if (a) {\r\n\r\n if (a._s) {\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n if (a._s && a._s.playState && !sameURL) {\r\n\r\n // global HTML5 audio case, and loading a new URL. stop the currently-playing one.\r\n a._s.stop();\r\n\r\n }\r\n\r\n } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {\r\n\r\n // non-global HTML5 reuse case: same url, ignore request\r\n s._apply_loop(a, instanceOptions.loops);\r\n\r\n return a;\r\n\r\n }\r\n\r\n }\r\n\r\n if (!sameURL) {\r\n\r\n // don't retain onPosition() stuff with new URLs.\r\n\r\n if (lastURL) {\r\n resetProperties(false);\r\n }\r\n\r\n // assign new HTML5 URL\r\n\r\n a.src = instanceOptions.url;\r\n\r\n s.url = instanceOptions.url;\r\n\r\n lastURL = instanceOptions.url;\r\n\r\n lastGlobalHTML5URL = instanceOptions.url;\r\n\r\n a._called_load = false;\r\n\r\n }\r\n\r\n } else {\r\n\r\n if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n s._a = new Audio(instanceOptions.url);\r\n s._a.load();\r\n\r\n } else {\r\n\r\n // null for stupid Opera 9.64 case\r\n s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());\r\n\r\n }\r\n\r\n // assign local reference\r\n a = s._a;\r\n\r\n a._called_load = false;\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n globalHTML5Audio = a;\r\n\r\n }\r\n\r\n }\r\n\r\n s.isHTML5 = true;\r\n\r\n // store a ref on the track\r\n s._a = a;\r\n\r\n // store a ref on the audio\r\n a._s = s;\r\n\r\n add_html5_events();\r\n\r\n s._apply_loop(a, instanceOptions.loops);\r\n\r\n if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n s.load();\r\n\r\n } else {\r\n\r\n // early HTML5 implementation (non-standard)\r\n a.autobuffer = false;\r\n\r\n // standard ('none' is also an option.)\r\n a.preload = 'auto';\r\n\r\n }\r\n\r\n return a;\r\n\r\n };\r\n\r\n add_html5_events = function() {\r\n\r\n if (s._a._added_events) return false;\r\n\r\n var f;\r\n\r\n function add(oEvt, oFn, bCapture) {\r\n return s._a ? s._a.addEventListener(oEvt, oFn, bCapture || false) : null;\r\n }\r\n\r\n s._a._added_events = true;\r\n\r\n for (f in html5_events) {\r\n if (html5_events.hasOwnProperty(f)) {\r\n add(f, html5_events[f]);\r\n }\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n remove_html5_events = function() {\r\n\r\n // Remove event listeners\r\n\r\n var f;\r\n\r\n function remove(oEvt, oFn, bCapture) {\r\n return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture || false) : null);\r\n }\r\n\r\n sm2._wD(s.id + ': Removing event listeners');\r\n s._a._added_events = false;\r\n\r\n for (f in html5_events) {\r\n if (html5_events.hasOwnProperty(f)) {\r\n remove(f, html5_events[f]);\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Pseudo-private event internals\r\n * ------------------------------\r\n */\r\n\r\n this._onload = function(nSuccess) {\r\n\r\n var fN,\r\n // check for duration to prevent false positives from flash 8 when loading from cache.\r\n loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);\r\n\r\n // <d>\r\n fN = s.id + ': ';\r\n sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));\r\n\r\n if (!loadOK && !s.isHTML5) {\r\n if (sm2.sandbox.noRemote === true) {\r\n sm2._wD(fN + str('noNet'), 1);\r\n }\r\n if (sm2.sandbox.noLocal === true) {\r\n sm2._wD(fN + str('noLocal'), 1);\r\n }\r\n }\r\n // </d>\r\n\r\n s.loaded = loadOK;\r\n s.readyState = (loadOK ? 3 : 2);\r\n s._onbufferchange(0);\r\n\r\n if (!loadOK && !s.isHTML5) {\r\n // note: no error code from Flash.\r\n s._onerror();\r\n }\r\n\r\n if (s._iO.onload) {\r\n wrapCallback(s, function() {\r\n s._iO.onload.apply(s, [loadOK]);\r\n });\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n this._onerror = function(errorCode, description) {\r\n\r\n // https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n if (s._iO.onerror) {\r\n wrapCallback(s, function() {\r\n s._iO.onerror.apply(s, [errorCode, description]);\r\n });\r\n }\r\n\r\n };\r\n\r\n this._onbufferchange = function(nIsBuffering) {\r\n\r\n // ignore if not playing\r\n if (s.playState === 0) return false;\r\n\r\n if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) return false;\r\n\r\n s.isBuffering = (nIsBuffering === 1);\r\n\r\n if (s._iO.onbufferchange) {\r\n sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);\r\n s._iO.onbufferchange.apply(s, [nIsBuffering]);\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Playback may have stopped due to buffering, or related reason.\r\n * This state can be encountered on iOS < 6 when auto-play is blocked.\r\n */\r\n\r\n this._onsuspend = function() {\r\n\r\n if (s._iO.onsuspend) {\r\n sm2._wD(s.id + ': Playback suspended');\r\n s._iO.onsuspend.apply(s);\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * flash 9/movieStar + RTMP-only method, should fire only once at most\r\n * at this point we just recreate failed sounds rather than trying to reconnect\r\n */\r\n\r\n this._onfailure = function(msg, level, code) {\r\n\r\n s.failures++;\r\n sm2._wD(s.id + ': Failure (' + s.failures + '): ' + msg);\r\n\r\n if (s._iO.onfailure && s.failures === 1) {\r\n s._iO.onfailure(msg, level, code);\r\n } else {\r\n sm2._wD(s.id + ': Ignoring failure');\r\n }\r\n\r\n };\r\n\r\n /**\r\n * flash 9/movieStar + RTMP-only method for unhandled warnings/exceptions from Flash\r\n * e.g., RTMP \"method missing\" warning (non-fatal) for getStreamLength on server\r\n */\r\n\r\n this._onwarning = function(msg, level, code) {\r\n\r\n if (s._iO.onwarning) {\r\n s._iO.onwarning(msg, level, code);\r\n }\r\n\r\n };\r\n\r\n this._onfinish = function() {\r\n\r\n // store local copy before it gets trashed...\r\n var io_onfinish = s._iO.onfinish;\r\n\r\n s._onbufferchange(0);\r\n s._resetOnPosition(0);\r\n\r\n // reset some state items\r\n if (s.instanceCount) {\r\n\r\n s.instanceCount--;\r\n\r\n if (!s.instanceCount) {\r\n\r\n // remove onPosition listeners, if any\r\n detachOnPosition();\r\n\r\n // reset instance options\r\n s.playState = 0;\r\n s.paused = false;\r\n s.instanceCount = 0;\r\n s.instanceOptions = {};\r\n s._iO = {};\r\n stop_html5_timer();\r\n\r\n // reset position, too\r\n if (s.isHTML5) {\r\n s.position = 0;\r\n }\r\n\r\n }\r\n\r\n if (!s.instanceCount || s._iO.multiShotEvents) {\r\n // fire onfinish for last, or every instance\r\n if (io_onfinish) {\r\n sm2._wD(s.id + ': onfinish()');\r\n wrapCallback(s, function() {\r\n io_onfinish.apply(s);\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {\r\n\r\n var instanceOptions = s._iO;\r\n\r\n s.bytesLoaded = nBytesLoaded;\r\n s.bytesTotal = nBytesTotal;\r\n s.duration = Math.floor(nDuration);\r\n s.bufferLength = nBufferLength;\r\n\r\n if (!s.isHTML5 && !instanceOptions.isMovieStar) {\r\n\r\n if (instanceOptions.duration) {\r\n // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.\r\n s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;\r\n } else {\r\n s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);\r\n }\r\n\r\n } else {\r\n\r\n s.durationEstimate = s.duration;\r\n\r\n }\r\n\r\n // for flash, reflect sequential-load-style buffering\r\n if (!s.isHTML5) {\r\n s.buffered = [{\r\n start: 0,\r\n end: s.duration\r\n }];\r\n }\r\n\r\n // allow whileloading to fire even if \"load\" fired under HTML5, due to HTTP range/partials\r\n if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {\r\n instanceOptions.whileloading.apply(s);\r\n }\r\n\r\n };\r\n\r\n this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {\r\n\r\n var instanceOptions = s._iO,\r\n eqLeft;\r\n\r\n // flash safety net\r\n if (isNaN(nPosition) || nPosition === null) return false;\r\n\r\n // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.\r\n s.position = Math.max(0, nPosition);\r\n\r\n s._processOnPosition();\r\n\r\n if (!s.isHTML5 && fV > 8) {\r\n\r\n if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {\r\n s.peakData = {\r\n left: oPeakData.leftPeak,\r\n right: oPeakData.rightPeak\r\n };\r\n }\r\n\r\n if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {\r\n s.waveformData = {\r\n left: oWaveformDataLeft.split(','),\r\n right: oWaveformDataRight.split(',')\r\n };\r\n }\r\n\r\n if (instanceOptions.useEQData) {\r\n if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {\r\n eqLeft = oEQData.leftEQ.split(',');\r\n s.eqData = eqLeft;\r\n s.eqData.left = eqLeft;\r\n if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {\r\n s.eqData.right = oEQData.rightEQ.split(',');\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n if (s.playState === 1) {\r\n\r\n // special case/hack: ensure buffering is false if loading from cache (and not yet started)\r\n if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {\r\n s._onbufferchange(0);\r\n }\r\n\r\n if (instanceOptions.whileplaying) {\r\n // flash may call after actual finish\r\n instanceOptions.whileplaying.apply(s);\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n this._oncaptiondata = function(oData) {\r\n\r\n /**\r\n * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n *\r\n * @param {object} oData\r\n */\r\n\r\n sm2._wD(s.id + ': Caption data received.');\r\n\r\n s.captiondata = oData;\r\n\r\n if (s._iO.oncaptiondata) {\r\n s._iO.oncaptiondata.apply(s, [oData]);\r\n }\r\n\r\n };\r\n\r\n this._onmetadata = function(oMDProps, oMDData) {\r\n\r\n /**\r\n * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n * RTMP may include song title, MovieStar content may include encoding info\r\n *\r\n * @param {array} oMDProps (names)\r\n * @param {array} oMDData (values)\r\n */\r\n\r\n sm2._wD(s.id + ': Metadata received.');\r\n\r\n var oData = {}, i, j;\r\n\r\n for (i = 0, j = oMDProps.length; i < j; i++) {\r\n oData[oMDProps[i]] = oMDData[i];\r\n }\r\n\r\n s.metadata = oData;\r\n\r\n if (s._iO.onmetadata) {\r\n s._iO.onmetadata.call(s, s.metadata);\r\n }\r\n\r\n };\r\n\r\n this._onid3 = function(oID3Props, oID3Data) {\r\n\r\n /**\r\n * internal: flash 8 + flash 9 ID3 feature\r\n * may include artist, song title etc.\r\n *\r\n * @param {array} oID3Props (names)\r\n * @param {array} oID3Data (values)\r\n */\r\n\r\n sm2._wD(s.id + ': ID3 data received.');\r\n\r\n var oData = [], i, j;\r\n\r\n for (i = 0, j = oID3Props.length; i < j; i++) {\r\n oData[oID3Props[i]] = oID3Data[i];\r\n }\r\n\r\n s.id3 = mixin(s.id3, oData);\r\n\r\n if (s._iO.onid3) {\r\n s._iO.onid3.apply(s);\r\n }\r\n\r\n };\r\n\r\n // flash/RTMP-only\r\n\r\n this._onconnect = function(bSuccess) {\r\n\r\n bSuccess = (bSuccess === 1);\r\n sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));\r\n s.connected = bSuccess;\r\n\r\n if (bSuccess) {\r\n\r\n s.failures = 0;\r\n\r\n if (idCheck(s.id)) {\r\n if (s.getAutoPlay()) {\r\n // only update the play state if auto playing\r\n s.play(_undefined, s.getAutoPlay());\r\n } else if (s._iO.autoLoad) {\r\n s.load();\r\n }\r\n }\r\n\r\n if (s._iO.onconnect) {\r\n s._iO.onconnect.apply(s, [bSuccess]);\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n this._ondataerror = function(sError) {\r\n\r\n // flash 9 wave/eq data handler\r\n // hack: called at start, and end from flash at/after onfinish()\r\n if (s.playState > 0) {\r\n sm2._wD(s.id + ': Data error: ' + sError);\r\n if (s._iO.ondataerror) {\r\n s._iO.ondataerror.apply(s);\r\n }\r\n }\r\n\r\n };\r\n\r\n // <d>\r\n this._debug();\r\n // </d>\r\n\r\n }; // SMSound()\r\n\r\n /**\r\n * Private SoundManager internals\r\n * ------------------------------\r\n */\r\n\r\n getDocument = function() {\r\n\r\n return (doc.body || doc.getElementsByTagName('div')[0]);\r\n\r\n };\r\n\r\n id = function(sID) {\r\n\r\n return doc.getElementById(sID);\r\n\r\n };\r\n\r\n mixin = function(oMain, oAdd) {\r\n\r\n // non-destructive merge\r\n var o1 = (oMain || {}), o2, o;\r\n\r\n // if unspecified, o2 is the default options object\r\n o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);\r\n\r\n for (o in o2) {\r\n\r\n if (o2.hasOwnProperty(o) && o1[o] === _undefined) {\r\n\r\n if (typeof o2[o] !== 'object' || o2[o] === null) {\r\n\r\n // assign directly\r\n o1[o] = o2[o];\r\n\r\n } else {\r\n\r\n // recurse through o2\r\n o1[o] = mixin(o1[o], o2[o]);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return o1;\r\n\r\n };\r\n\r\n wrapCallback = function(oSound, callback) {\r\n\r\n /**\r\n * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue\r\n * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).\r\n * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.\r\n * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.\r\n * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player\r\n */\r\n if (!oSound.isHTML5 && fV === 8) {\r\n window.setTimeout(callback, 0);\r\n } else {\r\n callback();\r\n }\r\n\r\n };\r\n\r\n // additional soundManager properties that soundManager.setup() will accept\r\n\r\n extraOptions = {\r\n onready: 1,\r\n ontimeout: 1,\r\n defaultOptions: 1,\r\n flash9Options: 1,\r\n movieStarOptions: 1\r\n };\r\n\r\n assign = function(o, oParent) {\r\n\r\n /**\r\n * recursive assignment of properties, soundManager.setup() helper\r\n * allows property assignment based on whitelist\r\n */\r\n\r\n var i,\r\n result = true,\r\n hasParent = (oParent !== _undefined),\r\n setupOptions = sm2.setupOptions,\r\n bonusOptions = extraOptions;\r\n\r\n // <d>\r\n\r\n // if soundManager.setup() called, show accepted parameters.\r\n\r\n if (o === _undefined) {\r\n\r\n result = [];\r\n\r\n for (i in setupOptions) {\r\n\r\n if (setupOptions.hasOwnProperty(i)) {\r\n result.push(i);\r\n }\r\n\r\n }\r\n\r\n for (i in bonusOptions) {\r\n\r\n if (bonusOptions.hasOwnProperty(i)) {\r\n\r\n if (typeof sm2[i] === 'object') {\r\n result.push(i + ': {...}');\r\n } else if (sm2[i] instanceof Function) {\r\n result.push(i + ': function() {...}');\r\n } else {\r\n result.push(i);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n sm2._wD(str('setup', result.join(', ')));\r\n\r\n return false;\r\n\r\n }\r\n\r\n // </d>\r\n\r\n for (i in o) {\r\n\r\n if (o.hasOwnProperty(i)) {\r\n\r\n // if not an {object} we want to recurse through...\r\n\r\n if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {\r\n\r\n // check \"allowed\" options\r\n\r\n if (hasParent && bonusOptions[oParent] !== _undefined) {\r\n\r\n // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }\r\n sm2[oParent][i] = o[i];\r\n\r\n } else if (setupOptions[i] !== _undefined) {\r\n\r\n // special case: assign to setupOptions object, which soundManager property references\r\n sm2.setupOptions[i] = o[i];\r\n\r\n // assign directly to soundManager, too\r\n sm2[i] = o[i];\r\n\r\n } else if (bonusOptions[i] === _undefined) {\r\n\r\n // invalid or disallowed parameter. complain.\r\n complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n result = false;\r\n\r\n } else if (sm2[i] instanceof Function) {\r\n\r\n /**\r\n * valid extraOptions (bonusOptions) parameter.\r\n * is it a method, like onready/ontimeout? call it.\r\n * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});\r\n */\r\n sm2[i].apply(sm2, (o[i] instanceof Array ? o[i] : [o[i]]));\r\n\r\n } else {\r\n\r\n // good old-fashioned direct assignment\r\n sm2[i] = o[i];\r\n\r\n }\r\n\r\n } else if (bonusOptions[i] === _undefined) {\r\n\r\n // recursion case, eg., { defaultOptions: { ... } }\r\n\r\n // invalid or disallowed parameter. complain.\r\n complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n result = false;\r\n\r\n } else {\r\n\r\n // recurse through object\r\n return assign(o[i], i);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n function preferFlashCheck(kind) {\r\n\r\n // whether flash should play a given type\r\n return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));\r\n\r\n }\r\n\r\n /**\r\n * Internal DOM2-level event helpers\r\n * ---------------------------------\r\n */\r\n\r\n event = (function() {\r\n\r\n // normalize event methods\r\n var old = (window.attachEvent),\r\n evt = {\r\n add: (old ? 'attachEvent' : 'addEventListener'),\r\n remove: (old ? 'detachEvent' : 'removeEventListener')\r\n };\r\n\r\n // normalize \"on\" event prefix, optional capture argument\r\n function getArgs(oArgs) {\r\n\r\n var args = slice.call(oArgs),\r\n len = args.length;\r\n\r\n if (old) {\r\n // prefix\r\n args[1] = 'on' + args[1];\r\n if (len > 3) {\r\n // no capture\r\n args.pop();\r\n }\r\n } else if (len === 3) {\r\n args.push(false);\r\n }\r\n\r\n return args;\r\n\r\n }\r\n\r\n function apply(args, sType) {\r\n\r\n // normalize and call the event method, with the proper arguments\r\n var element = args.shift(),\r\n method = [evt[sType]];\r\n\r\n if (old) {\r\n // old IE can't do apply().\r\n element[method](args[0], args[1]);\r\n } else {\r\n element[method].apply(element, args);\r\n }\r\n\r\n }\r\n\r\n function add() {\r\n apply(getArgs(arguments), 'add');\r\n }\r\n\r\n function remove() {\r\n apply(getArgs(arguments), 'remove');\r\n }\r\n\r\n return {\r\n add: add,\r\n remove: remove\r\n };\r\n\r\n }());\r\n\r\n /**\r\n * Internal HTML5 event handling\r\n * -----------------------------\r\n */\r\n\r\n function html5_event(oFn) {\r\n\r\n // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds\r\n\r\n return function(e) {\r\n\r\n var s = this._s,\r\n result;\r\n\r\n if (!s || !s._a) {\r\n // <d>\r\n if (s && s.id) {\r\n sm2._wD(s.id + ': Ignoring ' + e.type);\r\n } else {\r\n sm2._wD(h5 + 'Ignoring ' + e.type);\r\n }\r\n // </d>\r\n result = null;\r\n } else {\r\n result = oFn.call(this, e);\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n }\r\n\r\n html5_events = {\r\n\r\n // HTML5 event-name-to-handler map\r\n\r\n abort: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': abort');\r\n\r\n }),\r\n\r\n // enough has loaded to play\r\n\r\n canplay: html5_event(function() {\r\n\r\n var s = this._s,\r\n position1K;\r\n\r\n if (s._html5_canplay) {\r\n // this event has already fired. ignore.\r\n return;\r\n }\r\n\r\n s._html5_canplay = true;\r\n sm2._wD(s.id + ': canplay');\r\n s._onbufferchange(0);\r\n\r\n // position according to instance options\r\n position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position / msecScale : null);\r\n\r\n // set the position if position was provided before the sound loaded\r\n if (this.currentTime !== position1K) {\r\n sm2._wD(s.id + ': canplay: Setting position to ' + position1K);\r\n try {\r\n this.currentTime = position1K;\r\n } catch(ee) {\r\n sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);\r\n }\r\n }\r\n\r\n // hack for HTML5 from/to case\r\n if (s._iO._oncanplay) {\r\n s._iO._oncanplay();\r\n }\r\n\r\n }),\r\n\r\n canplaythrough: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n if (!s.loaded) {\r\n s._onbufferchange(0);\r\n s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());\r\n s._onload(true);\r\n }\r\n\r\n }),\r\n\r\n durationchange: html5_event(function() {\r\n\r\n // durationchange may fire at various times, probably the safest way to capture accurate/final duration.\r\n\r\n var s = this._s,\r\n duration;\r\n\r\n duration = s._get_html5_duration();\r\n\r\n if (!isNaN(duration) && duration !== s.duration) {\r\n\r\n sm2._wD(this._s.id + ': durationchange (' + duration + ')' + (s.duration ? ', previously ' + s.duration : ''));\r\n\r\n s.durationEstimate = s.duration = duration;\r\n\r\n }\r\n\r\n }),\r\n\r\n // TODO: Reserved for potential use\r\n /*\r\n emptied: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': emptied');\r\n\r\n }),\r\n */\r\n\r\n ended: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n sm2._wD(s.id + ': ended');\r\n\r\n s._onfinish();\r\n\r\n }),\r\n\r\n error: html5_event(function() {\r\n\r\n var description = (html5ErrorCodes[this.error.code] || null);\r\n sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code + (description ? ' (' + description + ')' : ''));\r\n this._s._onload(false);\r\n this._s._onerror(this.error.code, description);\r\n\r\n }),\r\n\r\n loadeddata: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n sm2._wD(s.id + ': loadeddata');\r\n\r\n // safari seems to nicely report progress events, eventually totalling 100%\r\n if (!s._loaded && !isSafari) {\r\n s.duration = s._get_html5_duration();\r\n }\r\n\r\n }),\r\n\r\n loadedmetadata: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': loadedmetadata');\r\n\r\n }),\r\n\r\n loadstart: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': loadstart');\r\n // assume buffering at first\r\n this._s._onbufferchange(1);\r\n\r\n }),\r\n\r\n play: html5_event(function() {\r\n\r\n // sm2._wD(this._s.id + ': play()');\r\n // once play starts, no buffering\r\n this._s._onbufferchange(0);\r\n\r\n }),\r\n\r\n playing: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': playing ' + String.fromCharCode(9835));\r\n // once play starts, no buffering\r\n this._s._onbufferchange(0);\r\n\r\n }),\r\n\r\n progress: html5_event(function(e) {\r\n\r\n // note: can fire repeatedly after \"loaded\" event, due to use of HTTP range/partials\r\n\r\n var s = this._s,\r\n i, j, progStr, buffered = 0,\r\n isProgress = (e.type === 'progress'),\r\n ranges = e.target.buffered,\r\n // firefox 3.6 implements e.loaded/total (bytes)\r\n loaded = (e.loaded || 0),\r\n total = (e.total || 1);\r\n\r\n // reset the \"buffered\" (loaded byte ranges) array\r\n s.buffered = [];\r\n\r\n if (ranges && ranges.length) {\r\n\r\n // if loaded is 0, try TimeRanges implementation as % of load\r\n // https://developer.mozilla.org/en/DOM/TimeRanges\r\n\r\n // re-build \"buffered\" array\r\n // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.\r\n for (i = 0, j = ranges.length; i < j; i++) {\r\n s.buffered.push({\r\n start: ranges.start(i) * msecScale,\r\n end: ranges.end(i) * msecScale\r\n });\r\n }\r\n\r\n // use the last value locally\r\n buffered = (ranges.end(0) - ranges.start(0)) * msecScale;\r\n\r\n // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges\r\n loaded = Math.min(1, buffered / (e.target.duration * msecScale));\r\n\r\n // <d>\r\n if (isProgress && ranges.length > 1) {\r\n progStr = [];\r\n j = ranges.length;\r\n for (i = 0; i < j; i++) {\r\n progStr.push((e.target.buffered.start(i) * msecScale) + '-' + (e.target.buffered.end(i) * msecScale));\r\n }\r\n sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));\r\n }\r\n\r\n if (isProgress && !isNaN(loaded)) {\r\n sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded * 100) + '% loaded');\r\n }\r\n // </d>\r\n\r\n }\r\n\r\n if (!isNaN(loaded)) {\r\n\r\n // TODO: prevent calls with duplicate values.\r\n s._whileloading(loaded, total, s._get_html5_duration());\r\n if (loaded && total && loaded === total) {\r\n // in case \"onload\" doesn't fire (eg. gecko 1.9.2)\r\n html5_events.canplaythrough.call(this, e);\r\n }\r\n\r\n }\r\n\r\n }),\r\n\r\n ratechange: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': ratechange');\r\n\r\n }),\r\n\r\n suspend: html5_event(function(e) {\r\n\r\n // download paused/stopped, may have finished (eg. onload)\r\n var s = this._s;\r\n\r\n sm2._wD(this._s.id + ': suspend');\r\n html5_events.progress.call(this, e);\r\n s._onsuspend();\r\n\r\n }),\r\n\r\n stalled: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': stalled');\r\n\r\n }),\r\n\r\n timeupdate: html5_event(function() {\r\n\r\n this._s._onTimer();\r\n\r\n }),\r\n\r\n waiting: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n // see also: seeking\r\n sm2._wD(this._s.id + ': waiting');\r\n\r\n // playback faster than download rate, etc.\r\n s._onbufferchange(1);\r\n\r\n })\r\n\r\n };\r\n\r\n html5OK = function(iO) {\r\n\r\n // playability test based on URL or MIME type\r\n\r\n var result;\r\n\r\n if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {\r\n\r\n // nothing to check\r\n result = false;\r\n\r\n } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {\r\n\r\n // RTMP, or preferring flash\r\n result = false;\r\n\r\n } else {\r\n\r\n // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er\r\n result = ((iO.type ? html5CanPlay({ type: iO.type }) : html5CanPlay({ url: iO.url }) || sm2.html5Only || iO.url.match(/data:/i)));\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n html5Unload = function(oAudio) {\r\n\r\n /**\r\n * Internal method: Unload media, and cancel any current/pending network requests.\r\n * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.\r\n * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media\r\n * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.\r\n * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.\r\n */\r\n\r\n var url;\r\n\r\n if (oAudio) {\r\n\r\n // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME.\r\n // Desktop Safari complains / fails on data: URI, so it gets about:blank.\r\n url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));\r\n\r\n oAudio.src = url;\r\n\r\n // reset some state, too\r\n if (oAudio._called_unload !== _undefined) {\r\n oAudio._called_load = false;\r\n }\r\n\r\n }\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n // ensure URL state is trashed, also\r\n lastGlobalHTML5URL = null;\r\n\r\n }\r\n\r\n return url;\r\n\r\n };\r\n\r\n html5CanPlay = function(o) {\r\n\r\n /**\r\n * Try to find MIME, test and return truthiness\r\n * o = {\r\n * url: '/path/to/an.mp3',\r\n * type: 'audio/mp3'\r\n * }\r\n */\r\n\r\n if (!sm2.useHTML5Audio || !sm2.hasHTML5) return false;\r\n\r\n var url = (o.url || null),\r\n mime = (o.type || null),\r\n aF = sm2.audioFormats,\r\n result,\r\n offset,\r\n fileExt,\r\n item;\r\n\r\n // account for known cases like audio/mp3\r\n\r\n if (mime && sm2.html5[mime] !== _undefined) return (sm2.html5[mime] && !preferFlashCheck(mime));\r\n\r\n if (!html5Ext) {\r\n\r\n html5Ext = [];\r\n\r\n for (item in aF) {\r\n\r\n if (aF.hasOwnProperty(item)) {\r\n\r\n html5Ext.push(item);\r\n\r\n if (aF[item].related) {\r\n html5Ext = html5Ext.concat(aF[item].related);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n html5Ext = new RegExp('\\\\.(' + html5Ext.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n }\r\n\r\n // TODO: Strip URL queries, etc.\r\n fileExt = (url ? url.toLowerCase().match(html5Ext) : null);\r\n\r\n if (!fileExt || !fileExt.length) {\r\n\r\n if (!mime) {\r\n\r\n result = false;\r\n\r\n } else {\r\n\r\n // audio/mp3 -> mp3, result should be known\r\n offset = mime.indexOf(';');\r\n\r\n // strip \"audio/X; codecs...\"\r\n fileExt = (offset !== -1 ? mime.substr(0, offset) : mime).substr(6);\r\n\r\n }\r\n\r\n } else {\r\n\r\n // match the raw extension name - \"mp3\", for example\r\n fileExt = fileExt[1];\r\n\r\n }\r\n\r\n if (fileExt && sm2.html5[fileExt] !== _undefined) {\r\n\r\n // result known\r\n result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));\r\n\r\n } else {\r\n\r\n mime = 'audio/' + fileExt;\r\n result = sm2.html5.canPlayType({ type: mime });\r\n\r\n sm2.html5[fileExt] = result;\r\n\r\n // sm2._wD('canPlayType, found result: ' + result);\r\n result = (result && sm2.html5[mime] && !preferFlashCheck(mime));\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n testHTML5 = function() {\r\n\r\n /**\r\n * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on\r\n * assigns results to html5[] and flash[].\r\n */\r\n\r\n if (!sm2.useHTML5Audio || !sm2.hasHTML5) {\r\n\r\n // without HTML5, we need Flash.\r\n sm2.html5.usingFlash = true;\r\n needsFlash = true;\r\n\r\n return false;\r\n\r\n }\r\n\r\n // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load \"null\" as a URL. :/\r\n var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),\r\n item, lookup, support = {}, aF, i;\r\n\r\n function cp(m) {\r\n\r\n var canPlay, j,\r\n result = false,\r\n isOK = false;\r\n\r\n if (!a || typeof a.canPlayType !== 'function') return result;\r\n\r\n if (m instanceof Array) {\r\n\r\n // iterate through all mime types, return any successes\r\n\r\n for (i = 0, j = m.length; i < j; i++) {\r\n\r\n if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {\r\n\r\n isOK = true;\r\n sm2.html5[m[i]] = true;\r\n\r\n // note flash support, too\r\n sm2.flash[m[i]] = !!(m[i].match(flashMIME));\r\n\r\n }\r\n\r\n }\r\n\r\n result = isOK;\r\n\r\n } else {\r\n\r\n canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);\r\n result = !!(canPlay && (canPlay.match(sm2.html5Test)));\r\n\r\n }\r\n\r\n return result;\r\n\r\n }\r\n\r\n // test all registered formats + codecs\r\n\r\n aF = sm2.audioFormats;\r\n\r\n for (item in aF) {\r\n\r\n if (aF.hasOwnProperty(item)) {\r\n\r\n lookup = 'audio/' + item;\r\n\r\n support[item] = cp(aF[item].type);\r\n\r\n // write back generic type too, eg. audio/mp3\r\n support[lookup] = support[item];\r\n\r\n // assign flash\r\n if (item.match(flashMIME)) {\r\n\r\n sm2.flash[item] = true;\r\n sm2.flash[lookup] = true;\r\n\r\n } else {\r\n\r\n sm2.flash[item] = false;\r\n sm2.flash[lookup] = false;\r\n\r\n }\r\n\r\n // assign result to related formats, too\r\n\r\n if (aF[item] && aF[item].related) {\r\n\r\n for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n\r\n // eg. audio/m4a\r\n support['audio/' + aF[item].related[i]] = support[item];\r\n sm2.html5[aF[item].related[i]] = support[item];\r\n sm2.flash[aF[item].related[i]] = support[item];\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n support.canPlayType = (a ? cp : null);\r\n sm2.html5 = mixin(sm2.html5, support);\r\n\r\n sm2.html5.usingFlash = featureCheck();\r\n needsFlash = sm2.html5.usingFlash;\r\n\r\n return true;\r\n\r\n };\r\n\r\n strings = {\r\n\r\n // <d>\r\n notReady: 'Unavailable - wait until onready() has fired.',\r\n notOK: 'Audio support is not available.',\r\n domError: sm + 'exception caught while appending SWF to DOM.',\r\n spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',\r\n swf404: smc + 'Verify that %s is a valid path.',\r\n tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',\r\n checkSWF: 'See SWF output for more debug info.',\r\n localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',\r\n waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',\r\n waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',\r\n waitSWF: smc + 'Waiting for 100% SWF load...',\r\n needFunction: smc + 'Function object expected for %s',\r\n badID: 'Sound ID \"%s\" should be a string, starting with a non-numeric character',\r\n currentObj: smc + '_debug(): Current sound objects',\r\n waitOnload: smc + 'Waiting for window.onload()',\r\n docLoaded: smc + 'Document already loaded',\r\n onload: smc + 'initComplete(): calling soundManager.onload()',\r\n onloadOK: sm + '.onload() complete',\r\n didInit: smc + 'init(): Already called?',\r\n secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',\r\n badRemove: smc + 'Failed to remove Flash node.',\r\n shutdown: sm + '.disable(): Shutting down',\r\n queue: smc + 'Queueing %s handler',\r\n smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',\r\n fbTimeout: 'No flash response, applying .' + swfCSS.swfTimedout + ' CSS...',\r\n fbLoaded: 'Flash loaded',\r\n fbHandler: smc + 'flashBlockHandler()',\r\n manURL: 'SMSound.load(): Using manually-assigned URL',\r\n onURL: sm + '.load(): current URL already assigned.',\r\n badFV: sm + '.flashVersion must be 8 or 9. \"%s\" is invalid. Reverting to %s.',\r\n as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',\r\n noNSLoop: 'Note: Looping not implemented for MovieStar formats',\r\n needfl9: 'Note: Switching to flash 9, required for MP4 formats.',\r\n mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',\r\n needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',\r\n gotFocus: smc + 'Got window focus.',\r\n policy: 'Enabling usePolicyFile for data access',\r\n setup: sm + '.setup(): allowed parameters: %s',\r\n setupError: sm + '.setup(): \"%s\" cannot be assigned with this method.',\r\n setupUndef: sm + '.setup(): Could not find option \"%s\"',\r\n setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',\r\n noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',\r\n sm2Loaded: 'SoundManager 2: Ready. ' + String.fromCharCode(10003),\r\n reset: sm + '.reset(): Removing event callbacks',\r\n mobileUA: 'Mobile UA detected, preferring HTML5 by default.',\r\n globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.',\r\n ignoreMobile: 'Ignoring mobile restrictions for this device.'\r\n // </d>\r\n\r\n };\r\n\r\n str = function() {\r\n\r\n // internal string replace helper.\r\n // arguments: o [,items to replace]\r\n // <d>\r\n\r\n var args,\r\n i, j, o,\r\n sstr;\r\n\r\n // real array, please\r\n args = slice.call(arguments);\r\n\r\n // first argument\r\n o = args.shift();\r\n\r\n sstr = (strings && strings[o] ? strings[o] : '');\r\n\r\n if (sstr && args && args.length) {\r\n for (i = 0, j = args.length; i < j; i++) {\r\n sstr = sstr.replace('%s', args[i]);\r\n }\r\n }\r\n\r\n return sstr;\r\n // </d>\r\n\r\n };\r\n\r\n loopFix = function(sOpt) {\r\n\r\n // flash 8 requires stream = false for looping to work\r\n if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {\r\n _wDS('as2loop');\r\n sOpt.stream = false;\r\n }\r\n\r\n return sOpt;\r\n\r\n };\r\n\r\n policyFix = function(sOpt, sPre) {\r\n\r\n if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {\r\n sm2._wD((sPre || '') + str('policy'));\r\n sOpt.usePolicyFile = true;\r\n }\r\n\r\n return sOpt;\r\n\r\n };\r\n\r\n complain = function(sMsg) {\r\n\r\n // <d>\r\n if (hasConsole && console.warn !== _undefined) {\r\n console.warn(sMsg);\r\n } else {\r\n sm2._wD(sMsg);\r\n }\r\n // </d>\r\n\r\n };\r\n\r\n doNothing = function() {\r\n\r\n return false;\r\n\r\n };\r\n\r\n disableObject = function(o) {\r\n\r\n var oProp;\r\n\r\n for (oProp in o) {\r\n if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {\r\n o[oProp] = doNothing;\r\n }\r\n }\r\n\r\n oProp = null;\r\n\r\n };\r\n\r\n failSafely = function(bNoDisable) {\r\n\r\n // general failure exception handler\r\n\r\n if (bNoDisable === _undefined) {\r\n bNoDisable = false;\r\n }\r\n\r\n if (disabled || bNoDisable) {\r\n sm2.disable(bNoDisable);\r\n }\r\n\r\n };\r\n\r\n normalizeMovieURL = function(movieURL) {\r\n\r\n var urlParams = null, url;\r\n\r\n if (movieURL) {\r\n\r\n if (movieURL.match(/\\.swf(\\?.*)?$/i)) {\r\n\r\n urlParams = movieURL.substr(movieURL.toLowerCase().lastIndexOf('.swf?') + 4);\r\n\r\n // assume user knows what they're doing\r\n if (urlParams) return movieURL;\r\n\r\n } else if (movieURL.lastIndexOf('/') !== movieURL.length - 1) {\r\n\r\n // append trailing slash, if needed\r\n movieURL += '/';\r\n\r\n }\r\n\r\n }\r\n\r\n url = (movieURL && movieURL.lastIndexOf('/') !== -1 ? movieURL.substr(0, movieURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;\r\n\r\n if (sm2.noSWFCache) {\r\n url += ('?ts=' + new Date().getTime());\r\n }\r\n\r\n return url;\r\n\r\n };\r\n\r\n setVersionInfo = function() {\r\n\r\n // short-hand for internal use\r\n\r\n fV = parseInt(sm2.flashVersion, 10);\r\n\r\n if (fV !== 8 && fV !== 9) {\r\n sm2._wD(str('badFV', fV, defaultFlashVersion));\r\n sm2.flashVersion = fV = defaultFlashVersion;\r\n }\r\n\r\n // debug flash movie, if applicable\r\n\r\n var isDebug = (sm2.debugMode || sm2.debugFlash ? '_debug.swf' : '.swf');\r\n\r\n if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {\r\n sm2._wD(str('needfl9'));\r\n sm2.flashVersion = fV = 9;\r\n }\r\n\r\n sm2.version = sm2.versionNumber + (sm2.html5Only ? ' (HTML5-only mode)' : (fV === 9 ? ' (AS3/Flash 9)' : ' (AS2/Flash 8)'));\r\n\r\n // set up default options\r\n if (fV > 8) {\r\n\r\n // +flash 9 base options\r\n sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);\r\n sm2.features.buffering = true;\r\n\r\n // +moviestar support\r\n sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);\r\n sm2.filePatterns.flash9 = new RegExp('\\\\.(mp3|' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n sm2.features.movieStar = true;\r\n\r\n } else {\r\n\r\n sm2.features.movieStar = false;\r\n\r\n }\r\n\r\n // regExp for flash canPlay(), etc.\r\n sm2.filePattern = sm2.filePatterns[(fV !== 8 ? 'flash9' : 'flash8')];\r\n\r\n // if applicable, use _debug versions of SWFs\r\n sm2.movieURL = (fV === 8 ? 'soundmanager2.swf' : 'soundmanager2_flash9.swf').replace('.swf', isDebug);\r\n\r\n sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);\r\n\r\n };\r\n\r\n setPolling = function(bPolling, bHighPerformance) {\r\n\r\n if (!flash) {\r\n return;\r\n }\r\n\r\n flash._setPolling(bPolling, bHighPerformance);\r\n\r\n };\r\n\r\n initDebug = function() {\r\n\r\n // starts debug mode, creating output <div> for UAs without console object\r\n\r\n // allow force of debug mode via URL\r\n // <d>\r\n if (sm2.debugURLParam.test(wl)) {\r\n sm2.setupOptions.debugMode = sm2.debugMode = true;\r\n }\r\n\r\n if (id(sm2.debugID)) {\r\n return;\r\n }\r\n\r\n var oD, oDebug, oTarget, oToggle, tmp;\r\n\r\n if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {\r\n\r\n oD = doc.createElement('div');\r\n oD.id = sm2.debugID + '-toggle';\r\n\r\n oToggle = {\r\n position: 'fixed',\r\n bottom: '0px',\r\n right: '0px',\r\n width: '1.2em',\r\n height: '1.2em',\r\n lineHeight: '1.2em',\r\n margin: '2px',\r\n textAlign: 'center',\r\n border: '1px solid #999',\r\n cursor: 'pointer',\r\n background: '#fff',\r\n color: '#333',\r\n zIndex: 10001\r\n };\r\n\r\n oD.appendChild(doc.createTextNode('-'));\r\n oD.onclick = toggleDebug;\r\n oD.title = 'Toggle SM2 debug console';\r\n\r\n if (ua.match(/msie 6/i)) {\r\n oD.style.position = 'absolute';\r\n oD.style.cursor = 'hand';\r\n }\r\n\r\n for (tmp in oToggle) {\r\n if (oToggle.hasOwnProperty(tmp)) {\r\n oD.style[tmp] = oToggle[tmp];\r\n }\r\n }\r\n\r\n oDebug = doc.createElement('div');\r\n oDebug.id = sm2.debugID;\r\n oDebug.style.display = (sm2.debugMode ? 'block' : 'none');\r\n\r\n if (sm2.debugMode && !id(oD.id)) {\r\n try {\r\n oTarget = getDocument();\r\n oTarget.appendChild(oD);\r\n } catch(e2) {\r\n throw new Error(str('domError') + ' \\n' + e2.toString());\r\n }\r\n oTarget.appendChild(oDebug);\r\n }\r\n\r\n }\r\n\r\n oTarget = null;\r\n // </d>\r\n\r\n };\r\n\r\n idCheck = this.getSoundById;\r\n\r\n // <d>\r\n _wDS = function(o, errorLevel) {\r\n\r\n return (!o ? '' : sm2._wD(str(o), errorLevel));\r\n\r\n };\r\n\r\n toggleDebug = function() {\r\n\r\n var o = id(sm2.debugID),\r\n oT = id(sm2.debugID + '-toggle');\r\n\r\n if (!o) {\r\n return;\r\n }\r\n\r\n if (debugOpen) {\r\n // minimize\r\n oT.innerHTML = '+';\r\n o.style.display = 'none';\r\n } else {\r\n oT.innerHTML = '-';\r\n o.style.display = 'block';\r\n }\r\n\r\n debugOpen = !debugOpen;\r\n\r\n };\r\n\r\n debugTS = function(sEventType, bSuccess, sMessage) {\r\n\r\n // troubleshooter debug hooks\r\n\r\n if (window.sm2Debugger !== _undefined) {\r\n try {\r\n sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);\r\n } catch(e) {\r\n // oh well\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n\r\n };\r\n // </d>\r\n\r\n getSWFCSS = function() {\r\n\r\n var css = [];\r\n\r\n if (sm2.debugMode) {\r\n css.push(swfCSS.sm2Debug);\r\n }\r\n\r\n if (sm2.debugFlash) {\r\n css.push(swfCSS.flashDebug);\r\n }\r\n\r\n if (sm2.useHighPerformance) {\r\n css.push(swfCSS.highPerf);\r\n }\r\n\r\n return css.join(' ');\r\n\r\n };\r\n\r\n flashBlockHandler = function() {\r\n\r\n // *possible* flash block situation.\r\n\r\n var name = str('fbHandler'),\r\n p = sm2.getMoviePercent(),\r\n css = swfCSS,\r\n error = {\r\n type: 'FLASHBLOCK'\r\n };\r\n\r\n if (sm2.html5Only) {\r\n // no flash, or unused\r\n return;\r\n }\r\n\r\n if (!sm2.ok()) {\r\n\r\n if (needsFlash) {\r\n // make the movie more visible, so user can fix\r\n sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null ? css.swfTimedout : css.swfError);\r\n sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));\r\n }\r\n\r\n sm2.didFlashBlock = true;\r\n\r\n // fire onready(), complain lightly\r\n processOnEvents({\r\n type: 'ontimeout',\r\n ignoreInit: true,\r\n error: error\r\n });\r\n\r\n catchError(error);\r\n\r\n } else {\r\n\r\n // SM2 loaded OK (or recovered)\r\n\r\n // <d>\r\n if (sm2.didFlashBlock) {\r\n sm2._wD(name + ': Unblocked');\r\n }\r\n // </d>\r\n\r\n if (sm2.oMC) {\r\n sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock ? ' ' + css.swfUnblocked : '')].join(' ');\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n addOnEvent = function(sType, oMethod, oScope) {\r\n\r\n if (on_queue[sType] === _undefined) {\r\n on_queue[sType] = [];\r\n }\r\n\r\n on_queue[sType].push({\r\n method: oMethod,\r\n scope: (oScope || null),\r\n fired: false\r\n });\r\n\r\n };\r\n\r\n processOnEvents = function(oOptions) {\r\n\r\n // if unspecified, assume OK/error\r\n\r\n if (!oOptions) {\r\n oOptions = {\r\n type: (sm2.ok() ? 'onready' : 'ontimeout')\r\n };\r\n }\r\n\r\n // not ready yet.\r\n if (!didInit && oOptions && !oOptions.ignoreInit) return false;\r\n\r\n // invalid case\r\n if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) return false;\r\n\r\n var status = {\r\n success: (oOptions && oOptions.ignoreInit ? sm2.ok() : !disabled)\r\n },\r\n\r\n // queue specified by type, or none\r\n srcQueue = (oOptions && oOptions.type ? on_queue[oOptions.type] || [] : []),\r\n\r\n queue = [], i, j,\r\n args = [status],\r\n canRetry = (needsFlash && !sm2.ok());\r\n\r\n if (oOptions.error) {\r\n args[0].error = oOptions.error;\r\n }\r\n\r\n for (i = 0, j = srcQueue.length; i < j; i++) {\r\n if (srcQueue[i].fired !== true) {\r\n queue.push(srcQueue[i]);\r\n }\r\n }\r\n\r\n if (queue.length) {\r\n\r\n // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));\r\n for (i = 0, j = queue.length; i < j; i++) {\r\n\r\n if (queue[i].scope) {\r\n queue[i].method.apply(queue[i].scope, args);\r\n } else {\r\n queue[i].method.apply(this, args);\r\n }\r\n\r\n if (!canRetry) {\r\n // useFlashBlock and SWF timeout case doesn't count here.\r\n queue[i].fired = true;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n initUserOnload = function() {\r\n\r\n window.setTimeout(function() {\r\n\r\n if (sm2.useFlashBlock) {\r\n flashBlockHandler();\r\n }\r\n\r\n processOnEvents();\r\n\r\n // call user-defined \"onload\", scoped to window\r\n\r\n if (typeof sm2.onload === 'function') {\r\n _wDS('onload', 1);\r\n sm2.onload.apply(window);\r\n _wDS('onloadOK', 1);\r\n }\r\n\r\n if (sm2.waitForWindowLoad) {\r\n event.add(window, 'load', initUserOnload);\r\n }\r\n\r\n }, 1);\r\n\r\n };\r\n\r\n detectFlash = function() {\r\n\r\n /**\r\n * Hat tip: Flash Detect library (BSD, (C) 2007) by Carl \"DocYes\" S. Yestrau\r\n * http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt\r\n */\r\n\r\n // this work has already been done.\r\n if (hasFlash !== _undefined) return hasFlash;\r\n\r\n var hasPlugin = false, n = navigator, obj, type, types, AX = window.ActiveXObject;\r\n\r\n // MS Edge 14 throws an \"Unspecified Error\" because n.plugins is inaccessible due to permissions\r\n var nP;\r\n\r\n try {\r\n nP = n.plugins;\r\n } catch(e) {\r\n nP = undefined;\r\n }\r\n\r\n if (nP && nP.length) {\r\n\r\n type = 'application/x-shockwave-flash';\r\n types = n.mimeTypes;\r\n\r\n if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {\r\n hasPlugin = true;\r\n }\r\n\r\n } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {\r\n\r\n // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.\r\n try {\r\n obj = new AX('ShockwaveFlash.ShockwaveFlash');\r\n } catch(e) {\r\n // oh well\r\n obj = null;\r\n }\r\n\r\n hasPlugin = (!!obj);\r\n\r\n // cleanup, because it is ActiveX after all\r\n obj = null;\r\n\r\n }\r\n\r\n hasFlash = hasPlugin;\r\n\r\n return hasPlugin;\r\n\r\n };\r\n\r\n featureCheck = function() {\r\n\r\n var flashNeeded,\r\n item,\r\n formats = sm2.audioFormats,\r\n // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.\r\n isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)\\s/i)));\r\n\r\n if (isSpecial) {\r\n\r\n // has Audio(), but is broken; let it load links directly.\r\n sm2.hasHTML5 = false;\r\n\r\n // ignore flash case, however\r\n sm2.html5Only = true;\r\n\r\n // hide the SWF, if present\r\n if (sm2.oMC) {\r\n sm2.oMC.style.display = 'none';\r\n }\r\n\r\n } else if (sm2.useHTML5Audio) {\r\n\r\n if (!sm2.html5 || !sm2.html5.canPlayType) {\r\n sm2._wD('SoundManager: No HTML5 Audio() support detected.');\r\n sm2.hasHTML5 = false;\r\n }\r\n\r\n // <d>\r\n if (isBadSafari) {\r\n sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ? ' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);\r\n }\r\n // </d>\r\n\r\n }\r\n\r\n if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n\r\n // sort out whether flash is optional, required or can be ignored.\r\n\r\n // innocent until proven guilty.\r\n canIgnoreFlash = true;\r\n\r\n for (item in formats) {\r\n\r\n if (formats.hasOwnProperty(item)) {\r\n\r\n if (formats[item].required) {\r\n\r\n if (!sm2.html5.canPlayType(formats[item].type)) {\r\n\r\n // 100% HTML5 mode is not possible.\r\n canIgnoreFlash = false;\r\n flashNeeded = true;\r\n\r\n } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {\r\n\r\n // flash may be required, or preferred for this format.\r\n flashNeeded = true;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // sanity check...\r\n if (sm2.ignoreFlash) {\r\n flashNeeded = false;\r\n canIgnoreFlash = true;\r\n }\r\n\r\n sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);\r\n\r\n return (!sm2.html5Only);\r\n\r\n };\r\n\r\n parseURL = function(url) {\r\n\r\n /**\r\n * Internal: Finds and returns the first playable URL (or failing that, the first URL.)\r\n * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.\r\n */\r\n\r\n var i, j, urlResult = 0, result;\r\n\r\n if (url instanceof Array) {\r\n\r\n // find the first good one\r\n for (i = 0, j = url.length; i < j; i++) {\r\n\r\n if (url[i] instanceof Object) {\r\n\r\n // MIME check\r\n if (sm2.canPlayMIME(url[i].type)) {\r\n urlResult = i;\r\n break;\r\n }\r\n\r\n } else if (sm2.canPlayURL(url[i])) {\r\n\r\n // URL string check\r\n urlResult = i;\r\n break;\r\n\r\n }\r\n\r\n }\r\n\r\n // normalize to string\r\n if (url[urlResult].url) {\r\n url[urlResult] = url[urlResult].url;\r\n }\r\n\r\n result = url[urlResult];\r\n\r\n } else {\r\n\r\n // single URL case\r\n result = url;\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n\r\n startTimer = function(oSound) {\r\n\r\n /**\r\n * attach a timer to this sound, and start an interval if needed\r\n */\r\n\r\n if (!oSound._hasTimer) {\r\n\r\n oSound._hasTimer = true;\r\n\r\n if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n if (h5IntervalTimer === null && h5TimerCount === 0) {\r\n\r\n h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);\r\n\r\n }\r\n\r\n h5TimerCount++;\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n stopTimer = function(oSound) {\r\n\r\n /**\r\n * detach a timer\r\n */\r\n\r\n if (oSound._hasTimer) {\r\n\r\n oSound._hasTimer = false;\r\n\r\n if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n // interval will stop itself at next execution.\r\n\r\n h5TimerCount--;\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n timerExecute = function() {\r\n\r\n /**\r\n * manual polling for HTML5 progress events, ie., whileplaying()\r\n * (can achieve greater precision than conservative default HTML5 interval)\r\n */\r\n\r\n var i;\r\n\r\n if (h5IntervalTimer !== null && !h5TimerCount) {\r\n\r\n // no active timers, stop polling interval.\r\n\r\n clearInterval(h5IntervalTimer);\r\n\r\n h5IntervalTimer = null;\r\n\r\n return;\r\n\r\n }\r\n\r\n // check all HTML5 sounds with timers\r\n\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n\r\n if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {\r\n sm2.sounds[sm2.soundIDs[i]]._onTimer();\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n catchError = function(options) {\r\n\r\n options = (options !== _undefined ? options : {});\r\n\r\n if (typeof sm2.onerror === 'function') {\r\n sm2.onerror.apply(window, [{\r\n type: (options.type !== _undefined ? options.type : null)\r\n }]);\r\n }\r\n\r\n if (options.fatal !== _undefined && options.fatal) {\r\n sm2.disable();\r\n }\r\n\r\n };\r\n\r\n badSafariFix = function() {\r\n\r\n // special case: \"bad\" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4\r\n if (!isBadSafari || !detectFlash()) {\r\n // doesn't apply\r\n return;\r\n }\r\n\r\n var aF = sm2.audioFormats, i, item;\r\n\r\n for (item in aF) {\r\n\r\n if (aF.hasOwnProperty(item)) {\r\n\r\n if (item === 'mp3' || item === 'mp4') {\r\n\r\n sm2._wD(sm + ': Using flash fallback for ' + item + ' format');\r\n sm2.html5[item] = false;\r\n\r\n // assign result to related formats, too\r\n if (aF[item] && aF[item].related) {\r\n for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n sm2.html5[aF[item].related[i]] = false;\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Pseudo-private flash/ExternalInterface methods\r\n * ----------------------------------------------\r\n */\r\n\r\n this._setSandboxType = function(sandboxType) {\r\n\r\n // <d>\r\n // Security sandbox according to Flash plugin\r\n var sb = sm2.sandbox;\r\n\r\n sb.type = sandboxType;\r\n sb.description = sb.types[(sb.types[sandboxType] !== _undefined ? sandboxType : 'unknown')];\r\n\r\n if (sb.type === 'localWithFile') {\r\n\r\n sb.noRemote = true;\r\n sb.noLocal = false;\r\n _wDS('secNote', 2);\r\n\r\n } else if (sb.type === 'localWithNetwork') {\r\n\r\n sb.noRemote = false;\r\n sb.noLocal = true;\r\n\r\n } else if (sb.type === 'localTrusted') {\r\n\r\n sb.noRemote = false;\r\n sb.noLocal = false;\r\n\r\n }\r\n // </d>\r\n\r\n };\r\n\r\n this._externalInterfaceOK = function(swfVersion) {\r\n\r\n // flash callback confirming flash loaded, EI working etc.\r\n // swfVersion: SWF build string\r\n\r\n if (sm2.swfLoaded) {\r\n return;\r\n }\r\n\r\n var e;\r\n\r\n debugTS('swf', true);\r\n debugTS('flashtojs', true);\r\n sm2.swfLoaded = true;\r\n tryInitOnFocus = false;\r\n\r\n if (isBadSafari) {\r\n badSafariFix();\r\n }\r\n\r\n // complain if JS + SWF build/version strings don't match, excluding +DEV builds\r\n // <d>\r\n if (!swfVersion || swfVersion.replace(/\\+dev/i, '') !== sm2.versionNumber.replace(/\\+dev/i, '')) {\r\n\r\n e = sm + ': Fatal: JavaScript file build \"' + sm2.versionNumber + '\" does not match Flash SWF build \"' + swfVersion + '\" at ' + sm2.url + '. Ensure both are up-to-date.';\r\n\r\n // escape flash -> JS stack so this error fires in window.\r\n setTimeout(function() {\r\n throw new Error(e);\r\n }, 0);\r\n\r\n // exit, init will fail with timeout\r\n return;\r\n\r\n }\r\n // </d>\r\n\r\n // IE needs a larger timeout\r\n setTimeout(init, isIE ? 100 : 1);\r\n\r\n };\r\n\r\n /**\r\n * Private initialization helpers\r\n * ------------------------------\r\n */\r\n\r\n createMovie = function(movieID, movieURL) {\r\n\r\n // ignore if already connected\r\n if (didAppend && appendSuccess) return false;\r\n\r\n function initMsg() {\r\n\r\n // <d>\r\n\r\n var options = [],\r\n title,\r\n msg = [],\r\n delimiter = ' + ';\r\n\r\n title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');\r\n\r\n if (!sm2.html5Only) {\r\n\r\n if (sm2.preferFlash) {\r\n options.push('preferFlash');\r\n }\r\n\r\n if (sm2.useHighPerformance) {\r\n options.push('useHighPerformance');\r\n }\r\n\r\n if (sm2.flashPollingInterval) {\r\n options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');\r\n }\r\n\r\n if (sm2.html5PollingInterval) {\r\n options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n }\r\n\r\n if (sm2.wmode) {\r\n options.push('wmode (' + sm2.wmode + ')');\r\n }\r\n\r\n if (sm2.debugFlash) {\r\n options.push('debugFlash');\r\n }\r\n\r\n if (sm2.useFlashBlock) {\r\n options.push('flashBlock');\r\n }\r\n\r\n } else if (sm2.html5PollingInterval) {\r\n options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n }\r\n\r\n if (options.length) {\r\n msg = msg.concat([options.join(delimiter)]);\r\n }\r\n\r\n sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);\r\n\r\n showSupport();\r\n\r\n // </d>\r\n\r\n }\r\n\r\n if (sm2.html5Only) {\r\n\r\n // 100% HTML5 mode\r\n setVersionInfo();\r\n\r\n initMsg();\r\n sm2.oMC = id(sm2.movieID);\r\n init();\r\n\r\n // prevent multiple init attempts\r\n didAppend = true;\r\n\r\n appendSuccess = true;\r\n\r\n return false;\r\n\r\n }\r\n\r\n // flash path\r\n var remoteURL = (movieURL || sm2.url),\r\n localURL = (sm2.altURL || remoteURL),\r\n swfTitle = 'JS/Flash audio component (SoundManager 2)',\r\n oTarget = getDocument(),\r\n extraClass = getSWFCSS(),\r\n isRTL = null,\r\n html = doc.getElementsByTagName('html')[0],\r\n oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;\r\n\r\n isRTL = (html && html.dir && html.dir.match(/rtl/i));\r\n movieID = (movieID === _undefined ? sm2.id : movieID);\r\n\r\n function param(name, value) {\r\n return '<param name=\"' + name + '\" value=\"' + value + '\" />';\r\n }\r\n\r\n // safety check for legacy (change to Flash 9 URL)\r\n setVersionInfo();\r\n sm2.url = normalizeMovieURL(overHTTP ? remoteURL : localURL);\r\n movieURL = sm2.url;\r\n\r\n sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);\r\n\r\n if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {\r\n /**\r\n * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here\r\n * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout\r\n * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)\r\n */\r\n messages.push(strings.spcWmode);\r\n sm2.wmode = null;\r\n }\r\n\r\n oEmbed = {\r\n name: movieID,\r\n id: movieID,\r\n src: movieURL,\r\n quality: 'high',\r\n allowScriptAccess: sm2.allowScriptAccess,\r\n bgcolor: sm2.bgColor,\r\n pluginspage: http + 'www.macromedia.com/go/getflashplayer',\r\n title: swfTitle,\r\n type: 'application/x-shockwave-flash',\r\n wmode: sm2.wmode,\r\n // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\r\n hasPriority: 'true'\r\n };\r\n\r\n if (sm2.debugFlash) {\r\n oEmbed.FlashVars = 'debug=1';\r\n }\r\n\r\n if (!sm2.wmode) {\r\n // don't write empty attribute\r\n delete oEmbed.wmode;\r\n }\r\n\r\n if (isIE) {\r\n\r\n // IE is \"special\".\r\n oMovie = doc.createElement('div');\r\n movieHTML = [\r\n '<object id=\"' + movieID + '\" data=\"' + movieURL + '\" type=\"' + oEmbed.type + '\" title=\"' + oEmbed.title + '\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">',\r\n param('movie', movieURL),\r\n param('AllowScriptAccess', sm2.allowScriptAccess),\r\n param('quality', oEmbed.quality),\r\n (sm2.wmode ? param('wmode', sm2.wmode) : ''),\r\n param('bgcolor', sm2.bgColor),\r\n param('hasPriority', 'true'),\r\n (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),\r\n '</object>'\r\n ].join('');\r\n\r\n } else {\r\n\r\n oMovie = doc.createElement('embed');\r\n for (tmp in oEmbed) {\r\n if (oEmbed.hasOwnProperty(tmp)) {\r\n oMovie.setAttribute(tmp, oEmbed[tmp]);\r\n }\r\n }\r\n\r\n }\r\n\r\n initDebug();\r\n extraClass = getSWFCSS();\r\n oTarget = getDocument();\r\n\r\n if (oTarget) {\r\n\r\n sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));\r\n\r\n if (!sm2.oMC.id) {\r\n\r\n sm2.oMC.id = sm2.movieID;\r\n sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;\r\n s = null;\r\n oEl = null;\r\n\r\n if (!sm2.useFlashBlock) {\r\n if (sm2.useHighPerformance) {\r\n // on-screen at all times\r\n s = {\r\n position: 'fixed',\r\n width: '8px',\r\n height: '8px',\r\n // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.\r\n bottom: '0px',\r\n left: '0px',\r\n overflow: 'hidden'\r\n };\r\n } else {\r\n // hide off-screen, lower priority\r\n s = {\r\n position: 'absolute',\r\n width: '6px',\r\n height: '6px',\r\n top: '-9999px',\r\n left: '-9999px'\r\n };\r\n if (isRTL) {\r\n s.left = Math.abs(parseInt(s.left, 10)) + 'px';\r\n }\r\n }\r\n }\r\n\r\n if (isWebkit) {\r\n // soundcloud-reported render/crash fix, safari 5\r\n sm2.oMC.style.zIndex = 10000;\r\n }\r\n\r\n if (!sm2.debugFlash) {\r\n for (x in s) {\r\n if (s.hasOwnProperty(x)) {\r\n sm2.oMC.style[x] = s[x];\r\n }\r\n }\r\n }\r\n\r\n try {\r\n\r\n if (!isIE) {\r\n sm2.oMC.appendChild(oMovie);\r\n }\r\n\r\n oTarget.appendChild(sm2.oMC);\r\n\r\n if (isIE) {\r\n oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n oEl.className = swfCSS.swfBox;\r\n oEl.innerHTML = movieHTML;\r\n }\r\n\r\n appendSuccess = true;\r\n\r\n } catch(e) {\r\n\r\n throw new Error(str('domError') + ' \\n' + e.toString());\r\n\r\n }\r\n\r\n } else {\r\n\r\n // SM2 container is already in the document (eg. flashblock use case)\r\n sClass = sm2.oMC.className;\r\n sm2.oMC.className = (sClass ? sClass + ' ' : swfCSS.swfDefault) + (extraClass ? ' ' + extraClass : '');\r\n sm2.oMC.appendChild(oMovie);\r\n\r\n if (isIE) {\r\n oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n oEl.className = swfCSS.swfBox;\r\n oEl.innerHTML = movieHTML;\r\n }\r\n\r\n appendSuccess = true;\r\n\r\n }\r\n\r\n }\r\n\r\n didAppend = true;\r\n\r\n initMsg();\r\n\r\n // sm2._wD(sm + ': Trying to load ' + movieURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);\r\n\r\n return true;\r\n\r\n };\r\n\r\n initMovie = function() {\r\n\r\n if (sm2.html5Only) {\r\n createMovie();\r\n return false;\r\n }\r\n\r\n // attempt to get, or create, movie (may already exist)\r\n if (flash) return false;\r\n\r\n if (!sm2.url) {\r\n\r\n /**\r\n * Something isn't right - we've reached init, but the soundManager url property has not been set.\r\n * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.\r\n * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.\r\n */\r\n\r\n _wDS('noURL');\r\n return false;\r\n\r\n }\r\n\r\n // inline markup case\r\n flash = sm2.getMovie(sm2.id);\r\n\r\n if (!flash) {\r\n\r\n if (!oRemoved) {\r\n\r\n // try to create\r\n createMovie(sm2.id, sm2.url);\r\n\r\n } else {\r\n\r\n // try to re-append removed movie after reboot()\r\n if (!isIE) {\r\n sm2.oMC.appendChild(oRemoved);\r\n } else {\r\n sm2.oMC.innerHTML = oRemovedHTML;\r\n }\r\n\r\n oRemoved = null;\r\n didAppend = true;\r\n\r\n }\r\n\r\n flash = sm2.getMovie(sm2.id);\r\n\r\n }\r\n\r\n if (typeof sm2.oninitmovie === 'function') {\r\n setTimeout(sm2.oninitmovie, 1);\r\n }\r\n\r\n // <d>\r\n flushMessages();\r\n // </d>\r\n\r\n return true;\r\n\r\n };\r\n\r\n delayWaitForEI = function() {\r\n\r\n setTimeout(waitForEI, 1000);\r\n\r\n };\r\n\r\n rebootIntoHTML5 = function() {\r\n\r\n // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.\r\n\r\n window.setTimeout(function() {\r\n\r\n complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');\r\n\r\n sm2.setup({\r\n preferFlash: false\r\n }).reboot();\r\n\r\n // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.\r\n sm2.didFlashBlock = true;\r\n\r\n sm2.beginDelayedInit();\r\n\r\n }, 1);\r\n\r\n };\r\n\r\n waitForEI = function() {\r\n\r\n var p,\r\n loadIncomplete = false;\r\n\r\n if (!sm2.url) {\r\n // No SWF url to load (noURL case) - exit for now. Will be retried when url is set.\r\n return;\r\n }\r\n\r\n if (waitingForEI) {\r\n return;\r\n }\r\n\r\n waitingForEI = true;\r\n event.remove(window, 'load', delayWaitForEI);\r\n\r\n if (hasFlash && tryInitOnFocus && !isFocused) {\r\n // Safari won't load flash in background tabs, only when focused.\r\n _wDS('waitFocus');\r\n return;\r\n }\r\n\r\n if (!didInit) {\r\n p = sm2.getMoviePercent();\r\n if (p > 0 && p < 100) {\r\n loadIncomplete = true;\r\n }\r\n }\r\n\r\n setTimeout(function() {\r\n\r\n p = sm2.getMoviePercent();\r\n\r\n if (loadIncomplete) {\r\n // special case: if movie *partially* loaded, retry until it's 100% before assuming failure.\r\n waitingForEI = false;\r\n sm2._wD(str('waitSWF'));\r\n window.setTimeout(delayWaitForEI, 1);\r\n return;\r\n }\r\n\r\n // <d>\r\n if (!didInit) {\r\n\r\n sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ' : '') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash ? ' ' + str('checkSWF') : ''), 2);\r\n\r\n if (!overHTTP && p) {\r\n\r\n _wDS('localFail', 2);\r\n\r\n if (!sm2.debugFlash) {\r\n _wDS('tryDebug', 2);\r\n }\r\n\r\n }\r\n\r\n if (p === 0) {\r\n\r\n // if 0 (not null), probably a 404.\r\n sm2._wD(str('swf404', sm2.url), 1);\r\n\r\n }\r\n\r\n debugTS('flashtojs', false, ': Timed out' + (overHTTP ? ' (Check flash security or flash blockers)' : ' (No plugin/missing SWF?)'));\r\n\r\n }\r\n // </d>\r\n\r\n // give up / time-out, depending\r\n\r\n if (!didInit && okToDisable) {\r\n\r\n if (p === null) {\r\n\r\n // SWF failed to report load progress. Possibly blocked.\r\n\r\n if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {\r\n\r\n if (sm2.useFlashBlock) {\r\n\r\n flashBlockHandler();\r\n\r\n }\r\n\r\n _wDS('waitForever');\r\n\r\n } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.\r\n rebootIntoHTML5();\r\n\r\n } else {\r\n\r\n _wDS('waitForever');\r\n\r\n // fire any regular registered ontimeout() listeners.\r\n processOnEvents({\r\n type: 'ontimeout',\r\n ignoreInit: true,\r\n error: {\r\n type: 'INIT_FLASHBLOCK'\r\n }\r\n });\r\n\r\n }\r\n\r\n } else if (sm2.flashLoadTimeout === 0) {\r\n\r\n // SWF loaded? Shouldn't be a blocking issue, then.\r\n\r\n _wDS('waitForever');\r\n\r\n } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n rebootIntoHTML5();\r\n\r\n } else {\r\n\r\n failSafely(true);\r\n\r\n }\r\n\r\n }\r\n\r\n }, sm2.flashLoadTimeout);\r\n\r\n };\r\n\r\n handleFocus = function() {\r\n\r\n function cleanup() {\r\n event.remove(window, 'focus', handleFocus);\r\n }\r\n\r\n if (isFocused || !tryInitOnFocus) {\r\n // already focused, or not special Safari background tab case\r\n cleanup();\r\n return true;\r\n }\r\n\r\n okToDisable = true;\r\n isFocused = true;\r\n _wDS('gotFocus');\r\n\r\n // allow init to restart\r\n waitingForEI = false;\r\n\r\n // kick off ExternalInterface timeout, now that the SWF has started\r\n delayWaitForEI();\r\n\r\n cleanup();\r\n return true;\r\n\r\n };\r\n\r\n flushMessages = function() {\r\n\r\n // <d>\r\n\r\n // SM2 pre-init debug messages\r\n if (messages.length) {\r\n sm2._wD('SoundManager 2: ' + messages.join(' '), 1);\r\n messages = [];\r\n }\r\n\r\n // </d>\r\n\r\n };\r\n\r\n showSupport = function() {\r\n\r\n // <d>\r\n\r\n flushMessages();\r\n\r\n var item, tests = [];\r\n\r\n if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n for (item in sm2.audioFormats) {\r\n if (sm2.audioFormats.hasOwnProperty(item)) {\r\n tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)' : (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ' : '') + 'and no flash support)' : ''))));\r\n }\r\n }\r\n sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);\r\n }\r\n\r\n // </d>\r\n\r\n };\r\n\r\n initComplete = function(bNoDisable) {\r\n\r\n if (didInit) return false;\r\n\r\n if (sm2.html5Only) {\r\n // all good.\r\n _wDS('sm2Loaded', 1);\r\n didInit = true;\r\n initUserOnload();\r\n debugTS('onload', true);\r\n return true;\r\n }\r\n\r\n var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),\r\n result = true,\r\n error;\r\n\r\n if (!wasTimeout) {\r\n didInit = true;\r\n }\r\n\r\n error = {\r\n type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')\r\n };\r\n\r\n sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ') ' + String.fromCharCode(disabled ? 10006 : 10003), disabled ? 2 : 1);\r\n\r\n if (disabled || bNoDisable) {\r\n\r\n if (sm2.useFlashBlock && sm2.oMC) {\r\n sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null ? swfCSS.swfTimedout : swfCSS.swfError);\r\n }\r\n\r\n processOnEvents({\r\n type: 'ontimeout',\r\n error: error,\r\n ignoreInit: true\r\n });\r\n\r\n debugTS('onload', false);\r\n catchError(error);\r\n\r\n result = false;\r\n\r\n } else {\r\n\r\n debugTS('onload', true);\r\n\r\n }\r\n\r\n if (!disabled) {\r\n\r\n if (sm2.waitForWindowLoad && !windowLoaded) {\r\n\r\n _wDS('waitOnload');\r\n event.add(window, 'load', initUserOnload);\r\n\r\n } else {\r\n\r\n // <d>\r\n if (sm2.waitForWindowLoad && windowLoaded) {\r\n _wDS('docLoaded');\r\n }\r\n // </d>\r\n\r\n initUserOnload();\r\n\r\n }\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)\r\n * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().\r\n */\r\n\r\n setProperties = function() {\r\n\r\n var i,\r\n o = sm2.setupOptions;\r\n\r\n for (i in o) {\r\n\r\n if (o.hasOwnProperty(i)) {\r\n\r\n // assign local property if not already defined\r\n\r\n if (sm2[i] === _undefined) {\r\n\r\n sm2[i] = o[i];\r\n\r\n } else if (sm2[i] !== o[i]) {\r\n\r\n // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync\r\n sm2.setupOptions[i] = sm2[i];\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n init = function() {\r\n\r\n // called after onload()\r\n\r\n if (didInit) {\r\n _wDS('didInit');\r\n return false;\r\n }\r\n\r\n function cleanup() {\r\n event.remove(window, 'load', sm2.beginDelayedInit);\r\n }\r\n\r\n if (sm2.html5Only) {\r\n\r\n if (!didInit) {\r\n // we don't need no steenking flash!\r\n cleanup();\r\n sm2.enabled = true;\r\n initComplete();\r\n }\r\n\r\n return true;\r\n\r\n }\r\n\r\n // flash path\r\n initMovie();\r\n\r\n try {\r\n\r\n // attempt to talk to Flash\r\n flash._externalInterfaceTest(false);\r\n\r\n /**\r\n * Apply user-specified polling interval, OR, if \"high performance\" set, faster vs. default polling\r\n * (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)\r\n */\r\n setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));\r\n\r\n if (!sm2.debugMode) {\r\n // stop the SWF from making debug output calls to JS\r\n flash._disableDebug();\r\n }\r\n\r\n sm2.enabled = true;\r\n debugTS('jstoflash', true);\r\n\r\n if (!sm2.html5Only) {\r\n // prevent browser from showing cached page state (or rather, restoring \"suspended\" page state) via back button, because flash may be dead\r\n // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/\r\n event.add(window, 'unload', doNothing);\r\n }\r\n\r\n } catch(e) {\r\n\r\n sm2._wD('js/flash exception: ' + e.toString());\r\n\r\n debugTS('jstoflash', false);\r\n\r\n catchError({\r\n type: 'JS_TO_FLASH_EXCEPTION',\r\n fatal: true\r\n });\r\n\r\n // don't disable, for reboot()\r\n failSafely(true);\r\n\r\n initComplete();\r\n\r\n return false;\r\n\r\n }\r\n\r\n initComplete();\r\n\r\n // disconnect events\r\n cleanup();\r\n\r\n return true;\r\n\r\n };\r\n\r\n domContentLoaded = function() {\r\n\r\n if (didDCLoaded) return false;\r\n\r\n didDCLoaded = true;\r\n\r\n // assign top-level soundManager properties eg. soundManager.url\r\n setProperties();\r\n\r\n initDebug();\r\n\r\n if (!hasFlash && sm2.hasHTML5) {\r\n\r\n sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);\r\n\r\n sm2.setup({\r\n useHTML5Audio: true,\r\n // make sure we aren't preferring flash, either\r\n // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.\r\n preferFlash: false\r\n });\r\n\r\n }\r\n\r\n testHTML5();\r\n\r\n if (!hasFlash && needsFlash) {\r\n\r\n messages.push(strings.needFlash);\r\n\r\n // TODO: Fatal here vs. timeout approach, etc.\r\n // hack: fail sooner.\r\n sm2.setup({\r\n flashLoadTimeout: 1\r\n });\r\n\r\n }\r\n\r\n if (doc.removeEventListener) {\r\n doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);\r\n }\r\n\r\n initMovie();\r\n\r\n return true;\r\n\r\n };\r\n\r\n domContentLoadedIE = function() {\r\n\r\n if (doc.readyState === 'complete') {\r\n domContentLoaded();\r\n doc.detachEvent('onreadystatechange', domContentLoadedIE);\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n winOnLoad = function() {\r\n\r\n // catch edge case of initComplete() firing after window.load()\r\n windowLoaded = true;\r\n\r\n // catch case where DOMContentLoaded has been sent, but we're still in doc.readyState = 'interactive'\r\n domContentLoaded();\r\n\r\n event.remove(window, 'load', winOnLoad);\r\n\r\n };\r\n\r\n // sniff up-front\r\n detectFlash();\r\n\r\n // focus and window load, init (primarily flash-driven)\r\n event.add(window, 'focus', handleFocus);\r\n event.add(window, 'load', delayWaitForEI);\r\n event.add(window, 'load', winOnLoad);\r\n\r\n if (doc.addEventListener) {\r\n\r\n doc.addEventListener('DOMContentLoaded', domContentLoaded, false);\r\n\r\n } else if (doc.attachEvent) {\r\n\r\n doc.attachEvent('onreadystatechange', domContentLoadedIE);\r\n\r\n } else {\r\n\r\n // no add/attachevent support - safe to assume no JS -> Flash either\r\n debugTS('onload', false);\r\n catchError({\r\n type: 'NO_DOM2_EVENTS',\r\n fatal: true\r\n });\r\n\r\n }\r\n\r\n} // SoundManager()\r\n\r\n// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading\r\n\r\nif (window.SM2_DEFER === _undefined || !SM2_DEFER) {\r\n soundManager = new SoundManager();\r\n}\r\n\r\n/**\r\n * SoundManager public interfaces\r\n * ------------------------------\r\n */\r\n\r\nif (typeof module === 'object' && module && typeof module.exports === 'object') {\r\n\r\n /**\r\n * commonJS module\r\n */\r\n\r\n module.exports.SoundManager = SoundManager;\r\n module.exports.soundManager = soundManager;\r\n\r\n} else if (typeof define === 'function' && define.amd) {\r\n\r\n /**\r\n * AMD - requireJS\r\n * basic usage:\r\n * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n * SoundManager.getInstance().setup({\r\n * url: '/swf/',\r\n * onready: function() { ... }\r\n * })\r\n * });\r\n *\r\n * SM2_DEFER usage:\r\n * window.SM2_DEFER = true;\r\n * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n * SoundManager.getInstance(function() {\r\n * var soundManager = new SoundManager.constructor();\r\n * soundManager.setup({\r\n * url: '/swf/',\r\n * ...\r\n * });\r\n * ...\r\n * soundManager.beginDelayedInit();\r\n * return soundManager;\r\n * })\r\n * });\r\n */\r\n\r\n define(function() {\r\n /**\r\n * Retrieve the global instance of SoundManager.\r\n * If a global instance does not exist it can be created using a callback.\r\n *\r\n * @param {Function} smBuilder Optional: Callback used to create a new SoundManager instance\r\n * @return {SoundManager} The global SoundManager instance\r\n */\r\n function getInstance(smBuilder) {\r\n if (!window.soundManager && smBuilder instanceof Function) {\r\n var instance = smBuilder(SoundManager);\r\n if (instance instanceof SoundManager) {\r\n window.soundManager = instance;\r\n }\r\n }\r\n return window.soundManager;\r\n }\r\n return {\r\n constructor: SoundManager,\r\n getInstance: getInstance\r\n };\r\n });\r\n\r\n}\r\n\r\n// standard browser case\r\n\r\n// constructor\r\nwindow.SoundManager = SoundManager;\r\n\r\n/**\r\n * note: SM2 requires a window global due to Flash, which makes calls to window.soundManager.\r\n * Flash may not always be needed, but this is not known until async init and SM2 may even \"reboot\" into Flash mode.\r\n */\r\n\r\n// public API, flash callbacks etc.\r\nwindow.soundManager = soundManager;\r\n\r\n}(window));\r\n","'use strict';\nvar $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n"],"names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","catch","delegateYield","asyncGeneratorStep","_defineProperties","_toPropertyKey","key","toPrimitive","String","_toPrimitive","PageChunk","leafIndex","chunkIndex","text","lineRects","_classCallCheck","this","_callee","server","bookPath","chunks","_context","$","ajax","url","concat","dataType","cache","data","path","page","_fromTextWrapperResponse","_fetch","arguments","apply","_next","_throw","_x","_x2","_x3","chunksResponse","map","correctedLineRects","_fixChunkRects","correctedText","_removeDanglingHyphens","rects","_rects","_slicedToArray","firstRect","secondRect","_firstRect","left","bottom","width","secondHeight","secondWidth","secondRight","replace","PageChunkIterator","pageCount","start","opts","assign","DEFAULT_OPTS","_cursor","chunk","_bufferedPages","_bufferingPages","_cursorLock","_this","_nextUncontrolled","_this2","_decrementUncontrolled","AT_END","_recenterBuffer","_fetchPageChunks","_nextUncontrolled2","_this3","cursorChangePromise","prevPageChunks","index","Math","max","pageBufferSize","end","min","_removePageFromBuffer","_this4","_fetchPageChunksDirect","fetch","isAndroid","userAgent","undefined","navigator","test","COLUMN_TO_LANG_INDEX","searchForISO6391","language","columnsToSearch","langs","colI","column","split","x","toLowerCase","indexOf","hasLocalStorage","window","localStorage","_asyncToGenerator","AbstractTTSEngine","options","voice","getBestBookVoice","getVoices","bookLanguage","playing","paused","_chunkIterator","activeSound","playbackRate","events","on","updateBestVoice","trigger","numLeafs","onLoadingStart","step","fireEvent","pause","resume","_jumpBackward","all","decrement","voiceURI","off","find","setItem","setVoice","newRate","setPlaybackRate","_step","_callee2","sound","playPromise","_context2","onDone","createSound","rate","load","onLoadingComplete","beforeChunkPlay","playSound","afterChunkPlay","loaded","play","voices","userLanguages","languages","bookLangVoices","filter","lang","startsWith","matchingUserLangs","getMatchingStoredVoice","getMatchingVoice","default","storedVoice","getItem","_step2","_iterator","_createForOfIteratorHelper","_ret","_loop","matchingVoices","err","_createClass","_callSuper","_getPrototypeOf","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","Boolean","valueOf","_get","get","bind","_superPropBase","getOwnPropertyDescriptor","_setPrototypeOf","FestivalTTSEngine","_AbstractTTSEngine","_$$browser","audioFormat","browser","mozilla","_inherits","localService","soundManager","setup","debugMode","preferFlash","useHTML5Audio","flashVersion","promise","match","iOSCaptureUserIntentHack","FestivalTTSSound","getSoundUrl","dataString","encodeURIComponent","_iOSCaptureUserIntentHack","SILENCE_1MS","res","onfinish","destruct","supported","soundUrl","_finishResolver","onload","_onresume","onresume","sleep","_play","_callee3","_context3","mp3","ogg","super_","WebTTSEngine","speechSynthesis","addEventListener","audio","Audio","SILENCE_6S_MP3","loop","src","mediaSession","metadata","MediaMetadata","title","br","bookTitle","artist","m","label","artwork","thumbnail","setActionHandler","jumpBackward","jumpForward","unshift","WebTTSSound","started","stopped","utterance","_lastEvents","boundary","_charIndex","_finishPromise","_this$voice","SpeechSynthesisUtterance","location","toString","console","log","ev","dispatchEvent","CustomEvent","_reload","wasPaused","recentEvent","target","charIndex","cancel","speak","isLocalVoice","isChrome","_chromePausingBugFix","endPromise","race","promisifyEvent","_finish","Event","_pause","pausePromise","pauseMightNotWork","timeoutPromise","isFirefox","_resume","_callee4","resumeMightNotWork","resumeMightNotFire","resumePromise","_context4","reload","_chromePausingBugFix2","_callee5","result","_context5","t0","en","jQuery","extend","BookReader","defaultOptions","enableTtsPlugin","_ttsBoxesByIndex","TTSEngine","isSupported","engineName","festival","web","ttsEngine","showProgressPopup","removeProgressPopup","ttsStop","ttsBeforeChunkPlay","ttsSendChunkFinishedAnalyticsEvent","init","eventNames","PostInit","click","ttsToggle","ttsStart","_createPageContainer","pageContainer","pageIndex","renderBoxesInPageContainerLayer","$container","buildMobileDrawerElement","$el","after","imagesBaseURL","initNavbar","refs","$BRReadAloudToolbar","prepend","renderVoiceOption","join","voiceSortOrder","b","localeCompare","renderVoicesMenu","voicesMenu","empty","bookLanguages","sort","otherLanguages","append","val","show","hide","ttsUpdateState","ttsPlayPause","ttsJumpForward","ttsJumpBackward","$rateSelector","parseFloat","tooltips","insertBefore","closest","autoStop","startTTSEngine","constModeThumb","mode","switchMode","constMode1up","addClass","ttsSendAnalyticsEvent","currentIndex","book","getNumLeafs","isPlaying","toggleClass","togglePlayPause","removeClass","ttsRemoveHilites","_ref","ttsMaybeFlipToIndex","ttsHighlightChunk","ttsScrollToChunk","_ref2","constMode2up","jumpToIndex","_modes","mode2Up","mode2UpLit","_ref3","_ref4","_Object$entries$_i","_Object$entries","_i","pageIndexString","boxes","getPage","getActivePageContainerElementsForIndex","container","entries","_$$last","last","scrollIntoView","block","isFullscreenActive","inline","behavior","getActivePageContainerElements","remove","action","archiveAnalyticsSendEvent","extraValues","mediaLanguage","exports","uaMatch","ua","exec","platform_match","matched","version","versionNumber","platform","parseInt","android","bb","blackberry","ipad","iphone","ipod","kindle","playbook","silk","mobile","cros","mac","linux","win","desktop","chrome","opr","safari","webkit","rv","iemobile","ie","edge","msedge","opera","jQBrowser","factory","_undefined","document","SoundManager","smURL","smID","setupOptions","debugFlash","useConsole","consoleOnly","waitForWindowLoad","bgColor","useHighPerformance","flashPollingInterval","html5PollingInterval","flashLoadTimeout","wmode","allowScriptAccess","useFlashBlock","forceUseGlobalHTML5Audio","ignoreMobileRestrictions","html5Test","noSWFCache","idPrefix","autoLoad","autoPlay","from","loops","onid3","onerror","whileloading","onplay","onpause","whileplaying","onposition","onstop","multiShot","multiShotEvents","position","pan","stream","to","usePolicyFile","volume","flash9Options","onfailure","isMovieStar","usePeakData","useWaveformData","useEQData","onbufferchange","ondataerror","movieStarOptions","bufferTime","serverURL","onconnect","duration","audioFormats","required","mp4","related","opus","wav","flac","movieID","id","debugID","debugURLParam","movieURL","altURL","swfLoaded","enabled","oMC","sounds","soundIDs","muted","didFlashBlock","filePattern","filePatterns","flash8","flash9","features","buffering","peakData","waveformData","eqData","movieStar","sandbox","types","remote","localWithFile","localWithNetwork","localTrusted","description","noRemote","noLocal","html5","usingFlash","flash","html5Only","ignoreFlash","SMSound","doNothing","setProperties","fV","debugTS","_wDS","initComplete","mixin","extraOptions","addOnEvent","processOnEvents","initUserOnload","delayWaitForEI","waitForEI","rebootIntoHTML5","setVersionInfo","handleFocus","strings","initMovie","domContentLoaded","winOnLoad","didDCLoaded","getDocument","createMovie","catchError","setPolling","initDebug","disableObject","failSafely","normalizeMovieURL","str","flashBlockHandler","getSWFCSS","swfCSS","toggleDebug","loopFix","policyFix","complain","idCheck","startTimer","stopTimer","timerExecute","parseURL","canIgnoreFlash","featureCheck","html5OK","html5CanPlay","html5ErrorCodes","html5Ext","html5Unload","domContentLoadedIE","testHTML5","event","lastGlobalHTML5URL","hasFlash","detectFlash","badSafariFix","html5_events","showSupport","flushMessages","wrapCallback","didSetup","sm2","globalHTML5Audio","sm","smc","wl","href","doc","on_queue","debugOpen","didAppend","appendSuccess","didInit","disabled","windowLoaded","wdCount","debugLevels","oRemoved","oRemovedHTML","waitingForEI","initPending","h5TimerCount","h5IntervalTimer","messages","needsFlash","Array","useGlobalHTML5Audio","idCounter","msecScale","is_iDevice","isIE","isWebkit","isSafari","isOpera","mobileHTML5","isBadSafari","hasConsole","isFocused","hasFocus","tryInitOnFocus","okToDisable","flashMIME","emptyURL","overHTTP","protocol","http","netStreamMimeTypes","netStreamTypes","netStreamPattern","RegExp","preferFlashCheck","kind","html5_event","oFn","_s","_a","_wD","h5","mimePattern","useAltURL","swfBox","swfDefault","swfError","swfTimedout","swfUnblocked","sm2Debug","highPerf","flashDebug","hasHTML5","canPlayType","noURL","ok","globalHTML5","ignoreMobile","mobileUA","beginDelayedInit","readyState","setTimeout","getMovie","movie_id","oOptions","_url","cs","cs_string","oSound","make","_setup_html5","_createSound","connected","destroySound","sID","_bFromSound","oS","_iO","unload","splice","onPosition","nPosition","oMethod","oScope","clearOnPosition","overloaded","allowOverride","setPosition","nMsecOffset","stopAll","pauseAll","resumeAll","togglePause","setPan","nPan","setVolume","nVol","j","mute","muteAll","unmute","unmuteAll","toggleMute","getMemoryUse","ram","_getMemoryUse","disable","bNoDisable","canPlayMIME","sMIME","canPlayURL","sURL","canPlayLink","oLink","getSoundById","_suppressDebug","onready","sType","ontimeout","_writeDebug","sText","sTypeOrObject","oItem","createElement","className","appendChild","createTextNode","style","fontWeight","color","firstChild","alert","_debug","reboot","resetEvents","excludeInit","k","innerHTML","parentNode","removeChild","fired","getMoviePercent","PercentLoaded","resetProperties","add_html5_events","remove_html5_events","stop_html5_timer","start_html5_timer","attachOnPosition","detachOnPosition","applyFromTo","lastHTML5State","urlOmitted","onplay_called","onPositionItems","onPositionFired","lastURL","time","instanceOptions","isHTML5","id3","playState","_called_load","_html5_canplay","autobuffer","preload","_load","fatal","_unload","_bFromSM","_destroySound","_updatePlayState","fN","audioClone","onended","oncanplay","startOK","getAutoPlay","setAutoPlay","substr","lastIndexOf","instanceCount","_oncanplay","_onfinish","currentTime","add","_start","onplayerror","bAll","originalPosition","_onbufferchange","_resetOnPosition","_onTimer","_stop","_setAutoPlay","normalizedRate","message","position1K","offset","toFixed","_setPosition","_bCallFlash","bInstanceOnly","_setPan","_bInstanceOnly","_setVolume","hasIO","scope","_processOnPosition","item","op","retainPosition","_hasTimer","bytesLoaded","bytesTotal","durationEstimate","buffered","right","failures","isBuffering","bForce","isNew","_get_html5_duration","_whileplaying","Infinity","_apply_loop","nLoops","sameURL","dURL","decodeURI","_added_events","oEvt","removeEventListener","_onload","nSuccess","loadOK","_onerror","errorCode","nIsBuffering","_onsuspend","onsuspend","_onfailure","msg","level","code","_onwarning","onwarning","io_onfinish","_whileloading","nBytesLoaded","nBytesTotal","nDuration","nBufferLength","floor","bufferLength","oPeakData","oWaveformDataLeft","oWaveformDataRight","oEQData","eqLeft","leftPeak","rightPeak","leftEQ","rightEQ","_oncaptiondata","oData","captiondata","oncaptiondata","_onmetadata","oMDProps","oMDData","onmetadata","_onid3","oID3Props","oID3Data","_onconnect","bSuccess","_ondataerror","sError","body","getElementsByTagName","getElementById","oMain","oAdd","o2","o1","callback","oParent","hasParent","bonusOptions","Function","old","evt","getArgs","oArgs","args","len","element","shift","abort","canplay","ee","canplaythrough","durationchange","ended","error","loadeddata","_loaded","loadedmetadata","loadstart","fromCharCode","progress","progStr","isProgress","ranges","total","ratechange","suspend","stalled","timeupdate","waiting","iO","oAudio","_called_unload","fileExt","mime","aF","lookup","support","cp","canPlay","isOK","notReady","notOK","domError","spcWmode","swf404","tryDebug","checkSWF","localFail","waitFocus","waitForever","waitSWF","needFunction","badID","currentObj","waitOnload","docLoaded","onloadOK","secNote","badRemove","shutdown","queue","smError","fbTimeout","fbLoaded","fbHandler","manURL","onURL","badFV","as2loop","noNSLoop","needfl9","mfTimeout","needFlash","gotFocus","policy","setupError","setupUndef","setupLate","sm2Loaded","sstr","sOpt","sPre","sMsg","warn","oProp","Date","getTime","isDebug","bPolling","bHighPerformance","_setPolling","oD","oDebug","oTarget","oToggle","tmp","height","lineHeight","margin","textAlign","border","cursor","background","zIndex","onclick","display","e2","errorLevel","oT","sEventType","sMessage","sm2Debugger","handleEvent","css","ignoreInit","status","success","srcQueue","canRetry","obj","nP","hasPlugin","AX","ActiveXObject","plugins","mimeTypes","enabledPlugin","flashNeeded","formats","urlResult","setInterval","clearInterval","_setSandboxType","sandboxType","sb","_externalInterfaceOK","swfVersion","initMsg","isRTL","oEmbed","oMovie","movieHTML","oEl","sClass","remoteURL","localURL","extraClass","html","param","dir","quality","bgcolor","pluginspage","hasPriority","FlashVars","setAttribute","overflow","top","abs","oninitmovie","loadIncomplete","cleanup","tests","_externalInterfaceTest","_disableDebug","detachEvent","attachEvent","SM2_DEFER","module","getInstance","smBuilder","instance","$entries","stat","O"],"sourceRoot":""}
|
1
|
+
{"version":3,"file":"plugins/plugin.tts.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/tts/PageChunk.js","webpack://@internetarchive/bookreader/./src/plugins/tts/PageChunkIterator.js","webpack://@internetarchive/bookreader/./src/plugins/tts/utils.js","webpack://@internetarchive/bookreader/./src/plugins/tts/AbstractTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/FestivalTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/WebTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/plugin.tts.js","webpack://@internetarchive/bookreader/./src/plugins/tts/tooltip_dict.js","webpack://@internetarchive/bookreader/./node_modules/iso-language-codes/js/data.js","webpack://@internetarchive/bookreader/./node_modules/jquery.browser/dist/jquery.browser.js","webpack://@internetarchive/bookreader/./node_modules/soundmanager2/script/soundmanager2.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js"],"sourcesContent":["/**\n * Class to manage a 'chunk' (approximately a paragraph) of text on a page.\n */\nexport default class PageChunk {\n /**\n * @param {number} leafIndex\n * @param {number} chunkIndex\n * @param {string} text\n * @param {DJVURect[]} lineRects\n */\n constructor(leafIndex, chunkIndex, text, lineRects) {\n this.leafIndex = leafIndex;\n this.chunkIndex = chunkIndex;\n this.text = text;\n this.lineRects = lineRects;\n }\n\n /**\n * @param {string} server\n * @param {string} bookPath\n * @param {number} leafIndex\n * @return {Promise<PageChunk[]>}\n */\n static async fetch(server, bookPath, leafIndex) {\n const chunks = await $.ajax({\n type: 'GET',\n url: `https://${server}/BookReader/BookReaderGetTextWrapper.php`,\n cache: true,\n xhrFields: {\n withCredentials: window.br.protected,\n },\n data: {\n path: `${bookPath}_djvu.xml`,\n page: leafIndex,\n callback: 'false',\n },\n });\n return PageChunk._fromTextWrapperResponse(leafIndex, chunks);\n }\n\n /**\n * Convert the response from BookReaderGetTextWrapper.php into a {@link PageChunk} instance\n * @param {number} leafIndex\n * @param {Array<[String, ...DJVURect[]]>} chunksResponse\n * @return {PageChunk[]}\n */\n static _fromTextWrapperResponse(leafIndex, chunksResponse) {\n return chunksResponse.map((c, i) => {\n const correctedLineRects = PageChunk._fixChunkRects(c.slice(1));\n const correctedText = PageChunk._removeDanglingHyphens(c[0]);\n return new PageChunk(leafIndex, i, correctedText, correctedLineRects);\n });\n }\n\n /**\n * @private\n * Sometimes the first rectangle will be ridiculously wide/tall. Find those and fix them\n * *NOTE*: Modifies the original array and returns it.\n * *NOTE*: This should probably be fixed on the petabox side, and then removed here\n * Has 2 problems:\n * - If the rect is the last rect on the page (and hence the only rect in the array),\n * the rect's size isn't fixed\n * - Because this relies on the second rect, there's a chance it won't be the right\n * width\n * @param {DJVURect[]} rects\n * @return {DJVURect[]}\n */\n static _fixChunkRects(rects) {\n if (rects.length < 2) return rects;\n\n const [firstRect, secondRect] = rects;\n const [left, bottom, right] = firstRect;\n const width = right - left;\n const secondHeight = secondRect[1] - secondRect[3];\n const secondWidth = secondRect[2] - secondRect[0];\n const secondRight = secondRect[2];\n\n if (width > secondWidth * 30) {\n // Set the end to be the same\n firstRect[2] = secondRight;\n // And the top to be the same height\n firstRect[3] = bottom - secondHeight;\n }\n\n return rects;\n }\n\n /**\n * Remove \"dangling\" hyphens from read aloud text to avoid TTS stuttering\n * @param {string} text\n * @return {string}\n */\n static _removeDanglingHyphens(text) {\n // Some books mis-OCR a dangling hyphen as a ¬ (mathematical not sign) . Since in math\n // the not sign should not appear followed by a space, we think we can safely assume\n // this should be replaced.\n return text.replace(/[-¬]\\s+/g, '');\n }\n}\n\n/**\n * @typedef {[number, number, number, number]} DJVURect\n * coords are in l,b,r,t order\n */\n","import PageChunk from './PageChunk.js';\n\n/**\n * Class that iterates over the page chunks of a book; caching/buffering\n * as much as possible to try to ensure a smooth experience.\n */\nexport default class PageChunkIterator {\n /**\n * @param {number} pageCount total number of pages\n * @param {number} start page to start on\n * @param {PageChunkIteratorOptions} opts\n */\n constructor(pageCount, start, opts) {\n this.pageCount = pageCount;\n this.opts = Object.assign({}, DEFAULT_OPTS, opts);\n /** Position in the chunk sequence */\n this._cursor = { page: start, chunk: 0 };\n /** @type {Object<number, PageChunk[]>} leaf index -> chunks*/\n this._bufferedPages = {};\n /** @type {Object<number, PromiseLike<PageChunk[]>} leaf index -> chunks*/\n this._bufferingPages = {};\n /**\n * @type {Promise} promise that manages cursor modifications so that they\n * happen in order triggered as opposed to order the server responds\n **/\n this._cursorLock = Promise.resolve();\n }\n\n /**\n * Get the next chunk\n * @return {PromiseLike<\"__PageChunkIterator.AT_END__\" | PageChunk>}\n */\n next() {\n return this._cursorLock = this._cursorLock\n .then(() => this._nextUncontrolled());\n }\n\n /**\n * Sends the cursor back 1\n * @return {Promise}\n **/\n decrement() {\n return this._cursorLock = this._cursorLock\n .then(() => this._decrementUncontrolled());\n }\n\n /**\n * Gets without ensuring synchronization. Since this iterator has a lot of async\n * code, calling e.g. \"next\" twice (before the first call to next has finished)\n * would cause the system to be in a weird state. To avoid that, we make sure calls\n * to next and decrement (functions that modify the cursor) are synchronized,\n * so that regardless how long it takes for one to respond, they'll always be executed\n * in the correct order.\n * @return {PromiseLike<\"__PageChunkIterator.AT_END__\" | PageChunk>}\n */\n async _nextUncontrolled() {\n if (this._cursor.page == this.pageCount) {\n return Promise.resolve(PageChunkIterator.AT_END);\n }\n this._recenterBuffer(this._cursor.page);\n const chunks = await this._fetchPageChunks(this._cursor.page);\n if (this._cursor.chunk == chunks.length) {\n this._cursor.page++;\n this._cursor.chunk = 0;\n return this._nextUncontrolled();\n }\n return chunks[this._cursor.chunk++];\n }\n\n /**\n * Decrements without ensuring synchronization. (See {@link PageChunkIterator._nextUncontrolled});\n * @return {Promise}\n */\n _decrementUncontrolled() {\n let cursorChangePromise = Promise.resolve();\n\n if (this._cursor.chunk > 0) {\n this._cursor.chunk--;\n } else if (this._cursor.page > 0) {\n this._cursor.page--;\n // Go back possibly multiple pages, because pages can be blank\n cursorChangePromise = this._fetchPageChunks(this._cursor.page)\n .then(prevPageChunks => {\n if (prevPageChunks.length == 0) return this._decrementUncontrolled();\n else this._cursor.chunk = prevPageChunks.length - 1;\n });\n }\n\n return cursorChangePromise\n .then(() => this._fetchPageChunks(this._cursor.page));\n }\n\n /**\n * Recenter the buffer around the provided page index\n * @param {number} index\n */\n _recenterBuffer(index) {\n const start = Math.max(0, index - this.opts.pageBufferSize);\n const end = Math.min(this.pageCount, index + this.opts.pageBufferSize + 1);\n for (let i = start; i < end; i++) {\n this._fetchPageChunks(i);\n }\n\n this._removePageFromBuffer(start - 1);\n this._removePageFromBuffer(end + 1);\n }\n\n /**\n * @param {number} index\n */\n _removePageFromBuffer(index) {\n delete this._bufferingPages[index];\n delete this._bufferedPages[index];\n }\n\n /**\n * Fetches the chunks on a page; checks the buffer, so it won't make unnecessary\n * requests if it's called multiple times for the same index.\n * @param {number} index\n * @return {Promise<PageChunk[]>}\n */\n _fetchPageChunks(index) {\n if (index in this._bufferingPages) return this._bufferingPages[index];\n if (index in this._bufferedPages) return Promise.resolve(this._bufferedPages[index]);\n\n this._bufferingPages[index] = this._fetchPageChunksDirect(index)\n .then(chunks => {\n delete this._bufferingPages[index];\n this._bufferedPages[index] = chunks;\n return chunks;\n });\n\n return this._bufferingPages[index];\n }\n\n /**\n * Fetches a page without checking buffer\n * @param {number} index\n */\n _fetchPageChunksDirect(index) {\n return PageChunk.fetch(this.opts.server, this.opts.bookPath, index);\n }\n}\n\nPageChunkIterator.AT_END = \"__PageChunkIterator.AT_END__\";\n\n/** @type {PageChunkIteratorOptions} */\nconst DEFAULT_OPTS = {\n server: null,\n bookPath: null,\n pageBufferSize: 2,\n};\n\n/**\n * @typedef {Object} PageChunkIteratorOptions\n * @property {string} server\n * @property {string} bookPath\n * @property {number} [pageBufferSize] number of pages to buffer before/after the current page\n */\n","import langs from 'iso-language-codes/js/data.js';\n\n/**\n * Use regex to approximate word count in a string\n * @param {string} text\n * @return {number}\n */\nexport function approximateWordCount(text) {\n const m = text.match(/\\S+/g);\n return m ? m.length : 0;\n}\n\n/**\n * Checks whether the current browser is on android\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isAndroid(userAgent = navigator.userAgent) {\n return /android/i.test(userAgent);\n}\n\n/**\n * @typedef {string} ISO6391\n * Language code in ISO 639-1 format. e.g. en, fr, zh\n **/\n\n/** Each lang is an array, with each index mapping to a different property */\nconst COLUMN_TO_LANG_INDEX = {\n 'Name': 0,\n 'Endonym': 1,\n 'ISO 639-1': 2,\n 'ISO 639-2/T': 3,\n 'ISO 639-2/B': 4,\n};\n\n/**\n * @param {string} language in some format\n * @return {ISO6391?}\n */\nexport function toISO6391(language) {\n if (!language) return null;\n language = language.toLowerCase();\n\n return searchForISO6391(language, ['ISO 639-1']) ||\n searchForISO6391(language, ['ISO 639-2/B']) ||\n searchForISO6391(language, ['ISO 639-2/T', 'Endonym', 'Name']);\n}\n\n/**\n * Searches for the given long in the given columns.\n * @param {string} language\n * @param {Array<keyof COLUMN_TO_LANG_INDEX>} columnsToSearch\n * @return {ISO6391?}\n */\nfunction searchForISO6391(language, columnsToSearch) {\n for (let i = 0; i < langs.length; i++) {\n for (let colI = 0; colI < columnsToSearch.length; colI++) {\n const column = columnsToSearch[colI];\n const columnValue = langs[i][COLUMN_TO_LANG_INDEX[column]];\n if (columnValue.split(', ').map(x => x.toLowerCase()).indexOf(language) != -1) {\n return langs[i][COLUMN_TO_LANG_INDEX['ISO 639-1']];\n }\n }\n }\n return null;\n}\n\n/**\n * Checks whether the current browser supports localStorage or\n * if the current context has access to it.\n * @return {boolean}\n */\nexport function hasLocalStorage() {\n try {\n return !!window.localStorage;\n } catch (e) {\n // Will throw in sandboxed iframe\n // DOMException: Window.localStorage getter: Forbidden in a sandboxed document without the 'allow-same-origin' flag.\n return false;\n }\n}\n","import PageChunkIterator from './PageChunkIterator.js';\nimport { hasLocalStorage } from './utils.js';\n/** @typedef {import('./utils.js').ISO6391} ISO6391 */\n/** @typedef {import('./PageChunk.js')} PageChunk */\n\n/**\n * @export\n * @typedef {Object} TTSEngineOptions\n * @property {String} server\n * @property {String} bookPath\n * @property {ISO6391} bookLanguage\n * @property {Function} onLoadingStart\n * @property {Function} onLoadingComplete\n * @property {Function} onDone called when the entire book is done\n * @property {function(PageChunk): PromiseLike} beforeChunkPlay will delay the playing of the chunk\n * @property {function(PageChunk): void} afterChunkPlay fires once a chunk has fully finished\n */\n\n/**\n * @typedef {Object} AbstractTTSSound\n * @property {PageChunk} chunk\n * @property {boolean} loaded\n * @property {number} rate\n * @property {SpeechSynthesisVoice} voice\n * @property {(callback: Function) => void} load\n * @property {() => PromiseLike} play\n * @property {() => Promise} stop\n * @property {() => void} pause\n * @property {() => void} resume\n * @property {() => void} finish force the sound to 'finish'\n * @property {number => void} setPlaybackRate\n * @property {SpeechSynthesisVoice => void} setVoice\n **/\n\n/** Handling bookreader's text-to-speech */\nexport default class AbstractTTSEngine {\n /**\n * @protected\n * @param {TTSEngineOptions} options\n */\n constructor(options) {\n this.playing = false;\n this.paused = false;\n this.opts = options;\n /** @type {PageChunkIterator} */\n this._chunkIterator = null;\n /** @type {AbstractTTSSound} */\n this.activeSound = null;\n this.playbackRate = 1;\n /** Events we can bind to */\n this.events = $({});\n /** @type {SpeechSynthesisVoice} */\n this.voice = null;\n // Listen for voice changes (fired by subclasses)\n this.events.on('voiceschanged', this.updateBestVoice);\n this.events.trigger('voiceschanged');\n }\n\n /**\n * @abstract\n * @return {boolean}\n */\n static isSupported() { throw new Error(\"Unimplemented abstract class\"); }\n\n /**\n * @abstract\n * @return {SpeechSynthesisVoice[]}\n */\n getVoices() { throw new Error(\"Unimplemented abstract class\"); }\n\n /** @abstract */\n init() { return null; }\n\n updateBestVoice = () => {\n this.voice = AbstractTTSEngine.getBestBookVoice(this.getVoices(), this.opts.bookLanguage);\n }\n\n /**\n * @param {number} leafIndex\n * @param {number} numLeafs total number of leafs in the current book\n */\n start(leafIndex, numLeafs) {\n this.playing = true;\n this.paused = false;\n this.opts.onLoadingStart();\n\n this._chunkIterator = new PageChunkIterator(numLeafs, leafIndex, {\n server: this.opts.server,\n bookPath: this.opts.bookPath,\n pageBufferSize: 5,\n });\n\n this.step();\n this.events.trigger('start');\n }\n\n stop() {\n if (this.activeSound) this.activeSound.stop();\n this.playing = false;\n this.paused = true;\n this._chunkIterator = null;\n this.activeSound = null;\n this.events.trigger('stop');\n }\n\n /** @public */\n pause() {\n const fireEvent = !this.paused && this.activeSound;\n this.paused = true;\n if (this.activeSound) this.activeSound.pause();\n if (fireEvent) this.events.trigger('pause');\n }\n\n /** @public */\n resume() {\n const fireEvent = this.paused && this.activeSound;\n this.paused = false;\n if (this.activeSound) this.activeSound.resume();\n if (fireEvent) this.events.trigger('resume');\n }\n\n togglePlayPause() {\n if (this.paused) this.resume();\n else this.pause();\n }\n\n /** @public */\n jumpForward() {\n if (this.activeSound) this.activeSound.finish();\n }\n\n /** @public */\n async jumpBackward() {\n await Promise.all([\n this.activeSound.stop(),\n this._chunkIterator.decrement()\n .then(() => this._chunkIterator.decrement()),\n ]);\n this.step();\n }\n\n /** @param {string} voiceURI */\n setVoice(voiceURI) {\n // if the user actively selects a voice, don't re-choose best voice anymore\n // MS Edge fires voices changed randomly very often\n this.events.off('voiceschanged', this.updateBestVoice);\n this.voice = this.getVoices().find(voice => voice.voiceURI === voiceURI);\n // if the current book has a language set, store the selected voice with the book language as a suffix\n if (this.opts.bookLanguage && hasLocalStorage()) {\n localStorage.setItem(`BRtts-voice-${this.opts.bookLanguage}`, this.voice.voiceURI);\n }\n if (this.activeSound) this.activeSound.setVoice(this.voice);\n }\n\n /** @param {number} newRate */\n setPlaybackRate(newRate) {\n this.playbackRate = newRate;\n if (this.activeSound) this.activeSound.setPlaybackRate(newRate);\n }\n\n /** @private */\n async step() {\n const chunk = await this._chunkIterator.next();\n if (chunk == PageChunkIterator.AT_END) {\n this.stop();\n this.opts.onDone();\n return;\n }\n this.opts.onLoadingStart();\n const sound = this.createSound(chunk);\n sound.chunk = chunk;\n sound.rate = this.playbackRate;\n sound.voice = this.voice;\n sound.load(() => this.opts.onLoadingComplete());\n\n this.opts.onLoadingComplete();\n\n await this.opts.beforeChunkPlay(chunk);\n\n if (!this.playing) return;\n\n const playPromise = await this.playSound(sound)\n .then(()=> this.opts.afterChunkPlay(sound.chunk));\n\n if (this.paused) this.pause();\n await playPromise;\n\n if (this.playing) return this.step();\n }\n\n /**\n * @abstract\n * @param {PageChunk} chunk\n * @return {AbstractTTSSound}\n */\n createSound(chunk) { throw new Error(\"Unimplemented abstract class\"); }\n\n /**\n * @param {AbstractTTSSound} sound\n * @return {PromiseLike} promise called once playing finished\n */\n playSound(sound) {\n this.activeSound = sound;\n if (!this.activeSound.loaded) this.opts.onLoadingStart();\n return this.activeSound.play();\n }\n\n /** Convenience wrapper for {@see AbstractTTSEngine.getBestVoice} */\n getBestVoice() {\n return AbstractTTSEngine.getBestBookVoice(this.getVoices(), this.opts.bookLanguage);\n }\n\n /**\n * @private\n * Find the best voice to use given the available voices, the book language, and the user's\n * languages.\n * @param {SpeechSynthesisVoice[]} voices\n * @param {ISO6391} bookLanguage\n * @param {string[]} userLanguages languages in BCP47 format (e.g. en-US). Ordered by preference.\n * @return {SpeechSynthesisVoice | undefined}\n */\n static getBestBookVoice(voices, bookLanguage, userLanguages = navigator.languages) {\n const bookLangVoices = voices.filter(v => v.lang.startsWith(bookLanguage));\n // navigator.languages browser support isn't great yet, so get just 1 language otherwise\n // Sample navigator.languages: [\"en-CA\", \"fr-CA\", \"fr\", \"en-US\", \"en\", \"de-DE\", \"de\"]\n userLanguages = userLanguages || (navigator.language ? [navigator.language] : []);\n\n // user languages that match the book language\n const matchingUserLangs = userLanguages.filter(lang => lang.startsWith(bookLanguage));\n\n // First try to find the last chosen voice from localStorage for the current book language\n return AbstractTTSEngine.getMatchingStoredVoice(bookLangVoices, bookLanguage)\n // Try to find voices that intersect these two sets\n || AbstractTTSEngine.getMatchingVoice(matchingUserLangs, bookLangVoices)\n // no user languages match the books; let's return the best voice for the book language\n || (bookLangVoices.find(v => v.default) || bookLangVoices[0])\n // No voices match the book language? let's find a voice in the user's language\n // and ignore book lang\n || AbstractTTSEngine.getMatchingVoice(userLanguages, voices)\n // C'mon! Ok, just read with whatever we got!\n || (voices.find(v => v.default) || voices[0]);\n }\n\n /**\n * @private\n * Get the voice last selected by the user for the book language from localStorage.\n * Returns undefined if no voice is stored or found.\n * @param {SpeechSynthesisVoice[]} voices browser voices to choose from\n * @param {ISO6391} bookLanguage book language to look for\n * @return {SpeechSynthesisVoice | undefined}\n */\n static getMatchingStoredVoice(voices, bookLanguage) {\n const storedVoice = hasLocalStorage() && localStorage.getItem(`BRtts-voice-${bookLanguage}`);\n return (storedVoice ? voices.find(v => v.voiceURI === storedVoice) : undefined);\n }\n\n /**\n * @private\n * Get the best voice that matches one of the BCP47 languages (order by preference)\n * @param {string[]} languages in BCP 47 format (e.g. 'en-US', or 'en'); ordered by preference\n * @param {SpeechSynthesisVoice[]} voices voices to choose from\n * @return {SpeechSynthesisVoice | undefined}\n */\n static getMatchingVoice(languages, voices) {\n for (const lang of languages) {\n // Chrome Android was returning voice languages like `en_US` instead of `en-US`\n const matchingVoices = voices.filter(v => v.lang.replace('_', '-').startsWith(lang));\n if (matchingVoices.length) {\n return matchingVoices.find(v => v.default) || matchingVoices[0];\n }\n }\n }\n}\n","import AbstractTTSEngine from './AbstractTTSEngine.js';\nimport { sleep } from '../../BookReader/utils.js';\n/* global soundManager */\nimport 'soundmanager2';\nimport 'jquery.browser';\n\n/** @typedef {import(\"./AbstractTTSEngine.js\").TTSEngineOptions} TTSEngineOptions */\n/** @typedef {import(\"./AbstractTTSEngine.js\").AbstractTTSSound} AbstractTTSSound */\n\n/**\n * @extends AbstractTTSEngine\n * TTS using Festival endpoint\n **/\nexport default class FestivalTTSEngine extends AbstractTTSEngine {\n /** @override */\n static isSupported() {\n return typeof(soundManager) !== 'undefined' && soundManager.supported();\n }\n\n /** @param {TTSEngineOptions} options */\n constructor(options) {\n super(options);\n // $.browsers is sometimes undefined on some Android browsers :/\n // Likely related to when $.browser was moved to npm\n /** @type {'mp3' | 'ogg'} format of audio to get */\n this.audioFormat = $.browser?.mozilla ? 'ogg' : 'mp3'; //eslint-disable-line no-jquery/no-browser\n }\n\n /** @override */\n getVoices() {\n return [\n { default: true, lang: \"en-US\", localService: false, name: \"Festival - English (US)\", voiceURI: null },\n ];\n }\n\n /** @override */\n init() {\n // setup sound manager\n soundManager.setup({\n debugMode: false,\n // Note, there's a bug in Chrome regarding range requests.\n // Flash is used as a workaround.\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=505707\n preferFlash: true,\n url: '/bookreader/BookReader/soundmanager/swf',\n useHTML5Audio: true,\n //flash 8 version of swf is buggy when calling play() on a sound that is still loading\n flashVersion: 9,\n });\n }\n\n /**\n * @override\n * @param {number} leafIndex\n * @param {number} numLeafs total number of leafs in the current book\n */\n start(leafIndex, numLeafs) {\n let promise = null;\n\n // Hack for iOS\n if (navigator.userAgent.match(/mobile/i)) {\n promise = this.iOSCaptureUserIntentHack();\n }\n\n promise = promise || Promise.resolve();\n promise.then(() => super.start(leafIndex, numLeafs));\n }\n\n /** @override */\n createSound(chunk) {\n return new FestivalTTSSound(this.getSoundUrl(chunk.text));\n }\n\n /**\n * @private\n * Get URL for audio that says this text\n * @param {String} dataString the thing to say\n * @return {String} url\n */\n getSoundUrl(dataString) {\n return 'https://' + this.opts.server + '/BookReader/BookReaderGetTTS.php?string='\n + encodeURIComponent(dataString)\n + '&format=.' + this.audioFormat;\n }\n\n /**\n * @private\n * Security restrictions require playback to be triggered\n * by a user click/touch. This intention gets lost in the async calls\n * on iOS, but, for some reason, if we start the audio here, it works.\n * See https://stackoverflow.com/questions/12206631/html5-audio-cant-play-through-javascript-unless-triggered-manually-once\n * @return {PromiseLike}\n */\n async iOSCaptureUserIntentHack() {\n const sound = soundManager.createSound({ url: SILENCE_1MS[this.audioFormat] });\n await new Promise(res => sound.play({onfinish: res}));\n sound.destruct();\n }\n}\n\n/** @extends AbstractTTSSound */\nclass FestivalTTSSound {\n /** @param {string} soundUrl **/\n constructor(soundUrl) {\n this.soundUrl = soundUrl;\n /** @type {SMSound} */\n this.sound = null;\n this.rate = 1;\n /** @type {function} calling this resolves the \"play\" promise */\n this._finishResolver = null;\n }\n\n get loaded() {\n return this.sound && this.sound.loaded;\n }\n\n load(onload) {\n this.sound = soundManager.createSound({\n url: this.soundUrl,\n // API recommended, but only fires once play started on safari\n onload: () => {\n if (this.rate != 1) this.sound.setPlaybackRate(this.rate);\n onload();\n },\n onresume: async () => {\n await sleep(25);\n if (this.rate != 1) this.sound.setPlaybackRate(this.rate);\n },\n });\n return this.sound.load();\n }\n\n async play() {\n await new Promise(res => {\n this._finishResolver = res;\n this.sound.play({ onfinish: res });\n });\n this.sound.destruct();\n }\n\n /** @override */\n stop() {\n this.sound.stop();\n return Promise.resolve();\n }\n\n /** @override */\n pause() { this.sound.pause(); }\n /** @override */\n resume() { this.sound.resume(); }\n /** @override */\n setPlaybackRate(rate) {\n this.rate = rate;\n this.sound.setPlaybackRate(rate);\n }\n\n /** @override */\n finish() {\n this.sound.stop();\n this._finishResolver();\n }\n}\n\n/** Needed to capture the audio context for iOS hack. Generated using Audacity. */\nconst SILENCE_1MS = {\n mp3: 'data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA//////////////////////////////////////////////////////////////////8AAAAeTEFNRTMuOTlyBJwAAAAAAAAAADUgJAaUQQABrgAAAnHIf8sZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sQxAADwlwBKGAAACAAAD/AAAAEAAAAH///////////////+UBAMExBTUUzLjk5LjOqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xDEIAPAAAGkAAAAIAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==',\n ogg: 'data:audio/ogg;base64,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',\n};\n","/* global br */\nimport { isChrome, isFirefox } from '../../util/browserSniffing.js';\nimport { isAndroid } from './utils.js';\nimport { promisifyEvent, sleep } from '../../BookReader/utils.js';\nimport AbstractTTSEngine from './AbstractTTSEngine.js';\n/** @typedef {import(\"./AbstractTTSEngine.js\").PageChunk} PageChunk */\n/** @typedef {import(\"./AbstractTTSEngine.js\").AbstractTTSSound} AbstractTTSSound */\n/** @typedef {import(\"./AbstractTTSEngine.js\").TTSEngineOptions} TTSEngineOptions */\n\n/**\n * @extends AbstractTTSEngine\n * TTS using Web Speech APIs\n **/\nexport default class WebTTSEngine extends AbstractTTSEngine {\n static isSupported() {\n return typeof(window.speechSynthesis) !== 'undefined' && !/samsungbrowser/i.test(navigator.userAgent);\n }\n\n /** @param {TTSEngineOptions} options */\n constructor(options) {\n super(options);\n\n // SAFARI doesn't have addEventListener on speechSynthesis\n if (speechSynthesis.addEventListener) {\n speechSynthesis.addEventListener('voiceschanged', () => this.events.trigger('voiceschanged'));\n }\n }\n\n /** @override */\n start(leafIndex, numLeafs) {\n // Need to run in this function to capture user intent to start playing audio\n if ('mediaSession' in navigator) {\n const audio = new Audio(SILENCE_6S_MP3);\n audio.loop = true;\n\n this.events.on('pause', () => audio.pause());\n this.events.on('resume', () => audio.play());\n // apparently this is what you need to do to make the media session notification go away\n // See https://developers.google.com/web/updates/2017/02/media-session#implementation_notes\n this.events.on('stop', () => audio.src = '');\n audio.play().then(() => {\n navigator.mediaSession.metadata = new MediaMetadata({\n title: br.bookTitle,\n artist: br.options.metadata.filter(m => m.label == 'Author').map(m => m.value)[0],\n // album: 'The Ultimate Collection (Remastered)',\n artwork: [\n { src: br.options.thumbnail, type: 'image/jpg' },\n ],\n });\n\n navigator.mediaSession.setActionHandler('play', () => {\n audio.play();\n this.resume();\n });\n navigator.mediaSession.setActionHandler('pause', () => {\n audio.pause();\n this.pause();\n });\n\n // navigator.mediaSession.setActionHandler('seekbackward', () => this.jumpBackward());\n // navigator.mediaSession.setActionHandler('seekforward', () => this.jumpForward());\n // Some devices only support the previoustrack/nexttrack (e.g. Win10), so show those.\n // Android devices do support the seek actions, but we don't want to show both buttons\n // and have them do the same thing.\n navigator.mediaSession.setActionHandler('previoustrack', () => this.jumpBackward());\n navigator.mediaSession.setActionHandler('nexttrack', () => this.jumpForward());\n });\n }\n\n return super.start(leafIndex, numLeafs);\n }\n\n /** @override */\n getVoices() {\n const voices = speechSynthesis.getVoices();\n if (voices.filter(v => v.default).length != 1) {\n // iOS bug where the default system voice is sometimes\n // missing from the list\n voices.unshift({\n voiceURI: 'bookreader.SystemDefault',\n name: 'System Default',\n // Not necessarily true, but very likely\n lang: navigator.language,\n default: true,\n localService: true,\n });\n }\n return voices;\n }\n\n /** @override */\n createSound(chunk) {\n return new WebTTSSound(chunk.text);\n }\n}\n\n/** @extends AbstractTTSSound */\nexport class WebTTSSound {\n /** @param {string} text **/\n constructor(text) {\n this.text = text;\n this.loaded = false;\n this.paused = false;\n this.started = false;\n /** Whether the audio was stopped with a .stop() call */\n this.stopped = false;\n this.rate = 1;\n\n /** @type {SpeechSynthesisUtterance} */\n this.utterance = null;\n\n /** @type {SpeechSynthesisVoice} */\n this.voice = null;\n\n this._lastEvents = {\n /** @type {SpeechSynthesisEvent} */\n pause: null,\n /** @type {SpeechSynthesisEvent} */\n boundary: null,\n /** @type {SpeechSynthesisEvent} */\n start: null,\n };\n\n /** Store where we are in the text. Only works on some browsers. */\n this._charIndex = 0;\n\n /** @type {Function} resolve function called when playback finished */\n this._finishResolver = null;\n\n /** @type {Promise} promise resolved by _finishResolver */\n this._finishPromise = null;\n }\n\n /** @override **/\n load(onload) {\n this.loaded = false;\n this.started = false;\n\n this.utterance = new SpeechSynthesisUtterance(this.text.slice(this._charIndex));\n // iOS bug where the default system voice is sometimes\n // missing from the list\n if (this.voice?.voiceURI !== 'bookreader.SystemDefault') {\n this.utterance.voice = this.voice;\n }\n // Need to also set lang (for some reason); won't set voice on Chrome@Android otherwise\n if (this.voice) this.utterance.lang = this.voice.lang;\n this.utterance.rate = this.rate;\n\n // Useful for debugging things\n if (location.toString().indexOf('_debugReadAloud=true') != -1) {\n this.utterance.addEventListener('pause', () => console.log('pause'));\n this.utterance.addEventListener('resume', () => console.log('resume'));\n this.utterance.addEventListener('start', () => console.log('start'));\n this.utterance.addEventListener('end', () => console.log('end'));\n this.utterance.addEventListener('error', () => console.log('error'));\n this.utterance.addEventListener('boundary', () => console.log('boundary'));\n this.utterance.addEventListener('mark', () => console.log('mark'));\n this.utterance.addEventListener('finish', () => console.log('finish'));\n }\n\n // Keep track of the speech synthesis events that come in; they have useful info\n // about progress (like charIndex)\n this.utterance.addEventListener('start', ev => this._lastEvents.start = ev);\n this.utterance.addEventListener('boundary', ev => this._lastEvents.boundary = ev);\n this.utterance.addEventListener('pause', ev => this._lastEvents.pause = ev);\n\n // Update our state\n this.utterance.addEventListener('start', () => {\n this.started = true;\n this.stopped = false;\n this.paused = false;\n });\n this.utterance.addEventListener('pause', () => this.paused = true);\n this.utterance.addEventListener('resume', () => this.paused = false);\n this.utterance.addEventListener('end', ev => {\n if (!this.paused && !this.stopped) {\n // Trigger a new event, finish, which only fires when audio fully completed\n this.utterance.dispatchEvent(new CustomEvent('finish', ev));\n }\n });\n this.loaded = true;\n onload && onload();\n }\n\n /**\n * Run whenever properties have changed. Tries to restart in the same spot it\n * left off.\n * @return {Promise<void>}\n */\n async reload() {\n // We'll restore the pause state, so copy it here\n const wasPaused = this.paused;\n // Use recent event to determine where we'll restart from\n // Browser support for this is mixed, but it degrades to restarting the chunk\n // and that's ok\n const recentEvent = this._lastEvents.boundary || this._lastEvents.pause;\n if (recentEvent) {\n this._charIndex = this.text.indexOf(recentEvent.target.text) + recentEvent.charIndex;\n }\n\n // We can't modify the utterance object, so we have to make a new one\n await this.stop();\n this.load();\n // Instead of playing and immediately pausing, we don't start playing. Note\n // this is a requirement because pause doesn't work consistently across\n // browsers.\n if (!wasPaused) this.play();\n }\n\n play() {\n this._finishPromise = this._finishPromise || new Promise(res => this._finishResolver = res);\n this.utterance.addEventListener('finish', this._finishResolver);\n\n // clear the queue\n speechSynthesis.cancel();\n // reset pause state\n speechSynthesis.resume();\n // Speak\n speechSynthesis.speak(this.utterance);\n\n const isLocalVoice = this.utterance.voice && this.utterance.voice.localService;\n if (isChrome() && !isLocalVoice) this._chromePausingBugFix();\n\n return this._finishPromise;\n }\n\n /** @return {Promise} */\n stop() {\n // 'end' won't fire if already stopped\n let endPromise = Promise.resolve();\n if (!this.stopped) {\n endPromise = Promise.race([\n promisifyEvent(this.utterance, 'end'),\n // Safari triggers an error when you call cancel mid-sound\n promisifyEvent(this.utterance, 'error'),\n ]);\n }\n this.stopped = true;\n speechSynthesis.cancel();\n return endPromise;\n }\n\n async finish() {\n await this.stop();\n this.utterance.dispatchEvent(new Event('finish'));\n }\n\n /**\n * @override\n * Will fire a pause event unless already paused\n **/\n async pause() {\n if (this.paused) return;\n\n const pausePromise = promisifyEvent(this.utterance, 'pause');\n speechSynthesis.pause();\n\n // There are a few awful browser cases:\n // 1. Pause works and fires\n // 2. Pause doesn't work and doesn't fire\n // 3. Pause works but doesn't fire\n const pauseMightNotWork = (isFirefox() && isAndroid());\n const pauseMightNotFire = isChrome() || pauseMightNotWork;\n\n if (pauseMightNotFire) {\n // wait for it just in case\n const timeoutPromise = sleep(100).then(() => 'timeout');\n const result = await Promise.race([pausePromise, timeoutPromise]);\n // We got our pause event; nothing to do!\n if (result != 'timeout') return;\n\n this.utterance.dispatchEvent(new CustomEvent('pause', this._lastEvents.start));\n\n // if pause might not work, then we'll stop entirely and restart later\n if (pauseMightNotWork) this.stop();\n }\n }\n\n async resume() {\n if (!this.started) {\n this.play();\n return;\n }\n\n if (!this.paused) return;\n\n // Browser cases:\n // 1. Resume works + fires\n // 2. Resume works + doesn't fire (Chrome Desktop)\n // 3. Resume doesn't work + doesn't fire (Chrome/FF Android)\n const resumeMightNotWork = (isChrome() && isAndroid()) || (isFirefox() && isAndroid());\n const resumeMightNotFire = isChrome() || resumeMightNotWork;\n\n // Try resume\n const resumePromise = promisifyEvent(this.utterance, 'resume');\n speechSynthesis.resume();\n\n if (resumeMightNotFire) {\n const result = await Promise.race([resumePromise, sleep(100).then(() => 'timeout')]);\n\n if (result != 'timeout') return;\n\n this.utterance.dispatchEvent(new CustomEvent('resume', {}));\n if (resumeMightNotWork) {\n await this.reload();\n this.play();\n }\n }\n }\n\n setPlaybackRate(rate) {\n this.rate = rate;\n this.reload();\n }\n\n /** @param {SpeechSynthesisVoice} voice */\n setVoice(voice) {\n this.voice = voice;\n this.reload();\n }\n /**\n * @private\n * Chrome has a bug where it only plays 15 seconds of TTS and then\n * suddenly stops (see https://bugs.chromium.org/p/chromium/issues/detail?id=679437 )\n * We avoid this (as described here: https://bugs.chromium.org/p/chromium/issues/detail?id=679437#c15 )\n * by pausing after 14 seconds and ~instantly resuming.\n */\n async _chromePausingBugFix() {\n const timeoutPromise = sleep(14000).then(() => 'timeout');\n const pausePromise = promisifyEvent(this.utterance, 'pause').then(() => 'paused');\n const endPromise = promisifyEvent(this.utterance, 'end').then(() => 'ended');\n const result = await Promise.race([timeoutPromise, pausePromise, endPromise]);\n if (location.toString().indexOf('_debugReadAloud=true') != -1) {\n console.log(`CHROME-PAUSE-HACK: ${result}`);\n }\n switch (result) {\n case 'ended':\n // audio was stopped/finished; nothing to do\n break;\n case 'paused':\n // audio was paused; wait for resume\n // Chrome won't let you resume the audio if 14s have passed 🤷\n // We could do the same as before (but resume+pause instead of pause+resume),\n // but that means we'd _constantly_ be running in the background. So in that\n // case, let's just restart the chunk\n await Promise.race([\n promisifyEvent(this.utterance, 'resume'),\n sleep(14000).then(() => 'timeout'),\n ]);\n result == 'timeout' ? this.reload() : this._chromePausingBugFix();\n break;\n case 'timeout':\n // We hit Chrome's secret cut off time. Pause/resume\n // to be able to keep TTS-ing\n speechSynthesis.pause();\n await sleep(25);\n speechSynthesis.resume();\n this._chromePausingBugFix();\n break;\n }\n }\n}\n\n/**\n * According to https://developers.google.com/web/updates/2017/02/media-session#implementation_notes , it needs to be at least 5 seconds\n * long to allow usage of the media sessions api\n */\nconst SILENCE_6S_MP3 = 'data:audio/mp3;base64,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';\n","/* global BookReader */\n/**\n * Plugin for Text to Speech in BookReader\n */\nimport FestivalTTSEngine from './FestivalTTSEngine.js';\nimport WebTTSEngine from './WebTTSEngine.js';\nimport { toISO6391, approximateWordCount } from './utils.js';\nimport { en as tooltips } from './tooltip_dict.js';\nimport { renderBoxesInPageContainerLayer } from '../../BookReader/PageContainer.js';\n/** @typedef {import('./PageChunk.js').default} PageChunk */\n/** @typedef {import(\"./AbstractTTSEngine.js\").default} AbstractTTSEngine */\n\n// Default options for TTS\njQuery.extend(BookReader.defaultOptions, {\n server: 'ia600609.us.archive.org',\n bookPath: '',\n enableTtsPlugin: true,\n});\n\n// Extend the constructor to add TTS properties\nBookReader.prototype.setup = (function (super_) {\n return function (options) {\n super_.call(this, options);\n\n if (this.options.enableTtsPlugin) {\n /** @type { {[pageIndex: number]: Array<{ l: number, r: number, t: number, b: number }>} } */\n this._ttsBoxesByIndex = {};\n\n let TTSEngine = WebTTSEngine.isSupported() ? WebTTSEngine :\n FestivalTTSEngine.isSupported() ? FestivalTTSEngine :\n null;\n\n if (/_forceTTSEngine=(festival|web)/.test(location.toString())) {\n const engineName = location.toString().match(/_forceTTSEngine=(festival|web)/)[1];\n TTSEngine = { festival: FestivalTTSEngine, web: WebTTSEngine }[engineName];\n }\n\n if (TTSEngine) {\n /** @type {AbstractTTSEngine} */\n this.ttsEngine = new TTSEngine({\n server: options.server,\n bookPath: options.bookPath,\n bookLanguage: toISO6391(options.bookLanguage),\n onLoadingStart: this.showProgressPopup.bind(this, 'Loading audio...'),\n onLoadingComplete: this.removeProgressPopup.bind(this),\n onDone: this.ttsStop.bind(this),\n beforeChunkPlay: this.ttsBeforeChunkPlay.bind(this),\n afterChunkPlay: this.ttsSendChunkFinishedAnalyticsEvent.bind(this),\n });\n }\n }\n };\n})(BookReader.prototype.setup);\n\nBookReader.prototype.init = (function(super_) {\n return function() {\n if (this.options.enableTtsPlugin) {\n // Bind to events\n\n this.bind(BookReader.eventNames.PostInit, () => {\n this.$('.BRicon.read').click(() => {\n this.ttsToggle();\n return false;\n });\n if (this.ttsEngine) {\n this.ttsEngine.init();\n if (/[?&]_autoReadAloud=show/.test(location.toString())) {\n this.ttsStart(false); // false flag is to initiate read aloud controls\n }\n }\n });\n\n // This is fired when the hash changes by one of the other plugins!\n // i.e. it will fire every time the page changes -_-\n // this.bind(BookReader.eventNames.stop, function(e, br) {\n // this.ttsStop();\n // }.bind(this));\n }\n super_.call(this);\n };\n})(BookReader.prototype.init);\n\n/** @override */\nBookReader.prototype._createPageContainer = (function (super_) {\n return function (index) {\n const pageContainer = super_.call(this, index);\n if (this.options.enableTtsPlugin && pageContainer.page && index in this._ttsBoxesByIndex) {\n const pageIndex = pageContainer.page.index;\n renderBoxesInPageContainerLayer('ttsHiliteLayer', this._ttsBoxesByIndex[pageIndex], pageContainer.page, pageContainer.$container[0]);\n }\n return pageContainer;\n };\n})(BookReader.prototype._createPageContainer);\n\n// Extend buildMobileDrawerElement\nBookReader.prototype.buildMobileDrawerElement = (function (super_) {\n return function () {\n const $el = super_.call(this);\n if (this.options.enableTtsPlugin && this.ttsEngine) {\n $el.find('.BRmobileMenu__moreInfoRow').after($(`\n <li>\n <span>\n <span class=\"DrawerIconWrapper\"><img class=\"DrawerIcon\" src=\"${this.imagesBaseURL}icon_speaker_open.svg\" alt=\"info-speaker\"/></span>\n Read Aloud\n </span>\n <div>\n <span class=\"larger\">Press to toggle read aloud</span>\n <br/>\n <button class=\"BRicon read\"></button>\n </div>\n </li>`));\n }\n return $el;\n };\n})(BookReader.prototype.buildMobileDrawerElement);\n\n// Extend initNavbar\nBookReader.prototype.initNavbar = (function (super_) {\n return function () {\n const $el = super_.call(this);\n if (this.options.enableTtsPlugin && this.ttsEngine) {\n this.refs.$BRReadAloudToolbar = $(`\n <ul class=\"read-aloud\">\n <li>\n <select class=\"playback-speed\" name=\"playback-speed\" title=\"${tooltips.playbackSpeed}\">\n <option value=\"0.25\">0.25x</option>\n <option value=\"0.5\">0.5x</option>\n <option value=\"0.75\">0.75x</option>\n <option value=\"1.0\" selected>1.0x</option>\n <option value=\"1.25\">1.25x</option>\n <option value=\"1.5\">1.5x</option>\n <option value=\"1.75\">1.75x</option>\n <option value=\"2\">2x</option>\n </select>\n </li>\n <li>\n <button type=\"button\" name=\"review\" title=\"${tooltips.review}\">\n <div class=\"icon icon-review\"></div>\n </button>\n </li>\n <li>\n <button type=\"button\" name=\"play\" title=\"${tooltips.play}\">\n <div class=\"icon icon-play\"></div>\n <div class=\"icon icon-pause\"></div>\n </button>\n </li>\n <li>\n <button type=\"button\" name=\"advance\" title=\"${tooltips.advance}\">\n <div class=\"icon icon-advance\"></div>\n </button>\n </li>\n <li>\n <select class=\"playback-voices\" name=\"playback-voice\" style=\"display: none\" title=\"Change read aloud voices\">\n </select>\n </li>\n </ul>\n `);\n\n $el.find('.BRcontrols').prepend(this.refs.$BRReadAloudToolbar);\n\n const renderVoiceOption = (voices) => {\n return voices.map(voice =>\n `<option value=\"${voice.voiceURI}\">${voice.lang} - ${voice.name}</option>`).join('');\n };\n\n const voiceSortOrder = (a,b) => `${a.lang} - ${a.name}`.localeCompare(`${b.lang} - ${b.name}`);\n\n const renderVoicesMenu = (voicesMenu) => {\n voicesMenu.empty();\n const bookLanguage = this.ttsEngine.opts.bookLanguage;\n const bookLanguages = this.ttsEngine.getVoices().filter(v => v.lang.startsWith(bookLanguage)).sort(voiceSortOrder);\n const otherLanguages = this.ttsEngine.getVoices().filter(v => !v.lang.startsWith(bookLanguage)).sort(voiceSortOrder);\n\n if (this.ttsEngine.getVoices().length > 1) {\n voicesMenu.append($(`<optgroup label=\"Book Language (${bookLanguage})\"> ${renderVoiceOption(bookLanguages)} </optgroup>`));\n voicesMenu.append($(`<optgroup label=\"Other Languages\"> ${renderVoiceOption(otherLanguages)} </optgroup>`));\n\n voicesMenu.val(this.ttsEngine.voice.voiceURI);\n voicesMenu.show();\n } else {\n voicesMenu.hide();\n }\n };\n\n const voicesMenu = this.refs.$BRReadAloudToolbar.find('[name=playback-voice]');\n renderVoicesMenu(voicesMenu);\n voicesMenu.on(\"change\", ev => this.ttsEngine.setVoice(voicesMenu.val()));\n this.ttsEngine.events.on('pause resume start', () => this.ttsUpdateState());\n this.ttsEngine.events.on('voiceschanged', () => renderVoicesMenu(voicesMenu));\n this.refs.$BRReadAloudToolbar.find('[name=play]').on(\"click\", this.ttsPlayPause.bind(this));\n this.refs.$BRReadAloudToolbar.find('[name=advance]').on(\"click\", this.ttsJumpForward.bind(this));\n this.refs.$BRReadAloudToolbar.find('[name=review]').on(\"click\", this.ttsJumpBackward.bind(this));\n const $rateSelector = this.refs.$BRReadAloudToolbar.find('select[name=\"playback-speed\"]');\n $rateSelector.on(\"change\", ev => this.ttsEngine.setPlaybackRate(parseFloat($rateSelector.val())));\n $(`<li>\n <button class=\"BRicon read js-tooltip\" title=\"${tooltips.readAloud}\">\n <div class=\"icon icon-read-aloud\"></div>\n <span class=\"BRtooltip\">${tooltips.readAloud}</span>\n </button>\n </li>`).insertBefore($el.find('.BRcontrols .BRicon.zoom_out').closest('li'));\n }\n return $el;\n };\n})(BookReader.prototype.initNavbar);\n\n// ttsToggle()\n//______________________________________________________________________________\nBookReader.prototype.ttsToggle = function () {\n if (this.autoStop) this.autoStop();\n if (this.ttsEngine.playing) {\n this.ttsStop();\n } else {\n this.ttsStart();\n }\n};\n\n// ttsStart(\n//______________________________________________________________________________\nBookReader.prototype.ttsStart = function (startTTSEngine = true) {\n if (this.constModeThumb == this.mode)\n this.switchMode(this.constMode1up);\n\n this.refs.$BRReadAloudToolbar.addClass('visible');\n this.$('.BRicon.read').addClass('unread active');\n this.ttsSendAnalyticsEvent('Start');\n if (startTTSEngine)\n this.ttsEngine.start(this.currentIndex(), this.book.getNumLeafs());\n};\n\nBookReader.prototype.ttsJumpForward = function () {\n if (this.ttsEngine.paused) {\n this.ttsEngine.resume();\n }\n this.ttsEngine.jumpForward();\n};\n\nBookReader.prototype.ttsJumpBackward = function () {\n if (this.ttsEngine.paused) {\n this.ttsEngine.resume();\n }\n this.ttsEngine.jumpBackward();\n};\n\nBookReader.prototype.ttsUpdateState = function() {\n const isPlaying = !(this.ttsEngine.paused || !this.ttsEngine.playing);\n this.$('.read-aloud [name=play]').toggleClass('playing', isPlaying);\n};\n\nBookReader.prototype.ttsPlayPause = function() {\n if (!this.ttsEngine.playing) {\n this.ttsToggle();\n } else {\n this.ttsEngine.togglePlayPause();\n this.ttsUpdateState();\n }\n};\n\n// ttsStop()\n//______________________________________________________________________________\nBookReader.prototype.ttsStop = function () {\n this.refs.$BRReadAloudToolbar.removeClass('visible');\n this.$('.BRicon.read').removeClass('unread active');\n this.ttsSendAnalyticsEvent('Stop');\n this.ttsEngine.stop();\n this.ttsRemoveHilites();\n this.removeProgressPopup();\n};\n\n/**\n * @param {PageChunk} chunk\n * @return {PromiseLike<void>} returns once the flip is done\n */\nBookReader.prototype.ttsBeforeChunkPlay = async function(chunk) {\n await this.ttsMaybeFlipToIndex(chunk.leafIndex);\n this.ttsHighlightChunk(chunk);\n this.ttsScrollToChunk(chunk);\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsSendChunkFinishedAnalyticsEvent = function(chunk) {\n this.ttsSendAnalyticsEvent('ChunkFinished-Words', approximateWordCount(chunk.text));\n};\n\n/**\n * Flip the page if the provided leaf index is not visible\n * @param {Number} leafIndex\n */\nBookReader.prototype.ttsMaybeFlipToIndex = async function (leafIndex) {\n if (this.constMode2up != this.mode) {\n this.jumpToIndex(leafIndex);\n } else {\n await this._modes.mode2Up.mode2UpLit.jumpToIndex(leafIndex);\n }\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsHighlightChunk = function(chunk) {\n // The poorly-named variable leafIndex\n const pageIndex = chunk.leafIndex;\n\n this.ttsRemoveHilites();\n\n // group by index; currently only possible to have chunks on one page :/\n this._ttsBoxesByIndex = {\n [pageIndex]: chunk.lineRects.map(([l, b, r, t]) => ({l, r, b, t})),\n };\n\n // update any already created pages\n for (const [pageIndexString, boxes] of Object.entries(this._ttsBoxesByIndex)) {\n const pageIndex = parseFloat(pageIndexString);\n const page = this.book.getPage(pageIndex);\n const pageContainers = this.getActivePageContainerElementsForIndex(pageIndex);\n pageContainers.forEach(container => renderBoxesInPageContainerLayer('ttsHiliteLayer', boxes, page, container));\n }\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsScrollToChunk = function(chunk) {\n // It behaves weird if used in thumb mode\n if (this.constModeThumb == this.mode) return;\n\n $(`.pagediv${chunk.leafIndex} .ttsHiliteLayer rect`).last()?.[0]?.scrollIntoView({\n // Only vertically center the highlight if we're in 1up or in full screen. In\n // 2up, if we're not fullscreen, the whole body gets scrolled around to try to\n // center the highlight 🙄 See:\n // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move/11041376\n // Note: nearest doesn't quite work great, because the ReadAloud toolbar is now\n // full-width, and covers up the last line of the highlight.\n block: this.constMode1up == this.mode || this.isFullscreenActive ? 'center' : 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n};\n\n// ttsRemoveHilites()\n//______________________________________________________________________________\nBookReader.prototype.ttsRemoveHilites = function () {\n $(this.getActivePageContainerElements()).find('.ttsHiliteLayer').remove();\n this._ttsBoxesByIndex = {};\n};\n\n/**\n * @private\n * Send an analytics event with an optional value. Also attaches the book's language.\n * @param {string} action\n * @param {number} [value]\n */\nBookReader.prototype.ttsSendAnalyticsEvent = function(action, value) {\n if (this.archiveAnalyticsSendEvent) {\n const extraValues = {};\n const mediaLanguage = this.ttsEngine.opts.bookLanguage;\n if (mediaLanguage) extraValues.mediaLanguage = mediaLanguage;\n this.archiveAnalyticsSendEvent('BRReadAloud', action, value, extraValues);\n }\n};\n","export const en = {\n advance: 'Advance 10 seconds',\n play: 'Play',\n playbackSpeed: 'Playback speed',\n readAloud: 'Read this book aloud',\n review: 'Review 10 seconds',\n};\n\nexport const es = {\n advance: 'Avance 10 segundos',\n play: 'Jugar',\n playbackSpeed: 'Velocidad de reproducción',\n readAloud: 'Lee este libro en voz alta',\n review: 'Revisar 10 segundos',\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\nvar _default = [['Serbian', 'српски језик', 'sr', 'srp', 'srp'], ['Romanian, Moldavian, Moldovan', 'Română', 'ro', 'ron', 'rum'], ['Sichuan Yi, Nuosu', 'ꆈꌠ꒿ Nuosuhxop', 'ii', 'iii', 'iii'], ['Tahitian', 'Reo Tahiti', 'ty', 'tah', 'tah'], ['Tagalog', 'Wikang Tagalog', 'tl', 'tgl', 'tgl'], ['Yiddish', 'ייִדיש', 'yi', 'yid', 'yid'], ['Akan', 'Akan', 'ak', 'aka', 'aka'], ['Malay', 'Bahasa Melayu, بهاس ملايو', 'ms', 'msa', 'may'], ['Arabic', 'العربية', 'ar', 'ara', 'ara'], ['Norwegian', 'Norsk', 'no', 'nor', 'nor'], ['Ojibwa', 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'oj', 'oji', 'oji'], ['Fulah', 'Fulfulde, Pulaar, Pular', 'ff', 'ful', 'ful'], ['Persian', 'فارسی', 'fa', 'fas', 'per'], ['Albanian', 'Shqip', 'sq', 'sqi', 'alb'], ['Aymara', 'aymar aru', 'ay', 'aym', 'aym'], ['Azerbaijani', 'azərbaycan dili', 'az', 'aze', 'aze'], ['Chinese', '中文 (Zhōngwén), 汉语, 漢語', 'zh', 'zho', 'chi'], ['Cree', 'ᓀᐦᐃᔭᐍᐏᐣ', 'cr', 'cre', 'cre'], ['Estonian', 'eesti, eesti keel', 'et', 'est', 'est'], ['Guaraní', 'Avañe\\'ẽ', 'gn', 'grn', 'grn'], ['Inupiaq', 'Iñupiaq, Iñupiatun', 'ik', 'ipk', 'ipk'], ['Inuktitut', 'ᐃᓄᒃᑎᑐᑦ', 'iu', 'iku', 'iku'], ['Kanuri', 'Kanuri', 'kr', 'kau', 'kau'], ['Komi', 'коми кыв', 'kv', 'kom', 'kom'], ['Kongo', 'Kikongo', 'kg', 'kon', 'kon'], ['Kurdish', 'Kurdî, کوردی', 'ku', 'kur', 'kur'], ['Latvian', 'latviešu valoda', 'lv', 'lav', 'lav'], ['Malagasy', 'fiteny malagasy', 'mg', 'mlg', 'mlg'], ['Mongolian', 'Монгол хэл', 'mn', 'mon', 'mon'], ['Oromo', 'Afaan Oromoo', 'om', 'orm', 'orm'], ['Pashto, Pushto', 'پښتو', 'ps', 'pus', 'pus'], ['Quechua', 'Runa Simi, Kichwa', 'qu', 'que', 'que'], ['Sardinian', 'sardu', 'sc', 'srd', 'srd'], ['Swahili', 'Kiswahili', 'sw', 'swa', 'swa'], ['Uzbek', 'Oʻzbek, Ўзбек, أۇزبېك', 'uz', 'uzb', 'uzb'], ['Zhuang, Chuang', 'Saɯ cueŋƅ, Saw cuengh', 'za', 'zha', 'zha'], ['Bislama', 'Bislama', 'bi', 'bis', 'bis'], ['Norwegian Bokmål', 'Norsk Bokmål', 'nb', 'nob', 'nob'], ['Norwegian Nynorsk', 'Norsk Nynorsk', 'nn', 'nno', 'nno'], ['Indonesian', 'Bahasa Indonesia', 'id', 'ind', 'ind'], ['Twi', 'Twi', 'tw', 'twi', 'twi'], ['Esperanto', 'Esperanto', 'eo', 'epo', 'epo'], ['Interlingua', 'Interlingua', 'ia', 'ina', 'ina'], ['Interlingue', 'Originally called Occidental; then Interlingue after WWII', 'ie', 'ile', 'ile'], ['Ido', 'Ido', 'io', 'ido', 'ido'], ['Volapük', 'Volapük', 'vo', 'vol', 'vol'], ['Bihari languages', 'भोजपुरी', 'bh', 'bih', 'bih'], ['Hebrew (modern)', 'עברית', 'he', 'heb', 'heb'], ['Sanskrit', 'संस्कृतम्', 'sa', 'san', 'san'], ['Church Slavic, Church Slavonic, Old Church Slavonic, Old Slavonic, Old Bulgarian', 'ѩзыкъ словѣньскъ', 'cu', 'chu', 'chu'], ['Pali', 'पाऴि', 'pi', 'pli', 'pli'], ['Avestan', 'avesta', 'ae', 'ave', 'ave'], ['Latin', 'latine, lingua latina', 'la', 'lat', 'lat'], ['Armenian', 'Հայերեն', 'hy', 'hye', 'arm'], ['Swati', 'SiSwati', 'ss', 'ssw', 'ssw'], ['Tibetan', 'བོད་ཡིག', 'bo', 'bod', 'tib'], ['South Ndebele', 'isiNdebele', 'nr', 'nbl', 'nbl'], ['Slovene', 'Slovenski Jezik, Slovenščina', 'sl', 'slv', 'slv'], ['Oriya', 'ଓଡ଼ିଆ', 'or', 'ori', 'ori'], ['North Ndebele', 'isiNdebele', 'nd', 'nde', 'nde'], ['Nauru', 'Dorerin Naoero', 'na', 'nau', 'nau'], ['Maori', 'te reo Māori', 'mi', 'mri', 'mao'], ['Marathi', 'मराठी', 'mr', 'mar', 'mar'], ['Luba-Katanga', 'Kiluba', 'lu', 'lub', 'lub'], ['Rundi', 'Ikirundi', 'rn', 'run', 'run'], ['Central Khmer', 'ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ', 'km', 'khm', 'khm'], ['Western Frisian', 'Frysk', 'fy', 'fry', 'fry'], ['Bengali', 'বাংলা', 'bn', 'ben', 'ben'], ['Avaric', 'авар мацӀ, магӀарул мацӀ', 'av', 'ava', 'ava'], ['Abkhazian', 'аҧсуа бызшәа, аҧсшәа', 'ab', 'abk', 'abk'], ['Afar', 'Afaraf', 'aa', 'aar', 'aar'], ['Afrikaans', 'Afrikaans', 'af', 'afr', 'afr'], ['Amharic', 'አማርኛ', 'am', 'amh', 'amh'], ['Aragonese', 'aragonés', 'an', 'arg', 'arg'], ['Assamese', 'অসমীয়া', 'as', 'asm', 'asm'], ['Bambara', 'bamanankan', 'bm', 'bam', 'bam'], ['Bashkir', 'башҡорт теле', 'ba', 'bak', 'bak'], ['Basque', 'euskara, euskera', 'eu', 'eus', 'baq'], ['Belarusian', 'беларуская мова', 'be', 'bel', 'bel'], ['Bosnian', 'bosanski jezik', 'bs', 'bos', 'bos'], ['Breton', 'brezhoneg', 'br', 'bre', 'bre'], ['Bulgarian', 'български език', 'bg', 'bul', 'bul'], ['Burmese', 'ဗမာစာ', 'my', 'mya', 'bur'], ['Catalan, Valencian', 'català, valencià', 'ca', 'cat', 'cat'], ['Chamorro', 'Chamoru', 'ch', 'cha', 'cha'], ['Chechen', 'нохчийн мотт', 'ce', 'che', 'che'], ['Chichewa, Chewa, Nyanja', 'chiCheŵa, chinyanja', 'ny', 'nya', 'nya'], ['Chuvash', 'чӑваш чӗлхи', 'cv', 'chv', 'chv'], ['Cornish', 'Kernewek', 'kw', 'cor', 'cor'], ['Corsican', 'corsu, lingua corsa', 'co', 'cos', 'cos'], ['Croatian', 'hrvatski jezik', 'hr', 'hrv', 'hrv'], ['Czech', 'čeština, český jazyk', 'cs', 'ces', 'cze'], ['Danish', 'dansk', 'da', 'dan', 'dan'], ['Divehi, Dhivehi, Maldivian', 'ދިވެހި', 'dv', 'div', 'div'], ['Dutch, Flemish', 'Nederlands, Vlaams', 'nl', 'nld', 'dut'], ['Dzongkha', 'རྫོང་ཁ', 'dz', 'dzo', 'dzo'], ['English', 'English', 'en', 'eng', 'eng'], ['Ewe', 'Eʋegbe', 'ee', 'ewe', 'ewe'], ['Faroese', 'føroyskt', 'fo', 'fao', 'fao'], ['Fijian', 'vosa Vakaviti', 'fj', 'fij', 'fij'], ['Finnish', 'suomi, suomen kieli', 'fi', 'fin', 'fin'], ['French', 'français, langue française', 'fr', 'fra', 'fre'], ['Galician', 'Galego', 'gl', 'glg', 'glg'], ['Georgian', 'ქართული', 'ka', 'kat', 'geo'], ['German', 'Deutsch', 'de', 'deu', 'ger'], ['Greek (modern)', 'ελληνικά', 'el', 'ell', 'gre'], ['Gujarati', 'ગુજરાતી', 'gu', 'guj', 'guj'], ['Haitian, Haitian Creole', 'Kreyòl ayisyen', 'ht', 'hat', 'hat'], ['Hausa', '(Hausa) هَوُسَ', 'ha', 'hau', 'hau'], ['Herero', 'Otjiherero', 'hz', 'her', 'her'], ['Hindi', 'हिन्दी, हिंदी', 'hi', 'hin', 'hin'], ['Hiri Motu', 'Hiri Motu', 'ho', 'hmo', 'hmo'], ['Hungarian', 'magyar', 'hu', 'hun', 'hun'], ['Irish', 'Gaeilge', 'ga', 'gle', 'gle'], ['Igbo', 'Asụsụ Igbo', 'ig', 'ibo', 'ibo'], ['Icelandic', 'Íslenska', 'is', 'isl', 'ice'], ['Italian', 'Italiano', 'it', 'ita', 'ita'], ['Japanese', '日本語 (にほんご)', 'ja', 'jpn', 'jpn'], ['Javanese', 'ꦧꦱꦗꦮ, Basa Jawa', 'jv', 'jav', 'jav'], ['Kalaallisut, Greenlandic', 'kalaallisut, kalaallit oqaasii', 'kl', 'kal', 'kal'], ['Kannada', 'ಕನ್ನಡ', 'kn', 'kan', 'kan'], ['Kashmiri', 'कश्मीरी, كشميري', 'ks', 'kas', 'kas'], ['Kazakh', 'қазақ тілі', 'kk', 'kaz', 'kaz'], ['Kikuyu, Gikuyu', 'Gĩkũyũ', 'ki', 'kik', 'kik'], ['Kinyarwanda', 'Ikinyarwanda', 'rw', 'kin', 'kin'], ['Kirghiz, Kyrgyz', 'Кыргызча, Кыргыз тили', 'ky', 'kir', 'kir'], ['Korean', '한국어', 'ko', 'kor', 'kor'], ['Kuanyama, Kwanyama', 'Kuanyama', 'kj', 'kua', 'kua'], ['Luxembourgish, Letzeburgesch', 'Lëtzebuergesch', 'lb', 'ltz', 'ltz'], ['Ganda', 'Luganda', 'lg', 'lug', 'lug'], ['Limburgan, Limburger, Limburgish', 'Limburgs', 'li', 'lim', 'lim'], ['Lingala', 'Lingála', 'ln', 'lin', 'lin'], ['Lao', 'ພາສາລາວ', 'lo', 'lao', 'lao'], ['Lithuanian', 'lietuvių kalba', 'lt', 'lit', 'lit'], ['Manx', 'Gaelg, Gailck', 'gv', 'glv', 'glv'], ['Macedonian', 'македонски јазик', 'mk', 'mkd', 'mac'], ['Malayalam', 'മലയാളം', 'ml', 'mal', 'mal'], ['Maltese', 'Malti', 'mt', 'mlt', 'mlt'], ['Marshallese', 'Kajin M̧ajeļ', 'mh', 'mah', 'mah'], ['Navajo, Navaho', 'Diné bizaad', 'nv', 'nav', 'nav'], ['Nepali', 'नेपाली', 'ne', 'nep', 'nep'], ['Ndonga', 'Owambo', 'ng', 'ndo', 'ndo'], ['Occitan', 'occitan, lenga d\\'òc', 'oc', 'oci', 'oci'], ['Ossetian, Ossetic', 'ирон æвзаг', 'os', 'oss', 'oss'], ['Panjabi, Punjabi', 'ਪੰਜਾਬੀ', 'pa', 'pan', 'pan'], ['Polish', 'język polski, polszczyzna', 'pl', 'pol', 'pol'], ['Portuguese', 'Português', 'pt', 'por', 'por'], ['Romansh', 'Rumantsch Grischun', 'rm', 'roh', 'roh'], ['Russian', 'русский', 'ru', 'rus', 'rus'], ['Sindhi', 'सिन्धी, سنڌي، سندھی', 'sd', 'snd', 'snd'], ['Northern Sami', 'Davvisámegiella', 'se', 'sme', 'sme'], ['Samoan', 'gagana fa\\'a Samoa', 'sm', 'smo', 'smo'], ['Sango', 'yângâ tî sängö', 'sg', 'sag', 'sag'], ['Gaelic, Scottish Gaelic', 'Gàidhlig', 'gd', 'gla', 'gla'], ['Shona', 'chiShona', 'sn', 'sna', 'sna'], ['Sinhala, Sinhalese', 'සිංහල', 'si', 'sin', 'sin'], ['Slovak', 'Slovenčina, Slovenský Jazyk', 'sk', 'slk', 'slo'], ['Somali', 'Soomaaliga, af Soomaali', 'so', 'som', 'som'], ['Southern Sotho', 'Sesotho', 'st', 'sot', 'sot'], ['Spanish, Castilian', 'Español', 'es', 'spa', 'spa'], ['Sundanese', 'Basa Sunda', 'su', 'sun', 'sun'], ['Swedish', 'Svenska', 'sv', 'swe', 'swe'], ['Tamil', 'தமிழ்', 'ta', 'tam', 'tam'], ['Telugu', 'తెలుగు', 'te', 'tel', 'tel'], ['Tajik', 'тоҷикӣ, toçikī, تاجیکی', 'tg', 'tgk', 'tgk'], ['Thai', 'ไทย', 'th', 'tha', 'tha'], ['Tigrinya', 'ትግርኛ', 'ti', 'tir', 'tir'], ['Turkmen', 'Türkmen, Түркмен', 'tk', 'tuk', 'tuk'], ['Tswana', 'Setswana', 'tn', 'tsn', 'tsn'], ['Tongan (Tonga Islands)', 'Faka Tonga', 'to', 'ton', 'ton'], ['Turkish', 'Türkçe', 'tr', 'tur', 'tur'], ['Tsonga', 'Xitsonga', 'ts', 'tso', 'tso'], ['Tatar', 'татар теле, tatar tele', 'tt', 'tat', 'tat'], ['Uighur, Uyghur', 'ئۇيغۇرچە, Uyghurche', 'ug', 'uig', 'uig'], ['Ukrainian', 'Українська', 'uk', 'ukr', 'ukr'], ['Urdu', 'اردو', 'ur', 'urd', 'urd'], ['Venda', 'Tshivenḓa', 've', 'ven', 'ven'], ['Vietnamese', 'Tiếng Việt', 'vi', 'vie', 'vie'], ['Walloon', 'Walon', 'wa', 'wln', 'wln'], ['Welsh', 'Cymraeg', 'cy', 'cym', 'wel'], ['Wolof', 'Wollof', 'wo', 'wol', 'wol'], ['Xhosa', 'isiXhosa', 'xh', 'xho', 'xho'], ['Yoruba', 'Yorùbá', 'yo', 'yor', 'yor'], ['Zulu', 'isiZulu', 'zu', 'zul', 'zul']];\nexports[\"default\"] = _default;","/*!\n * jQuery Browser Plugin 0.1.0\n * https://github.com/gabceb/jquery-browser-plugin\n *\n * Original jquery-browser code Copyright 2005, 2015 jQuery Foundation, Inc. and other contributors\n * http://jquery.org/license\n *\n * Modifications Copyright 2015 Gabriel Cebrian\n * https://github.com/gabceb\n *\n * Released under the MIT license\n *\n * Date: 05-07-2015\n */\n/*global window: false */\n\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['jquery'], function ($) {\n return factory($);\n });\n } else if (typeof module === 'object' && typeof module.exports === 'object') {\n // Node-like environment\n module.exports = factory(require('jquery'));\n } else {\n // Browser globals\n factory(window.jQuery);\n }\n}(function(jQuery) {\n \"use strict\";\n\n function uaMatch( ua ) {\n // If an UA is not provided, default to the current browser UA.\n if ( ua === undefined ) {\n ua = window.navigator.userAgent;\n }\n ua = ua.toLowerCase();\n\n var match = /(edge)\\/([\\w.]+)/.exec( ua ) ||\n /(opr)[\\/]([\\w.]+)/.exec( ua ) ||\n /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(iemobile)[\\/]([\\w.]+)/.exec( ua ) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n /(msie) ([\\w.]+)/.exec( ua ) ||\n ua.indexOf(\"trident\") >= 0 && /(rv)(?::| )([\\w.]+)/.exec( ua ) ||\n ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n [];\n\n var platform_match = /(ipad)/.exec( ua ) ||\n /(ipod)/.exec( ua ) ||\n /(windows phone)/.exec( ua ) ||\n /(iphone)/.exec( ua ) ||\n /(kindle)/.exec( ua ) ||\n /(silk)/.exec( ua ) ||\n /(android)/.exec( ua ) ||\n /(win)/.exec( ua ) ||\n /(mac)/.exec( ua ) ||\n /(linux)/.exec( ua ) ||\n /(cros)/.exec( ua ) ||\n /(playbook)/.exec( ua ) ||\n /(bb)/.exec( ua ) ||\n /(blackberry)/.exec( ua ) ||\n [];\n\n var browser = {},\n matched = {\n browser: match[ 5 ] || match[ 3 ] || match[ 1 ] || \"\",\n version: match[ 2 ] || match[ 4 ] || \"0\",\n versionNumber: match[ 4 ] || match[ 2 ] || \"0\",\n platform: platform_match[ 0 ] || \"\"\n };\n\n if ( matched.browser ) {\n browser[ matched.browser ] = true;\n browser.version = matched.version;\n browser.versionNumber = parseInt(matched.versionNumber, 10);\n }\n\n if ( matched.platform ) {\n browser[ matched.platform ] = true;\n }\n\n // These are all considered mobile platforms, meaning they run a mobile browser\n if ( browser.android || browser.bb || browser.blackberry || browser.ipad || browser.iphone ||\n browser.ipod || browser.kindle || browser.playbook || browser.silk || browser[ \"windows phone\" ]) {\n browser.mobile = true;\n }\n\n // These are all considered desktop platforms, meaning they run a desktop browser\n if ( browser.cros || browser.mac || browser.linux || browser.win ) {\n browser.desktop = true;\n }\n\n // Chrome, Opera 15+ and Safari are webkit based browsers\n if ( browser.chrome || browser.opr || browser.safari ) {\n browser.webkit = true;\n }\n\n // IE11 has a new token so we will assign it msie to avoid breaking changes\n if ( browser.rv || browser.iemobile) {\n var ie = \"msie\";\n\n matched.browser = ie;\n browser[ie] = true;\n }\n\n // Edge is officially known as Microsoft Edge, so rewrite the key to match\n if ( browser.edge ) {\n delete browser.edge;\n var msedge = \"msedge\";\n\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Blackberry browsers are marked as Safari on BlackBerry\n if ( browser.safari && browser.blackberry ) {\n var blackberry = \"blackberry\";\n\n matched.browser = blackberry;\n browser[blackberry] = true;\n }\n\n // Playbook browsers are marked as Safari on Playbook\n if ( browser.safari && browser.playbook ) {\n var playbook = \"playbook\";\n\n matched.browser = playbook;\n browser[playbook] = true;\n }\n\n // BB10 is a newer OS version of BlackBerry\n if ( browser.bb ) {\n var bb = \"blackberry\";\n\n matched.browser = bb;\n browser[bb] = true;\n }\n\n // Opera 15+ are identified as opr\n if ( browser.opr ) {\n var opera = \"opera\";\n\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock Android browsers are marked as Safari on Android.\n if ( browser.safari && browser.android ) {\n var android = \"android\";\n\n matched.browser = android;\n browser[android] = true;\n }\n\n // Kindle browsers are marked as Safari on Kindle\n if ( browser.safari && browser.kindle ) {\n var kindle = \"kindle\";\n\n matched.browser = kindle;\n browser[kindle] = true;\n }\n\n // Kindle Silk browsers are marked as Safari on Kindle\n if ( browser.safari && browser.silk ) {\n var silk = \"silk\";\n\n matched.browser = silk;\n browser[silk] = true;\n }\n\n // Assign the name and platform variable\n browser.name = matched.browser;\n browser.platform = matched.platform;\n return browser;\n }\n\n // Run the matching process, also assign the function to the returned object\n // for manual, jQuery-free use if desired\n window.jQBrowser = uaMatch( window.navigator.userAgent );\n window.jQBrowser.uaMatch = uaMatch;\n\n // Only assign to jQuery.browser if jQuery is loaded\n if ( jQuery ) {\n jQuery.browser = window.jQBrowser;\n }\n\n return window.jQBrowser;\n}));\n","/** @license\r\n *\r\n * SoundManager 2: JavaScript Sound for the Web\r\n * ----------------------------------------------\r\n * http://schillmania.com/projects/soundmanager2/\r\n *\r\n * Copyright (c) 2007, Scott Schiller. All rights reserved.\r\n * Code provided under the BSD License:\r\n * http://schillmania.com/projects/soundmanager2/license.txt\r\n *\r\n * V2.97a.20170601\r\n */\r\n\r\n/**\r\n * About this file\r\n * -------------------------------------------------------------------------------------\r\n * This is the fully-commented source version of the SoundManager 2 API,\r\n * recommended for use during development and testing.\r\n *\r\n * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)\r\n * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion\r\n * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)\r\n *\r\n * You may notice <d> and </d> comments in this source; these are delimiters for\r\n * debug blocks which are removed in the -nodebug builds, further optimizing code size.\r\n *\r\n * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)\r\n */\r\n\r\n(function SM2(window, _undefined) {\r\n\r\n/* global Audio, document, window, navigator, define, module, SM2_DEFER, opera, setTimeout, setInterval, clearTimeout, sm2Debugger */\r\n\r\n'use strict';\r\n\r\nif (!window || !window.document) {\r\n\r\n // Don't cross the [environment] streams. SM2 expects to be running in a browser, not under node.js etc.\r\n // Additionally, if a browser somehow manages to fail this test, as Egon said: \"It would be bad.\"\r\n\r\n throw new Error('SoundManager requires a browser with window and document objects.');\r\n\r\n}\r\n\r\nvar soundManager = null;\r\n\r\n/**\r\n * The SoundManager constructor.\r\n *\r\n * @constructor\r\n * @param {string} smURL Optional: Path to SWF files\r\n * @param {string} smID Optional: The ID to use for the SWF container element\r\n * @this {SoundManager}\r\n * @return {SoundManager} The new SoundManager instance\r\n */\r\n\r\nfunction SoundManager(smURL, smID) {\r\n\r\n /**\r\n * soundManager configuration options list\r\n * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)\r\n * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})\r\n */\r\n\r\n this.setupOptions = {\r\n\r\n url: (smURL || null), // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/\r\n flashVersion: 8, // flash build to use (8 or 9.) Some API features require 9.\r\n debugMode: true, // enable debugging output (console.log() with HTML fallback)\r\n debugFlash: false, // enable debugging output inside SWF, troubleshoot Flash/browser issues\r\n useConsole: true, // use console.log() if available (otherwise, writes to #soundmanager-debug element)\r\n consoleOnly: true, // if console is being used, do not create/write to #soundmanager-debug\r\n waitForWindowLoad: false, // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r\n bgColor: '#ffffff', // SWF background color. N/A when wmode = 'transparent'\r\n useHighPerformance: false, // position:fixed flash movie can help increase js/flash speed, minimize lag\r\n flashPollingInterval: null, // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.\r\n html5PollingInterval: null, // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.\r\n flashLoadTimeout: 1000, // msec to wait for flash movie to load before failing (0 = infinity)\r\n wmode: null, // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)\r\n allowScriptAccess: 'always', // for scripting the SWF (object/embed property), 'always' or 'sameDomain'\r\n useFlashBlock: false, // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.\r\n useHTML5Audio: true, // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (MP3/MP4 support varies.) Ideally, transparent vs. Flash API where possible.\r\n forceUseGlobalHTML5Audio: false, // if true, a single Audio() object is used for all sounds - and only one can play at a time.\r\n ignoreMobileRestrictions: false, // if true, SM2 will not apply global HTML5 audio rules to mobile UAs. iOS > 7 and WebViews may allow multiple Audio() instances.\r\n html5Test: /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.\r\n preferFlash: false, // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.\r\n noSWFCache: false, // if true, appends ?ts={date} to break aggressive SWF caching.\r\n idPrefix: 'sound' // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.\r\n\r\n };\r\n\r\n this.defaultOptions = {\r\n\r\n /**\r\n * the default configuration for sound objects made with createSound() and related methods\r\n * eg., volume, auto-load behaviour and so forth\r\n */\r\n\r\n autoLoad: false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r\n autoPlay: false, // enable playing of file as soon as possible (much faster if \"stream\" is true)\r\n from: null, // position to start playback within a sound (msec), default = beginning\r\n loops: 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)\r\n onid3: null, // callback function for \"ID3 data is added/available\"\r\n onerror: null, // callback function for \"load failed\" (or, playback/network/decode error under HTML5.)\r\n onload: null, // callback function for \"load finished\"\r\n whileloading: null, // callback function for \"download progress update\" (X of Y bytes received)\r\n onplay: null, // callback for \"play\" start\r\n onpause: null, // callback for \"pause\"\r\n onresume: null, // callback for \"resume\" (pause toggle)\r\n whileplaying: null, // callback during play (position update)\r\n onposition: null, // object containing times and function callbacks for positions of interest\r\n onstop: null, // callback for \"user stop\"\r\n onfinish: null, // callback function for \"sound finished playing\"\r\n multiShot: true, // let sounds \"restart\" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r\n multiShotEvents: false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled\r\n position: null, // offset (milliseconds) to seek to within loaded sound data.\r\n pan: 0, // \"pan\" settings, left-to-right, -100 to 100\r\n playbackRate: 1, // rate at which to play the sound (HTML5-only)\r\n stream: true, // allows playing before entire file has loaded (recommended)\r\n to: null, // position to end playback within a sound (msec), default = end\r\n type: null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3\r\n usePolicyFile: false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)\r\n volume: 100 // self-explanatory. 0-100, the latter being the max.\r\n\r\n };\r\n\r\n this.flash9Options = {\r\n\r\n /**\r\n * flash 9-only options,\r\n * merged into defaultOptions if flash 9 is being used\r\n */\r\n\r\n onfailure: null, // callback function for when playing fails (Flash 9, MovieStar + RTMP-only)\r\n isMovieStar: null, // \"MovieStar\" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r\n usePeakData: false, // enable left/right channel peak (level) data\r\n useWaveformData: false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.\r\n useEQData: false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.\r\n onbufferchange: null, // callback for \"isBuffering\" property change\r\n ondataerror: null // callback for waveform/eq data access error (flash playing audio in other tabs/domains)\r\n\r\n };\r\n\r\n this.movieStarOptions = {\r\n\r\n /**\r\n * flash 9.0r115+ MPEG4 audio options,\r\n * merged into defaultOptions if flash 9+movieStar mode is enabled\r\n */\r\n\r\n bufferTime: 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)\r\n serverURL: null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants\r\n onconnect: null, // rtmp: callback for connection to flash media server\r\n duration: null // rtmp: song duration (msec)\r\n\r\n };\r\n\r\n this.audioFormats = {\r\n\r\n /**\r\n * determines HTML5 support + flash requirements.\r\n * if no support (via flash and/or HTML5) for a \"required\" format, SM2 will fail to start.\r\n * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)\r\n */\r\n\r\n mp3: {\r\n type: ['audio/mpeg; codecs=\"mp3\"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],\r\n required: true\r\n },\r\n\r\n mp4: {\r\n related: ['aac', 'm4a', 'm4b'], // additional formats under the MP4 container\r\n type: ['audio/mp4; codecs=\"mp4a.40.2\"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],\r\n required: false\r\n },\r\n\r\n ogg: {\r\n type: ['audio/ogg; codecs=vorbis'],\r\n required: false\r\n },\r\n\r\n opus: {\r\n type: ['audio/ogg; codecs=opus', 'audio/opus'],\r\n required: false\r\n },\r\n\r\n wav: {\r\n type: ['audio/wav; codecs=\"1\"', 'audio/wav', 'audio/wave', 'audio/x-wav'],\r\n required: false\r\n },\r\n\r\n flac: {\r\n type: ['audio/flac'],\r\n required: false\r\n }\r\n\r\n };\r\n\r\n // HTML attributes (id + class names) for the SWF container\r\n\r\n this.movieID = 'sm2-container';\r\n this.id = (smID || 'sm2movie');\r\n\r\n this.debugID = 'soundmanager-debug';\r\n this.debugURLParam = /([#?&])debug=1/i;\r\n\r\n // dynamic attributes\r\n\r\n this.versionNumber = 'V2.97a.20170601';\r\n this.version = null;\r\n this.movieURL = null;\r\n this.altURL = null;\r\n this.swfLoaded = false;\r\n this.enabled = false;\r\n this.oMC = null;\r\n this.sounds = {};\r\n this.soundIDs = [];\r\n this.muted = false;\r\n this.didFlashBlock = false;\r\n this.filePattern = null;\r\n\r\n this.filePatterns = {\r\n flash8: /\\.mp3(\\?.*)?$/i,\r\n flash9: /\\.mp3(\\?.*)?$/i\r\n };\r\n\r\n // support indicators, set at init\r\n\r\n this.features = {\r\n buffering: false,\r\n peakData: false,\r\n waveformData: false,\r\n eqData: false,\r\n movieStar: false\r\n };\r\n\r\n // flash sandbox info, used primarily in troubleshooting\r\n\r\n this.sandbox = {\r\n // <d>\r\n type: null,\r\n types: {\r\n remote: 'remote (domain-based) rules',\r\n localWithFile: 'local with file access (no internet access)',\r\n localWithNetwork: 'local with network (internet access only, no local access)',\r\n localTrusted: 'local, trusted (local+internet access)'\r\n },\r\n description: null,\r\n noRemote: null,\r\n noLocal: null\r\n // </d>\r\n };\r\n\r\n /**\r\n * format support (html5/flash)\r\n * stores canPlayType() results based on audioFormats.\r\n * eg. { mp3: boolean, mp4: boolean }\r\n * treat as read-only.\r\n */\r\n\r\n this.html5 = {\r\n usingFlash: null // set if/when flash fallback is needed\r\n };\r\n\r\n // file type support hash\r\n this.flash = {};\r\n\r\n // determined at init time\r\n this.html5Only = false;\r\n\r\n // used for special cases (eg. iPad/iPhone/palm OS?)\r\n this.ignoreFlash = false;\r\n\r\n /**\r\n * a few private internals (OK, a lot. :D)\r\n */\r\n\r\n var SMSound,\r\n sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],\r\n canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5ErrorCodes, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, didSetup, msecScale = 1000,\r\n is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie|trident/i),\r\n isWebkit = ua.match(/webkit/i),\r\n isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)),\r\n isOpera = (ua.match(/opera/i)),\r\n mobileHTML5 = (ua.match(/(mobile|pre\\/|xoom)/i) || is_iDevice || isAndroid),\r\n isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS\\sX\\s10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, \"Silk\") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159\r\n hasConsole = (window.console !== _undefined && console.log !== _undefined),\r\n isFocused = (doc.hasFocus !== _undefined ? doc.hasFocus() : null),\r\n tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())),\r\n okToDisable = !tryInitOnFocus,\r\n flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i,\r\n emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)\r\n emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading\r\n overHTTP = (doc.location ? doc.location.protocol.match(/http/i) : null),\r\n http = (!overHTTP ? '//' : ''),\r\n // mp3, mp4, aac etc.\r\n netStreamMimeTypes = /^\\s*audio\\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\\s*(?:$|;)/i,\r\n // Flash v9.0r115+ \"moviestar\" formats\r\n netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],\r\n netStreamPattern = new RegExp('\\\\.(' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n this.mimePattern = /^\\s*audio\\/(?:x-)?(?:mp(?:eg|3))\\s*(?:$|;)/i; // default mp3 set\r\n\r\n // use altURL if not \"online\"\r\n this.useAltURL = !overHTTP;\r\n\r\n swfCSS = {\r\n swfBox: 'sm2-object-box',\r\n swfDefault: 'movieContainer',\r\n swfError: 'swf_error', // SWF loaded, but SM2 couldn't start (other error)\r\n swfTimedout: 'swf_timedout',\r\n swfLoaded: 'swf_loaded',\r\n swfUnblocked: 'swf_unblocked', // or loaded OK\r\n sm2Debug: 'sm2_debug',\r\n highPerf: 'high_performance',\r\n flashDebug: 'flash_debug'\r\n };\r\n\r\n /**\r\n * HTML5 error codes, per W3C\r\n * Error code 1, MEDIA_ERR_ABORTED: Client aborted download at user's request.\r\n * Error code 2, MEDIA_ERR_NETWORK: A network error of some description caused the user agent to stop fetching the media resource, after the resource was established to be usable.\r\n * Error code 3, MEDIA_ERR_DECODE: An error of some description occurred while decoding the media resource, after the resource was established to be usable.\r\n * Error code 4, MEDIA_ERR_SRC_NOT_SUPPORTED: Media (audio file) not supported (\"not usable.\")\r\n * Reference: https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n */\r\n html5ErrorCodes = [\r\n null,\r\n 'MEDIA_ERR_ABORTED',\r\n 'MEDIA_ERR_NETWORK',\r\n 'MEDIA_ERR_DECODE',\r\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\r\n ];\r\n\r\n /**\r\n * basic HTML5 Audio() support test\r\n * try...catch because of IE 9 \"not implemented\" nonsense\r\n * https://github.com/Modernizr/Modernizr/issues/224\r\n */\r\n\r\n this.hasHTML5 = (function() {\r\n try {\r\n // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.\r\n return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);\r\n } catch(e) {\r\n return false;\r\n }\r\n }());\r\n\r\n /**\r\n * Public SoundManager API\r\n * -----------------------\r\n */\r\n\r\n /**\r\n * Configures top-level soundManager properties.\r\n *\r\n * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }\r\n * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.\r\n */\r\n\r\n this.setup = function(options) {\r\n\r\n var noURL = (!sm2.url);\r\n\r\n // warn if flash options have already been applied\r\n\r\n if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {\r\n complain(str('setupLate'));\r\n }\r\n\r\n // TODO: defer: true?\r\n\r\n assign(options);\r\n\r\n if (!useGlobalHTML5Audio) {\r\n\r\n if (mobileHTML5) {\r\n\r\n // force the singleton HTML5 pattern on mobile, by default.\r\n if (!sm2.setupOptions.ignoreMobileRestrictions || sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n messages.push(strings.globalHTML5);\r\n useGlobalHTML5Audio = true;\r\n }\r\n\r\n } else if (sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n\r\n // only apply singleton HTML5 on desktop if forced.\r\n messages.push(strings.globalHTML5);\r\n useGlobalHTML5Audio = true;\r\n\r\n }\r\n\r\n }\r\n\r\n if (!didSetup && mobileHTML5) {\r\n\r\n if (sm2.setupOptions.ignoreMobileRestrictions) {\r\n\r\n messages.push(strings.ignoreMobile);\r\n\r\n } else {\r\n\r\n // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.\r\n\r\n // <d>\r\n if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {\r\n // notify that defaults are being changed.\r\n sm2._wD(strings.mobileUA);\r\n }\r\n // </d>\r\n\r\n sm2.setupOptions.useHTML5Audio = true;\r\n sm2.setupOptions.preferFlash = false;\r\n\r\n if (is_iDevice) {\r\n\r\n // no flash here.\r\n sm2.ignoreFlash = true;\r\n\r\n } else if ((isAndroid && !ua.match(/android\\s2\\.3/i)) || !isAndroid) {\r\n\r\n /**\r\n * Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence.\r\n * Common use case: exiting sound onfinish() -> createSound() -> play()\r\n * Presuming similar restrictions for other mobile, non-Android, non-iOS devices.\r\n */\r\n\r\n // <d>\r\n sm2._wD(strings.globalHTML5);\r\n // </d>\r\n\r\n useGlobalHTML5Audio = true;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // special case 1: \"Late setup\". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.\r\n\r\n if (options) {\r\n\r\n if (noURL && didDCLoaded && options.url !== _undefined) {\r\n sm2.beginDelayedInit();\r\n }\r\n\r\n // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.\r\n\r\n if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {\r\n setTimeout(domContentLoaded, 1);\r\n }\r\n\r\n }\r\n\r\n didSetup = true;\r\n\r\n return sm2;\r\n\r\n };\r\n\r\n this.ok = function() {\r\n\r\n return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));\r\n\r\n };\r\n\r\n this.supported = this.ok; // legacy\r\n\r\n this.getMovie = function(movie_id) {\r\n\r\n // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version\r\n return id(movie_id) || doc[movie_id] || window[movie_id];\r\n\r\n };\r\n\r\n /**\r\n * Creates a SMSound sound object instance. Can also be overloaded, e.g., createSound('mySound', '/some.mp3');\r\n *\r\n * @param {object} oOptions Sound options (at minimum, url parameter is required.)\r\n * @return {object} SMSound The new SMSound object.\r\n */\r\n\r\n this.createSound = function(oOptions, _url) {\r\n\r\n var cs, cs_string, options, oSound = null;\r\n\r\n // <d>\r\n cs = sm + '.createSound(): ';\r\n cs_string = cs + str(!didInit ? 'notReady' : 'notOK');\r\n // </d>\r\n\r\n if (!didInit || !sm2.ok()) {\r\n complain(cs_string);\r\n return false;\r\n }\r\n\r\n if (_url !== _undefined) {\r\n // function overloading in JS! :) ... assume simple createSound(id, url) use case.\r\n oOptions = {\r\n id: oOptions,\r\n url: _url\r\n };\r\n }\r\n\r\n // inherit from defaultOptions\r\n options = mixin(oOptions);\r\n\r\n options.url = parseURL(options.url);\r\n\r\n // generate an id, if needed.\r\n if (options.id === _undefined) {\r\n options.id = sm2.setupOptions.idPrefix + (idCounter++);\r\n }\r\n\r\n // <d>\r\n if (options.id.toString().charAt(0).match(/^[0-9]$/)) {\r\n sm2._wD(cs + str('badID', options.id), 2);\r\n }\r\n\r\n sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);\r\n // </d>\r\n\r\n if (idCheck(options.id, true)) {\r\n sm2._wD(cs + options.id + ' exists', 1);\r\n return sm2.sounds[options.id];\r\n }\r\n\r\n function make() {\r\n\r\n options = loopFix(options);\r\n sm2.sounds[options.id] = new SMSound(options);\r\n sm2.soundIDs.push(options.id);\r\n return sm2.sounds[options.id];\r\n\r\n }\r\n\r\n if (html5OK(options)) {\r\n\r\n oSound = make();\r\n // <d>\r\n if (!sm2.html5Only) {\r\n sm2._wD(options.id + ': Using HTML5');\r\n }\r\n // </d>\r\n oSound._setup_html5(options);\r\n\r\n } else {\r\n\r\n if (sm2.html5Only) {\r\n sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');\r\n return make();\r\n }\r\n\r\n // TODO: Move HTML5/flash checks into generic URL parsing/handling function.\r\n\r\n if (sm2.html5.usingFlash && options.url && options.url.match(/data:/i)) {\r\n // data: URIs not supported by Flash, either.\r\n sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');\r\n return make();\r\n }\r\n\r\n if (fV > 8) {\r\n if (options.isMovieStar === null) {\r\n // attempt to detect MPEG-4 formats\r\n options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));\r\n }\r\n // <d>\r\n if (options.isMovieStar) {\r\n sm2._wD(cs + 'using MovieStar handling');\r\n if (options.loops > 1) {\r\n _wDS('noNSLoop');\r\n }\r\n }\r\n // </d>\r\n }\r\n\r\n options = policyFix(options, cs);\r\n oSound = make();\r\n\r\n if (fV === 8) {\r\n flash._createSound(options.id, options.loops || 1, options.usePolicyFile);\r\n } else {\r\n flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar ? options.bufferTime : false), options.loops || 1, options.serverURL, options.duration || null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);\r\n if (!options.serverURL) {\r\n // We are connected immediately\r\n oSound.connected = true;\r\n if (options.onconnect) {\r\n options.onconnect.apply(oSound);\r\n }\r\n }\r\n }\r\n\r\n if (!options.serverURL && (options.autoLoad || options.autoPlay)) {\r\n // call load for non-rtmp streams\r\n oSound.load(options);\r\n }\r\n\r\n }\r\n\r\n // rtmp will play in onconnect\r\n if (!options.serverURL && options.autoPlay) {\r\n oSound.play();\r\n }\r\n\r\n return oSound;\r\n\r\n };\r\n\r\n /**\r\n * Destroys a SMSound sound object instance.\r\n *\r\n * @param {string} sID The ID of the sound to destroy\r\n */\r\n\r\n this.destroySound = function(sID, _bFromSound) {\r\n\r\n // explicitly destroy a sound before normal page unload, etc.\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n var oS = sm2.sounds[sID], i;\r\n\r\n oS.stop();\r\n\r\n // Disable all callbacks after stop(), when the sound is being destroyed\r\n oS._iO = {};\r\n\r\n oS.unload();\r\n\r\n for (i = 0; i < sm2.soundIDs.length; i++) {\r\n if (sm2.soundIDs[i] === sID) {\r\n sm2.soundIDs.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n if (!_bFromSound) {\r\n // ignore if being called from SMSound instance\r\n oS.destruct(true);\r\n }\r\n\r\n oS = null;\r\n delete sm2.sounds[sID];\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Calls the load() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {object} oOptions Optional: Sound options\r\n */\r\n\r\n this.load = function(sID, oOptions) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].load(oOptions);\r\n\r\n };\r\n\r\n /**\r\n * Calls the unload() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n */\r\n\r\n this.unload = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].unload();\r\n\r\n };\r\n\r\n /**\r\n * Calls the onPosition() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nPosition The position to watch for\r\n * @param {function} oMethod The relevant callback to fire\r\n * @param {object} oScope Optional: The scope to apply the callback to\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.onPosition = function(sID, nPosition, oMethod, oScope) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);\r\n\r\n };\r\n\r\n // legacy/backwards-compability: lower-case method name\r\n this.onposition = this.onPosition;\r\n\r\n /**\r\n * Calls the clearOnPosition() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nPosition The position to watch for\r\n * @param {function} oMethod Optional: The relevant callback to fire\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.clearOnPosition = function(sID, nPosition, oMethod) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);\r\n\r\n };\r\n\r\n /**\r\n * Calls the play() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {object} oOptions Optional: Sound options\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.play = function(sID, oOptions) {\r\n\r\n var result = null,\r\n // legacy function-overloading use case: play('mySound', '/path/to/some.mp3');\r\n overloaded = (oOptions && !(oOptions instanceof Object));\r\n\r\n if (!didInit || !sm2.ok()) {\r\n complain(sm + '.play(): ' + str(!didInit ? 'notReady' : 'notOK'));\r\n return false;\r\n }\r\n\r\n if (!idCheck(sID, overloaded)) {\r\n\r\n // no sound found for the given ID. Bail.\r\n if (!overloaded) return false;\r\n\r\n if (overloaded) {\r\n oOptions = {\r\n url: oOptions\r\n };\r\n }\r\n\r\n if (oOptions && oOptions.url) {\r\n // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});\r\n sm2._wD(sm + '.play(): Attempting to create \"' + sID + '\"', 1);\r\n oOptions.id = sID;\r\n result = sm2.createSound(oOptions).play();\r\n }\r\n\r\n } else if (overloaded) {\r\n\r\n // existing sound object case\r\n oOptions = {\r\n url: oOptions\r\n };\r\n\r\n }\r\n\r\n if (result === null) {\r\n // default case\r\n result = sm2.sounds[sID].play(oOptions);\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n // just for convenience\r\n this.start = this.play;\r\n\r\n /**\r\n * Calls the setPlaybackRate() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPlaybackRate = function(sID, rate, allowOverride) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setPlaybackRate(rate, allowOverride);\r\n\r\n };\r\n\r\n /**\r\n * Calls the setPosition() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nMsecOffset Position (milliseconds)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPosition = function(sID, nMsecOffset) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setPosition(nMsecOffset);\r\n\r\n };\r\n\r\n /**\r\n * Calls the stop() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.stop = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n sm2._wD(sm + '.stop(' + sID + ')', 1);\r\n\r\n return sm2.sounds[sID].stop();\r\n\r\n };\r\n\r\n /**\r\n * Stops all currently-playing sounds.\r\n */\r\n\r\n this.stopAll = function() {\r\n\r\n var oSound;\r\n sm2._wD(sm + '.stopAll()', 1);\r\n\r\n for (oSound in sm2.sounds) {\r\n if (sm2.sounds.hasOwnProperty(oSound)) {\r\n // apply only to sound objects\r\n sm2.sounds[oSound].stop();\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Calls the pause() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.pause = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].pause();\r\n\r\n };\r\n\r\n /**\r\n * Pauses all currently-playing sounds.\r\n */\r\n\r\n this.pauseAll = function() {\r\n\r\n var i;\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].pause();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Calls the resume() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.resume = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].resume();\r\n\r\n };\r\n\r\n /**\r\n * Resumes all currently-paused sounds.\r\n */\r\n\r\n this.resumeAll = function() {\r\n\r\n var i;\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].resume();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Calls the togglePause() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.togglePause = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].togglePause();\r\n\r\n };\r\n\r\n /**\r\n * Calls the setPan() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nPan The pan value (-100 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPan = function(sID, nPan) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setPan(nPan);\r\n\r\n };\r\n\r\n /**\r\n * Calls the setVolume() method of a SMSound object by ID\r\n * Overloaded case: pass only volume argument eg., setVolume(50) to apply to all sounds.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @param {number} nVol The volume value (0 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setVolume = function(sID, nVol) {\r\n\r\n // setVolume(50) function overloading case - apply to all sounds\r\n\r\n var i, j;\r\n\r\n if (sID !== _undefined && !isNaN(sID) && nVol === _undefined) {\r\n for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n sm2.sounds[sm2.soundIDs[i]].setVolume(sID);\r\n }\r\n return false;\r\n }\r\n\r\n // setVolume('mySound', 50) case\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].setVolume(nVol);\r\n\r\n };\r\n\r\n /**\r\n * Calls the mute() method of either a single SMSound object by ID, or all sound objects.\r\n *\r\n * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n */\r\n\r\n this.mute = function(sID) {\r\n\r\n var i = 0;\r\n\r\n if (sID instanceof String) {\r\n sID = null;\r\n }\r\n\r\n if (!sID) {\r\n\r\n sm2._wD(sm + '.mute(): Muting all sounds');\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].mute();\r\n }\r\n sm2.muted = true;\r\n\r\n } else {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n sm2._wD(sm + '.mute(): Muting \"' + sID + '\"');\r\n return sm2.sounds[sID].mute();\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Mutes all sounds.\r\n */\r\n\r\n this.muteAll = function() {\r\n\r\n sm2.mute();\r\n\r\n };\r\n\r\n /**\r\n * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.\r\n *\r\n * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n */\r\n\r\n this.unmute = function(sID) {\r\n\r\n var i;\r\n\r\n if (sID instanceof String) {\r\n sID = null;\r\n }\r\n\r\n if (!sID) {\r\n\r\n sm2._wD(sm + '.unmute(): Unmuting all sounds');\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].unmute();\r\n }\r\n sm2.muted = false;\r\n\r\n } else {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n sm2._wD(sm + '.unmute(): Unmuting \"' + sID + '\"');\r\n\r\n return sm2.sounds[sID].unmute();\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Unmutes all sounds.\r\n */\r\n\r\n this.unmuteAll = function() {\r\n\r\n sm2.unmute();\r\n\r\n };\r\n\r\n /**\r\n * Calls the toggleMute() method of a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.toggleMute = function(sID) {\r\n\r\n if (!idCheck(sID)) return false;\r\n\r\n return sm2.sounds[sID].toggleMute();\r\n\r\n };\r\n\r\n /**\r\n * Retrieves the memory used by the flash plugin.\r\n *\r\n * @return {number} The amount of memory in use\r\n */\r\n\r\n this.getMemoryUse = function() {\r\n\r\n // flash-only\r\n var ram = 0;\r\n\r\n if (flash && fV !== 8) {\r\n ram = parseInt(flash._getMemoryUse(), 10);\r\n }\r\n\r\n return ram;\r\n\r\n };\r\n\r\n /**\r\n * Undocumented: NOPs soundManager and all SMSound objects.\r\n */\r\n\r\n this.disable = function(bNoDisable) {\r\n\r\n // destroy all functions\r\n var i;\r\n\r\n if (bNoDisable === _undefined) {\r\n bNoDisable = false;\r\n }\r\n\r\n // already disabled?\r\n if (disabled) return false;\r\n\r\n disabled = true;\r\n\r\n _wDS('shutdown', 1);\r\n\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n disableObject(sm2.sounds[sm2.soundIDs[i]]);\r\n }\r\n\r\n disableObject(sm2);\r\n\r\n // fire \"complete\", despite fail\r\n initComplete(bNoDisable);\r\n\r\n event.remove(window, 'load', initUserOnload);\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Determines playability of a MIME type, eg. 'audio/mp3'.\r\n */\r\n\r\n this.canPlayMIME = function(sMIME) {\r\n\r\n var result;\r\n\r\n if (sm2.hasHTML5) {\r\n result = html5CanPlay({\r\n type: sMIME\r\n });\r\n }\r\n\r\n if (!result && needsFlash) {\r\n // if flash 9, test netStream (movieStar) types as well.\r\n result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less \"weird\" (per JSLint)\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Determines playability of a URL based on audio support.\r\n *\r\n * @param {string} sURL The URL to test\r\n * @return {boolean} URL playability\r\n */\r\n\r\n this.canPlayURL = function(sURL) {\r\n\r\n var result;\r\n\r\n if (sm2.hasHTML5) {\r\n result = html5CanPlay({\r\n url: sURL\r\n });\r\n }\r\n\r\n if (!result && needsFlash) {\r\n result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Determines playability of an HTML DOM <a> object (or similar object literal) based on audio support.\r\n *\r\n * @param {object} oLink an HTML DOM <a> object or object literal including href and/or type attributes\r\n * @return {boolean} URL playability\r\n */\r\n\r\n this.canPlayLink = function(oLink) {\r\n\r\n if (oLink.type !== _undefined && oLink.type && sm2.canPlayMIME(oLink.type)) return true;\r\n\r\n return sm2.canPlayURL(oLink.href);\r\n\r\n };\r\n\r\n /**\r\n * Retrieves a SMSound object by ID.\r\n *\r\n * @param {string} sID The ID of the sound\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.getSoundById = function(sID, _suppressDebug) {\r\n\r\n if (!sID) return null;\r\n\r\n var result = sm2.sounds[sID];\r\n\r\n // <d>\r\n if (!result && !_suppressDebug) {\r\n sm2._wD(sm + '.getSoundById(): Sound \"' + sID + '\" not found.', 2);\r\n }\r\n // </d>\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Queues a callback for execution when SoundManager has successfully initialized.\r\n *\r\n * @param {function} oMethod The callback method to fire\r\n * @param {object} oScope Optional: The scope to apply to the callback\r\n */\r\n\r\n this.onready = function(oMethod, oScope) {\r\n\r\n var sType = 'onready',\r\n result = false;\r\n\r\n if (typeof oMethod === 'function') {\r\n\r\n // <d>\r\n if (didInit) {\r\n sm2._wD(str('queue', sType));\r\n }\r\n // </d>\r\n\r\n if (!oScope) {\r\n oScope = window;\r\n }\r\n\r\n addOnEvent(sType, oMethod, oScope);\r\n processOnEvents();\r\n\r\n result = true;\r\n\r\n } else {\r\n\r\n throw str('needFunction', sType);\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Queues a callback for execution when SoundManager has failed to initialize.\r\n *\r\n * @param {function} oMethod The callback method to fire\r\n * @param {object} oScope Optional: The scope to apply to the callback\r\n */\r\n\r\n this.ontimeout = function(oMethod, oScope) {\r\n\r\n var sType = 'ontimeout',\r\n result = false;\r\n\r\n if (typeof oMethod === 'function') {\r\n\r\n // <d>\r\n if (didInit) {\r\n sm2._wD(str('queue', sType));\r\n }\r\n // </d>\r\n\r\n if (!oScope) {\r\n oScope = window;\r\n }\r\n\r\n addOnEvent(sType, oMethod, oScope);\r\n processOnEvents({ type: sType });\r\n\r\n result = true;\r\n\r\n } else {\r\n\r\n throw str('needFunction', sType);\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * Writes console.log()-style debug output to a console or in-browser element.\r\n * Applies when debugMode = true\r\n *\r\n * @param {string} sText The console message\r\n * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.\r\n */\r\n\r\n this._writeDebug = function(sText, sTypeOrObject) {\r\n\r\n // pseudo-private console.log()-style output\r\n // <d>\r\n\r\n var sDID = 'soundmanager-debug', o, oItem;\r\n\r\n if (!sm2.setupOptions.debugMode) return false;\r\n\r\n if (hasConsole && sm2.useConsole) {\r\n if (sTypeOrObject && typeof sTypeOrObject === 'object') {\r\n // object passed; dump to console.\r\n console.log(sText, sTypeOrObject);\r\n } else if (debugLevels[sTypeOrObject] !== _undefined) {\r\n console[debugLevels[sTypeOrObject]](sText);\r\n } else {\r\n console.log(sText);\r\n }\r\n if (sm2.consoleOnly) return true;\r\n }\r\n\r\n o = id(sDID);\r\n\r\n if (!o) return false;\r\n\r\n oItem = doc.createElement('div');\r\n\r\n if (++wdCount % 2 === 0) {\r\n oItem.className = 'sm2-alt';\r\n }\r\n\r\n if (sTypeOrObject === _undefined) {\r\n sTypeOrObject = 0;\r\n } else {\r\n sTypeOrObject = parseInt(sTypeOrObject, 10);\r\n }\r\n\r\n oItem.appendChild(doc.createTextNode(sText));\r\n\r\n if (sTypeOrObject) {\r\n if (sTypeOrObject >= 2) {\r\n oItem.style.fontWeight = 'bold';\r\n }\r\n if (sTypeOrObject === 3) {\r\n oItem.style.color = '#ff3333';\r\n }\r\n }\r\n\r\n // top-to-bottom\r\n // o.appendChild(oItem);\r\n\r\n // bottom-to-top\r\n o.insertBefore(oItem, o.firstChild);\r\n\r\n o = null;\r\n // </d>\r\n\r\n return true;\r\n\r\n };\r\n\r\n // <d>\r\n // last-resort debugging option\r\n if (wl.indexOf('sm2-debug=alert') !== -1) {\r\n this._writeDebug = function(sText) {\r\n window.alert(sText);\r\n };\r\n }\r\n // </d>\r\n\r\n // alias\r\n this._wD = this._writeDebug;\r\n\r\n /**\r\n * Provides debug / state information on all SMSound objects.\r\n */\r\n\r\n this._debug = function() {\r\n\r\n // <d>\r\n var i, j;\r\n _wDS('currentObj', 1);\r\n\r\n for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n sm2.sounds[sm2.soundIDs[i]]._debug();\r\n }\r\n // </d>\r\n\r\n };\r\n\r\n /**\r\n * Restarts and re-initializes the SoundManager instance.\r\n *\r\n * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.\r\n * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).\r\n * @return {object} soundManager The soundManager instance.\r\n */\r\n\r\n this.reboot = function(resetEvents, excludeInit) {\r\n\r\n // reset some (or all) state, and re-init unless otherwise specified.\r\n\r\n // <d>\r\n if (sm2.soundIDs.length) {\r\n sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');\r\n }\r\n // </d>\r\n\r\n var i, j, k;\r\n\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n sm2.sounds[sm2.soundIDs[i]].destruct();\r\n }\r\n\r\n // trash ze flash (remove from the DOM)\r\n\r\n if (flash) {\r\n\r\n try {\r\n\r\n if (isIE) {\r\n oRemovedHTML = flash.innerHTML;\r\n }\r\n\r\n oRemoved = flash.parentNode.removeChild(flash);\r\n\r\n } catch(e) {\r\n\r\n // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.\r\n\r\n _wDS('badRemove', 2);\r\n\r\n }\r\n\r\n }\r\n\r\n // actually, force recreate of movie.\r\n\r\n oRemovedHTML = oRemoved = needsFlash = flash = null;\r\n\r\n sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;\r\n\r\n sm2.soundIDs = [];\r\n sm2.sounds = {};\r\n\r\n idCounter = 0;\r\n didSetup = false;\r\n\r\n if (!resetEvents) {\r\n // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init\r\n for (i in on_queue) {\r\n if (on_queue.hasOwnProperty(i)) {\r\n for (j = 0, k = on_queue[i].length; j < k; j++) {\r\n on_queue[i][j].fired = false;\r\n }\r\n }\r\n }\r\n } else {\r\n // remove all callbacks entirely\r\n on_queue = [];\r\n }\r\n\r\n // <d>\r\n if (!excludeInit) {\r\n sm2._wD(sm + ': Rebooting...');\r\n }\r\n // </d>\r\n\r\n // reset HTML5 and flash canPlay test results\r\n\r\n sm2.html5 = {\r\n usingFlash: null\r\n };\r\n\r\n sm2.flash = {};\r\n\r\n // reset device-specific HTML/flash mode switches\r\n\r\n sm2.html5Only = false;\r\n sm2.ignoreFlash = false;\r\n\r\n window.setTimeout(function() {\r\n\r\n // by default, re-init\r\n\r\n if (!excludeInit) {\r\n sm2.beginDelayedInit();\r\n }\r\n\r\n }, 20);\r\n\r\n return sm2;\r\n\r\n };\r\n\r\n this.reset = function() {\r\n\r\n /**\r\n * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.\r\n * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().\r\n * @return {object} soundManager The soundManager instance.\r\n */\r\n\r\n _wDS('reset');\r\n\r\n return sm2.reboot(true, true);\r\n\r\n };\r\n\r\n /**\r\n * Undocumented: Determines the SM2 flash movie's load progress.\r\n *\r\n * @return {number or null} Percent loaded, or if invalid/unsupported, null.\r\n */\r\n\r\n this.getMoviePercent = function() {\r\n\r\n /**\r\n * Interesting syntax notes...\r\n * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof \"function\" nor instanceof Function, but are still valid.\r\n * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw \"object doesn't support this property or method\".\r\n * Thus, 'in' syntax must be used.\r\n */\r\n\r\n return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null);\r\n\r\n };\r\n\r\n /**\r\n * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().\r\n */\r\n\r\n this.beginDelayedInit = function() {\r\n\r\n windowLoaded = true;\r\n domContentLoaded();\r\n\r\n setTimeout(function() {\r\n\r\n if (initPending) return false;\r\n\r\n createMovie();\r\n initMovie();\r\n initPending = true;\r\n\r\n return true;\r\n\r\n }, 20);\r\n\r\n delayWaitForEI();\r\n\r\n };\r\n\r\n /**\r\n * Destroys the SoundManager instance and all SMSound instances.\r\n */\r\n\r\n this.destruct = function() {\r\n\r\n sm2._wD(sm + '.destruct()');\r\n sm2.disable(true);\r\n\r\n };\r\n\r\n /**\r\n * SMSound() (sound object) constructor\r\n * ------------------------------------\r\n *\r\n * @param {object} oOptions Sound options (id and url are required attributes)\r\n * @return {SMSound} The new SMSound object\r\n */\r\n\r\n SMSound = function(oOptions) {\r\n\r\n var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;\r\n\r\n lastHTML5State = {\r\n // tracks duration + position (time)\r\n duration: null,\r\n time: null\r\n };\r\n\r\n this.id = oOptions.id;\r\n\r\n // legacy\r\n this.sID = this.id;\r\n\r\n this.url = oOptions.url;\r\n this.options = mixin(oOptions);\r\n\r\n // per-play-instance-specific options\r\n this.instanceOptions = this.options;\r\n\r\n // short alias\r\n this._iO = this.instanceOptions;\r\n\r\n // assign property defaults\r\n this.pan = this.options.pan;\r\n this.volume = this.options.volume;\r\n\r\n // whether or not this object is using HTML5\r\n this.isHTML5 = false;\r\n\r\n // internal HTML5 Audio() object reference\r\n this._a = null;\r\n\r\n // for flash 8 special-case createSound() without url, followed by load/play with url case\r\n urlOmitted = (!this.url);\r\n\r\n /**\r\n * SMSound() public methods\r\n * ------------------------\r\n */\r\n\r\n this.id3 = {};\r\n\r\n /**\r\n * Writes SMSound object parameters to debug console\r\n */\r\n\r\n this._debug = function() {\r\n\r\n // <d>\r\n sm2._wD(s.id + ': Merged options:', s.options);\r\n // </d>\r\n\r\n };\r\n\r\n /**\r\n * Begins loading a sound per its *url*.\r\n *\r\n * @param {object} options Optional: Sound options\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.load = function(options) {\r\n\r\n var oSound = null, instanceOptions;\r\n\r\n if (options !== _undefined) {\r\n s._iO = mixin(options, s.options);\r\n } else {\r\n options = s.options;\r\n s._iO = options;\r\n if (lastURL && lastURL !== s.url) {\r\n _wDS('manURL');\r\n s._iO.url = s.url;\r\n s.url = null;\r\n }\r\n }\r\n\r\n if (!s._iO.url) {\r\n s._iO.url = s.url;\r\n }\r\n\r\n s._iO.url = parseURL(s._iO.url);\r\n\r\n // ensure we're in sync\r\n s.instanceOptions = s._iO;\r\n\r\n // local shortcut\r\n instanceOptions = s._iO;\r\n\r\n sm2._wD(s.id + ': load (' + instanceOptions.url + ')');\r\n\r\n if (!instanceOptions.url && !s.url) {\r\n sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);\r\n return s;\r\n }\r\n\r\n // <d>\r\n if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {\r\n // flash 8 load() -> play() won't work before onload has fired.\r\n sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);\r\n }\r\n // </d>\r\n\r\n if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {\r\n _wDS('onURL', 1);\r\n // if loaded and an onload() exists, fire immediately.\r\n if (s.readyState === 3 && instanceOptions.onload) {\r\n // assume success based on truthy duration.\r\n wrapCallback(s, function() {\r\n instanceOptions.onload.apply(s, [(!!s.duration)]);\r\n });\r\n }\r\n return s;\r\n }\r\n\r\n // reset a few state properties\r\n\r\n s.loaded = false;\r\n s.readyState = 1;\r\n s.playState = 0;\r\n s.id3 = {};\r\n\r\n // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.\r\n\r\n if (html5OK(instanceOptions)) {\r\n\r\n oSound = s._setup_html5(instanceOptions);\r\n\r\n if (!oSound._called_load) {\r\n\r\n s._html5_canplay = false;\r\n\r\n // TODO: review called_load / html5_canplay logic\r\n\r\n // if url provided directly to load(), assign it here.\r\n\r\n if (s.url !== instanceOptions.url) {\r\n\r\n sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);\r\n\r\n s._a.src = instanceOptions.url;\r\n\r\n // TODO: review / re-apply all relevant options (volume, loop, onposition etc.)\r\n\r\n // reset position for new URL\r\n s.setPosition(0);\r\n\r\n }\r\n\r\n // given explicit load call, try to preload.\r\n\r\n // early HTML5 implementation (non-standard)\r\n s._a.autobuffer = 'auto';\r\n\r\n // standard property, values: none / metadata / auto\r\n // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx\r\n s._a.preload = 'auto';\r\n\r\n s._a._called_load = true;\r\n\r\n } else {\r\n\r\n sm2._wD(s.id + ': Ignoring request to load again');\r\n\r\n }\r\n\r\n } else {\r\n\r\n if (sm2.html5Only) {\r\n sm2._wD(s.id + ': No flash support. Exiting.');\r\n return s;\r\n }\r\n\r\n if (s._iO.url && s._iO.url.match(/data:/i)) {\r\n // data: URIs not supported by Flash, either.\r\n sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');\r\n return s;\r\n }\r\n\r\n try {\r\n s.isHTML5 = false;\r\n s._iO = policyFix(loopFix(instanceOptions));\r\n // if we have \"position\", disable auto-play as we'll be seeking to that position at onload().\r\n if (s._iO.autoPlay && (s._iO.position || s._iO.from)) {\r\n sm2._wD(s.id + ': Disabling autoPlay because of non-zero offset case');\r\n s._iO.autoPlay = false;\r\n }\r\n // re-assign local shortcut\r\n instanceOptions = s._iO;\r\n if (fV === 8) {\r\n flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);\r\n } else {\r\n flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops || 1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);\r\n }\r\n } catch(e) {\r\n _wDS('smError', 2);\r\n debugTS('onload', false);\r\n catchError({\r\n type: 'SMSOUND_LOAD_JS_EXCEPTION',\r\n fatal: true\r\n });\r\n }\r\n\r\n }\r\n\r\n // after all of this, ensure sound url is up to date.\r\n s.url = instanceOptions.url;\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Unloads a sound, canceling any open HTTP requests.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.unload = function() {\r\n\r\n // Flash 8/AS2 can't \"close\" a stream - fake it by loading an empty URL\r\n // Flash 9/AS3: Close stream, preventing further load\r\n // HTML5: Most UAs will use empty URL\r\n\r\n if (s.readyState !== 0) {\r\n\r\n sm2._wD(s.id + ': unload()');\r\n\r\n if (!s.isHTML5) {\r\n\r\n if (fV === 8) {\r\n flash._unload(s.id, emptyURL);\r\n } else {\r\n flash._unload(s.id);\r\n }\r\n\r\n } else {\r\n\r\n stop_html5_timer();\r\n\r\n if (s._a) {\r\n\r\n s._a.pause();\r\n\r\n // update empty URL, too\r\n lastURL = html5Unload(s._a);\r\n\r\n }\r\n\r\n }\r\n\r\n // reset load/status flags\r\n resetProperties();\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Unloads and destroys a sound.\r\n */\r\n\r\n this.destruct = function(_bFromSM) {\r\n\r\n sm2._wD(s.id + ': Destruct');\r\n\r\n if (!s.isHTML5) {\r\n\r\n // kill sound within Flash\r\n // Disable the onfailure handler\r\n s._iO.onfailure = null;\r\n flash._destroySound(s.id);\r\n\r\n } else {\r\n\r\n stop_html5_timer();\r\n\r\n if (s._a) {\r\n s._a.pause();\r\n html5Unload(s._a);\r\n if (!useGlobalHTML5Audio) {\r\n remove_html5_events();\r\n }\r\n // break obvious circular reference\r\n s._a._s = null;\r\n s._a = null;\r\n }\r\n\r\n }\r\n\r\n if (!_bFromSM) {\r\n // ensure deletion from controller\r\n sm2.destroySound(s.id, true);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Begins playing a sound.\r\n *\r\n * @param {object} options Optional: Sound options\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.play = function(options, _updatePlayState) {\r\n\r\n var fN, allowMulti, a, onready,\r\n audioClone, onended, oncanplay,\r\n startOK = true;\r\n\r\n // <d>\r\n fN = s.id + ': play(): ';\r\n // </d>\r\n\r\n // default to true\r\n _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);\r\n\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n // first, use local URL (if specified)\r\n if (s.url) {\r\n s._iO.url = s.url;\r\n }\r\n\r\n // mix in any options defined at createSound()\r\n s._iO = mixin(s._iO, s.options);\r\n\r\n // mix in any options specific to this method\r\n s._iO = mixin(options, s._iO);\r\n\r\n s._iO.url = parseURL(s._iO.url);\r\n\r\n s.instanceOptions = s._iO;\r\n\r\n // RTMP-only\r\n if (!s.isHTML5 && s._iO.serverURL && !s.connected) {\r\n if (!s.getAutoPlay()) {\r\n sm2._wD(fN + ' Netstream not connected yet - setting autoPlay');\r\n s.setAutoPlay(true);\r\n }\r\n // play will be called in onconnect()\r\n return s;\r\n }\r\n\r\n if (html5OK(s._iO)) {\r\n s._setup_html5(s._iO);\r\n start_html5_timer();\r\n }\r\n\r\n if (s.playState === 1 && !s.paused) {\r\n\r\n allowMulti = s._iO.multiShot;\r\n\r\n if (!allowMulti) {\r\n\r\n sm2._wD(fN + 'Already playing (one-shot)', 1);\r\n\r\n if (s.isHTML5) {\r\n // go back to original position.\r\n s.setPosition(s._iO.position);\r\n }\r\n\r\n return s;\r\n\r\n }\r\n\r\n sm2._wD(fN + 'Already playing (multi-shot)', 1);\r\n\r\n }\r\n\r\n // edge case: play() with explicit URL parameter\r\n if (options.url && options.url !== s.url) {\r\n\r\n // special case for createSound() followed by load() / play() with url; avoid double-load case.\r\n if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {\r\n\r\n urlOmitted = false;\r\n\r\n } else {\r\n\r\n // load using merged options\r\n s.load(s._iO);\r\n\r\n }\r\n\r\n }\r\n\r\n if (!s.loaded) {\r\n\r\n if (s.readyState === 0) {\r\n\r\n sm2._wD(fN + 'Attempting to load');\r\n\r\n // try to get this sound playing ASAP\r\n if (!s.isHTML5 && !sm2.html5Only) {\r\n\r\n // flash: assign directly because setAutoPlay() increments the instanceCount\r\n s._iO.autoPlay = true;\r\n s.load(s._iO);\r\n\r\n } else if (s.isHTML5) {\r\n\r\n // iOS needs this when recycling sounds, loading a new URL on an existing object.\r\n s.load(s._iO);\r\n\r\n } else {\r\n\r\n sm2._wD(fN + 'Unsupported type. Exiting.');\r\n\r\n return s;\r\n\r\n }\r\n\r\n // HTML5 hack - re-set instanceOptions?\r\n s.instanceOptions = s._iO;\r\n\r\n } else if (s.readyState === 2) {\r\n\r\n sm2._wD(fN + 'Could not load - exiting', 2);\r\n\r\n return s;\r\n\r\n } else {\r\n\r\n sm2._wD(fN + 'Loading - attempting to play...');\r\n\r\n }\r\n\r\n } else {\r\n\r\n // \"play()\"\r\n sm2._wD(fN.substr(0, fN.lastIndexOf(':')));\r\n\r\n }\r\n\r\n if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {\r\n // flash 9 needs a position reset if play() is called while at the end of a sound.\r\n sm2._wD(fN + 'Sound at end, resetting to position: 0');\r\n options.position = 0;\r\n }\r\n\r\n /**\r\n * Streams will pause when their buffer is full if they are being loaded.\r\n * In this case paused is true, but the song hasn't started playing yet.\r\n * If we just call resume() the onplay() callback will never be called.\r\n * So only call resume() if the position is > 0.\r\n * Another reason is because options like volume won't have been applied yet.\r\n * For normal sounds, just resume.\r\n */\r\n\r\n if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {\r\n\r\n // https://gist.github.com/37b17df75cc4d7a90bf6\r\n sm2._wD(fN + 'Resuming from paused state', 1);\r\n s.resume();\r\n\r\n } else {\r\n\r\n s._iO = mixin(options, s._iO);\r\n\r\n /**\r\n * Preload in the event of play() with position under Flash,\r\n * or from/to parameters and non-RTMP case\r\n */\r\n if (((!s.isHTML5 && s._iO.position !== null && s._iO.position > 0) || (s._iO.from !== null && s._iO.from > 0) || s._iO.to !== null) && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {\r\n\r\n onready = function() {\r\n // sound \"canplay\" or onload()\r\n // re-apply position/from/to to instance options, and start playback\r\n s._iO = mixin(options, s._iO);\r\n s.play(s._iO);\r\n };\r\n\r\n // HTML5 needs to at least have \"canplay\" fired before seeking.\r\n if (s.isHTML5 && !s._html5_canplay) {\r\n\r\n // this hasn't been loaded yet. load it first, and then do this again.\r\n sm2._wD(fN + 'Beginning load for non-zero offset case');\r\n\r\n s.load({\r\n // note: custom HTML5-only event added for from/to implementation.\r\n _oncanplay: onready\r\n });\r\n\r\n } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {\r\n\r\n // to be safe, preload the whole thing in Flash.\r\n\r\n sm2._wD(fN + 'Preloading for non-zero offset case');\r\n\r\n s.load({\r\n onload: onready\r\n });\r\n\r\n }\r\n\r\n // otherwise, we're ready to go. re-apply local options, and continue\r\n\r\n s._iO = applyFromTo();\r\n\r\n }\r\n\r\n // sm2._wD(fN + 'Starting to play');\r\n\r\n // increment instance counter, where enabled + supported\r\n if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {\r\n s.instanceCount++;\r\n }\r\n\r\n // if first play and onposition parameters exist, apply them now\r\n if (s._iO.onposition && s.playState === 0) {\r\n attachOnPosition(s);\r\n }\r\n\r\n s.playState = 1;\r\n s.paused = false;\r\n\r\n s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);\r\n\r\n if (!s.isHTML5) {\r\n s._iO = policyFix(loopFix(s._iO));\r\n }\r\n\r\n if (s._iO.onplay && _updatePlayState) {\r\n s._iO.onplay.apply(s);\r\n onplay_called = true;\r\n }\r\n\r\n s.setVolume(s._iO.volume, true);\r\n s.setPan(s._iO.pan, true);\r\n\r\n if (s._iO.playbackRate !== 1) {\r\n s.setPlaybackRate(s._iO.playbackRate);\r\n }\r\n\r\n if (!s.isHTML5) {\r\n\r\n startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);\r\n\r\n if (fV === 9 && !startOK) {\r\n // edge case: no sound hardware, or 32-channel flash ceiling hit.\r\n // applies only to Flash 9, non-NetStream/MovieStar sounds.\r\n // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29\r\n sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);\r\n if (s._iO.onplayerror) {\r\n s._iO.onplayerror.apply(s);\r\n }\r\n\r\n }\r\n\r\n } else if (s.instanceCount < 2) {\r\n\r\n // HTML5 single-instance case\r\n\r\n start_html5_timer();\r\n\r\n a = s._setup_html5();\r\n\r\n s.setPosition(s._iO.position);\r\n\r\n a.play();\r\n\r\n } else {\r\n\r\n // HTML5 multi-shot case\r\n\r\n sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');\r\n\r\n audioClone = new Audio(s._iO.url);\r\n\r\n onended = function() {\r\n event.remove(audioClone, 'ended', onended);\r\n s._onfinish(s);\r\n // cleanup\r\n html5Unload(audioClone);\r\n audioClone = null;\r\n };\r\n\r\n oncanplay = function() {\r\n event.remove(audioClone, 'canplay', oncanplay);\r\n try {\r\n audioClone.currentTime = s._iO.position / msecScale;\r\n } catch(err) {\r\n complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position / msecScale));\r\n }\r\n audioClone.play();\r\n };\r\n\r\n event.add(audioClone, 'ended', onended);\r\n\r\n // apply volume to clones, too\r\n if (s._iO.volume !== _undefined) {\r\n audioClone.volume = Math.max(0, Math.min(1, s._iO.volume / 100));\r\n }\r\n\r\n // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.\r\n if (s.muted) {\r\n audioClone.muted = true;\r\n }\r\n\r\n if (s._iO.position) {\r\n // HTML5 audio can't seek before onplay() event has fired.\r\n // wait for canplay, then seek to position and start playback.\r\n event.add(audioClone, 'canplay', oncanplay);\r\n } else {\r\n // begin playback at currentTime: 0\r\n audioClone.play();\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n // just for convenience\r\n this.start = this.play;\r\n\r\n /**\r\n * Stops playing a sound (and optionally, all sounds)\r\n *\r\n * @param {boolean} bAll Optional: Whether to stop all sounds\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.stop = function(bAll) {\r\n\r\n var instanceOptions = s._iO,\r\n originalPosition;\r\n\r\n if (s.playState === 1) {\r\n\r\n sm2._wD(s.id + ': stop()');\r\n\r\n s._onbufferchange(0);\r\n s._resetOnPosition(0);\r\n s.paused = false;\r\n\r\n if (!s.isHTML5) {\r\n s.playState = 0;\r\n }\r\n\r\n // remove onPosition listeners, if any\r\n detachOnPosition();\r\n\r\n // and \"to\" position, if set\r\n if (instanceOptions.to) {\r\n s.clearOnPosition(instanceOptions.to);\r\n }\r\n\r\n if (!s.isHTML5) {\r\n\r\n flash._stop(s.id, bAll);\r\n\r\n // hack for netStream: just unload\r\n if (instanceOptions.serverURL) {\r\n s.unload();\r\n }\r\n\r\n } else if (s._a) {\r\n\r\n originalPosition = s.position;\r\n\r\n // act like Flash, though\r\n s.setPosition(0);\r\n\r\n // hack: reflect old position for onstop() (also like Flash)\r\n s.position = originalPosition;\r\n\r\n // html5 has no stop()\r\n // NOTE: pausing means iOS requires interaction to resume.\r\n s._a.pause();\r\n\r\n s.playState = 0;\r\n\r\n // and update UI\r\n s._onTimer();\r\n\r\n stop_html5_timer();\r\n\r\n }\r\n\r\n s.instanceCount = 0;\r\n s._iO = {};\r\n\r\n if (instanceOptions.onstop) {\r\n instanceOptions.onstop.apply(s);\r\n }\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Undocumented/internal: Sets autoPlay for RTMP.\r\n *\r\n * @param {boolean} autoPlay state\r\n */\r\n\r\n this.setAutoPlay = function(autoPlay) {\r\n\r\n sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));\r\n s._iO.autoPlay = autoPlay;\r\n\r\n if (!s.isHTML5) {\r\n flash._setAutoPlay(s.id, autoPlay);\r\n if (autoPlay) {\r\n // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)\r\n if (!s.instanceCount && s.readyState === 1) {\r\n s.instanceCount++;\r\n sm2._wD(s.id + ': Incremented instance count to ' + s.instanceCount);\r\n }\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Undocumented/internal: Returns the autoPlay boolean.\r\n *\r\n * @return {boolean} The current autoPlay value\r\n */\r\n\r\n this.getAutoPlay = function() {\r\n\r\n return s._iO.autoPlay;\r\n\r\n };\r\n\r\n /**\r\n * Sets the playback rate of a sound (HTML5-only.)\r\n *\r\n * @param {number} playbackRate (+/-)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPlaybackRate = function(playbackRate) {\r\n\r\n // Per Mozilla, limit acceptable values to prevent playback from stopping (unless allowOverride is truthy.)\r\n // https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained\r\n var normalizedRate = Math.max(0.5, Math.min(4, playbackRate));\r\n\r\n // <d>\r\n if (normalizedRate !== playbackRate) {\r\n sm2._wD(s.id + ': setPlaybackRate(' + playbackRate + '): limiting rate to ' + normalizedRate, 2);\r\n }\r\n // </d>\r\n\r\n if (s.isHTML5) {\r\n try {\r\n s._iO.playbackRate = normalizedRate;\r\n s._a.playbackRate = normalizedRate;\r\n } catch(e) {\r\n sm2._wD(s.id + ': setPlaybackRate(' + normalizedRate + ') failed: ' + e.message, 2);\r\n }\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Sets the position of a sound.\r\n *\r\n * @param {number} nMsecOffset Position (milliseconds)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPosition = function(nMsecOffset) {\r\n\r\n if (nMsecOffset === _undefined) {\r\n nMsecOffset = 0;\r\n }\r\n\r\n var position, position1K,\r\n // Use the duration from the instance options, if we don't have a track duration yet.\r\n // position >= 0 and <= current available (loaded) duration\r\n offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));\r\n\r\n s.position = offset;\r\n position1K = s.position / msecScale;\r\n s._resetOnPosition(s.position);\r\n s._iO.position = offset;\r\n\r\n if (!s.isHTML5) {\r\n\r\n position = (fV === 9 ? s.position : position1K);\r\n\r\n if (s.readyState && s.readyState !== 2) {\r\n // if paused or not playing, will not resume (by playing)\r\n flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);\r\n }\r\n\r\n } else if (s._a) {\r\n\r\n // Set the position in the canplay handler if the sound is not ready yet\r\n if (s._html5_canplay) {\r\n\r\n if (s._a.currentTime.toFixed(3) !== position1K.toFixed(3)) {\r\n\r\n /**\r\n * DOM/JS errors/exceptions to watch out for:\r\n * if seek is beyond (loaded?) position, \"DOM exception 11\"\r\n * \"INDEX_SIZE_ERR\": DOM exception 1\r\n */\r\n sm2._wD(s.id + ': setPosition(' + position1K + ')');\r\n\r\n try {\r\n s._a.currentTime = position1K;\r\n if (s.playState === 0 || s.paused) {\r\n // allow seek without auto-play/resume\r\n s._a.pause();\r\n }\r\n } catch(e) {\r\n sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);\r\n }\r\n\r\n }\r\n\r\n } else if (position1K) {\r\n\r\n // warn on non-zero seek attempts\r\n sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);\r\n return s;\r\n\r\n }\r\n\r\n if (s.paused) {\r\n\r\n // if paused, refresh UI right away by forcing update\r\n s._onTimer(true);\r\n\r\n }\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Pauses sound playback.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.pause = function(_bCallFlash) {\r\n\r\n if (s.paused || (s.playState === 0 && s.readyState !== 1)) return s;\r\n\r\n sm2._wD(s.id + ': pause()');\r\n s.paused = true;\r\n\r\n if (!s.isHTML5) {\r\n if (_bCallFlash || _bCallFlash === _undefined) {\r\n flash._pause(s.id, s._iO.multiShot);\r\n }\r\n } else {\r\n s._setup_html5().pause();\r\n stop_html5_timer();\r\n }\r\n\r\n if (s._iO.onpause) {\r\n s._iO.onpause.apply(s);\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Resumes sound playback.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n /**\r\n * When auto-loaded streams pause on buffer full they have a playState of 0.\r\n * We need to make sure that the playState is set to 1 when these streams \"resume\".\r\n * When a paused stream is resumed, we need to trigger the onplay() callback if it\r\n * hasn't been called already. In this case since the sound is being played for the\r\n * first time, I think it's more appropriate to call onplay() rather than onresume().\r\n */\r\n\r\n this.resume = function() {\r\n\r\n var instanceOptions = s._iO;\r\n\r\n if (!s.paused) return s;\r\n\r\n sm2._wD(s.id + ': resume()');\r\n s.paused = false;\r\n s.playState = 1;\r\n\r\n if (!s.isHTML5) {\r\n\r\n if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {\r\n // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.\r\n s.setPosition(s.position);\r\n }\r\n\r\n // flash method is toggle-based (pause/resume)\r\n flash._pause(s.id, instanceOptions.multiShot);\r\n\r\n } else {\r\n\r\n s._setup_html5().play();\r\n start_html5_timer();\r\n\r\n }\r\n\r\n if (!onplay_called && instanceOptions.onplay) {\r\n\r\n instanceOptions.onplay.apply(s);\r\n onplay_called = true;\r\n\r\n } else if (instanceOptions.onresume) {\r\n\r\n instanceOptions.onresume.apply(s);\r\n\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Toggles sound playback.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.togglePause = function() {\r\n\r\n sm2._wD(s.id + ': togglePause()');\r\n\r\n if (s.playState === 0) {\r\n s.play({\r\n position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)\r\n });\r\n return s;\r\n }\r\n\r\n if (s.paused) {\r\n s.resume();\r\n } else {\r\n s.pause();\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Sets the panning (L-R) effect.\r\n *\r\n * @param {number} nPan The pan value (-100 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setPan = function(nPan, bInstanceOnly) {\r\n\r\n if (nPan === _undefined) {\r\n nPan = 0;\r\n }\r\n\r\n if (bInstanceOnly === _undefined) {\r\n bInstanceOnly = false;\r\n }\r\n\r\n if (!s.isHTML5) {\r\n flash._setPan(s.id, nPan);\r\n } // else { no HTML5 pan? }\r\n\r\n s._iO.pan = nPan;\r\n\r\n if (!bInstanceOnly) {\r\n s.pan = nPan;\r\n s.options.pan = nPan;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Sets the volume.\r\n *\r\n * @param {number} nVol The volume value (0 to 100)\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.setVolume = function(nVol, _bInstanceOnly) {\r\n\r\n /**\r\n * Note: Setting volume has no effect on iOS \"special snowflake\" devices.\r\n * Hardware volume control overrides software, and volume\r\n * will always return 1 per Apple docs. (iOS 4 + 5.)\r\n * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html\r\n */\r\n\r\n if (nVol === _undefined) {\r\n nVol = 100;\r\n }\r\n\r\n if (_bInstanceOnly === _undefined) {\r\n _bInstanceOnly = false;\r\n }\r\n\r\n if (!s.isHTML5) {\r\n\r\n flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted ? 0 : nVol);\r\n\r\n } else if (s._a) {\r\n\r\n if (sm2.muted && !s.muted) {\r\n s.muted = true;\r\n s._a.muted = true;\r\n }\r\n\r\n // valid range for native HTML5 Audio(): 0-1\r\n s._a.volume = Math.max(0, Math.min(1, nVol / 100));\r\n\r\n }\r\n\r\n s._iO.volume = nVol;\r\n\r\n if (!_bInstanceOnly) {\r\n s.volume = nVol;\r\n s.options.volume = nVol;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Mutes the sound.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.mute = function() {\r\n\r\n s.muted = true;\r\n\r\n if (!s.isHTML5) {\r\n flash._setVolume(s.id, 0);\r\n } else if (s._a) {\r\n s._a.muted = true;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Unmutes the sound.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.unmute = function() {\r\n\r\n s.muted = false;\r\n var hasIO = (s._iO.volume !== _undefined);\r\n\r\n if (!s.isHTML5) {\r\n flash._setVolume(s.id, hasIO ? s._iO.volume : s.options.volume);\r\n } else if (s._a) {\r\n s._a.muted = false;\r\n }\r\n\r\n return s;\r\n\r\n };\r\n\r\n /**\r\n * Toggles the muted state of a sound.\r\n *\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.toggleMute = function() {\r\n\r\n return (s.muted ? s.unmute() : s.mute());\r\n\r\n };\r\n\r\n /**\r\n * Registers a callback to be fired when a sound reaches a given position during playback.\r\n *\r\n * @param {number} nPosition The position to watch for\r\n * @param {function} oMethod The relevant callback to fire\r\n * @param {object} oScope Optional: The scope to apply the callback to\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.onPosition = function(nPosition, oMethod, oScope) {\r\n\r\n // TODO: basic dupe checking?\r\n\r\n onPositionItems.push({\r\n position: parseInt(nPosition, 10),\r\n method: oMethod,\r\n scope: (oScope !== _undefined ? oScope : s),\r\n fired: false\r\n });\r\n\r\n return s;\r\n\r\n };\r\n\r\n // legacy/backwards-compability: lower-case method name\r\n this.onposition = this.onPosition;\r\n\r\n /**\r\n * Removes registered callback(s) from a sound, by position and/or callback.\r\n *\r\n * @param {number} nPosition The position to clear callback(s) for\r\n * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position\r\n * @return {SMSound} The SMSound object\r\n */\r\n\r\n this.clearOnPosition = function(nPosition, oMethod) {\r\n\r\n var i;\r\n\r\n nPosition = parseInt(nPosition, 10);\r\n\r\n if (isNaN(nPosition)) {\r\n // safety check\r\n return;\r\n }\r\n\r\n for (i = 0; i < onPositionItems.length; i++) {\r\n\r\n if (nPosition === onPositionItems[i].position) {\r\n // remove this item if no method was specified, or, if the method matches\r\n\r\n if (!oMethod || (oMethod === onPositionItems[i].method)) {\r\n\r\n if (onPositionItems[i].fired) {\r\n // decrement \"fired\" counter, too\r\n onPositionFired--;\r\n }\r\n\r\n onPositionItems.splice(i, 1);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n this._processOnPosition = function() {\r\n\r\n var i, item, j = onPositionItems.length;\r\n\r\n if (!j || !s.playState || onPositionFired >= j) return false;\r\n\r\n for (i = j - 1; i >= 0; i--) {\r\n\r\n item = onPositionItems[i];\r\n\r\n if (!item.fired && s.position >= item.position) {\r\n\r\n item.fired = true;\r\n onPositionFired++;\r\n item.method.apply(item.scope, [item.position]);\r\n\r\n // reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.\r\n j = onPositionItems.length;\r\n\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n this._resetOnPosition = function(nPosition) {\r\n\r\n // reset \"fired\" for items interested in this position\r\n var i, item, j = onPositionItems.length;\r\n\r\n if (!j) return false;\r\n\r\n for (i = j - 1; i >= 0; i--) {\r\n\r\n item = onPositionItems[i];\r\n\r\n if (item.fired && nPosition <= item.position) {\r\n item.fired = false;\r\n onPositionFired--;\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * SMSound() private internals\r\n * --------------------------------\r\n */\r\n\r\n applyFromTo = function() {\r\n\r\n var instanceOptions = s._iO,\r\n f = instanceOptions.from,\r\n t = instanceOptions.to,\r\n start, end;\r\n\r\n end = function() {\r\n\r\n // end has been reached.\r\n sm2._wD(s.id + ': \"To\" time of ' + t + ' reached.');\r\n\r\n // detach listener\r\n s.clearOnPosition(t, end);\r\n\r\n // stop should clear this, too\r\n s.stop();\r\n\r\n };\r\n\r\n start = function() {\r\n\r\n sm2._wD(s.id + ': Playing \"from\" ' + f);\r\n\r\n // add listener for end\r\n if (t !== null && !isNaN(t)) {\r\n s.onPosition(t, end);\r\n }\r\n\r\n };\r\n\r\n if (f !== null && !isNaN(f)) {\r\n\r\n // apply to instance options, guaranteeing correct start position.\r\n instanceOptions.position = f;\r\n\r\n // multiShot timing can't be tracked, so prevent that.\r\n instanceOptions.multiShot = false;\r\n\r\n start();\r\n\r\n }\r\n\r\n // return updated instanceOptions including starting position\r\n return instanceOptions;\r\n\r\n };\r\n\r\n attachOnPosition = function() {\r\n\r\n var item,\r\n op = s._iO.onposition;\r\n\r\n // attach onposition things, if any, now.\r\n\r\n if (op) {\r\n\r\n for (item in op) {\r\n if (op.hasOwnProperty(item)) {\r\n s.onPosition(parseInt(item, 10), op[item]);\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n detachOnPosition = function() {\r\n\r\n var item,\r\n op = s._iO.onposition;\r\n\r\n // detach any onposition()-style listeners.\r\n\r\n if (op) {\r\n\r\n for (item in op) {\r\n if (op.hasOwnProperty(item)) {\r\n s.clearOnPosition(parseInt(item, 10));\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n start_html5_timer = function() {\r\n\r\n if (s.isHTML5) {\r\n startTimer(s);\r\n }\r\n\r\n };\r\n\r\n stop_html5_timer = function() {\r\n\r\n if (s.isHTML5) {\r\n stopTimer(s);\r\n }\r\n\r\n };\r\n\r\n resetProperties = function(retainPosition) {\r\n\r\n if (!retainPosition) {\r\n onPositionItems = [];\r\n onPositionFired = 0;\r\n }\r\n\r\n onplay_called = false;\r\n\r\n s._hasTimer = null;\r\n s._a = null;\r\n s._html5_canplay = false;\r\n s.bytesLoaded = null;\r\n s.bytesTotal = null;\r\n s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);\r\n s.durationEstimate = null;\r\n s.buffered = [];\r\n\r\n // legacy: 1D array\r\n s.eqData = [];\r\n\r\n s.eqData.left = [];\r\n s.eqData.right = [];\r\n\r\n s.failures = 0;\r\n s.isBuffering = false;\r\n s.instanceOptions = {};\r\n s.instanceCount = 0;\r\n s.loaded = false;\r\n s.metadata = {};\r\n\r\n // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r\n s.readyState = 0;\r\n\r\n s.muted = false;\r\n s.paused = false;\r\n\r\n s.peakData = {\r\n left: 0,\r\n right: 0\r\n };\r\n\r\n s.waveformData = {\r\n left: [],\r\n right: []\r\n };\r\n\r\n s.playState = 0;\r\n s.position = null;\r\n\r\n s.id3 = {};\r\n\r\n };\r\n\r\n resetProperties();\r\n\r\n /**\r\n * Pseudo-private SMSound internals\r\n * --------------------------------\r\n */\r\n\r\n this._onTimer = function(bForce) {\r\n\r\n /**\r\n * HTML5-only _whileplaying() etc.\r\n * called from both HTML5 native events, and polling/interval-based timers\r\n * mimics flash and fires only when time/duration change, so as to be polling-friendly\r\n */\r\n\r\n var duration, isNew = false, time, x = {};\r\n\r\n if (s._hasTimer || bForce) {\r\n\r\n // TODO: May not need to track readyState (1 = loading)\r\n\r\n if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {\r\n\r\n duration = s._get_html5_duration();\r\n\r\n if (duration !== lastHTML5State.duration) {\r\n\r\n lastHTML5State.duration = duration;\r\n s.duration = duration;\r\n isNew = true;\r\n\r\n }\r\n\r\n // TODO: investigate why this goes wack if not set/re-set each time.\r\n s.durationEstimate = s.duration;\r\n\r\n time = (s._a.currentTime * msecScale || 0);\r\n\r\n if (time !== lastHTML5State.time) {\r\n\r\n lastHTML5State.time = time;\r\n isNew = true;\r\n\r\n }\r\n\r\n if (isNew || bForce) {\r\n\r\n s._whileplaying(time, x, x, x, x);\r\n\r\n }\r\n\r\n }/* else {\r\n\r\n // sm2._wD('_onTimer: Warn for \"'+s.id+'\": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));\r\n\r\n return false;\r\n\r\n }*/\r\n\r\n }\r\n\r\n return isNew;\r\n\r\n };\r\n\r\n this._get_html5_duration = function() {\r\n\r\n var instanceOptions = s._iO,\r\n // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null\r\n d = (s._a && s._a.duration ? s._a.duration * msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),\r\n result = (d && !isNaN(d) && d !== Infinity ? d : null);\r\n\r\n return result;\r\n\r\n };\r\n\r\n this._apply_loop = function(a, nLoops) {\r\n\r\n /**\r\n * boolean instead of \"loop\", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop\r\n * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.\r\n */\r\n\r\n // <d>\r\n if (!a.loop && nLoops > 1) {\r\n sm2._wD('Note: Native HTML5 looping is infinite.', 1);\r\n }\r\n // </d>\r\n\r\n a.loop = (nLoops > 1 ? 'loop' : '');\r\n\r\n };\r\n\r\n this._setup_html5 = function(options) {\r\n\r\n var instanceOptions = mixin(s._iO, options),\r\n a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,\r\n dURL = decodeURI(instanceOptions.url),\r\n sameURL;\r\n\r\n /**\r\n * \"First things first, I, Poppa...\" (reset the previous state of the old sound, if playing)\r\n * Fixes case with devices that can only play one sound at a time\r\n * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state\r\n */\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n if (dURL === decodeURI(lastGlobalHTML5URL)) {\r\n // global HTML5 audio: re-use of URL\r\n sameURL = true;\r\n }\r\n\r\n } else if (dURL === decodeURI(lastURL)) {\r\n\r\n // options URL is the same as the \"last\" URL, and we used (loaded) it\r\n sameURL = true;\r\n\r\n }\r\n\r\n if (a) {\r\n\r\n if (a._s) {\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n if (a._s && a._s.playState && !sameURL) {\r\n\r\n // global HTML5 audio case, and loading a new URL. stop the currently-playing one.\r\n a._s.stop();\r\n\r\n }\r\n\r\n } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {\r\n\r\n // non-global HTML5 reuse case: same url, ignore request\r\n s._apply_loop(a, instanceOptions.loops);\r\n\r\n return a;\r\n\r\n }\r\n\r\n }\r\n\r\n if (!sameURL) {\r\n\r\n // don't retain onPosition() stuff with new URLs.\r\n\r\n if (lastURL) {\r\n resetProperties(false);\r\n }\r\n\r\n // assign new HTML5 URL\r\n\r\n a.src = instanceOptions.url;\r\n\r\n s.url = instanceOptions.url;\r\n\r\n lastURL = instanceOptions.url;\r\n\r\n lastGlobalHTML5URL = instanceOptions.url;\r\n\r\n a._called_load = false;\r\n\r\n }\r\n\r\n } else {\r\n\r\n if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n s._a = new Audio(instanceOptions.url);\r\n s._a.load();\r\n\r\n } else {\r\n\r\n // null for stupid Opera 9.64 case\r\n s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());\r\n\r\n }\r\n\r\n // assign local reference\r\n a = s._a;\r\n\r\n a._called_load = false;\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n globalHTML5Audio = a;\r\n\r\n }\r\n\r\n }\r\n\r\n s.isHTML5 = true;\r\n\r\n // store a ref on the track\r\n s._a = a;\r\n\r\n // store a ref on the audio\r\n a._s = s;\r\n\r\n add_html5_events();\r\n\r\n s._apply_loop(a, instanceOptions.loops);\r\n\r\n if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n s.load();\r\n\r\n } else {\r\n\r\n // early HTML5 implementation (non-standard)\r\n a.autobuffer = false;\r\n\r\n // standard ('none' is also an option.)\r\n a.preload = 'auto';\r\n\r\n }\r\n\r\n return a;\r\n\r\n };\r\n\r\n add_html5_events = function() {\r\n\r\n if (s._a._added_events) return false;\r\n\r\n var f;\r\n\r\n function add(oEvt, oFn, bCapture) {\r\n return s._a ? s._a.addEventListener(oEvt, oFn, bCapture || false) : null;\r\n }\r\n\r\n s._a._added_events = true;\r\n\r\n for (f in html5_events) {\r\n if (html5_events.hasOwnProperty(f)) {\r\n add(f, html5_events[f]);\r\n }\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n remove_html5_events = function() {\r\n\r\n // Remove event listeners\r\n\r\n var f;\r\n\r\n function remove(oEvt, oFn, bCapture) {\r\n return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture || false) : null);\r\n }\r\n\r\n sm2._wD(s.id + ': Removing event listeners');\r\n s._a._added_events = false;\r\n\r\n for (f in html5_events) {\r\n if (html5_events.hasOwnProperty(f)) {\r\n remove(f, html5_events[f]);\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Pseudo-private event internals\r\n * ------------------------------\r\n */\r\n\r\n this._onload = function(nSuccess) {\r\n\r\n var fN,\r\n // check for duration to prevent false positives from flash 8 when loading from cache.\r\n loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);\r\n\r\n // <d>\r\n fN = s.id + ': ';\r\n sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));\r\n\r\n if (!loadOK && !s.isHTML5) {\r\n if (sm2.sandbox.noRemote === true) {\r\n sm2._wD(fN + str('noNet'), 1);\r\n }\r\n if (sm2.sandbox.noLocal === true) {\r\n sm2._wD(fN + str('noLocal'), 1);\r\n }\r\n }\r\n // </d>\r\n\r\n s.loaded = loadOK;\r\n s.readyState = (loadOK ? 3 : 2);\r\n s._onbufferchange(0);\r\n\r\n if (!loadOK && !s.isHTML5) {\r\n // note: no error code from Flash.\r\n s._onerror();\r\n }\r\n\r\n if (s._iO.onload) {\r\n wrapCallback(s, function() {\r\n s._iO.onload.apply(s, [loadOK]);\r\n });\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n this._onerror = function(errorCode, description) {\r\n\r\n // https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n if (s._iO.onerror) {\r\n wrapCallback(s, function() {\r\n s._iO.onerror.apply(s, [errorCode, description]);\r\n });\r\n }\r\n\r\n };\r\n\r\n this._onbufferchange = function(nIsBuffering) {\r\n\r\n // ignore if not playing\r\n if (s.playState === 0) return false;\r\n\r\n if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) return false;\r\n\r\n s.isBuffering = (nIsBuffering === 1);\r\n\r\n if (s._iO.onbufferchange) {\r\n sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);\r\n s._iO.onbufferchange.apply(s, [nIsBuffering]);\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * Playback may have stopped due to buffering, or related reason.\r\n * This state can be encountered on iOS < 6 when auto-play is blocked.\r\n */\r\n\r\n this._onsuspend = function() {\r\n\r\n if (s._iO.onsuspend) {\r\n sm2._wD(s.id + ': Playback suspended');\r\n s._iO.onsuspend.apply(s);\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n /**\r\n * flash 9/movieStar + RTMP-only method, should fire only once at most\r\n * at this point we just recreate failed sounds rather than trying to reconnect\r\n */\r\n\r\n this._onfailure = function(msg, level, code) {\r\n\r\n s.failures++;\r\n sm2._wD(s.id + ': Failure (' + s.failures + '): ' + msg);\r\n\r\n if (s._iO.onfailure && s.failures === 1) {\r\n s._iO.onfailure(msg, level, code);\r\n } else {\r\n sm2._wD(s.id + ': Ignoring failure');\r\n }\r\n\r\n };\r\n\r\n /**\r\n * flash 9/movieStar + RTMP-only method for unhandled warnings/exceptions from Flash\r\n * e.g., RTMP \"method missing\" warning (non-fatal) for getStreamLength on server\r\n */\r\n\r\n this._onwarning = function(msg, level, code) {\r\n\r\n if (s._iO.onwarning) {\r\n s._iO.onwarning(msg, level, code);\r\n }\r\n\r\n };\r\n\r\n this._onfinish = function() {\r\n\r\n // store local copy before it gets trashed...\r\n var io_onfinish = s._iO.onfinish;\r\n\r\n s._onbufferchange(0);\r\n s._resetOnPosition(0);\r\n\r\n // reset some state items\r\n if (s.instanceCount) {\r\n\r\n s.instanceCount--;\r\n\r\n if (!s.instanceCount) {\r\n\r\n // remove onPosition listeners, if any\r\n detachOnPosition();\r\n\r\n // reset instance options\r\n s.playState = 0;\r\n s.paused = false;\r\n s.instanceCount = 0;\r\n s.instanceOptions = {};\r\n s._iO = {};\r\n stop_html5_timer();\r\n\r\n // reset position, too\r\n if (s.isHTML5) {\r\n s.position = 0;\r\n }\r\n\r\n }\r\n\r\n if (!s.instanceCount || s._iO.multiShotEvents) {\r\n // fire onfinish for last, or every instance\r\n if (io_onfinish) {\r\n sm2._wD(s.id + ': onfinish()');\r\n wrapCallback(s, function() {\r\n io_onfinish.apply(s);\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {\r\n\r\n var instanceOptions = s._iO;\r\n\r\n s.bytesLoaded = nBytesLoaded;\r\n s.bytesTotal = nBytesTotal;\r\n s.duration = Math.floor(nDuration);\r\n s.bufferLength = nBufferLength;\r\n\r\n if (!s.isHTML5 && !instanceOptions.isMovieStar) {\r\n\r\n if (instanceOptions.duration) {\r\n // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.\r\n s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;\r\n } else {\r\n s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);\r\n }\r\n\r\n } else {\r\n\r\n s.durationEstimate = s.duration;\r\n\r\n }\r\n\r\n // for flash, reflect sequential-load-style buffering\r\n if (!s.isHTML5) {\r\n s.buffered = [{\r\n start: 0,\r\n end: s.duration\r\n }];\r\n }\r\n\r\n // allow whileloading to fire even if \"load\" fired under HTML5, due to HTTP range/partials\r\n if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {\r\n instanceOptions.whileloading.apply(s);\r\n }\r\n\r\n };\r\n\r\n this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {\r\n\r\n var instanceOptions = s._iO,\r\n eqLeft;\r\n\r\n // flash safety net\r\n if (isNaN(nPosition) || nPosition === null) return false;\r\n\r\n // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.\r\n s.position = Math.max(0, nPosition);\r\n\r\n s._processOnPosition();\r\n\r\n if (!s.isHTML5 && fV > 8) {\r\n\r\n if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {\r\n s.peakData = {\r\n left: oPeakData.leftPeak,\r\n right: oPeakData.rightPeak\r\n };\r\n }\r\n\r\n if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {\r\n s.waveformData = {\r\n left: oWaveformDataLeft.split(','),\r\n right: oWaveformDataRight.split(',')\r\n };\r\n }\r\n\r\n if (instanceOptions.useEQData) {\r\n if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {\r\n eqLeft = oEQData.leftEQ.split(',');\r\n s.eqData = eqLeft;\r\n s.eqData.left = eqLeft;\r\n if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {\r\n s.eqData.right = oEQData.rightEQ.split(',');\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n if (s.playState === 1) {\r\n\r\n // special case/hack: ensure buffering is false if loading from cache (and not yet started)\r\n if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {\r\n s._onbufferchange(0);\r\n }\r\n\r\n if (instanceOptions.whileplaying) {\r\n // flash may call after actual finish\r\n instanceOptions.whileplaying.apply(s);\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n this._oncaptiondata = function(oData) {\r\n\r\n /**\r\n * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n *\r\n * @param {object} oData\r\n */\r\n\r\n sm2._wD(s.id + ': Caption data received.');\r\n\r\n s.captiondata = oData;\r\n\r\n if (s._iO.oncaptiondata) {\r\n s._iO.oncaptiondata.apply(s, [oData]);\r\n }\r\n\r\n };\r\n\r\n this._onmetadata = function(oMDProps, oMDData) {\r\n\r\n /**\r\n * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n * RTMP may include song title, MovieStar content may include encoding info\r\n *\r\n * @param {array} oMDProps (names)\r\n * @param {array} oMDData (values)\r\n */\r\n\r\n sm2._wD(s.id + ': Metadata received.');\r\n\r\n var oData = {}, i, j;\r\n\r\n for (i = 0, j = oMDProps.length; i < j; i++) {\r\n oData[oMDProps[i]] = oMDData[i];\r\n }\r\n\r\n s.metadata = oData;\r\n\r\n if (s._iO.onmetadata) {\r\n s._iO.onmetadata.call(s, s.metadata);\r\n }\r\n\r\n };\r\n\r\n this._onid3 = function(oID3Props, oID3Data) {\r\n\r\n /**\r\n * internal: flash 8 + flash 9 ID3 feature\r\n * may include artist, song title etc.\r\n *\r\n * @param {array} oID3Props (names)\r\n * @param {array} oID3Data (values)\r\n */\r\n\r\n sm2._wD(s.id + ': ID3 data received.');\r\n\r\n var oData = [], i, j;\r\n\r\n for (i = 0, j = oID3Props.length; i < j; i++) {\r\n oData[oID3Props[i]] = oID3Data[i];\r\n }\r\n\r\n s.id3 = mixin(s.id3, oData);\r\n\r\n if (s._iO.onid3) {\r\n s._iO.onid3.apply(s);\r\n }\r\n\r\n };\r\n\r\n // flash/RTMP-only\r\n\r\n this._onconnect = function(bSuccess) {\r\n\r\n bSuccess = (bSuccess === 1);\r\n sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));\r\n s.connected = bSuccess;\r\n\r\n if (bSuccess) {\r\n\r\n s.failures = 0;\r\n\r\n if (idCheck(s.id)) {\r\n if (s.getAutoPlay()) {\r\n // only update the play state if auto playing\r\n s.play(_undefined, s.getAutoPlay());\r\n } else if (s._iO.autoLoad) {\r\n s.load();\r\n }\r\n }\r\n\r\n if (s._iO.onconnect) {\r\n s._iO.onconnect.apply(s, [bSuccess]);\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n this._ondataerror = function(sError) {\r\n\r\n // flash 9 wave/eq data handler\r\n // hack: called at start, and end from flash at/after onfinish()\r\n if (s.playState > 0) {\r\n sm2._wD(s.id + ': Data error: ' + sError);\r\n if (s._iO.ondataerror) {\r\n s._iO.ondataerror.apply(s);\r\n }\r\n }\r\n\r\n };\r\n\r\n // <d>\r\n this._debug();\r\n // </d>\r\n\r\n }; // SMSound()\r\n\r\n /**\r\n * Private SoundManager internals\r\n * ------------------------------\r\n */\r\n\r\n getDocument = function() {\r\n\r\n return (doc.body || doc.getElementsByTagName('div')[0]);\r\n\r\n };\r\n\r\n id = function(sID) {\r\n\r\n return doc.getElementById(sID);\r\n\r\n };\r\n\r\n mixin = function(oMain, oAdd) {\r\n\r\n // non-destructive merge\r\n var o1 = (oMain || {}), o2, o;\r\n\r\n // if unspecified, o2 is the default options object\r\n o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);\r\n\r\n for (o in o2) {\r\n\r\n if (o2.hasOwnProperty(o) && o1[o] === _undefined) {\r\n\r\n if (typeof o2[o] !== 'object' || o2[o] === null) {\r\n\r\n // assign directly\r\n o1[o] = o2[o];\r\n\r\n } else {\r\n\r\n // recurse through o2\r\n o1[o] = mixin(o1[o], o2[o]);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return o1;\r\n\r\n };\r\n\r\n wrapCallback = function(oSound, callback) {\r\n\r\n /**\r\n * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue\r\n * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).\r\n * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.\r\n * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.\r\n * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player\r\n */\r\n if (!oSound.isHTML5 && fV === 8) {\r\n window.setTimeout(callback, 0);\r\n } else {\r\n callback();\r\n }\r\n\r\n };\r\n\r\n // additional soundManager properties that soundManager.setup() will accept\r\n\r\n extraOptions = {\r\n onready: 1,\r\n ontimeout: 1,\r\n defaultOptions: 1,\r\n flash9Options: 1,\r\n movieStarOptions: 1\r\n };\r\n\r\n assign = function(o, oParent) {\r\n\r\n /**\r\n * recursive assignment of properties, soundManager.setup() helper\r\n * allows property assignment based on whitelist\r\n */\r\n\r\n var i,\r\n result = true,\r\n hasParent = (oParent !== _undefined),\r\n setupOptions = sm2.setupOptions,\r\n bonusOptions = extraOptions;\r\n\r\n // <d>\r\n\r\n // if soundManager.setup() called, show accepted parameters.\r\n\r\n if (o === _undefined) {\r\n\r\n result = [];\r\n\r\n for (i in setupOptions) {\r\n\r\n if (setupOptions.hasOwnProperty(i)) {\r\n result.push(i);\r\n }\r\n\r\n }\r\n\r\n for (i in bonusOptions) {\r\n\r\n if (bonusOptions.hasOwnProperty(i)) {\r\n\r\n if (typeof sm2[i] === 'object') {\r\n result.push(i + ': {...}');\r\n } else if (sm2[i] instanceof Function) {\r\n result.push(i + ': function() {...}');\r\n } else {\r\n result.push(i);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n sm2._wD(str('setup', result.join(', ')));\r\n\r\n return false;\r\n\r\n }\r\n\r\n // </d>\r\n\r\n for (i in o) {\r\n\r\n if (o.hasOwnProperty(i)) {\r\n\r\n // if not an {object} we want to recurse through...\r\n\r\n if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {\r\n\r\n // check \"allowed\" options\r\n\r\n if (hasParent && bonusOptions[oParent] !== _undefined) {\r\n\r\n // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }\r\n sm2[oParent][i] = o[i];\r\n\r\n } else if (setupOptions[i] !== _undefined) {\r\n\r\n // special case: assign to setupOptions object, which soundManager property references\r\n sm2.setupOptions[i] = o[i];\r\n\r\n // assign directly to soundManager, too\r\n sm2[i] = o[i];\r\n\r\n } else if (bonusOptions[i] === _undefined) {\r\n\r\n // invalid or disallowed parameter. complain.\r\n complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n result = false;\r\n\r\n } else if (sm2[i] instanceof Function) {\r\n\r\n /**\r\n * valid extraOptions (bonusOptions) parameter.\r\n * is it a method, like onready/ontimeout? call it.\r\n * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});\r\n */\r\n sm2[i].apply(sm2, (o[i] instanceof Array ? o[i] : [o[i]]));\r\n\r\n } else {\r\n\r\n // good old-fashioned direct assignment\r\n sm2[i] = o[i];\r\n\r\n }\r\n\r\n } else if (bonusOptions[i] === _undefined) {\r\n\r\n // recursion case, eg., { defaultOptions: { ... } }\r\n\r\n // invalid or disallowed parameter. complain.\r\n complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n result = false;\r\n\r\n } else {\r\n\r\n // recurse through object\r\n return assign(o[i], i);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n function preferFlashCheck(kind) {\r\n\r\n // whether flash should play a given type\r\n return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));\r\n\r\n }\r\n\r\n /**\r\n * Internal DOM2-level event helpers\r\n * ---------------------------------\r\n */\r\n\r\n event = (function() {\r\n\r\n // normalize event methods\r\n var old = (window.attachEvent),\r\n evt = {\r\n add: (old ? 'attachEvent' : 'addEventListener'),\r\n remove: (old ? 'detachEvent' : 'removeEventListener')\r\n };\r\n\r\n // normalize \"on\" event prefix, optional capture argument\r\n function getArgs(oArgs) {\r\n\r\n var args = slice.call(oArgs),\r\n len = args.length;\r\n\r\n if (old) {\r\n // prefix\r\n args[1] = 'on' + args[1];\r\n if (len > 3) {\r\n // no capture\r\n args.pop();\r\n }\r\n } else if (len === 3) {\r\n args.push(false);\r\n }\r\n\r\n return args;\r\n\r\n }\r\n\r\n function apply(args, sType) {\r\n\r\n // normalize and call the event method, with the proper arguments\r\n var element = args.shift(),\r\n method = [evt[sType]];\r\n\r\n if (old) {\r\n // old IE can't do apply().\r\n element[method](args[0], args[1]);\r\n } else {\r\n element[method].apply(element, args);\r\n }\r\n\r\n }\r\n\r\n function add() {\r\n apply(getArgs(arguments), 'add');\r\n }\r\n\r\n function remove() {\r\n apply(getArgs(arguments), 'remove');\r\n }\r\n\r\n return {\r\n add: add,\r\n remove: remove\r\n };\r\n\r\n }());\r\n\r\n /**\r\n * Internal HTML5 event handling\r\n * -----------------------------\r\n */\r\n\r\n function html5_event(oFn) {\r\n\r\n // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds\r\n\r\n return function(e) {\r\n\r\n var s = this._s,\r\n result;\r\n\r\n if (!s || !s._a) {\r\n // <d>\r\n if (s && s.id) {\r\n sm2._wD(s.id + ': Ignoring ' + e.type);\r\n } else {\r\n sm2._wD(h5 + 'Ignoring ' + e.type);\r\n }\r\n // </d>\r\n result = null;\r\n } else {\r\n result = oFn.call(this, e);\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n }\r\n\r\n html5_events = {\r\n\r\n // HTML5 event-name-to-handler map\r\n\r\n abort: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': abort');\r\n\r\n }),\r\n\r\n // enough has loaded to play\r\n\r\n canplay: html5_event(function() {\r\n\r\n var s = this._s,\r\n position1K;\r\n\r\n if (s._html5_canplay) {\r\n // this event has already fired. ignore.\r\n return;\r\n }\r\n\r\n s._html5_canplay = true;\r\n sm2._wD(s.id + ': canplay');\r\n s._onbufferchange(0);\r\n\r\n // position according to instance options\r\n position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position / msecScale : null);\r\n\r\n // set the position if position was provided before the sound loaded\r\n if (this.currentTime !== position1K) {\r\n sm2._wD(s.id + ': canplay: Setting position to ' + position1K);\r\n try {\r\n this.currentTime = position1K;\r\n } catch(ee) {\r\n sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);\r\n }\r\n }\r\n\r\n // hack for HTML5 from/to case\r\n if (s._iO._oncanplay) {\r\n s._iO._oncanplay();\r\n }\r\n\r\n }),\r\n\r\n canplaythrough: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n if (!s.loaded) {\r\n s._onbufferchange(0);\r\n s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());\r\n s._onload(true);\r\n }\r\n\r\n }),\r\n\r\n durationchange: html5_event(function() {\r\n\r\n // durationchange may fire at various times, probably the safest way to capture accurate/final duration.\r\n\r\n var s = this._s,\r\n duration;\r\n\r\n duration = s._get_html5_duration();\r\n\r\n if (!isNaN(duration) && duration !== s.duration) {\r\n\r\n sm2._wD(this._s.id + ': durationchange (' + duration + ')' + (s.duration ? ', previously ' + s.duration : ''));\r\n\r\n s.durationEstimate = s.duration = duration;\r\n\r\n }\r\n\r\n }),\r\n\r\n // TODO: Reserved for potential use\r\n /*\r\n emptied: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': emptied');\r\n\r\n }),\r\n */\r\n\r\n ended: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n sm2._wD(s.id + ': ended');\r\n\r\n s._onfinish();\r\n\r\n }),\r\n\r\n error: html5_event(function() {\r\n\r\n var description = (html5ErrorCodes[this.error.code] || null);\r\n sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code + (description ? ' (' + description + ')' : ''));\r\n this._s._onload(false);\r\n this._s._onerror(this.error.code, description);\r\n\r\n }),\r\n\r\n loadeddata: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n sm2._wD(s.id + ': loadeddata');\r\n\r\n // safari seems to nicely report progress events, eventually totalling 100%\r\n if (!s._loaded && !isSafari) {\r\n s.duration = s._get_html5_duration();\r\n }\r\n\r\n }),\r\n\r\n loadedmetadata: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': loadedmetadata');\r\n\r\n }),\r\n\r\n loadstart: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': loadstart');\r\n // assume buffering at first\r\n this._s._onbufferchange(1);\r\n\r\n }),\r\n\r\n play: html5_event(function() {\r\n\r\n // sm2._wD(this._s.id + ': play()');\r\n // once play starts, no buffering\r\n this._s._onbufferchange(0);\r\n\r\n }),\r\n\r\n playing: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': playing ' + String.fromCharCode(9835));\r\n // once play starts, no buffering\r\n this._s._onbufferchange(0);\r\n\r\n }),\r\n\r\n progress: html5_event(function(e) {\r\n\r\n // note: can fire repeatedly after \"loaded\" event, due to use of HTTP range/partials\r\n\r\n var s = this._s,\r\n i, j, progStr, buffered = 0,\r\n isProgress = (e.type === 'progress'),\r\n ranges = e.target.buffered,\r\n // firefox 3.6 implements e.loaded/total (bytes)\r\n loaded = (e.loaded || 0),\r\n total = (e.total || 1);\r\n\r\n // reset the \"buffered\" (loaded byte ranges) array\r\n s.buffered = [];\r\n\r\n if (ranges && ranges.length) {\r\n\r\n // if loaded is 0, try TimeRanges implementation as % of load\r\n // https://developer.mozilla.org/en/DOM/TimeRanges\r\n\r\n // re-build \"buffered\" array\r\n // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.\r\n for (i = 0, j = ranges.length; i < j; i++) {\r\n s.buffered.push({\r\n start: ranges.start(i) * msecScale,\r\n end: ranges.end(i) * msecScale\r\n });\r\n }\r\n\r\n // use the last value locally\r\n buffered = (ranges.end(0) - ranges.start(0)) * msecScale;\r\n\r\n // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges\r\n loaded = Math.min(1, buffered / (e.target.duration * msecScale));\r\n\r\n // <d>\r\n if (isProgress && ranges.length > 1) {\r\n progStr = [];\r\n j = ranges.length;\r\n for (i = 0; i < j; i++) {\r\n progStr.push((e.target.buffered.start(i) * msecScale) + '-' + (e.target.buffered.end(i) * msecScale));\r\n }\r\n sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));\r\n }\r\n\r\n if (isProgress && !isNaN(loaded)) {\r\n sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded * 100) + '% loaded');\r\n }\r\n // </d>\r\n\r\n }\r\n\r\n if (!isNaN(loaded)) {\r\n\r\n // TODO: prevent calls with duplicate values.\r\n s._whileloading(loaded, total, s._get_html5_duration());\r\n if (loaded && total && loaded === total) {\r\n // in case \"onload\" doesn't fire (eg. gecko 1.9.2)\r\n html5_events.canplaythrough.call(this, e);\r\n }\r\n\r\n }\r\n\r\n }),\r\n\r\n ratechange: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': ratechange');\r\n\r\n }),\r\n\r\n suspend: html5_event(function(e) {\r\n\r\n // download paused/stopped, may have finished (eg. onload)\r\n var s = this._s;\r\n\r\n sm2._wD(this._s.id + ': suspend');\r\n html5_events.progress.call(this, e);\r\n s._onsuspend();\r\n\r\n }),\r\n\r\n stalled: html5_event(function() {\r\n\r\n sm2._wD(this._s.id + ': stalled');\r\n\r\n }),\r\n\r\n timeupdate: html5_event(function() {\r\n\r\n this._s._onTimer();\r\n\r\n }),\r\n\r\n waiting: html5_event(function() {\r\n\r\n var s = this._s;\r\n\r\n // see also: seeking\r\n sm2._wD(this._s.id + ': waiting');\r\n\r\n // playback faster than download rate, etc.\r\n s._onbufferchange(1);\r\n\r\n })\r\n\r\n };\r\n\r\n html5OK = function(iO) {\r\n\r\n // playability test based on URL or MIME type\r\n\r\n var result;\r\n\r\n if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {\r\n\r\n // nothing to check\r\n result = false;\r\n\r\n } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {\r\n\r\n // RTMP, or preferring flash\r\n result = false;\r\n\r\n } else {\r\n\r\n // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er\r\n result = ((iO.type ? html5CanPlay({ type: iO.type }) : html5CanPlay({ url: iO.url }) || sm2.html5Only || iO.url.match(/data:/i)));\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n html5Unload = function(oAudio) {\r\n\r\n /**\r\n * Internal method: Unload media, and cancel any current/pending network requests.\r\n * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.\r\n * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media\r\n * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.\r\n * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.\r\n */\r\n\r\n var url;\r\n\r\n if (oAudio) {\r\n\r\n // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME.\r\n // Desktop Safari complains / fails on data: URI, so it gets about:blank.\r\n url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));\r\n\r\n oAudio.src = url;\r\n\r\n // reset some state, too\r\n if (oAudio._called_unload !== _undefined) {\r\n oAudio._called_load = false;\r\n }\r\n\r\n }\r\n\r\n if (useGlobalHTML5Audio) {\r\n\r\n // ensure URL state is trashed, also\r\n lastGlobalHTML5URL = null;\r\n\r\n }\r\n\r\n return url;\r\n\r\n };\r\n\r\n html5CanPlay = function(o) {\r\n\r\n /**\r\n * Try to find MIME, test and return truthiness\r\n * o = {\r\n * url: '/path/to/an.mp3',\r\n * type: 'audio/mp3'\r\n * }\r\n */\r\n\r\n if (!sm2.useHTML5Audio || !sm2.hasHTML5) return false;\r\n\r\n var url = (o.url || null),\r\n mime = (o.type || null),\r\n aF = sm2.audioFormats,\r\n result,\r\n offset,\r\n fileExt,\r\n item;\r\n\r\n // account for known cases like audio/mp3\r\n\r\n if (mime && sm2.html5[mime] !== _undefined) return (sm2.html5[mime] && !preferFlashCheck(mime));\r\n\r\n if (!html5Ext) {\r\n\r\n html5Ext = [];\r\n\r\n for (item in aF) {\r\n\r\n if (aF.hasOwnProperty(item)) {\r\n\r\n html5Ext.push(item);\r\n\r\n if (aF[item].related) {\r\n html5Ext = html5Ext.concat(aF[item].related);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n html5Ext = new RegExp('\\\\.(' + html5Ext.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n }\r\n\r\n // TODO: Strip URL queries, etc.\r\n fileExt = (url ? url.toLowerCase().match(html5Ext) : null);\r\n\r\n if (!fileExt || !fileExt.length) {\r\n\r\n if (!mime) {\r\n\r\n result = false;\r\n\r\n } else {\r\n\r\n // audio/mp3 -> mp3, result should be known\r\n offset = mime.indexOf(';');\r\n\r\n // strip \"audio/X; codecs...\"\r\n fileExt = (offset !== -1 ? mime.substr(0, offset) : mime).substr(6);\r\n\r\n }\r\n\r\n } else {\r\n\r\n // match the raw extension name - \"mp3\", for example\r\n fileExt = fileExt[1];\r\n\r\n }\r\n\r\n if (fileExt && sm2.html5[fileExt] !== _undefined) {\r\n\r\n // result known\r\n result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));\r\n\r\n } else {\r\n\r\n mime = 'audio/' + fileExt;\r\n result = sm2.html5.canPlayType({ type: mime });\r\n\r\n sm2.html5[fileExt] = result;\r\n\r\n // sm2._wD('canPlayType, found result: ' + result);\r\n result = (result && sm2.html5[mime] && !preferFlashCheck(mime));\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n testHTML5 = function() {\r\n\r\n /**\r\n * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on\r\n * assigns results to html5[] and flash[].\r\n */\r\n\r\n if (!sm2.useHTML5Audio || !sm2.hasHTML5) {\r\n\r\n // without HTML5, we need Flash.\r\n sm2.html5.usingFlash = true;\r\n needsFlash = true;\r\n\r\n return false;\r\n\r\n }\r\n\r\n // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load \"null\" as a URL. :/\r\n var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),\r\n item, lookup, support = {}, aF, i;\r\n\r\n function cp(m) {\r\n\r\n var canPlay, j,\r\n result = false,\r\n isOK = false;\r\n\r\n if (!a || typeof a.canPlayType !== 'function') return result;\r\n\r\n if (m instanceof Array) {\r\n\r\n // iterate through all mime types, return any successes\r\n\r\n for (i = 0, j = m.length; i < j; i++) {\r\n\r\n if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {\r\n\r\n isOK = true;\r\n sm2.html5[m[i]] = true;\r\n\r\n // note flash support, too\r\n sm2.flash[m[i]] = !!(m[i].match(flashMIME));\r\n\r\n }\r\n\r\n }\r\n\r\n result = isOK;\r\n\r\n } else {\r\n\r\n canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);\r\n result = !!(canPlay && (canPlay.match(sm2.html5Test)));\r\n\r\n }\r\n\r\n return result;\r\n\r\n }\r\n\r\n // test all registered formats + codecs\r\n\r\n aF = sm2.audioFormats;\r\n\r\n for (item in aF) {\r\n\r\n if (aF.hasOwnProperty(item)) {\r\n\r\n lookup = 'audio/' + item;\r\n\r\n support[item] = cp(aF[item].type);\r\n\r\n // write back generic type too, eg. audio/mp3\r\n support[lookup] = support[item];\r\n\r\n // assign flash\r\n if (item.match(flashMIME)) {\r\n\r\n sm2.flash[item] = true;\r\n sm2.flash[lookup] = true;\r\n\r\n } else {\r\n\r\n sm2.flash[item] = false;\r\n sm2.flash[lookup] = false;\r\n\r\n }\r\n\r\n // assign result to related formats, too\r\n\r\n if (aF[item] && aF[item].related) {\r\n\r\n for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n\r\n // eg. audio/m4a\r\n support['audio/' + aF[item].related[i]] = support[item];\r\n sm2.html5[aF[item].related[i]] = support[item];\r\n sm2.flash[aF[item].related[i]] = support[item];\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n support.canPlayType = (a ? cp : null);\r\n sm2.html5 = mixin(sm2.html5, support);\r\n\r\n sm2.html5.usingFlash = featureCheck();\r\n needsFlash = sm2.html5.usingFlash;\r\n\r\n return true;\r\n\r\n };\r\n\r\n strings = {\r\n\r\n // <d>\r\n notReady: 'Unavailable - wait until onready() has fired.',\r\n notOK: 'Audio support is not available.',\r\n domError: sm + 'exception caught while appending SWF to DOM.',\r\n spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',\r\n swf404: smc + 'Verify that %s is a valid path.',\r\n tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',\r\n checkSWF: 'See SWF output for more debug info.',\r\n localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',\r\n waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',\r\n waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',\r\n waitSWF: smc + 'Waiting for 100% SWF load...',\r\n needFunction: smc + 'Function object expected for %s',\r\n badID: 'Sound ID \"%s\" should be a string, starting with a non-numeric character',\r\n currentObj: smc + '_debug(): Current sound objects',\r\n waitOnload: smc + 'Waiting for window.onload()',\r\n docLoaded: smc + 'Document already loaded',\r\n onload: smc + 'initComplete(): calling soundManager.onload()',\r\n onloadOK: sm + '.onload() complete',\r\n didInit: smc + 'init(): Already called?',\r\n secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',\r\n badRemove: smc + 'Failed to remove Flash node.',\r\n shutdown: sm + '.disable(): Shutting down',\r\n queue: smc + 'Queueing %s handler',\r\n smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',\r\n fbTimeout: 'No flash response, applying .' + swfCSS.swfTimedout + ' CSS...',\r\n fbLoaded: 'Flash loaded',\r\n fbHandler: smc + 'flashBlockHandler()',\r\n manURL: 'SMSound.load(): Using manually-assigned URL',\r\n onURL: sm + '.load(): current URL already assigned.',\r\n badFV: sm + '.flashVersion must be 8 or 9. \"%s\" is invalid. Reverting to %s.',\r\n as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',\r\n noNSLoop: 'Note: Looping not implemented for MovieStar formats',\r\n needfl9: 'Note: Switching to flash 9, required for MP4 formats.',\r\n mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',\r\n needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',\r\n gotFocus: smc + 'Got window focus.',\r\n policy: 'Enabling usePolicyFile for data access',\r\n setup: sm + '.setup(): allowed parameters: %s',\r\n setupError: sm + '.setup(): \"%s\" cannot be assigned with this method.',\r\n setupUndef: sm + '.setup(): Could not find option \"%s\"',\r\n setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',\r\n noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',\r\n sm2Loaded: 'SoundManager 2: Ready. ' + String.fromCharCode(10003),\r\n reset: sm + '.reset(): Removing event callbacks',\r\n mobileUA: 'Mobile UA detected, preferring HTML5 by default.',\r\n globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.',\r\n ignoreMobile: 'Ignoring mobile restrictions for this device.'\r\n // </d>\r\n\r\n };\r\n\r\n str = function() {\r\n\r\n // internal string replace helper.\r\n // arguments: o [,items to replace]\r\n // <d>\r\n\r\n var args,\r\n i, j, o,\r\n sstr;\r\n\r\n // real array, please\r\n args = slice.call(arguments);\r\n\r\n // first argument\r\n o = args.shift();\r\n\r\n sstr = (strings && strings[o] ? strings[o] : '');\r\n\r\n if (sstr && args && args.length) {\r\n for (i = 0, j = args.length; i < j; i++) {\r\n sstr = sstr.replace('%s', args[i]);\r\n }\r\n }\r\n\r\n return sstr;\r\n // </d>\r\n\r\n };\r\n\r\n loopFix = function(sOpt) {\r\n\r\n // flash 8 requires stream = false for looping to work\r\n if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {\r\n _wDS('as2loop');\r\n sOpt.stream = false;\r\n }\r\n\r\n return sOpt;\r\n\r\n };\r\n\r\n policyFix = function(sOpt, sPre) {\r\n\r\n if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {\r\n sm2._wD((sPre || '') + str('policy'));\r\n sOpt.usePolicyFile = true;\r\n }\r\n\r\n return sOpt;\r\n\r\n };\r\n\r\n complain = function(sMsg) {\r\n\r\n // <d>\r\n if (hasConsole && console.warn !== _undefined) {\r\n console.warn(sMsg);\r\n } else {\r\n sm2._wD(sMsg);\r\n }\r\n // </d>\r\n\r\n };\r\n\r\n doNothing = function() {\r\n\r\n return false;\r\n\r\n };\r\n\r\n disableObject = function(o) {\r\n\r\n var oProp;\r\n\r\n for (oProp in o) {\r\n if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {\r\n o[oProp] = doNothing;\r\n }\r\n }\r\n\r\n oProp = null;\r\n\r\n };\r\n\r\n failSafely = function(bNoDisable) {\r\n\r\n // general failure exception handler\r\n\r\n if (bNoDisable === _undefined) {\r\n bNoDisable = false;\r\n }\r\n\r\n if (disabled || bNoDisable) {\r\n sm2.disable(bNoDisable);\r\n }\r\n\r\n };\r\n\r\n normalizeMovieURL = function(movieURL) {\r\n\r\n var urlParams = null, url;\r\n\r\n if (movieURL) {\r\n\r\n if (movieURL.match(/\\.swf(\\?.*)?$/i)) {\r\n\r\n urlParams = movieURL.substr(movieURL.toLowerCase().lastIndexOf('.swf?') + 4);\r\n\r\n // assume user knows what they're doing\r\n if (urlParams) return movieURL;\r\n\r\n } else if (movieURL.lastIndexOf('/') !== movieURL.length - 1) {\r\n\r\n // append trailing slash, if needed\r\n movieURL += '/';\r\n\r\n }\r\n\r\n }\r\n\r\n url = (movieURL && movieURL.lastIndexOf('/') !== -1 ? movieURL.substr(0, movieURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;\r\n\r\n if (sm2.noSWFCache) {\r\n url += ('?ts=' + new Date().getTime());\r\n }\r\n\r\n return url;\r\n\r\n };\r\n\r\n setVersionInfo = function() {\r\n\r\n // short-hand for internal use\r\n\r\n fV = parseInt(sm2.flashVersion, 10);\r\n\r\n if (fV !== 8 && fV !== 9) {\r\n sm2._wD(str('badFV', fV, defaultFlashVersion));\r\n sm2.flashVersion = fV = defaultFlashVersion;\r\n }\r\n\r\n // debug flash movie, if applicable\r\n\r\n var isDebug = (sm2.debugMode || sm2.debugFlash ? '_debug.swf' : '.swf');\r\n\r\n if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {\r\n sm2._wD(str('needfl9'));\r\n sm2.flashVersion = fV = 9;\r\n }\r\n\r\n sm2.version = sm2.versionNumber + (sm2.html5Only ? ' (HTML5-only mode)' : (fV === 9 ? ' (AS3/Flash 9)' : ' (AS2/Flash 8)'));\r\n\r\n // set up default options\r\n if (fV > 8) {\r\n\r\n // +flash 9 base options\r\n sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);\r\n sm2.features.buffering = true;\r\n\r\n // +moviestar support\r\n sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);\r\n sm2.filePatterns.flash9 = new RegExp('\\\\.(mp3|' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n sm2.features.movieStar = true;\r\n\r\n } else {\r\n\r\n sm2.features.movieStar = false;\r\n\r\n }\r\n\r\n // regExp for flash canPlay(), etc.\r\n sm2.filePattern = sm2.filePatterns[(fV !== 8 ? 'flash9' : 'flash8')];\r\n\r\n // if applicable, use _debug versions of SWFs\r\n sm2.movieURL = (fV === 8 ? 'soundmanager2.swf' : 'soundmanager2_flash9.swf').replace('.swf', isDebug);\r\n\r\n sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);\r\n\r\n };\r\n\r\n setPolling = function(bPolling, bHighPerformance) {\r\n\r\n if (!flash) {\r\n return;\r\n }\r\n\r\n flash._setPolling(bPolling, bHighPerformance);\r\n\r\n };\r\n\r\n initDebug = function() {\r\n\r\n // starts debug mode, creating output <div> for UAs without console object\r\n\r\n // allow force of debug mode via URL\r\n // <d>\r\n if (sm2.debugURLParam.test(wl)) {\r\n sm2.setupOptions.debugMode = sm2.debugMode = true;\r\n }\r\n\r\n if (id(sm2.debugID)) {\r\n return;\r\n }\r\n\r\n var oD, oDebug, oTarget, oToggle, tmp;\r\n\r\n if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {\r\n\r\n oD = doc.createElement('div');\r\n oD.id = sm2.debugID + '-toggle';\r\n\r\n oToggle = {\r\n position: 'fixed',\r\n bottom: '0px',\r\n right: '0px',\r\n width: '1.2em',\r\n height: '1.2em',\r\n lineHeight: '1.2em',\r\n margin: '2px',\r\n textAlign: 'center',\r\n border: '1px solid #999',\r\n cursor: 'pointer',\r\n background: '#fff',\r\n color: '#333',\r\n zIndex: 10001\r\n };\r\n\r\n oD.appendChild(doc.createTextNode('-'));\r\n oD.onclick = toggleDebug;\r\n oD.title = 'Toggle SM2 debug console';\r\n\r\n if (ua.match(/msie 6/i)) {\r\n oD.style.position = 'absolute';\r\n oD.style.cursor = 'hand';\r\n }\r\n\r\n for (tmp in oToggle) {\r\n if (oToggle.hasOwnProperty(tmp)) {\r\n oD.style[tmp] = oToggle[tmp];\r\n }\r\n }\r\n\r\n oDebug = doc.createElement('div');\r\n oDebug.id = sm2.debugID;\r\n oDebug.style.display = (sm2.debugMode ? 'block' : 'none');\r\n\r\n if (sm2.debugMode && !id(oD.id)) {\r\n try {\r\n oTarget = getDocument();\r\n oTarget.appendChild(oD);\r\n } catch(e2) {\r\n throw new Error(str('domError') + ' \\n' + e2.toString());\r\n }\r\n oTarget.appendChild(oDebug);\r\n }\r\n\r\n }\r\n\r\n oTarget = null;\r\n // </d>\r\n\r\n };\r\n\r\n idCheck = this.getSoundById;\r\n\r\n // <d>\r\n _wDS = function(o, errorLevel) {\r\n\r\n return (!o ? '' : sm2._wD(str(o), errorLevel));\r\n\r\n };\r\n\r\n toggleDebug = function() {\r\n\r\n var o = id(sm2.debugID),\r\n oT = id(sm2.debugID + '-toggle');\r\n\r\n if (!o) {\r\n return;\r\n }\r\n\r\n if (debugOpen) {\r\n // minimize\r\n oT.innerHTML = '+';\r\n o.style.display = 'none';\r\n } else {\r\n oT.innerHTML = '-';\r\n o.style.display = 'block';\r\n }\r\n\r\n debugOpen = !debugOpen;\r\n\r\n };\r\n\r\n debugTS = function(sEventType, bSuccess, sMessage) {\r\n\r\n // troubleshooter debug hooks\r\n\r\n if (window.sm2Debugger !== _undefined) {\r\n try {\r\n sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);\r\n } catch(e) {\r\n // oh well\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n\r\n };\r\n // </d>\r\n\r\n getSWFCSS = function() {\r\n\r\n var css = [];\r\n\r\n if (sm2.debugMode) {\r\n css.push(swfCSS.sm2Debug);\r\n }\r\n\r\n if (sm2.debugFlash) {\r\n css.push(swfCSS.flashDebug);\r\n }\r\n\r\n if (sm2.useHighPerformance) {\r\n css.push(swfCSS.highPerf);\r\n }\r\n\r\n return css.join(' ');\r\n\r\n };\r\n\r\n flashBlockHandler = function() {\r\n\r\n // *possible* flash block situation.\r\n\r\n var name = str('fbHandler'),\r\n p = sm2.getMoviePercent(),\r\n css = swfCSS,\r\n error = {\r\n type: 'FLASHBLOCK'\r\n };\r\n\r\n if (sm2.html5Only) {\r\n // no flash, or unused\r\n return;\r\n }\r\n\r\n if (!sm2.ok()) {\r\n\r\n if (needsFlash) {\r\n // make the movie more visible, so user can fix\r\n sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null ? css.swfTimedout : css.swfError);\r\n sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));\r\n }\r\n\r\n sm2.didFlashBlock = true;\r\n\r\n // fire onready(), complain lightly\r\n processOnEvents({\r\n type: 'ontimeout',\r\n ignoreInit: true,\r\n error: error\r\n });\r\n\r\n catchError(error);\r\n\r\n } else {\r\n\r\n // SM2 loaded OK (or recovered)\r\n\r\n // <d>\r\n if (sm2.didFlashBlock) {\r\n sm2._wD(name + ': Unblocked');\r\n }\r\n // </d>\r\n\r\n if (sm2.oMC) {\r\n sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock ? ' ' + css.swfUnblocked : '')].join(' ');\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n addOnEvent = function(sType, oMethod, oScope) {\r\n\r\n if (on_queue[sType] === _undefined) {\r\n on_queue[sType] = [];\r\n }\r\n\r\n on_queue[sType].push({\r\n method: oMethod,\r\n scope: (oScope || null),\r\n fired: false\r\n });\r\n\r\n };\r\n\r\n processOnEvents = function(oOptions) {\r\n\r\n // if unspecified, assume OK/error\r\n\r\n if (!oOptions) {\r\n oOptions = {\r\n type: (sm2.ok() ? 'onready' : 'ontimeout')\r\n };\r\n }\r\n\r\n // not ready yet.\r\n if (!didInit && oOptions && !oOptions.ignoreInit) return false;\r\n\r\n // invalid case\r\n if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) return false;\r\n\r\n var status = {\r\n success: (oOptions && oOptions.ignoreInit ? sm2.ok() : !disabled)\r\n },\r\n\r\n // queue specified by type, or none\r\n srcQueue = (oOptions && oOptions.type ? on_queue[oOptions.type] || [] : []),\r\n\r\n queue = [], i, j,\r\n args = [status],\r\n canRetry = (needsFlash && !sm2.ok());\r\n\r\n if (oOptions.error) {\r\n args[0].error = oOptions.error;\r\n }\r\n\r\n for (i = 0, j = srcQueue.length; i < j; i++) {\r\n if (srcQueue[i].fired !== true) {\r\n queue.push(srcQueue[i]);\r\n }\r\n }\r\n\r\n if (queue.length) {\r\n\r\n // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));\r\n for (i = 0, j = queue.length; i < j; i++) {\r\n\r\n if (queue[i].scope) {\r\n queue[i].method.apply(queue[i].scope, args);\r\n } else {\r\n queue[i].method.apply(this, args);\r\n }\r\n\r\n if (!canRetry) {\r\n // useFlashBlock and SWF timeout case doesn't count here.\r\n queue[i].fired = true;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n initUserOnload = function() {\r\n\r\n window.setTimeout(function() {\r\n\r\n if (sm2.useFlashBlock) {\r\n flashBlockHandler();\r\n }\r\n\r\n processOnEvents();\r\n\r\n // call user-defined \"onload\", scoped to window\r\n\r\n if (typeof sm2.onload === 'function') {\r\n _wDS('onload', 1);\r\n sm2.onload.apply(window);\r\n _wDS('onloadOK', 1);\r\n }\r\n\r\n if (sm2.waitForWindowLoad) {\r\n event.add(window, 'load', initUserOnload);\r\n }\r\n\r\n }, 1);\r\n\r\n };\r\n\r\n detectFlash = function() {\r\n\r\n /**\r\n * Hat tip: Flash Detect library (BSD, (C) 2007) by Carl \"DocYes\" S. Yestrau\r\n * http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt\r\n */\r\n\r\n // this work has already been done.\r\n if (hasFlash !== _undefined) return hasFlash;\r\n\r\n var hasPlugin = false, n = navigator, obj, type, types, AX = window.ActiveXObject;\r\n\r\n // MS Edge 14 throws an \"Unspecified Error\" because n.plugins is inaccessible due to permissions\r\n var nP;\r\n\r\n try {\r\n nP = n.plugins;\r\n } catch(e) {\r\n nP = undefined;\r\n }\r\n\r\n if (nP && nP.length) {\r\n\r\n type = 'application/x-shockwave-flash';\r\n types = n.mimeTypes;\r\n\r\n if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {\r\n hasPlugin = true;\r\n }\r\n\r\n } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {\r\n\r\n // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.\r\n try {\r\n obj = new AX('ShockwaveFlash.ShockwaveFlash');\r\n } catch(e) {\r\n // oh well\r\n obj = null;\r\n }\r\n\r\n hasPlugin = (!!obj);\r\n\r\n // cleanup, because it is ActiveX after all\r\n obj = null;\r\n\r\n }\r\n\r\n hasFlash = hasPlugin;\r\n\r\n return hasPlugin;\r\n\r\n };\r\n\r\n featureCheck = function() {\r\n\r\n var flashNeeded,\r\n item,\r\n formats = sm2.audioFormats,\r\n // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.\r\n isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)\\s/i)));\r\n\r\n if (isSpecial) {\r\n\r\n // has Audio(), but is broken; let it load links directly.\r\n sm2.hasHTML5 = false;\r\n\r\n // ignore flash case, however\r\n sm2.html5Only = true;\r\n\r\n // hide the SWF, if present\r\n if (sm2.oMC) {\r\n sm2.oMC.style.display = 'none';\r\n }\r\n\r\n } else if (sm2.useHTML5Audio) {\r\n\r\n if (!sm2.html5 || !sm2.html5.canPlayType) {\r\n sm2._wD('SoundManager: No HTML5 Audio() support detected.');\r\n sm2.hasHTML5 = false;\r\n }\r\n\r\n // <d>\r\n if (isBadSafari) {\r\n sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ? ' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);\r\n }\r\n // </d>\r\n\r\n }\r\n\r\n if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n\r\n // sort out whether flash is optional, required or can be ignored.\r\n\r\n // innocent until proven guilty.\r\n canIgnoreFlash = true;\r\n\r\n for (item in formats) {\r\n\r\n if (formats.hasOwnProperty(item)) {\r\n\r\n if (formats[item].required) {\r\n\r\n if (!sm2.html5.canPlayType(formats[item].type)) {\r\n\r\n // 100% HTML5 mode is not possible.\r\n canIgnoreFlash = false;\r\n flashNeeded = true;\r\n\r\n } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {\r\n\r\n // flash may be required, or preferred for this format.\r\n flashNeeded = true;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // sanity check...\r\n if (sm2.ignoreFlash) {\r\n flashNeeded = false;\r\n canIgnoreFlash = true;\r\n }\r\n\r\n sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);\r\n\r\n return (!sm2.html5Only);\r\n\r\n };\r\n\r\n parseURL = function(url) {\r\n\r\n /**\r\n * Internal: Finds and returns the first playable URL (or failing that, the first URL.)\r\n * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.\r\n */\r\n\r\n var i, j, urlResult = 0, result;\r\n\r\n if (url instanceof Array) {\r\n\r\n // find the first good one\r\n for (i = 0, j = url.length; i < j; i++) {\r\n\r\n if (url[i] instanceof Object) {\r\n\r\n // MIME check\r\n if (sm2.canPlayMIME(url[i].type)) {\r\n urlResult = i;\r\n break;\r\n }\r\n\r\n } else if (sm2.canPlayURL(url[i])) {\r\n\r\n // URL string check\r\n urlResult = i;\r\n break;\r\n\r\n }\r\n\r\n }\r\n\r\n // normalize to string\r\n if (url[urlResult].url) {\r\n url[urlResult] = url[urlResult].url;\r\n }\r\n\r\n result = url[urlResult];\r\n\r\n } else {\r\n\r\n // single URL case\r\n result = url;\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n\r\n startTimer = function(oSound) {\r\n\r\n /**\r\n * attach a timer to this sound, and start an interval if needed\r\n */\r\n\r\n if (!oSound._hasTimer) {\r\n\r\n oSound._hasTimer = true;\r\n\r\n if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n if (h5IntervalTimer === null && h5TimerCount === 0) {\r\n\r\n h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);\r\n\r\n }\r\n\r\n h5TimerCount++;\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n stopTimer = function(oSound) {\r\n\r\n /**\r\n * detach a timer\r\n */\r\n\r\n if (oSound._hasTimer) {\r\n\r\n oSound._hasTimer = false;\r\n\r\n if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n // interval will stop itself at next execution.\r\n\r\n h5TimerCount--;\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n timerExecute = function() {\r\n\r\n /**\r\n * manual polling for HTML5 progress events, ie., whileplaying()\r\n * (can achieve greater precision than conservative default HTML5 interval)\r\n */\r\n\r\n var i;\r\n\r\n if (h5IntervalTimer !== null && !h5TimerCount) {\r\n\r\n // no active timers, stop polling interval.\r\n\r\n clearInterval(h5IntervalTimer);\r\n\r\n h5IntervalTimer = null;\r\n\r\n return;\r\n\r\n }\r\n\r\n // check all HTML5 sounds with timers\r\n\r\n for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n\r\n if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {\r\n sm2.sounds[sm2.soundIDs[i]]._onTimer();\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n catchError = function(options) {\r\n\r\n options = (options !== _undefined ? options : {});\r\n\r\n if (typeof sm2.onerror === 'function') {\r\n sm2.onerror.apply(window, [{\r\n type: (options.type !== _undefined ? options.type : null)\r\n }]);\r\n }\r\n\r\n if (options.fatal !== _undefined && options.fatal) {\r\n sm2.disable();\r\n }\r\n\r\n };\r\n\r\n badSafariFix = function() {\r\n\r\n // special case: \"bad\" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4\r\n if (!isBadSafari || !detectFlash()) {\r\n // doesn't apply\r\n return;\r\n }\r\n\r\n var aF = sm2.audioFormats, i, item;\r\n\r\n for (item in aF) {\r\n\r\n if (aF.hasOwnProperty(item)) {\r\n\r\n if (item === 'mp3' || item === 'mp4') {\r\n\r\n sm2._wD(sm + ': Using flash fallback for ' + item + ' format');\r\n sm2.html5[item] = false;\r\n\r\n // assign result to related formats, too\r\n if (aF[item] && aF[item].related) {\r\n for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n sm2.html5[aF[item].related[i]] = false;\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Pseudo-private flash/ExternalInterface methods\r\n * ----------------------------------------------\r\n */\r\n\r\n this._setSandboxType = function(sandboxType) {\r\n\r\n // <d>\r\n // Security sandbox according to Flash plugin\r\n var sb = sm2.sandbox;\r\n\r\n sb.type = sandboxType;\r\n sb.description = sb.types[(sb.types[sandboxType] !== _undefined ? sandboxType : 'unknown')];\r\n\r\n if (sb.type === 'localWithFile') {\r\n\r\n sb.noRemote = true;\r\n sb.noLocal = false;\r\n _wDS('secNote', 2);\r\n\r\n } else if (sb.type === 'localWithNetwork') {\r\n\r\n sb.noRemote = false;\r\n sb.noLocal = true;\r\n\r\n } else if (sb.type === 'localTrusted') {\r\n\r\n sb.noRemote = false;\r\n sb.noLocal = false;\r\n\r\n }\r\n // </d>\r\n\r\n };\r\n\r\n this._externalInterfaceOK = function(swfVersion) {\r\n\r\n // flash callback confirming flash loaded, EI working etc.\r\n // swfVersion: SWF build string\r\n\r\n if (sm2.swfLoaded) {\r\n return;\r\n }\r\n\r\n var e;\r\n\r\n debugTS('swf', true);\r\n debugTS('flashtojs', true);\r\n sm2.swfLoaded = true;\r\n tryInitOnFocus = false;\r\n\r\n if (isBadSafari) {\r\n badSafariFix();\r\n }\r\n\r\n // complain if JS + SWF build/version strings don't match, excluding +DEV builds\r\n // <d>\r\n if (!swfVersion || swfVersion.replace(/\\+dev/i, '') !== sm2.versionNumber.replace(/\\+dev/i, '')) {\r\n\r\n e = sm + ': Fatal: JavaScript file build \"' + sm2.versionNumber + '\" does not match Flash SWF build \"' + swfVersion + '\" at ' + sm2.url + '. Ensure both are up-to-date.';\r\n\r\n // escape flash -> JS stack so this error fires in window.\r\n setTimeout(function() {\r\n throw new Error(e);\r\n }, 0);\r\n\r\n // exit, init will fail with timeout\r\n return;\r\n\r\n }\r\n // </d>\r\n\r\n // IE needs a larger timeout\r\n setTimeout(init, isIE ? 100 : 1);\r\n\r\n };\r\n\r\n /**\r\n * Private initialization helpers\r\n * ------------------------------\r\n */\r\n\r\n createMovie = function(movieID, movieURL) {\r\n\r\n // ignore if already connected\r\n if (didAppend && appendSuccess) return false;\r\n\r\n function initMsg() {\r\n\r\n // <d>\r\n\r\n var options = [],\r\n title,\r\n msg = [],\r\n delimiter = ' + ';\r\n\r\n title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');\r\n\r\n if (!sm2.html5Only) {\r\n\r\n if (sm2.preferFlash) {\r\n options.push('preferFlash');\r\n }\r\n\r\n if (sm2.useHighPerformance) {\r\n options.push('useHighPerformance');\r\n }\r\n\r\n if (sm2.flashPollingInterval) {\r\n options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');\r\n }\r\n\r\n if (sm2.html5PollingInterval) {\r\n options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n }\r\n\r\n if (sm2.wmode) {\r\n options.push('wmode (' + sm2.wmode + ')');\r\n }\r\n\r\n if (sm2.debugFlash) {\r\n options.push('debugFlash');\r\n }\r\n\r\n if (sm2.useFlashBlock) {\r\n options.push('flashBlock');\r\n }\r\n\r\n } else if (sm2.html5PollingInterval) {\r\n options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n }\r\n\r\n if (options.length) {\r\n msg = msg.concat([options.join(delimiter)]);\r\n }\r\n\r\n sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);\r\n\r\n showSupport();\r\n\r\n // </d>\r\n\r\n }\r\n\r\n if (sm2.html5Only) {\r\n\r\n // 100% HTML5 mode\r\n setVersionInfo();\r\n\r\n initMsg();\r\n sm2.oMC = id(sm2.movieID);\r\n init();\r\n\r\n // prevent multiple init attempts\r\n didAppend = true;\r\n\r\n appendSuccess = true;\r\n\r\n return false;\r\n\r\n }\r\n\r\n // flash path\r\n var remoteURL = (movieURL || sm2.url),\r\n localURL = (sm2.altURL || remoteURL),\r\n swfTitle = 'JS/Flash audio component (SoundManager 2)',\r\n oTarget = getDocument(),\r\n extraClass = getSWFCSS(),\r\n isRTL = null,\r\n html = doc.getElementsByTagName('html')[0],\r\n oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;\r\n\r\n isRTL = (html && html.dir && html.dir.match(/rtl/i));\r\n movieID = (movieID === _undefined ? sm2.id : movieID);\r\n\r\n function param(name, value) {\r\n return '<param name=\"' + name + '\" value=\"' + value + '\" />';\r\n }\r\n\r\n // safety check for legacy (change to Flash 9 URL)\r\n setVersionInfo();\r\n sm2.url = normalizeMovieURL(overHTTP ? remoteURL : localURL);\r\n movieURL = sm2.url;\r\n\r\n sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);\r\n\r\n if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {\r\n /**\r\n * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here\r\n * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout\r\n * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)\r\n */\r\n messages.push(strings.spcWmode);\r\n sm2.wmode = null;\r\n }\r\n\r\n oEmbed = {\r\n name: movieID,\r\n id: movieID,\r\n src: movieURL,\r\n quality: 'high',\r\n allowScriptAccess: sm2.allowScriptAccess,\r\n bgcolor: sm2.bgColor,\r\n pluginspage: http + 'www.macromedia.com/go/getflashplayer',\r\n title: swfTitle,\r\n type: 'application/x-shockwave-flash',\r\n wmode: sm2.wmode,\r\n // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\r\n hasPriority: 'true'\r\n };\r\n\r\n if (sm2.debugFlash) {\r\n oEmbed.FlashVars = 'debug=1';\r\n }\r\n\r\n if (!sm2.wmode) {\r\n // don't write empty attribute\r\n delete oEmbed.wmode;\r\n }\r\n\r\n if (isIE) {\r\n\r\n // IE is \"special\".\r\n oMovie = doc.createElement('div');\r\n movieHTML = [\r\n '<object id=\"' + movieID + '\" data=\"' + movieURL + '\" type=\"' + oEmbed.type + '\" title=\"' + oEmbed.title + '\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">',\r\n param('movie', movieURL),\r\n param('AllowScriptAccess', sm2.allowScriptAccess),\r\n param('quality', oEmbed.quality),\r\n (sm2.wmode ? param('wmode', sm2.wmode) : ''),\r\n param('bgcolor', sm2.bgColor),\r\n param('hasPriority', 'true'),\r\n (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),\r\n '</object>'\r\n ].join('');\r\n\r\n } else {\r\n\r\n oMovie = doc.createElement('embed');\r\n for (tmp in oEmbed) {\r\n if (oEmbed.hasOwnProperty(tmp)) {\r\n oMovie.setAttribute(tmp, oEmbed[tmp]);\r\n }\r\n }\r\n\r\n }\r\n\r\n initDebug();\r\n extraClass = getSWFCSS();\r\n oTarget = getDocument();\r\n\r\n if (oTarget) {\r\n\r\n sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));\r\n\r\n if (!sm2.oMC.id) {\r\n\r\n sm2.oMC.id = sm2.movieID;\r\n sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;\r\n s = null;\r\n oEl = null;\r\n\r\n if (!sm2.useFlashBlock) {\r\n if (sm2.useHighPerformance) {\r\n // on-screen at all times\r\n s = {\r\n position: 'fixed',\r\n width: '8px',\r\n height: '8px',\r\n // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.\r\n bottom: '0px',\r\n left: '0px',\r\n overflow: 'hidden'\r\n };\r\n } else {\r\n // hide off-screen, lower priority\r\n s = {\r\n position: 'absolute',\r\n width: '6px',\r\n height: '6px',\r\n top: '-9999px',\r\n left: '-9999px'\r\n };\r\n if (isRTL) {\r\n s.left = Math.abs(parseInt(s.left, 10)) + 'px';\r\n }\r\n }\r\n }\r\n\r\n if (isWebkit) {\r\n // soundcloud-reported render/crash fix, safari 5\r\n sm2.oMC.style.zIndex = 10000;\r\n }\r\n\r\n if (!sm2.debugFlash) {\r\n for (x in s) {\r\n if (s.hasOwnProperty(x)) {\r\n sm2.oMC.style[x] = s[x];\r\n }\r\n }\r\n }\r\n\r\n try {\r\n\r\n if (!isIE) {\r\n sm2.oMC.appendChild(oMovie);\r\n }\r\n\r\n oTarget.appendChild(sm2.oMC);\r\n\r\n if (isIE) {\r\n oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n oEl.className = swfCSS.swfBox;\r\n oEl.innerHTML = movieHTML;\r\n }\r\n\r\n appendSuccess = true;\r\n\r\n } catch(e) {\r\n\r\n throw new Error(str('domError') + ' \\n' + e.toString());\r\n\r\n }\r\n\r\n } else {\r\n\r\n // SM2 container is already in the document (eg. flashblock use case)\r\n sClass = sm2.oMC.className;\r\n sm2.oMC.className = (sClass ? sClass + ' ' : swfCSS.swfDefault) + (extraClass ? ' ' + extraClass : '');\r\n sm2.oMC.appendChild(oMovie);\r\n\r\n if (isIE) {\r\n oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n oEl.className = swfCSS.swfBox;\r\n oEl.innerHTML = movieHTML;\r\n }\r\n\r\n appendSuccess = true;\r\n\r\n }\r\n\r\n }\r\n\r\n didAppend = true;\r\n\r\n initMsg();\r\n\r\n // sm2._wD(sm + ': Trying to load ' + movieURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);\r\n\r\n return true;\r\n\r\n };\r\n\r\n initMovie = function() {\r\n\r\n if (sm2.html5Only) {\r\n createMovie();\r\n return false;\r\n }\r\n\r\n // attempt to get, or create, movie (may already exist)\r\n if (flash) return false;\r\n\r\n if (!sm2.url) {\r\n\r\n /**\r\n * Something isn't right - we've reached init, but the soundManager url property has not been set.\r\n * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.\r\n * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.\r\n */\r\n\r\n _wDS('noURL');\r\n return false;\r\n\r\n }\r\n\r\n // inline markup case\r\n flash = sm2.getMovie(sm2.id);\r\n\r\n if (!flash) {\r\n\r\n if (!oRemoved) {\r\n\r\n // try to create\r\n createMovie(sm2.id, sm2.url);\r\n\r\n } else {\r\n\r\n // try to re-append removed movie after reboot()\r\n if (!isIE) {\r\n sm2.oMC.appendChild(oRemoved);\r\n } else {\r\n sm2.oMC.innerHTML = oRemovedHTML;\r\n }\r\n\r\n oRemoved = null;\r\n didAppend = true;\r\n\r\n }\r\n\r\n flash = sm2.getMovie(sm2.id);\r\n\r\n }\r\n\r\n if (typeof sm2.oninitmovie === 'function') {\r\n setTimeout(sm2.oninitmovie, 1);\r\n }\r\n\r\n // <d>\r\n flushMessages();\r\n // </d>\r\n\r\n return true;\r\n\r\n };\r\n\r\n delayWaitForEI = function() {\r\n\r\n setTimeout(waitForEI, 1000);\r\n\r\n };\r\n\r\n rebootIntoHTML5 = function() {\r\n\r\n // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.\r\n\r\n window.setTimeout(function() {\r\n\r\n complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');\r\n\r\n sm2.setup({\r\n preferFlash: false\r\n }).reboot();\r\n\r\n // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.\r\n sm2.didFlashBlock = true;\r\n\r\n sm2.beginDelayedInit();\r\n\r\n }, 1);\r\n\r\n };\r\n\r\n waitForEI = function() {\r\n\r\n var p,\r\n loadIncomplete = false;\r\n\r\n if (!sm2.url) {\r\n // No SWF url to load (noURL case) - exit for now. Will be retried when url is set.\r\n return;\r\n }\r\n\r\n if (waitingForEI) {\r\n return;\r\n }\r\n\r\n waitingForEI = true;\r\n event.remove(window, 'load', delayWaitForEI);\r\n\r\n if (hasFlash && tryInitOnFocus && !isFocused) {\r\n // Safari won't load flash in background tabs, only when focused.\r\n _wDS('waitFocus');\r\n return;\r\n }\r\n\r\n if (!didInit) {\r\n p = sm2.getMoviePercent();\r\n if (p > 0 && p < 100) {\r\n loadIncomplete = true;\r\n }\r\n }\r\n\r\n setTimeout(function() {\r\n\r\n p = sm2.getMoviePercent();\r\n\r\n if (loadIncomplete) {\r\n // special case: if movie *partially* loaded, retry until it's 100% before assuming failure.\r\n waitingForEI = false;\r\n sm2._wD(str('waitSWF'));\r\n window.setTimeout(delayWaitForEI, 1);\r\n return;\r\n }\r\n\r\n // <d>\r\n if (!didInit) {\r\n\r\n sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ' : '') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash ? ' ' + str('checkSWF') : ''), 2);\r\n\r\n if (!overHTTP && p) {\r\n\r\n _wDS('localFail', 2);\r\n\r\n if (!sm2.debugFlash) {\r\n _wDS('tryDebug', 2);\r\n }\r\n\r\n }\r\n\r\n if (p === 0) {\r\n\r\n // if 0 (not null), probably a 404.\r\n sm2._wD(str('swf404', sm2.url), 1);\r\n\r\n }\r\n\r\n debugTS('flashtojs', false, ': Timed out' + (overHTTP ? ' (Check flash security or flash blockers)' : ' (No plugin/missing SWF?)'));\r\n\r\n }\r\n // </d>\r\n\r\n // give up / time-out, depending\r\n\r\n if (!didInit && okToDisable) {\r\n\r\n if (p === null) {\r\n\r\n // SWF failed to report load progress. Possibly blocked.\r\n\r\n if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {\r\n\r\n if (sm2.useFlashBlock) {\r\n\r\n flashBlockHandler();\r\n\r\n }\r\n\r\n _wDS('waitForever');\r\n\r\n } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.\r\n rebootIntoHTML5();\r\n\r\n } else {\r\n\r\n _wDS('waitForever');\r\n\r\n // fire any regular registered ontimeout() listeners.\r\n processOnEvents({\r\n type: 'ontimeout',\r\n ignoreInit: true,\r\n error: {\r\n type: 'INIT_FLASHBLOCK'\r\n }\r\n });\r\n\r\n }\r\n\r\n } else if (sm2.flashLoadTimeout === 0) {\r\n\r\n // SWF loaded? Shouldn't be a blocking issue, then.\r\n\r\n _wDS('waitForever');\r\n\r\n } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n rebootIntoHTML5();\r\n\r\n } else {\r\n\r\n failSafely(true);\r\n\r\n }\r\n\r\n }\r\n\r\n }, sm2.flashLoadTimeout);\r\n\r\n };\r\n\r\n handleFocus = function() {\r\n\r\n function cleanup() {\r\n event.remove(window, 'focus', handleFocus);\r\n }\r\n\r\n if (isFocused || !tryInitOnFocus) {\r\n // already focused, or not special Safari background tab case\r\n cleanup();\r\n return true;\r\n }\r\n\r\n okToDisable = true;\r\n isFocused = true;\r\n _wDS('gotFocus');\r\n\r\n // allow init to restart\r\n waitingForEI = false;\r\n\r\n // kick off ExternalInterface timeout, now that the SWF has started\r\n delayWaitForEI();\r\n\r\n cleanup();\r\n return true;\r\n\r\n };\r\n\r\n flushMessages = function() {\r\n\r\n // <d>\r\n\r\n // SM2 pre-init debug messages\r\n if (messages.length) {\r\n sm2._wD('SoundManager 2: ' + messages.join(' '), 1);\r\n messages = [];\r\n }\r\n\r\n // </d>\r\n\r\n };\r\n\r\n showSupport = function() {\r\n\r\n // <d>\r\n\r\n flushMessages();\r\n\r\n var item, tests = [];\r\n\r\n if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n for (item in sm2.audioFormats) {\r\n if (sm2.audioFormats.hasOwnProperty(item)) {\r\n tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)' : (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ' : '') + 'and no flash support)' : ''))));\r\n }\r\n }\r\n sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);\r\n }\r\n\r\n // </d>\r\n\r\n };\r\n\r\n initComplete = function(bNoDisable) {\r\n\r\n if (didInit) return false;\r\n\r\n if (sm2.html5Only) {\r\n // all good.\r\n _wDS('sm2Loaded', 1);\r\n didInit = true;\r\n initUserOnload();\r\n debugTS('onload', true);\r\n return true;\r\n }\r\n\r\n var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),\r\n result = true,\r\n error;\r\n\r\n if (!wasTimeout) {\r\n didInit = true;\r\n }\r\n\r\n error = {\r\n type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')\r\n };\r\n\r\n sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ') ' + String.fromCharCode(disabled ? 10006 : 10003), disabled ? 2 : 1);\r\n\r\n if (disabled || bNoDisable) {\r\n\r\n if (sm2.useFlashBlock && sm2.oMC) {\r\n sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null ? swfCSS.swfTimedout : swfCSS.swfError);\r\n }\r\n\r\n processOnEvents({\r\n type: 'ontimeout',\r\n error: error,\r\n ignoreInit: true\r\n });\r\n\r\n debugTS('onload', false);\r\n catchError(error);\r\n\r\n result = false;\r\n\r\n } else {\r\n\r\n debugTS('onload', true);\r\n\r\n }\r\n\r\n if (!disabled) {\r\n\r\n if (sm2.waitForWindowLoad && !windowLoaded) {\r\n\r\n _wDS('waitOnload');\r\n event.add(window, 'load', initUserOnload);\r\n\r\n } else {\r\n\r\n // <d>\r\n if (sm2.waitForWindowLoad && windowLoaded) {\r\n _wDS('docLoaded');\r\n }\r\n // </d>\r\n\r\n initUserOnload();\r\n\r\n }\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n /**\r\n * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)\r\n * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().\r\n */\r\n\r\n setProperties = function() {\r\n\r\n var i,\r\n o = sm2.setupOptions;\r\n\r\n for (i in o) {\r\n\r\n if (o.hasOwnProperty(i)) {\r\n\r\n // assign local property if not already defined\r\n\r\n if (sm2[i] === _undefined) {\r\n\r\n sm2[i] = o[i];\r\n\r\n } else if (sm2[i] !== o[i]) {\r\n\r\n // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync\r\n sm2.setupOptions[i] = sm2[i];\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n init = function() {\r\n\r\n // called after onload()\r\n\r\n if (didInit) {\r\n _wDS('didInit');\r\n return false;\r\n }\r\n\r\n function cleanup() {\r\n event.remove(window, 'load', sm2.beginDelayedInit);\r\n }\r\n\r\n if (sm2.html5Only) {\r\n\r\n if (!didInit) {\r\n // we don't need no steenking flash!\r\n cleanup();\r\n sm2.enabled = true;\r\n initComplete();\r\n }\r\n\r\n return true;\r\n\r\n }\r\n\r\n // flash path\r\n initMovie();\r\n\r\n try {\r\n\r\n // attempt to talk to Flash\r\n flash._externalInterfaceTest(false);\r\n\r\n /**\r\n * Apply user-specified polling interval, OR, if \"high performance\" set, faster vs. default polling\r\n * (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)\r\n */\r\n setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));\r\n\r\n if (!sm2.debugMode) {\r\n // stop the SWF from making debug output calls to JS\r\n flash._disableDebug();\r\n }\r\n\r\n sm2.enabled = true;\r\n debugTS('jstoflash', true);\r\n\r\n if (!sm2.html5Only) {\r\n // prevent browser from showing cached page state (or rather, restoring \"suspended\" page state) via back button, because flash may be dead\r\n // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/\r\n event.add(window, 'unload', doNothing);\r\n }\r\n\r\n } catch(e) {\r\n\r\n sm2._wD('js/flash exception: ' + e.toString());\r\n\r\n debugTS('jstoflash', false);\r\n\r\n catchError({\r\n type: 'JS_TO_FLASH_EXCEPTION',\r\n fatal: true\r\n });\r\n\r\n // don't disable, for reboot()\r\n failSafely(true);\r\n\r\n initComplete();\r\n\r\n return false;\r\n\r\n }\r\n\r\n initComplete();\r\n\r\n // disconnect events\r\n cleanup();\r\n\r\n return true;\r\n\r\n };\r\n\r\n domContentLoaded = function() {\r\n\r\n if (didDCLoaded) return false;\r\n\r\n didDCLoaded = true;\r\n\r\n // assign top-level soundManager properties eg. soundManager.url\r\n setProperties();\r\n\r\n initDebug();\r\n\r\n if (!hasFlash && sm2.hasHTML5) {\r\n\r\n sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);\r\n\r\n sm2.setup({\r\n useHTML5Audio: true,\r\n // make sure we aren't preferring flash, either\r\n // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.\r\n preferFlash: false\r\n });\r\n\r\n }\r\n\r\n testHTML5();\r\n\r\n if (!hasFlash && needsFlash) {\r\n\r\n messages.push(strings.needFlash);\r\n\r\n // TODO: Fatal here vs. timeout approach, etc.\r\n // hack: fail sooner.\r\n sm2.setup({\r\n flashLoadTimeout: 1\r\n });\r\n\r\n }\r\n\r\n if (doc.removeEventListener) {\r\n doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);\r\n }\r\n\r\n initMovie();\r\n\r\n return true;\r\n\r\n };\r\n\r\n domContentLoadedIE = function() {\r\n\r\n if (doc.readyState === 'complete') {\r\n domContentLoaded();\r\n doc.detachEvent('onreadystatechange', domContentLoadedIE);\r\n }\r\n\r\n return true;\r\n\r\n };\r\n\r\n winOnLoad = function() {\r\n\r\n // catch edge case of initComplete() firing after window.load()\r\n windowLoaded = true;\r\n\r\n // catch case where DOMContentLoaded has been sent, but we're still in doc.readyState = 'interactive'\r\n domContentLoaded();\r\n\r\n event.remove(window, 'load', winOnLoad);\r\n\r\n };\r\n\r\n // sniff up-front\r\n detectFlash();\r\n\r\n // focus and window load, init (primarily flash-driven)\r\n event.add(window, 'focus', handleFocus);\r\n event.add(window, 'load', delayWaitForEI);\r\n event.add(window, 'load', winOnLoad);\r\n\r\n if (doc.addEventListener) {\r\n\r\n doc.addEventListener('DOMContentLoaded', domContentLoaded, false);\r\n\r\n } else if (doc.attachEvent) {\r\n\r\n doc.attachEvent('onreadystatechange', domContentLoadedIE);\r\n\r\n } else {\r\n\r\n // no add/attachevent support - safe to assume no JS -> Flash either\r\n debugTS('onload', false);\r\n catchError({\r\n type: 'NO_DOM2_EVENTS',\r\n fatal: true\r\n });\r\n\r\n }\r\n\r\n} // SoundManager()\r\n\r\n// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading\r\n\r\nif (window.SM2_DEFER === _undefined || !SM2_DEFER) {\r\n soundManager = new SoundManager();\r\n}\r\n\r\n/**\r\n * SoundManager public interfaces\r\n * ------------------------------\r\n */\r\n\r\nif (typeof module === 'object' && module && typeof module.exports === 'object') {\r\n\r\n /**\r\n * commonJS module\r\n */\r\n\r\n module.exports.SoundManager = SoundManager;\r\n module.exports.soundManager = soundManager;\r\n\r\n} else if (typeof define === 'function' && define.amd) {\r\n\r\n /**\r\n * AMD - requireJS\r\n * basic usage:\r\n * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n * SoundManager.getInstance().setup({\r\n * url: '/swf/',\r\n * onready: function() { ... }\r\n * })\r\n * });\r\n *\r\n * SM2_DEFER usage:\r\n * window.SM2_DEFER = true;\r\n * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n * SoundManager.getInstance(function() {\r\n * var soundManager = new SoundManager.constructor();\r\n * soundManager.setup({\r\n * url: '/swf/',\r\n * ...\r\n * });\r\n * ...\r\n * soundManager.beginDelayedInit();\r\n * return soundManager;\r\n * })\r\n * });\r\n */\r\n\r\n define(function() {\r\n /**\r\n * Retrieve the global instance of SoundManager.\r\n * If a global instance does not exist it can be created using a callback.\r\n *\r\n * @param {Function} smBuilder Optional: Callback used to create a new SoundManager instance\r\n * @return {SoundManager} The global SoundManager instance\r\n */\r\n function getInstance(smBuilder) {\r\n if (!window.soundManager && smBuilder instanceof Function) {\r\n var instance = smBuilder(SoundManager);\r\n if (instance instanceof SoundManager) {\r\n window.soundManager = instance;\r\n }\r\n }\r\n return window.soundManager;\r\n }\r\n return {\r\n constructor: SoundManager,\r\n getInstance: getInstance\r\n };\r\n });\r\n\r\n}\r\n\r\n// standard browser case\r\n\r\n// constructor\r\nwindow.SoundManager = SoundManager;\r\n\r\n/**\r\n * note: SM2 requires a window global due to Flash, which makes calls to window.soundManager.\r\n * Flash may not always be needed, but this is not known until async init and SM2 may even \"reboot\" into Flash mode.\r\n */\r\n\r\n// public API, flash callbacks etc.\r\nwindow.soundManager = soundManager;\r\n\r\n}(window));\r\n","'use strict';\nvar $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n"],"names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","catch","delegateYield","asyncGeneratorStep","_defineProperties","_toPropertyKey","key","toPrimitive","String","_toPrimitive","PageChunk","leafIndex","chunkIndex","text","lineRects","_classCallCheck","this","_callee","server","bookPath","chunks","_context","$","ajax","url","concat","cache","xhrFields","withCredentials","window","br","protected","data","path","page","callback","_fromTextWrapperResponse","_fetch","arguments","apply","_next","_throw","_x","_x2","_x3","chunksResponse","map","correctedLineRects","_fixChunkRects","correctedText","_removeDanglingHyphens","rects","_rects","_slicedToArray","firstRect","secondRect","_firstRect","left","bottom","width","secondHeight","secondWidth","secondRight","replace","PageChunkIterator","pageCount","start","opts","assign","DEFAULT_OPTS","_cursor","chunk","_bufferedPages","_bufferingPages","_cursorLock","_this","_nextUncontrolled","_this2","_decrementUncontrolled","AT_END","_recenterBuffer","_fetchPageChunks","_nextUncontrolled2","_this3","cursorChangePromise","prevPageChunks","index","Math","max","pageBufferSize","end","min","_removePageFromBuffer","_this4","_fetchPageChunksDirect","fetch","isAndroid","userAgent","undefined","navigator","test","COLUMN_TO_LANG_INDEX","searchForISO6391","language","columnsToSearch","langs","colI","column","split","x","toLowerCase","indexOf","hasLocalStorage","localStorage","_asyncToGenerator","AbstractTTSEngine","options","voice","getBestBookVoice","getVoices","bookLanguage","playing","paused","_chunkIterator","activeSound","playbackRate","events","on","updateBestVoice","trigger","numLeafs","onLoadingStart","step","fireEvent","pause","resume","_jumpBackward","all","decrement","voiceURI","off","find","setItem","setVoice","newRate","setPlaybackRate","_step","_callee2","sound","playPromise","_context2","onDone","createSound","rate","load","onLoadingComplete","beforeChunkPlay","playSound","afterChunkPlay","loaded","play","voices","userLanguages","languages","bookLangVoices","filter","lang","startsWith","matchingUserLangs","getMatchingStoredVoice","getMatchingVoice","default","storedVoice","getItem","_step2","_iterator","_createForOfIteratorHelper","_ret","_loop","matchingVoices","err","_createClass","_callSuper","_getPrototypeOf","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","Boolean","valueOf","_get","get","bind","_superPropBase","getOwnPropertyDescriptor","_setPrototypeOf","FestivalTTSEngine","_AbstractTTSEngine","_$$browser","audioFormat","browser","mozilla","_inherits","localService","soundManager","setup","debugMode","preferFlash","useHTML5Audio","flashVersion","promise","match","iOSCaptureUserIntentHack","FestivalTTSSound","getSoundUrl","dataString","encodeURIComponent","_iOSCaptureUserIntentHack","SILENCE_1MS","res","onfinish","destruct","supported","soundUrl","_finishResolver","onload","_onresume","onresume","sleep","_play","_callee3","_context3","mp3","ogg","super_","WebTTSEngine","speechSynthesis","addEventListener","audio","Audio","SILENCE_6S_MP3","loop","src","mediaSession","metadata","MediaMetadata","title","bookTitle","artist","m","label","artwork","thumbnail","setActionHandler","jumpBackward","jumpForward","unshift","WebTTSSound","started","stopped","utterance","_lastEvents","boundary","_charIndex","_finishPromise","_this$voice","SpeechSynthesisUtterance","location","toString","console","log","ev","dispatchEvent","CustomEvent","_reload","wasPaused","recentEvent","target","charIndex","cancel","speak","isLocalVoice","isChrome","_chromePausingBugFix","endPromise","race","promisifyEvent","_finish","Event","_pause","pausePromise","pauseMightNotWork","timeoutPromise","isFirefox","_resume","_callee4","resumeMightNotWork","resumeMightNotFire","resumePromise","_context4","reload","_chromePausingBugFix2","_callee5","result","_context5","t0","en","jQuery","extend","BookReader","defaultOptions","enableTtsPlugin","_ttsBoxesByIndex","TTSEngine","isSupported","engineName","festival","web","ttsEngine","showProgressPopup","removeProgressPopup","ttsStop","ttsBeforeChunkPlay","ttsSendChunkFinishedAnalyticsEvent","init","eventNames","PostInit","click","ttsToggle","ttsStart","_createPageContainer","pageContainer","pageIndex","renderBoxesInPageContainerLayer","$container","buildMobileDrawerElement","$el","after","imagesBaseURL","initNavbar","refs","$BRReadAloudToolbar","prepend","renderVoiceOption","join","voiceSortOrder","b","localeCompare","renderVoicesMenu","voicesMenu","empty","bookLanguages","sort","otherLanguages","append","val","show","hide","ttsUpdateState","ttsPlayPause","ttsJumpForward","ttsJumpBackward","$rateSelector","parseFloat","tooltips","insertBefore","closest","autoStop","startTTSEngine","constModeThumb","mode","switchMode","constMode1up","addClass","ttsSendAnalyticsEvent","currentIndex","book","getNumLeafs","isPlaying","toggleClass","togglePlayPause","removeClass","ttsRemoveHilites","_ref","ttsMaybeFlipToIndex","ttsHighlightChunk","ttsScrollToChunk","_ref2","constMode2up","jumpToIndex","_modes","mode2Up","mode2UpLit","_ref3","_ref4","_Object$entries$_i","_Object$entries","_i","pageIndexString","boxes","getPage","getActivePageContainerElementsForIndex","container","entries","_$$last","last","scrollIntoView","block","isFullscreenActive","inline","behavior","getActivePageContainerElements","remove","action","archiveAnalyticsSendEvent","extraValues","mediaLanguage","exports","uaMatch","ua","exec","platform_match","matched","version","versionNumber","platform","parseInt","android","bb","blackberry","ipad","iphone","ipod","kindle","playbook","silk","mobile","cros","mac","linux","win","desktop","chrome","opr","safari","webkit","rv","iemobile","ie","edge","msedge","opera","jQBrowser","factory","_undefined","document","SoundManager","smURL","smID","setupOptions","debugFlash","useConsole","consoleOnly","waitForWindowLoad","bgColor","useHighPerformance","flashPollingInterval","html5PollingInterval","flashLoadTimeout","wmode","allowScriptAccess","useFlashBlock","forceUseGlobalHTML5Audio","ignoreMobileRestrictions","html5Test","noSWFCache","idPrefix","autoLoad","autoPlay","from","loops","onid3","onerror","whileloading","onplay","onpause","whileplaying","onposition","onstop","multiShot","multiShotEvents","position","pan","stream","to","usePolicyFile","volume","flash9Options","onfailure","isMovieStar","usePeakData","useWaveformData","useEQData","onbufferchange","ondataerror","movieStarOptions","bufferTime","serverURL","onconnect","duration","audioFormats","required","mp4","related","opus","wav","flac","movieID","id","debugID","debugURLParam","movieURL","altURL","swfLoaded","enabled","oMC","sounds","soundIDs","muted","didFlashBlock","filePattern","filePatterns","flash8","flash9","features","buffering","peakData","waveformData","eqData","movieStar","sandbox","types","remote","localWithFile","localWithNetwork","localTrusted","description","noRemote","noLocal","html5","usingFlash","flash","html5Only","ignoreFlash","SMSound","doNothing","setProperties","fV","debugTS","_wDS","initComplete","mixin","extraOptions","addOnEvent","processOnEvents","initUserOnload","delayWaitForEI","waitForEI","rebootIntoHTML5","setVersionInfo","handleFocus","strings","initMovie","domContentLoaded","winOnLoad","didDCLoaded","getDocument","createMovie","catchError","setPolling","initDebug","disableObject","failSafely","normalizeMovieURL","str","flashBlockHandler","getSWFCSS","swfCSS","toggleDebug","loopFix","policyFix","complain","idCheck","startTimer","stopTimer","timerExecute","parseURL","canIgnoreFlash","featureCheck","html5OK","html5CanPlay","html5ErrorCodes","html5Ext","html5Unload","domContentLoadedIE","testHTML5","event","lastGlobalHTML5URL","hasFlash","detectFlash","badSafariFix","html5_events","showSupport","flushMessages","wrapCallback","didSetup","sm2","globalHTML5Audio","sm","smc","wl","href","doc","on_queue","debugOpen","didAppend","appendSuccess","didInit","disabled","windowLoaded","wdCount","debugLevels","oRemoved","oRemovedHTML","waitingForEI","initPending","h5TimerCount","h5IntervalTimer","messages","needsFlash","Array","useGlobalHTML5Audio","idCounter","msecScale","is_iDevice","isIE","isWebkit","isSafari","isOpera","mobileHTML5","isBadSafari","hasConsole","isFocused","hasFocus","tryInitOnFocus","okToDisable","flashMIME","emptyURL","overHTTP","protocol","http","netStreamMimeTypes","netStreamTypes","netStreamPattern","RegExp","preferFlashCheck","kind","html5_event","oFn","_s","_a","_wD","h5","mimePattern","useAltURL","swfBox","swfDefault","swfError","swfTimedout","swfUnblocked","sm2Debug","highPerf","flashDebug","hasHTML5","canPlayType","noURL","ok","globalHTML5","ignoreMobile","mobileUA","beginDelayedInit","readyState","setTimeout","getMovie","movie_id","oOptions","_url","cs","cs_string","oSound","make","_setup_html5","_createSound","connected","destroySound","sID","_bFromSound","oS","_iO","unload","splice","onPosition","nPosition","oMethod","oScope","clearOnPosition","overloaded","allowOverride","setPosition","nMsecOffset","stopAll","pauseAll","resumeAll","togglePause","setPan","nPan","setVolume","nVol","j","mute","muteAll","unmute","unmuteAll","toggleMute","getMemoryUse","ram","_getMemoryUse","disable","bNoDisable","canPlayMIME","sMIME","canPlayURL","sURL","canPlayLink","oLink","getSoundById","_suppressDebug","onready","sType","ontimeout","_writeDebug","sText","sTypeOrObject","oItem","createElement","className","appendChild","createTextNode","style","fontWeight","color","firstChild","alert","_debug","reboot","resetEvents","excludeInit","k","innerHTML","parentNode","removeChild","fired","getMoviePercent","PercentLoaded","resetProperties","add_html5_events","remove_html5_events","stop_html5_timer","start_html5_timer","attachOnPosition","detachOnPosition","applyFromTo","lastHTML5State","urlOmitted","onplay_called","onPositionItems","onPositionFired","lastURL","time","instanceOptions","isHTML5","id3","playState","_called_load","_html5_canplay","autobuffer","preload","_load","fatal","_unload","_bFromSM","_destroySound","_updatePlayState","fN","audioClone","onended","oncanplay","startOK","getAutoPlay","setAutoPlay","substr","lastIndexOf","instanceCount","_oncanplay","_onfinish","currentTime","add","_start","onplayerror","bAll","originalPosition","_onbufferchange","_resetOnPosition","_onTimer","_stop","_setAutoPlay","normalizedRate","message","position1K","offset","toFixed","_setPosition","_bCallFlash","bInstanceOnly","_setPan","_bInstanceOnly","_setVolume","hasIO","scope","_processOnPosition","item","op","retainPosition","_hasTimer","bytesLoaded","bytesTotal","durationEstimate","buffered","right","failures","isBuffering","bForce","isNew","_get_html5_duration","_whileplaying","Infinity","_apply_loop","nLoops","sameURL","dURL","decodeURI","_added_events","oEvt","removeEventListener","_onload","nSuccess","loadOK","_onerror","errorCode","nIsBuffering","_onsuspend","onsuspend","_onfailure","msg","level","code","_onwarning","onwarning","io_onfinish","_whileloading","nBytesLoaded","nBytesTotal","nDuration","nBufferLength","floor","bufferLength","oPeakData","oWaveformDataLeft","oWaveformDataRight","oEQData","eqLeft","leftPeak","rightPeak","leftEQ","rightEQ","_oncaptiondata","oData","captiondata","oncaptiondata","_onmetadata","oMDProps","oMDData","onmetadata","_onid3","oID3Props","oID3Data","_onconnect","bSuccess","_ondataerror","sError","body","getElementsByTagName","getElementById","oMain","oAdd","o2","o1","oParent","hasParent","bonusOptions","Function","old","evt","getArgs","oArgs","args","len","element","shift","abort","canplay","ee","canplaythrough","durationchange","ended","error","loadeddata","_loaded","loadedmetadata","loadstart","fromCharCode","progress","progStr","isProgress","ranges","total","ratechange","suspend","stalled","timeupdate","waiting","iO","oAudio","_called_unload","fileExt","mime","aF","lookup","support","cp","canPlay","isOK","notReady","notOK","domError","spcWmode","swf404","tryDebug","checkSWF","localFail","waitFocus","waitForever","waitSWF","needFunction","badID","currentObj","waitOnload","docLoaded","onloadOK","secNote","badRemove","shutdown","queue","smError","fbTimeout","fbLoaded","fbHandler","manURL","onURL","badFV","as2loop","noNSLoop","needfl9","mfTimeout","needFlash","gotFocus","policy","setupError","setupUndef","setupLate","sm2Loaded","sstr","sOpt","sPre","sMsg","warn","oProp","Date","getTime","isDebug","bPolling","bHighPerformance","_setPolling","oD","oDebug","oTarget","oToggle","tmp","height","lineHeight","margin","textAlign","border","cursor","background","zIndex","onclick","display","e2","errorLevel","oT","sEventType","sMessage","sm2Debugger","handleEvent","css","ignoreInit","status","success","srcQueue","canRetry","obj","nP","hasPlugin","AX","ActiveXObject","plugins","mimeTypes","enabledPlugin","flashNeeded","formats","urlResult","setInterval","clearInterval","_setSandboxType","sandboxType","sb","_externalInterfaceOK","swfVersion","initMsg","isRTL","oEmbed","oMovie","movieHTML","oEl","sClass","remoteURL","localURL","extraClass","html","param","dir","quality","bgcolor","pluginspage","hasPriority","FlashVars","setAttribute","overflow","top","abs","oninitmovie","loadIncomplete","cleanup","tests","_externalInterfaceTest","_disableDebug","detachEvent","attachEvent","SM2_DEFER","module","getInstance","smBuilder","instance","$entries","stat","O"],"sourceRoot":""}
|