@internetarchive/bookreader 5.0.0-7 → 5.0.0-70

Sign up to get free protection for your applications and to get access to all the features.
Files changed (313) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +73 -10
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +396 -1129
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1509 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -1
  13. package/BookReader/icons/2up.svg +1 -1
  14. package/BookReader/icons/advance.svg +1 -1
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -1
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -1
  19. package/BookReader/icons/fullscreen_exit.svg +1 -1
  20. package/BookReader/icons/hamburger.svg +1 -1
  21. package/BookReader/icons/left-arrow.svg +1 -1
  22. package/BookReader/icons/magnify-minus.svg +1 -1
  23. package/BookReader/icons/magnify-plus.svg +1 -1
  24. package/BookReader/icons/magnify.svg +1 -1
  25. package/BookReader/icons/pause.svg +1 -1
  26. package/BookReader/icons/play.svg +1 -1
  27. package/BookReader/icons/playback-speed.svg +1 -1
  28. package/BookReader/icons/read-aloud.svg +1 -1
  29. package/BookReader/icons/review.svg +1 -1
  30. package/BookReader/icons/thumbnails.svg +1 -1
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -1
  33. package/BookReader/images/BRicons.svg +3 -3
  34. package/BookReader/images/books_graphic.svg +1 -1
  35. package/BookReader/images/icon_book.svg +1 -1
  36. package/BookReader/images/icon_bookmark.svg +1 -1
  37. package/BookReader/images/icon_gear.svg +1 -1
  38. package/BookReader/images/icon_hamburger.svg +1 -1
  39. package/BookReader/images/icon_home.svg +1 -1
  40. package/BookReader/images/icon_info.svg +1 -1
  41. package/BookReader/images/icon_one_page.svg +1 -1
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -1
  45. package/BookReader/images/icon_search_button.svg +1 -1
  46. package/BookReader/images/icon_share.svg +1 -1
  47. package/BookReader/images/icon_skip-ahead.svg +1 -1
  48. package/BookReader/images/icon_skip-back.svg +1 -1
  49. package/BookReader/images/icon_speaker.svg +1 -1
  50. package/BookReader/images/icon_speaker_open.svg +1 -1
  51. package/BookReader/images/icon_thumbnails.svg +1 -1
  52. package/BookReader/images/icon_toc.svg +1 -1
  53. package/BookReader/images/icon_two_pages.svg +1 -1
  54. package/BookReader/images/marker_chap-off.svg +1 -1
  55. package/BookReader/images/marker_chap-on.svg +1 -1
  56. package/BookReader/images/marker_srch-on.svg +1 -1
  57. package/BookReader/jquery-3.js +2 -0
  58. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  59. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  60. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  61. package/BookReader/plugins/plugin.autoplay.js +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  63. package/BookReader/plugins/plugin.chapters.js +25 -1
  64. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  65. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  66. package/BookReader/plugins/plugin.iframe.js +1 -1
  67. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  68. package/BookReader/plugins/plugin.resume.js +1 -1
  69. package/BookReader/plugins/plugin.resume.js.map +1 -1
  70. package/BookReader/plugins/plugin.search.js +2 -1
  71. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  72. package/BookReader/plugins/plugin.search.js.map +1 -1
  73. package/BookReader/plugins/plugin.text_selection.js +2 -1
  74. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  76. package/BookReader/plugins/plugin.tts.js +1 -1
  77. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  78. package/BookReader/plugins/plugin.tts.js.map +1 -1
  79. package/BookReader/plugins/plugin.url.js +1 -1
  80. package/BookReader/plugins/plugin.url.js.map +1 -1
  81. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  82. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  83. package/BookReader/webcomponents-bundle.js +3 -0
  84. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  85. package/BookReader/webcomponents-bundle.js.map +1 -0
  86. package/BookReaderDemo/BookReaderDemo.css +16 -19
  87. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  88. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  89. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  90. package/BookReaderDemo/IADemoBr.js +147 -0
  91. package/BookReaderDemo/demo-advanced.html +2 -2
  92. package/BookReaderDemo/demo-autoplay.html +2 -3
  93. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  94. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  95. package/BookReaderDemo/demo-fullscreen.html +2 -4
  96. package/BookReaderDemo/demo-iiif.html +2 -1
  97. package/BookReaderDemo/demo-iiif.js +0 -1
  98. package/BookReaderDemo/demo-internetarchive.html +213 -17
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +2 -1
  101. package/BookReaderDemo/demo-simple.html +2 -1
  102. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  103. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  104. package/BookReaderDemo/immersion-1up.html +2 -2
  105. package/BookReaderDemo/immersion-mode.html +2 -4
  106. package/BookReaderDemo/toggle_controls.html +3 -2
  107. package/BookReaderDemo/view_mode.html +2 -1
  108. package/BookReaderDemo/viewmode-cycle.html +2 -3
  109. package/CHANGELOG.md +283 -0
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +4 -1
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +71 -60
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +4 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +4 -2
  121. package/src/BookNavigator/assets/ia-logo.js +17 -0
  122. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  123. package/src/BookNavigator/assets/icon_close.js +1 -1
  124. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  125. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  126. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  127. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  128. package/src/BookNavigator/book-navigator.js +586 -0
  129. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  130. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  131. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  132. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  133. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  134. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  135. package/src/BookNavigator/delete-modal-actions.js +1 -1
  136. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  137. package/src/BookNavigator/downloads/downloads.js +41 -25
  138. package/src/BookNavigator/search/search-provider.js +49 -27
  139. package/src/BookNavigator/search/search-results.js +23 -9
  140. package/src/BookNavigator/sharing.js +27 -0
  141. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  142. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  143. package/src/BookNavigator/volumes/volumes-provider.js +111 -0
  144. package/src/BookNavigator/volumes/volumes.js +188 -0
  145. package/src/BookReader/BookModel.js +64 -34
  146. package/src/BookReader/DragScrollable.js +233 -0
  147. package/src/BookReader/Mode1Up.js +56 -351
  148. package/src/BookReader/Mode1UpLit.js +388 -0
  149. package/src/BookReader/Mode2Up.js +73 -1318
  150. package/src/BookReader/Mode2UpLit.js +776 -0
  151. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  152. package/src/BookReader/ModeSmoothZoom.js +312 -0
  153. package/src/BookReader/ModeThumb.js +18 -12
  154. package/src/BookReader/Navbar/Navbar.js +12 -38
  155. package/src/BookReader/PageContainer.js +81 -6
  156. package/src/BookReader/ReduceSet.js +1 -1
  157. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  158. package/src/BookReader/events.js +2 -3
  159. package/src/BookReader/options.js +24 -2
  160. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  161. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  162. package/src/BookReader/utils/SelectionObserver.js +43 -0
  163. package/src/BookReader/utils.js +118 -13
  164. package/src/BookReader.js +427 -1061
  165. package/src/assets/icons/magnify-minus.svg +3 -7
  166. package/src/assets/icons/magnify-plus.svg +3 -7
  167. package/src/assets/icons/voice.svg +1 -0
  168. package/src/css/BookReader.scss +1 -5
  169. package/src/css/_BRBookmarks.scss +1 -1
  170. package/src/css/_BRComponent.scss +1 -1
  171. package/src/css/_BRmain.scss +16 -0
  172. package/src/css/_BRnav.scss +11 -38
  173. package/src/css/_BRpages.scss +149 -40
  174. package/src/css/_BRsearch.scss +67 -21
  175. package/src/css/_TextSelection.scss +87 -27
  176. package/src/css/_colorbox.scss +2 -2
  177. package/src/css/_controls.scss +20 -7
  178. package/src/css/_icons.scss +1 -1
  179. package/src/ia-bookreader/ia-bookreader.js +224 -0
  180. package/src/plugins/plugin.archive_analytics.js +3 -3
  181. package/src/plugins/plugin.autoplay.js +5 -11
  182. package/src/plugins/plugin.chapters.js +211 -186
  183. package/src/plugins/plugin.resume.js +3 -3
  184. package/src/plugins/plugin.text_selection.js +464 -134
  185. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  186. package/src/plugins/search/plugin.search.js +142 -125
  187. package/src/plugins/search/utils.js +43 -0
  188. package/src/plugins/search/view.js +33 -58
  189. package/src/plugins/tts/AbstractTTSEngine.js +68 -40
  190. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  191. package/src/plugins/tts/PageChunk.js +15 -21
  192. package/src/plugins/tts/PageChunkIterator.js +8 -12
  193. package/src/plugins/tts/WebTTSEngine.js +87 -71
  194. package/src/plugins/tts/plugin.tts.js +95 -126
  195. package/src/plugins/tts/utils.js +0 -25
  196. package/src/plugins/url/UrlPlugin.js +191 -0
  197. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  198. package/src/util/browserSniffing.js +22 -0
  199. package/src/util/docCookies.js +21 -2
  200. package/tests/e2e/README.md +37 -0
  201. package/tests/e2e/autoplay.test.js +2 -2
  202. package/tests/e2e/base.test.js +8 -16
  203. package/tests/e2e/helpers/base.js +53 -48
  204. package/tests/e2e/helpers/debug.js +1 -1
  205. package/tests/e2e/helpers/params.js +17 -0
  206. package/tests/e2e/helpers/rightToLeft.js +8 -14
  207. package/tests/e2e/helpers/search.js +73 -0
  208. package/tests/e2e/models/Navigation.js +20 -37
  209. package/tests/e2e/rightToLeft.test.js +4 -5
  210. package/tests/e2e/viewmode.test.js +40 -33
  211. package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
  212. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  213. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  214. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  215. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  216. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  217. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  218. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  219. package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
  220. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  221. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  222. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
  223. package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
  224. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  225. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  226. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  227. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  228. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  229. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  230. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  231. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  232. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  233. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  234. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  235. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  236. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  237. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  238. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  239. package/tests/jest/BookReader/utils/SelectionObserver.test.js +43 -0
  240. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  241. package/tests/jest/BookReader/utils.test.js +229 -0
  242. package/tests/jest/BookReader.keyboard.test.js +190 -0
  243. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  244. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  245. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  246. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  247. package/tests/jest/plugins/plugin.chapters.test.js +145 -0
  248. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  249. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  250. package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
  251. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  252. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +25 -47
  253. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
  254. package/tests/jest/plugins/search/utils.js +25 -0
  255. package/tests/jest/plugins/search/utils.test.js +29 -0
  256. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +29 -9
  257. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  258. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  259. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  260. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  261. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  262. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  263. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  264. package/tests/jest/setup.js +3 -0
  265. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  266. package/tests/jest/util/docCookies.test.js +24 -0
  267. package/tests/{util → jest/util}/strings.test.js +1 -1
  268. package/tests/{utils.js → jest/utils.js} +38 -0
  269. package/webpack.config.js +11 -6
  270. package/.babelrc +0 -12
  271. package/.dependabot/config.yml +0 -6
  272. package/.testcaferc.json +0 -5
  273. package/BookReader/bookreader-component-bundle.js +0 -1450
  274. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  275. package/BookReader/bookreader-component-bundle.js.map +0 -1
  276. package/BookReader/jquery-1.10.1.js +0 -2
  277. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  278. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  279. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  280. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  281. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  282. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  283. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  284. package/karma.conf.js +0 -23
  285. package/src/BookNavigator/BookModel.js +0 -14
  286. package/src/BookNavigator/BookNavigator.js +0 -446
  287. package/src/BookNavigator/assets/book-loader.js +0 -27
  288. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  289. package/src/BookNavigator/search/a-search-result.js +0 -55
  290. package/src/BookReader/DebugConsole.js +0 -54
  291. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  292. package/src/ItemNavigator/ItemNavigator.js +0 -376
  293. package/src/ItemNavigator/providers/sharing.js +0 -29
  294. package/src/css/_MobileNav.scss +0 -194
  295. package/src/dragscrollable-br.js +0 -261
  296. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  297. package/src/plugins/plugin.mobile_nav.js +0 -287
  298. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  299. package/tests/BookReader/DebugConsole.test.js +0 -25
  300. package/tests/BookReader/Mode1Up.test.js +0 -164
  301. package/tests/BookReader/Mode2Up.test.js +0 -247
  302. package/tests/BookReader/utils.test.js +0 -109
  303. package/tests/e2e/helpers/desktopSearch.js +0 -72
  304. package/tests/e2e/helpers/mobileSearch.js +0 -85
  305. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  306. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  307. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  308. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  309. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  310. package/tests/plugins/plugin.chapters.test.js +0 -130
  311. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  312. package/tests/plugins/plugin.text_selection.test.js +0 -203
  313. package/tests/util/docCookies.test.js +0 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://@internetarchive/bookreader/./src/plugins/tts/PageChunk.js","webpack://@internetarchive/bookreader/./src/plugins/tts/PageChunkIterator.js","webpack://@internetarchive/bookreader/./src/plugins/tts/AbstractTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/utils.js","webpack://@internetarchive/bookreader/./src/plugins/tts/FestivalTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/plugin.tts.js","webpack://@internetarchive/bookreader/./src/plugins/tts/WebTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/tooltip_dict.js","webpack://@internetarchive/bookreader/./src/util/browserSniffing.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/function-bind.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.assign.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.get-prototype-of.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.reflect.construct.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.reflect.get.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.match.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.starts-with.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"],"names":["PageChunk","leafIndex","chunkIndex","text","lineRects","this","server","bookPath","Promise","res","rej","$","ajax","type","url","dataType","cache","data","path","page","error","then","chunks","_fromTextWrapperResponse","chunksResponse","map","c","i","correctedLineRects","_fixChunkRects","slice","correctedText","_removeDanglingHyphens","rects","length","firstRect","secondRect","left","bottom","width","secondHeight","secondWidth","secondRight","replace","PageChunkIterator","pageCount","start","opts","Object","assign","DEFAULT_OPTS","_cursor","chunk","_bufferedPages","_bufferingPages","_cursorLock","resolve","_nextUncontrolled","_decrementUncontrolled","AT_END","_recenterBuffer","_fetchPageChunks","cursorChangePromise","prevPageChunks","index","Math","max","pageBufferSize","end","min","_removePageFromBuffer","_fetchPageChunksDirect","fetch","AbstractTTSEngine","options","playing","paused","_chunkIterator","activeSound","playbackRate","events","voice","on","getBestBookVoice","getVoices","bookLanguage","trigger","Error","voices","userLanguages","navigator","languages","bookLangVoices","filter","v","lang","startsWith","matchingUserLangs","language","getMatchingVoice","find","default","matchingVoices","numLeafs","onLoadingStart","step","stop","fireEvent","pause","resume","finish","all","decrement","newRate","setPlaybackRate","next","onDone","sound","createSound","rate","load","onLoadingComplete","beforeChunkPlay","playPromise","playSound","afterChunkPlay","loaded","play","promisifyEvent","target","eventType","addEventListener","resolver","ev","removeEventListener","sleep","ms","setTimeout","isAndroid","userAgent","test","COLUMN_TO_LANG_INDEX","searchForISO6391","columnsToSearch","langs","colI","column","split","x","toLowerCase","indexOf","FestivalTTSEngine","audioFormat","browser","mozilla","localService","name","voiceURI","soundManager","setup","debugMode","preferFlash","useHTML5Audio","flashVersion","promise","match","iOSCaptureUserIntentHack","FestivalTTSSound","getSoundUrl","dataString","encodeURIComponent","SILENCE_1MS","onfinish","destruct","supported","soundUrl","_finishResolver","onload","onresume","mp3","ogg","super_","WebTTSEngine","speechSynthesis","audio","Audio","SILENCE_6S_MP3","loop","src","mediaSession","metadata","MediaMetadata","title","br","bookTitle","artist","m","label","value","artwork","thumbnail","setActionHandler","jumpBackward","jumpForward","WebTTSSound","window","started","stopped","utterance","_lastEvents","boundary","_charIndex","_finishPromise","SpeechSynthesisUtterance","location","toString","console","log","dispatchEvent","CustomEvent","wasPaused","recentEvent","charIndex","cancel","speak","isLocalVoice","isChrome","_chromePausingBugFix","endPromise","race","Event","pausePromise","pauseMightNotWork","isFirefox","timeoutPromise","result","resumeMightNotWork","resumeMightNotFire","resumePromise","reload","en","jQuery","extend","BookReader","defaultOptions","enableTtsPlugin","prototype","call","ttsHilites","TTSEngine","isSupported","engineName","festival","web","ttsEngine","showProgressPopup","bind","removeProgressPopup","ttsStop","ttsBeforeChunkPlay","ttsSendChunkFinishedAnalyticsEvent","init","eventNames","fragmentChange","mode","constMode2up","visibleSelector","twoPage","currentIndexL","currentIndexR","join","show","not","hide","PostInit","click","ttsToggle","ttsStart","buildMobileDrawerElement","$el","after","imagesBaseURL","initNavbar","refs","$BRReadAloudToolbar","prepend","ttsUpdateState","ttsPlayPause","ttsJumpForward","ttsJumpBackward","$rateSelector","change","parseFloat","val","tooltips","insertBefore","closest","autoStop","startTTSEngine","constModeThumb","switchMode","constMode1up","addClass","ttsSendAnalyticsEvent","currentIndex","getNumLeafs","isPlaying","toggleClass","togglePlayPause","removeClass","ttsRemoveHilites","ttsMaybeFlipToIndex","ttsHighlightChunk","ttsScrollToChunk","in2PageMode","animationFinishedCallback","prev","jumpToIndex","ttsHilite2UP","ttsHilite1UP","leafTop","parseInt","_getPageHeight","reduce","padding","chunkTop","chunkBot","topOfFirstChunk","botOfLastChunk","containerTop","$brContainer","prop","containerBot","height","animate","scrollTop","l","b","r","t","div","document","createElement","push","appendTo","css","top","$brTwoPageView","setHilightCss2UP","remove","action","archiveAnalyticsSendEvent","extraValues","mediaLanguage","vendor","isSafari","aFunction","isObject","factories","construct","C","argsLength","args","list","Function","module","exports","that","fn","partArgs","arguments","boundFunction","concat","apply","stat","forced","fails","toObject","nativeGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","sham","getPrototypeOf","it","getBuiltIn","anObject","create","nativeConstruct","NEW_TARGET_BUG","F","ARGS_BUG","FORCED","Target","newTarget","$args","proto","instance","has","getOwnPropertyDescriptorModule","get","propertyKey","descriptor","receiver","f","undefined","fixRegExpWellKnownSymbolLogic","toLength","requireObjectCoercible","advanceStringIndex","regExpExec","MATCH","nativeMatch","maybeCallNative","regexp","O","matcher","RegExp","String","done","rx","S","global","fullUnicode","unicode","lastIndex","A","n","matchStr","getOwnPropertyDescriptor","notARegExp","correctIsRegExpLogic","IS_PURE","$startsWith","CORRECT_IS_REGEXP_LOGIC","writable","searchString","search","uaMatch","ua","exec","platform_match","matched","version","versionNumber","platform","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","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","isOpera","mobileHTML5","isBadSafari","hasConsole","isFocused","hasFocus","tryInitOnFocus","okToDisable","flashMIME","emptyURL","overHTTP","protocol","http","netStreamMimeTypes","netStreamTypes","netStreamPattern","preferFlashCheck","kind","html5_event","oFn","e","s","_s","_a","_wD","h5","mimePattern","useAltURL","swfBox","swfDefault","swfError","swfTimedout","swfUnblocked","sm2Debug","highPerf","flashDebug","hasHTML5","canPlayType","noURL","ok","globalHTML5","ignoreMobile","mobileUA","beginDelayedInit","readyState","getMovie","movie_id","oOptions","_url","cs","cs_string","oSound","charAt","make","_setup_html5","_createSound","connected","destroySound","sID","_bFromSound","oS","_iO","unload","splice","onPosition","nPosition","oMethod","oScope","clearOnPosition","overloaded","allowOverride","setPosition","nMsecOffset","stopAll","hasOwnProperty","pauseAll","resumeAll","togglePause","setPan","nPan","setVolume","nVol","j","isNaN","mute","muteAll","unmute","unmuteAll","toggleMute","getMemoryUse","ram","_getMemoryUse","disable","bNoDisable","canPlayMIME","sMIME","canPlayURL","sURL","canPlayLink","oLink","getSoundById","_suppressDebug","onready","sType","ontimeout","_writeDebug","sText","sTypeOrObject","o","oItem","className","appendChild","createTextNode","style","fontWeight","color","firstChild","alert","_debug","reboot","resetEvents","excludeInit","k","innerHTML","parentNode","removeChild","fired","reset","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","a","audioClone","onended","oncanplay","startOK","getAutoPlay","setAutoPlay","substr","lastIndexOf","instanceCount","_oncanplay","_onfinish","currentTime","err","add","_start","onplayerror","bAll","originalPosition","_onbufferchange","_resetOnPosition","_onTimer","_stop","_setAutoPlay","normalizedRate","message","position1K","offset","toFixed","_setPosition","_bCallFlash","_pause","bInstanceOnly","_setPan","_bInstanceOnly","_setVolume","hasIO","method","scope","_processOnPosition","item","op","retainPosition","_hasTimer","bytesLoaded","bytesTotal","durationEstimate","buffered","right","failures","isBuffering","bForce","isNew","_get_html5_duration","_whileplaying","d","Infinity","_apply_loop","nLoops","sameURL","dURL","decodeURI","_added_events","oEvt","_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","old","evt","getArgs","oArgs","len","pop","element","shift","abort","canplay","ee","canplaythrough","durationchange","ended","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","lineHeight","margin","textAlign","border","cursor","background","zIndex","onclick","display","e2","errorLevel","oT","sEventType","sMessage","sm2Debugger","handleEvent","p","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","abs","oninitmovie","loadIncomplete","cleanup","tests","_externalInterfaceTest","_disableDebug","detachEvent","attachEvent","SM2_DEFER","constructor","getInstance","smBuilder"],"mappings":"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","file":"plugins/plugin.tts.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 fetch(server, bookPath, leafIndex) {\n // jquery's ajax \"PromiseLike\" implementation is inconsistent with\n // modern Promises, so convert it to a full promise (it doesn't forward\n // a returned promise to the next handler in the chain, which kind of\n // defeats the entire point of using promises to avoid \"callback hell\")\n return new Promise((res, rej) => {\n $.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 error: rej,\n })\n .then(chunks => {\n res(PageChunk._fromTextWrapperResponse(leafIndex, chunks));\n });\n });\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 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 _nextUncontrolled() {\n if (this._cursor.page == this.pageCount) {\n return Promise.resolve(PageChunkIterator.AT_END);\n }\n\n this._recenterBuffer(this._cursor.page);\n\n return this._fetchPageChunks(this._cursor.page)\n .then(chunks => {\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 /**\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 PageChunkIterator from './PageChunkIterator.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 **/\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', () => {\n this.voice = AbstractTTSEngine.getBestBookVoice(this.getVoices(), this.opts.bookLanguage);\n });\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 /**\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.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._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 jumpBackward() {\n Promise.all([\n this.activeSound.stop(),\n this._chunkIterator.decrement()\n .then(() => this._chunkIterator.decrement())\n ])\n .then(() => this.step());\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 step() {\n this._chunkIterator.next()\n .then(chunk => {\n if (chunk == PageChunkIterator.AT_END) {\n this.stop();\n this.opts.onDone();\n return;\n }\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 return this.opts.beforeChunkPlay(chunk).then(() => sound);\n })\n .then(sound => {\n if (!this.playing) return;\n\n const playPromise = this.playSound(sound)\n .then(() => this.opts.afterChunkPlay(sound.chunk));\n if (this.paused) this.pause();\n return playPromise;\n })\n .then(() => {\n if (this.playing) return this.step();\n });\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 // Try to find voices that intersect these two sets\n return 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 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 langs from 'iso-language-codes/js/data.js';\n\n/**\n * Convert a EventTarget style event into a promise\n * @param {EventTarget} target\n * @param {string} eventType\n * @return {Promise<Event>}\n */\nexport function promisifyEvent(target, eventType) {\n return new Promise(res => {\n const resolver = ev => {\n target.removeEventListener(eventType, resolver);\n res(ev);\n };\n target.addEventListener(eventType, resolver);\n });\n}\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 * Waits the provided number of ms and then resolves with a promise\n * @param {number} ms\n * @return {Promise}\n */\nexport function sleep(ms) {\n return new Promise(res => setTimeout(res, ms));\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","import AbstractTTSEngine from './AbstractTTSEngine.js';\nimport { sleep } from './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';\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 iOSCaptureUserIntentHack() {\n const sound = soundManager.createSound({ url: SILENCE_1MS[this.audioFormat] });\n return new Promise(res => sound.play({onfinish: res}))\n .then(() => 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: () => {\n sleep(25).then(() => {\n if (this.rate != 1) this.sound.setPlaybackRate(this.rate);\n });\n }\n });\n return this.sound.load();\n }\n\n play() {\n return new Promise(res => {\n this._finishResolver = res;\n this.sound.play({ onfinish: res });\n })\n .then(() => 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 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';\n/** @typedef {import('./PageChunk.js')} PageChunk */\n/** @typedef {import(\"./AbstractTTSEngine.js\")} 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 this.ttsHilites = [];\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 // TODO move this to BookReader.js or something\n this.bind(BookReader.eventNames.fragmentChange, () => {\n if (this.mode == this.constMode2up) {\n // clear highlights if they're no longer valid for this page\n const visibleIndices = [this.twoPage.currentIndexL, this.twoPage.currentIndexR];\n const visibleSelector = visibleIndices.map(i => `.BRReadAloudHilite.Leaf-${i}`).join(', ');\n $(this.ttsHilites).filter(visibleSelector).show();\n $(this.ttsHilites).not(visibleSelector).hide();\n }\n });\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\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 </ul>\n `);\n $el.find('.BRcontrols').prepend(this.refs.$BRReadAloudToolbar);\n this.ttsEngine.events.on('pause resume start', () => this.ttsUpdateState());\n this.refs.$BRReadAloudToolbar.find('[name=play]').click(this.ttsPlayPause.bind(this));\n this.refs.$BRReadAloudToolbar.find('[name=advance]').click(this.ttsJumpForward.bind(this));\n this.refs.$BRReadAloudToolbar.find('[name=review]').click(this.ttsJumpBackward.bind(this));\n const $rateSelector = this.refs.$BRReadAloudToolbar.find('select[name=\"playback-speed\"]');\n $rateSelector.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=\"tooltip\">${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.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(this.ttsEngine.paused);\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 = function(chunk) {\n return this.ttsMaybeFlipToIndex(chunk.leafIndex)\n .then(() => {\n this.ttsHighlightChunk(chunk);\n this.ttsScrollToChunk(chunk);\n });\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 * @return {PromiseLike<void>} resolves once the flip animation has completed\n */\nBookReader.prototype.ttsMaybeFlipToIndex = function (leafIndex) {\n const in2PageMode = this.constMode2up == this.mode;\n let resolve = null;\n const promise = new Promise(res => resolve = res);\n\n if (!in2PageMode) {\n this.jumpToIndex(leafIndex);\n resolve();\n } else {\n const leafVisible = leafIndex == this.twoPage.currentIndexR || leafIndex == this.twoPage.currentIndexL;\n if (leafVisible) {\n resolve();\n } else {\n this.animationFinishedCallback = resolve;\n const mustGoNext = leafIndex > Math.max(this.twoPage.currentIndexR, this.twoPage.currentIndexL);\n if (mustGoNext) this.next();\n else this.prev();\n promise.then(this.ttsMaybeFlipToIndex.bind(this, leafIndex));\n }\n }\n\n return promise;\n}\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsHighlightChunk = function(chunk) {\n this.ttsRemoveHilites();\n\n if (this.constMode2up == this.mode) {\n this.ttsHilite2UP(chunk);\n } else {\n this.ttsHilite1UP(chunk);\n }\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsScrollToChunk = function(chunk) {\n if (this.constMode1up != this.mode) return;\n\n let leafTop = 0;\n let h;\n let i;\n for (i = 0; i < chunk.leafIndex; i++) {\n h = parseInt(this._getPageHeight(i) / this.reduce);\n leafTop += h + this.padding;\n }\n\n const chunkTop = chunk.lineRects[0][3]; //coords are in l,b,r,t order\n const chunkBot = chunk.lineRects[chunk.lineRects.length - 1][1];\n\n const topOfFirstChunk = leafTop + chunkTop / this.reduce;\n const botOfLastChunk = leafTop + chunkBot / this.reduce;\n\n if (window?.soundManager?.debugMode) console.log('leafTop = ' + leafTop + ' topOfFirstChunk = ' + topOfFirstChunk + ' botOfLastChunk = ' + botOfLastChunk);\n\n const containerTop = this.refs.$brContainer.prop('scrollTop');\n const containerBot = containerTop + this.refs.$brContainer.height();\n if (window?.soundManager?.debugMode) console.log('containerTop = ' + containerTop + ' containerBot = ' + containerBot);\n\n if ((topOfFirstChunk < containerTop) || (botOfLastChunk > containerBot)) {\n this.refs.$brContainer.stop(true).animate({scrollTop: topOfFirstChunk},'fast');\n }\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsHilite1UP = function(chunk) {\n for (let i = 0; i < chunk.lineRects.length; i++) {\n //each rect is an array of l,b,r,t coords (djvu.xml ordering...)\n const l = chunk.lineRects[i][0];\n const b = chunk.lineRects[i][1];\n const r = chunk.lineRects[i][2];\n const t = chunk.lineRects[i][3];\n\n const div = document.createElement('div');\n this.ttsHilites.push(div);\n $(div).prop('className', 'BookReaderSearchHilite').appendTo(\n this.$('.pagediv' + chunk.leafIndex)\n );\n\n $(div).css({\n width: (r - l) / this.reduce + 'px',\n height: (b - t) / this.reduce + 'px',\n left: l / this.reduce + 'px',\n top: t / this.reduce + 'px'\n });\n }\n\n};\n\n/**\n * @param {PageChunk} chunk\n */\nBookReader.prototype.ttsHilite2UP = function (chunk) {\n for (let i = 0; i < chunk.lineRects.length; i++) {\n //each rect is an array of l,b,r,t coords (djvu.xml ordering...)\n const l = chunk.lineRects[i][0];\n const b = chunk.lineRects[i][1];\n const r = chunk.lineRects[i][2];\n const t = chunk.lineRects[i][3];\n\n const div = document.createElement('div');\n this.ttsHilites.push(div);\n $(div)\n .prop('className', 'BookReaderSearchHilite BRReadAloudHilite Leaf-' + chunk.leafIndex)\n .css('zIndex', 3)\n .appendTo(this.refs.$brTwoPageView);\n this.setHilightCss2UP(div, chunk.leafIndex, l, r, t, b);\n }\n};\n\n// ttsRemoveHilites()\n//______________________________________________________________________________\nBookReader.prototype.ttsRemoveHilites = function () {\n $(this.ttsHilites).remove();\n this.ttsHilites = [];\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","/* global br */\nimport { isChrome, isFirefox } from '../../util/browserSniffing.js';\nimport { sleep, promisifyEvent, isAndroid } from './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() { return speechSynthesis.getVoices(); }\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 this.utterance.voice = this.voice;\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 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 return this.stop()\n .then(() => {\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\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 finish() {\n this.stop().then(() => this.utterance.dispatchEvent(new Event('finish')));\n }\n\n /**\n * @override\n * Will fire a pause event unless already paused\n **/\n 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 Promise.race([pausePromise, timeoutPromise])\n .then(result => {\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 // if pause might not work, then we'll stop entirely and restart later\n if (pauseMightNotWork) this.stop();\n });\n }\n }\n\n 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 Promise.race([resumePromise, sleep(100).then(() => 'timeout')])\n .then(result => {\n if (result != 'timeout') return;\n\n this.utterance.dispatchEvent(new CustomEvent('resume', {}));\n if (resumeMightNotWork) {\n const reloadPromise = this.reload();\n reloadPromise.then(() => this.play());\n }\n });\n }\n }\n\n setPlaybackRate(rate) {\n this.rate = rate;\n this.reload();\n }\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 _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 return Promise.race([timeoutPromise, pausePromise, endPromise])\n .then(result => {\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 Promise.race([\n promisifyEvent(this.utterance, 'resume'),\n sleep(14000).then(() => 'timeout'),\n ])\n .then(result => {\n result == 'timeout' ? this.reload() : this._chromePausingBugFix();\n });\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 sleep(25)\n .then(() => {\n speechSynthesis.resume();\n this._chromePausingBugFix();\n });\n break;\n }\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","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","\n/**\n * Checks whether the current browser is a Chrome/Chromium browser\n * Code from https://stackoverflow.com/a/4565120/2317712\n * @param {string} [userAgent]\n * @param {string} [vendor]\n * @return {boolean}\n */\nexport function isChrome(userAgent = navigator.userAgent, vendor = navigator.vendor) {\n return /chrome/i.test(userAgent) && /google inc/i.test(vendor);\n}\n\n/**\n * Checks whether the current browser is firefox\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isFirefox(userAgent = navigator.userAgent) {\n return /firefox/i.test(userAgent);\n}\n\n/**\n * Checks whether the current browser is safari\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#Browser_Name\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isSafari(userAgent = navigator.userAgent) {\n return /safari/i.test(userAgent) && !/chrome|chromium/i.test(userAgent);\n}\n","'use strict';\nvar aFunction = require('../internals/a-function');\nvar isObject = require('../internals/is-object');\n\nvar slice = [].slice;\nvar factories = {};\n\nvar construct = function (C, argsLength, args) {\n if (!(argsLength in factories)) {\n for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func -- we have no proper alternatives, IE8- only\n factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');\n } return factories[argsLength](C, args);\n};\n\n// `Function.prototype.bind` method implementation\n// https://tc39.es/ecma262/#sec-function.prototype.bind\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = slice.call(arguments, 1);\n var boundFunction = function bound(/* args... */) {\n var args = partArgs.concat(slice.call(arguments));\n return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);\n };\n if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;\n return boundFunction;\n};\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\n// eslint-disable-next-line es/no-object-assign -- required for testing\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toObject = require('../internals/to-object');\nvar nativeGetPrototypeOf = require('../internals/object-get-prototype-of');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {\n getPrototypeOf: function getPrototypeOf(it) {\n return nativeGetPrototypeOf(toObject(it));\n }\n});\n\n","var $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar aFunction = require('../internals/a-function');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar bind = require('../internals/function-bind');\nvar fails = require('../internals/fails');\n\nvar nativeConstruct = getBuiltIn('Reflect', 'construct');\n\n// `Reflect.construct` method\n// https://tc39.es/ecma262/#sec-reflect.construct\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n nativeConstruct(function () { /* empty */ });\n});\nvar FORCED = NEW_TARGET_BUG || ARGS_BUG;\n\n$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","var $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar has = require('../internals/has');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\n// `Reflect.get` method\n// https://tc39.es/ecma262/#sec-reflect.get\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var descriptor, prototype;\n if (anObject(target) === receiver) return target[propertyKey];\n if (descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey)) return has(descriptor, 'value')\n ? descriptor.value\n : descriptor.get === undefined\n ? undefined\n : descriptor.get.call(receiver);\n if (isObject(prototype = getPrototypeOf(target))) return get(prototype, propertyKey, receiver);\n}\n\n$({ target: 'Reflect', stat: true }, {\n get: get\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\n// eslint-disable-next-line es/no-string-prototype-startswith -- safe\nvar $startsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.es/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\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 &lt;a&gt; object (or similar object literal) based on audio support.\r\n *\r\n * @param {object} oLink an HTML DOM &lt;a&gt; 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"],"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/AbstractTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/FestivalTTSEngine.js","webpack://@internetarchive/bookreader/./src/plugins/tts/utils.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/core-js/internals/number-parse-float.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.parse-float.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"],"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 PageChunkIterator from './PageChunkIterator.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.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._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) {\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 = 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","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","/* 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(this.ttsEngine.paused);\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","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar charAt = uncurryThis(''.charAt);\nvar $parseFloat = global.parseFloat;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar FORCED = 1 / $parseFloat(whitespaces + '-0') !== -Infinity\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { $parseFloat(Object(ITERATOR)); }));\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\nmodule.exports = FORCED ? function parseFloat(string) {\n var trimmedString = trim(toString(string));\n var result = $parseFloat(trimmedString);\n return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result;\n} : $parseFloat;\n","var $ = 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","var $ = require('../internals/export');\nvar $parseFloat = require('../internals/number-parse-float');\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\n$({ global: true, forced: parseFloat != $parseFloat }, {\n parseFloat: $parseFloat\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 &lt;a&gt; object (or similar object literal) based on audio support.\r\n *\r\n * @param {object} oLink an HTML DOM &lt;a&gt; 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"],"names":["_regeneratorRuntime","exports","Op","Object","prototype","hasOwn","hasOwnProperty","defineProperty","obj","key","desc","value","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","type","call","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","result","_typeof","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","state","Error","undefined","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","return","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","doneResult","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_defineProperties","target","props","descriptor","input","hint","prim","toPrimitive","res","String","_toPrimitive","PageChunk","leafIndex","chunkIndex","text","lineRects","instance","Constructor","_classCallCheck","this","staticProps","_fetch","_callee","server","bookPath","chunks","_context","$","ajax","url","concat","dataType","cache","data","path","page","_fromTextWrapperResponse","args","arguments","apply","_x","_x2","_x3","chunksResponse","map","c","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","protoProps","_nextUncontrolled2","_this","_nextUncontrolled","_this2","_decrementUncontrolled","AT_END","_recenterBuffer","_fetchPageChunks","_this3","cursorChangePromise","prevPageChunks","index","Math","max","pageBufferSize","end","min","_removePageFromBuffer","_this4","_fetchPageChunksDirect","fetch","_asyncToGenerator","_toPropertyKey","AbstractTTSEngine","options","voice","getBestBookVoice","getVoices","bookLanguage","playing","paused","_chunkIterator","activeSound","playbackRate","events","on","updateBestVoice","trigger","_step","_jumpBackward","numLeafs","onLoadingStart","step","fireEvent","pause","resume","all","decrement","voiceURI","off","find","localStorage","setItem","setVoice","newRate","setPlaybackRate","_callee2","sound","playPromise","_context2","onDone","createSound","rate","load","onLoadingComplete","beforeChunkPlay","playSound","afterChunkPlay","loaded","play","voices","userLanguages","navigator","languages","bookLangVoices","filter","v","lang","startsWith","matchingUserLangs","language","getMatchingStoredVoice","getMatchingVoice","default","storedVoice","getItem","_step2","_iterator","_createForOfIteratorHelper","_loop","matchingVoices","s","n","_ret","e","f","_createClass","_get","Reflect","get","bind","property","receiver","base","_getPrototypeOf","_superPropBase","getOwnPropertyDescriptor","_setPrototypeOf","o","p","FestivalTTSEngine","_AbstractTTSEngine","subClass","superClass","_inherits","_iOSCaptureUserIntentHack","Derived","hasNativeReflectConstruct","_super","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","Super","NewTarget","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_$$browser","audioFormat","browser","mozilla","localService","soundManager","setup","debugMode","preferFlash","useHTML5Audio","flashVersion","promise","userAgent","match","iOSCaptureUserIntentHack","FestivalTTSSound","getSoundUrl","dataString","encodeURIComponent","SILENCE_1MS","onfinish","destruct","supported","soundUrl","_finishResolver","_play","onload","_onresume","onresume","sleep","_callee3","_context3","mp3","ogg","isAndroid","test","COLUMN_TO_LANG_INDEX","searchForISO6391","columnsToSearch","langs","colI","column","split","x","toLowerCase","indexOf","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","window","started","stopped","utterance","_lastEvents","boundary","_charIndex","_finishPromise","_chromePausingBugFix2","_resume","_pause","_finish","_reload","_this$voice","SpeechSynthesisUtterance","location","toString","console","log","ev","dispatchEvent","CustomEvent","wasPaused","recentEvent","charIndex","cancel","speak","isLocalVoice","isChrome","_chromePausingBugFix","endPromise","race","promisifyEvent","Event","pausePromise","pauseMightNotWork","timeoutPromise","isFirefox","_callee4","resumeMightNotWork","resumeMightNotFire","resumePromise","_context4","reload","_callee5","_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","a","b","localeCompare","renderVoicesMenu","voicesMenu","empty","bookLanguages","sort","otherLanguages","append","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","l","r","t","_Object$entries$_i","_Object$entries","_i2","pageIndexString","boxes","getPage","getActivePageContainerElementsForIndex","container","entries","_$$last","last","scrollIntoView","block","isFullscreenActive","inline","behavior","getActivePageContainerElements","remove","action","archiveAnalyticsSendEvent","extraValues","mediaLanguage","global","fails","uncurryThis","trim","whitespaces","$parseFloat","ITERATOR","FORCED","module","string","trimmedString","$entries","stat","O","forced","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","d","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","len","element","shift","abort","canplay","ee","canplaythrough","durationchange","ended","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","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","getInstance","smBuilder"],"sourceRoot":""}