From d338706cecded101bde969e70bfe516c81ae6f99 Mon Sep 17 00:00:00 2001 From: Michael Deal Date: Wed, 15 Feb 2012 20:46:03 -0800 Subject: [PATCH] let there be midi --- MIDIPlayer.css | 164 + MIDIPlayer.html | 362 ++ README.html | 142 + WhitneyMusicBox.html | 112 + images/backward.png | Bin 0 -> 1890 bytes images/forward.png | Bin 0 -> 1824 bytes images/pause.png | Bin 0 -> 1718 bytes images/play.png | Bin 0 -> 1729 bytes images/shiverMeTimbers.gif | Bin 0 -> 953 bytes images/stop.png | Bin 0 -> 1692 bytes images/tuna.png | Bin 0 -> 192897 bytes inc/SoundManager2/license.txt | 29 + .../script/soundmanager2-jsmin.js | 104 + .../script/soundmanager2-nodebug-jsmin.js | 77 + .../script/soundmanager2-nodebug.js | 2377 ++++++++ inc/SoundManager2/script/soundmanager2.js | 5019 +++++++++++++++++ inc/SoundManager2/swf/soundmanager2.swf | Bin 0 -> 2850 bytes inc/SoundManager2/swf/soundmanager2_debug.swf | Bin 0 -> 3280 bytes .../swf/soundmanager2_flash9.swf | Bin 0 -> 8682 bytes .../swf/soundmanager2_flash9_debug.swf | Bin 0 -> 16806 bytes .../swf/soundmanager2_flash_xdomain.zip | Bin 0 -> 32404 bytes inc/midibridge/README | 39 + inc/midibridge/index.html | 83 + inc/midibridge/java/midiapplet.jar | Bin 0 -> 14830 bytes inc/midibridge/lib/MidiBridge.js | 502 ++ js/Color.js | 154 + js/DOMLoader.XMLHttp.js | 126 + js/DOMLoader.script.js | 131 + js/Event.Mouse.js | 155 + js/Event.js | 203 + js/MIDI.Player.js | 279 + js/MIDI.Plugin.js | 486 ++ js/MIDI.audioDetect.js | 63 + js/MIDI.loadPlugin.js | 95 + js/MusicTheory.Synesthesia.js | 259 + js/MusicTheory.js | 209 + js/VersionControl.Base64.js | 67 + js/Widgets.Loader.js | 181 + js/lib/base64binary.js | 80 + js/lib/jasmid/LICENSE | 24 + js/lib/jasmid/jasmid/LICENSE | 24 + js/lib/jasmid/jasmid/midifile.js | 238 + js/lib/jasmid/jasmid/replayer.js | 83 + js/lib/jasmid/jasmid/stream.js | 68 + js/lib/jasmid/midifile.js | 238 + js/lib/jasmid/replayer.js | 83 + js/lib/jasmid/stream.js | 68 + minimal.html | 31 + soundfont/mp3/A0.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/A7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Ab7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B0.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/B7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb0.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Bb7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/C8.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/D7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Db8.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/E7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Eb7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/F7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/G7.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb1.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb2.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb3.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb4.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb5.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb6.mp3 | Bin 0 -> 12065 bytes soundfont/mp3/Gb7.mp3 | Bin 0 -> 12065 bytes soundfont/soundfont-mp3.js | 91 + soundfont/soundfont-ogg.js | 91 + 139 files changed, 12537 insertions(+) create mode 100644 MIDIPlayer.css create mode 100644 MIDIPlayer.html create mode 100644 README.html create mode 100644 WhitneyMusicBox.html create mode 100644 images/backward.png create mode 100644 images/forward.png create mode 100644 images/pause.png create mode 100644 images/play.png create mode 100644 images/shiverMeTimbers.gif create mode 100644 images/stop.png create mode 100644 images/tuna.png create mode 100755 inc/SoundManager2/license.txt create mode 100755 inc/SoundManager2/script/soundmanager2-jsmin.js create mode 100755 inc/SoundManager2/script/soundmanager2-nodebug-jsmin.js create mode 100755 inc/SoundManager2/script/soundmanager2-nodebug.js create mode 100755 inc/SoundManager2/script/soundmanager2.js create mode 100755 inc/SoundManager2/swf/soundmanager2.swf create mode 100755 inc/SoundManager2/swf/soundmanager2_debug.swf create mode 100755 inc/SoundManager2/swf/soundmanager2_flash9.swf create mode 100755 inc/SoundManager2/swf/soundmanager2_flash9_debug.swf create mode 100755 inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip create mode 100644 inc/midibridge/README create mode 100644 inc/midibridge/index.html create mode 100644 inc/midibridge/java/midiapplet.jar create mode 100644 inc/midibridge/lib/MidiBridge.js create mode 100644 js/Color.js create mode 100644 js/DOMLoader.XMLHttp.js create mode 100644 js/DOMLoader.script.js create mode 100644 js/Event.Mouse.js create mode 100644 js/Event.js create mode 100644 js/MIDI.Player.js create mode 100644 js/MIDI.Plugin.js create mode 100644 js/MIDI.audioDetect.js create mode 100644 js/MIDI.loadPlugin.js create mode 100644 js/MusicTheory.Synesthesia.js create mode 100644 js/MusicTheory.js create mode 100644 js/VersionControl.Base64.js create mode 100644 js/Widgets.Loader.js create mode 100644 js/lib/base64binary.js create mode 100644 js/lib/jasmid/LICENSE create mode 100644 js/lib/jasmid/jasmid/LICENSE create mode 100644 js/lib/jasmid/jasmid/midifile.js create mode 100644 js/lib/jasmid/jasmid/replayer.js create mode 100644 js/lib/jasmid/jasmid/stream.js create mode 100644 js/lib/jasmid/midifile.js create mode 100644 js/lib/jasmid/replayer.js create mode 100644 js/lib/jasmid/stream.js create mode 100644 minimal.html create mode 100644 soundfont/mp3/A0.mp3 create mode 100644 soundfont/mp3/A1.mp3 create mode 100644 soundfont/mp3/A2.mp3 create mode 100644 soundfont/mp3/A3.mp3 create mode 100644 soundfont/mp3/A4.mp3 create mode 100644 soundfont/mp3/A5.mp3 create mode 100644 soundfont/mp3/A6.mp3 create mode 100644 soundfont/mp3/A7.mp3 create mode 100644 soundfont/mp3/Ab1.mp3 create mode 100644 soundfont/mp3/Ab2.mp3 create mode 100644 soundfont/mp3/Ab3.mp3 create mode 100644 soundfont/mp3/Ab4.mp3 create mode 100644 soundfont/mp3/Ab5.mp3 create mode 100644 soundfont/mp3/Ab6.mp3 create mode 100644 soundfont/mp3/Ab7.mp3 create mode 100644 soundfont/mp3/B0.mp3 create mode 100644 soundfont/mp3/B1.mp3 create mode 100644 soundfont/mp3/B2.mp3 create mode 100644 soundfont/mp3/B3.mp3 create mode 100644 soundfont/mp3/B4.mp3 create mode 100644 soundfont/mp3/B5.mp3 create mode 100644 soundfont/mp3/B6.mp3 create mode 100644 soundfont/mp3/B7.mp3 create mode 100644 soundfont/mp3/Bb0.mp3 create mode 100644 soundfont/mp3/Bb1.mp3 create mode 100644 soundfont/mp3/Bb2.mp3 create mode 100644 soundfont/mp3/Bb3.mp3 create mode 100644 soundfont/mp3/Bb4.mp3 create mode 100644 soundfont/mp3/Bb5.mp3 create mode 100644 soundfont/mp3/Bb6.mp3 create mode 100644 soundfont/mp3/Bb7.mp3 create mode 100644 soundfont/mp3/C1.mp3 create mode 100644 soundfont/mp3/C2.mp3 create mode 100644 soundfont/mp3/C3.mp3 create mode 100644 soundfont/mp3/C4.mp3 create mode 100644 soundfont/mp3/C5.mp3 create mode 100644 soundfont/mp3/C6.mp3 create mode 100644 soundfont/mp3/C7.mp3 create mode 100644 soundfont/mp3/C8.mp3 create mode 100644 soundfont/mp3/D1.mp3 create mode 100644 soundfont/mp3/D2.mp3 create mode 100644 soundfont/mp3/D3.mp3 create mode 100644 soundfont/mp3/D4.mp3 create mode 100644 soundfont/mp3/D5.mp3 create mode 100644 soundfont/mp3/D6.mp3 create mode 100644 soundfont/mp3/D7.mp3 create mode 100644 soundfont/mp3/Db1.mp3 create mode 100644 soundfont/mp3/Db2.mp3 create mode 100644 soundfont/mp3/Db3.mp3 create mode 100644 soundfont/mp3/Db4.mp3 create mode 100644 soundfont/mp3/Db5.mp3 create mode 100644 soundfont/mp3/Db6.mp3 create mode 100644 soundfont/mp3/Db7.mp3 create mode 100644 soundfont/mp3/Db8.mp3 create mode 100644 soundfont/mp3/E1.mp3 create mode 100644 soundfont/mp3/E2.mp3 create mode 100644 soundfont/mp3/E3.mp3 create mode 100644 soundfont/mp3/E4.mp3 create mode 100644 soundfont/mp3/E5.mp3 create mode 100644 soundfont/mp3/E6.mp3 create mode 100644 soundfont/mp3/E7.mp3 create mode 100644 soundfont/mp3/Eb1.mp3 create mode 100644 soundfont/mp3/Eb2.mp3 create mode 100644 soundfont/mp3/Eb3.mp3 create mode 100644 soundfont/mp3/Eb4.mp3 create mode 100644 soundfont/mp3/Eb5.mp3 create mode 100644 soundfont/mp3/Eb6.mp3 create mode 100644 soundfont/mp3/Eb7.mp3 create mode 100644 soundfont/mp3/F1.mp3 create mode 100644 soundfont/mp3/F2.mp3 create mode 100644 soundfont/mp3/F3.mp3 create mode 100644 soundfont/mp3/F4.mp3 create mode 100644 soundfont/mp3/F5.mp3 create mode 100644 soundfont/mp3/F6.mp3 create mode 100644 soundfont/mp3/F7.mp3 create mode 100644 soundfont/mp3/G1.mp3 create mode 100644 soundfont/mp3/G2.mp3 create mode 100644 soundfont/mp3/G3.mp3 create mode 100644 soundfont/mp3/G4.mp3 create mode 100644 soundfont/mp3/G5.mp3 create mode 100644 soundfont/mp3/G6.mp3 create mode 100644 soundfont/mp3/G7.mp3 create mode 100644 soundfont/mp3/Gb1.mp3 create mode 100644 soundfont/mp3/Gb2.mp3 create mode 100644 soundfont/mp3/Gb3.mp3 create mode 100644 soundfont/mp3/Gb4.mp3 create mode 100644 soundfont/mp3/Gb5.mp3 create mode 100644 soundfont/mp3/Gb6.mp3 create mode 100644 soundfont/mp3/Gb7.mp3 create mode 100644 soundfont/soundfont-mp3.js create mode 100644 soundfont/soundfont-ogg.js diff --git a/MIDIPlayer.css b/MIDIPlayer.css new file mode 100644 index 0000000..4c4912e --- /dev/null +++ b/MIDIPlayer.css @@ -0,0 +1,164 @@ +body { + font-family: Andada; + font-size: 1.2em; + line-height: 2em; + background: #fcfae9; + color: #907d62; + margin: 0 50px; +} +div.player { + background-image: -webkit-gradient(linear,left top,left bottom,from(rgba(66,66,66,1)),to(rgba(22,22,22,1))); + background-image: -webkit-linear-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); + background-image: -moz-linear-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); + background-image: -ms-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); + background-image: -o-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); + background-image: linear-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); + padding: 15px 20px; + border: 1px solid #000; + box-shadow: 0 0 10px #fff; + -moz-box-shadow: 0 0 10px #fff; + -webkit-box-shadow: 0 0 10px #fff; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + color: #FFFFFF; + color: rgba(255, 255, 255, 0.8); + text-shadow: 1px 1px 2px #000; + -moz-text-shadow: 1px 1px 2px #000; + margin-bottom: 15px; +} +div.player #capsule { + border: 1px solid #000; + box-shadow: 0 0 10px #555; + -moz-box-shadow: 0 0 10px #555; + -webkit-box-shadow: 0 0 10px #555; + background: #000; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1, rgba(0,0,0,0.5)), color-stop(0, #333)); + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); + background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); + background-image: -ms-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); + background-image: -o-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); + background-image: linear-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); + overflow: hidden; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + width: 420px; + display: inline-block; + height: 30px; +} +div.player #capsule #cursor { + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + background: #003b96; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1, #003b96), color-stop(0, #0088e9)); + background-image: -webkit-linear-gradient(top, #003b96 1, #0088e9 0); + background-image: -moz-linear-gradient(top, #003b96 1, #0088e9 0); + background-image: -ms-gradient(top, #003b96 1, #0088e9 0); + background-image: -o-gradient(top, #003b96 1, #0088e9 0); + background-image: linear-gradient(top, #003b96 1, #0088e9 0); + width: 0; + display: inline-block; + height: 100%; +} +div.player span.time { + position: relative; + top: -9px; + padding: 0 10px; + width: 40px; + display: inline-block; + text-align: right; +} +div.player div.time-controls { + width: 560px; + margin: 10px auto 0; +} +input[type="image"]:hover { + opacity: 1; +} +input[type="image"]:active { + opacity: 0.85; +} +input[type="image"] { + opacity: 0.7; +} +p { + margin: 15px 0 0 15px; + color: #403522; +} + li { + color: #403522; +} +li { + margin-bottom: 20px; + color: #000; + background: rgba(255, 0, 0, 0); + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + list-style-type: none; + padding: 2px 10px; +} +pre { + width: 90%; + overflow-x: scroll; + padding: 0; + margin: 0; +} +pre b { + color: #fff; + background: rgba(255, 0, 0, 0.5); + padding: 2px 5px; +} +li.indent { + color: #403522; + background: none; + position: relative; + left: 50px; + list-style-type: none; +} +li.indent.square { + background: none; + list-style-type: square; +} +h3 { + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1, rgba(0, 200, 255, 0.35)), color-stop(0, rgba(0,88,127,0.42))); + color: #fff; + text-shadow: 1px 1px #000; + padding: 2px 10px; + border-bottom: 1px solid rgba(0,0,0,0.3); + border-top: 1px solid rgba(0,0,0,0.6); +} +li a { + color: #000; +} +h3 a { + color: #fff; +} +a, li.indent.demos a { + color: #06f; +} +li a:hover, a:hover, li.indent.demos a:hover { + color: #c09; +} +h3 a:hover { + color: #ff0; +} +h3 { + font-family: Oswald; +} +h1 { + font-family: Oswald; font-size: 2em; font-weight: bold; z-index: 2; padding-left: 15px; position: relative; color: rgba(0,0,0,0.5); text-shadow: 0 0 7px rgba(255,255,0,0.50); +} + + +#colors div { + -webkit-transition-property: background, color; + -webkit-transition-duration: .25s; +padding: 1px 0 1px 5px; font-family: arial; font-size: 9px; line-height: 9px; color: #aaa; width: 30px; height: 9px; + background-image: -webkit-gradient(linear,left top,left bottom,from(rgba(66,66,66,0.75)),to(rgba(0,0,0,1))); +border-bottom: 1px solid rgba(5,5,5,0.7); +} \ No newline at end of file diff --git a/MIDIPlayer.html b/MIDIPlayer.html new file mode 100644 index 0000000..712bf76 --- /dev/null +++ b/MIDIPlayer.html @@ -0,0 +1,362 @@ + + + + + MIDI.js - Sequencing in Javascript. + + + + + + + + + + + + + + + + + + + + + + + + + +

MIDI.js - Sequencing in Javascript.

+
+
+
+
+ + + + +
+
+ 0:00 + + + + -0:00 +
+
+
Loading API...
+

What’s all this hubub?

+

MIDI.js (on github) ties together, and builds upon frameworks that bring MIDI generation to the browser. + Combine it with jasmid to create a web-radio MIDI stream similar to this demo... + or with Three.js, Sparks.js, or GLSL to create Audio/visual experiments. + Piano/guitar simulations, Drum machines, MIDI recording, and all kinds of certified funkitude is within your grasps! +

Google Chrome is recommended for best listening experience, it’s timing perfection! Firefox and Safari can both perform a bit more like the piano has been drinking, arrr.

+

Carpe beerum, and commandeer yer own copy!

+

Description of package;

+
  • MIDI.loadPlugin.js:  Decides which framework is best to use, and sends request.
  • +
  • +
    +// interface to download soundfont, then execute callback;
    +MIDI.loadPlugin(callback, soundfont);
    +// simple example to get started;
    +MIDI.loadPlugin(function() {
    +	MIDI.noteOn(0, 100, 127, 0); // plays note once loaded
    +}, "soundfont/soundfont-ogg-guitar.js");
    +
    +
  • +
  • MIDI.Soundfont.js:  Customizable base64 Soundfont.
  • +
  • Encode your own soundfonts, Drums, Guitars, and so on.
  • +
  • You are listening to Fluid (R3) General MIDI SoundFont (GM).
  • +
  • MIDI.Plugin.js:  Ties together the following frameworks;
  • +
  • +MIDI.noteOn(channel, note, velocity, delay);
    +MIDI.noteOff(channel, note, delay);
    +MIDI.chordOn(channel, chord, velocity, delay);
    +MIDI.chordOff(channel, chord, delay);
    +MIDI.keyToNote = object; // A0 => 21
    +MIDI.noteToKey = object; // 21 => A0
    +
  • +
  • MIDI.Player.js:  Streams the MIDI to the browser. +
  • +
    +MIDI.Player.currentTime = integer; // time we are at now within the song.
    +MIDI.Player.endTime = integer; // time when song ends.
    +MIDI.Player.playing = boolean; // are we playing? yes or no.
    +MIDI.Player.loadFile(file, callback); // load .MIDI from base64 or binary XML request.
    +MIDI.Player.start(); // start the MIDI track (you can put this in the loadFile callback)
    +MIDI.Player.resume(); // resume the MIDI track from pause.
    +MIDI.Player.pause(); // pause the MIDI track.
    +MIDI.Player.stop(); // stops all audio being played, and resets currentTime to 0.
    +Callback whenever a note is played;
    +MIDI.Player.removeListener(); // removes current listener.
    +MIDI.Player.addListener(function(data) { // set it to your own function!
    +	var now = data.now; // where we are now
    +	var end = data.end; // time when song ends
    +	var channel = data.channel; // channel note is playing on
    +	var message = data.message; // 128 is noteOff, 144 is noteOn
    +	var note = data.note; // the note
    +	var velocity = data.velocity; // the velocity of the note
    +	// then do whatever you want with the information!
    +});
    +Smooth animation, interpolates between onMidiEvent calls;
    +MIDI.Player.clearAnimation(); // clears current animation.
    +MIDI.Player.setAnimation(function(data) {
    +	var now = data.now; // where we are now
    +	var end = data.end; // time when song ends
    +	var events = data.events; // all the notes currently being processed
    +	// then do what you want with the information!
    +});
  • + +
  • Color.js:  Color conversions, music isn’t complete without!
  • +
  • Color.Space(0xff0000, "HEX>RGB>HSL");
  • +
  • DOMLoader.script.js:  Loads scripts in synchronously, or asynchronously.
  • +
  • DOMLoader.script.add(src, callback);
  • +
  • DOMLoader.XMLHttp.js:  Cross-browser XMLHttpd request.
  • +
  • DOMLoader.sendRequest(src, callback);
  • +
  • MusicTheory.Synesthesia.js:  Note-to-color mappings (from Isaac Newton onwards).
  • +

    Many thanks to the authors of these libraries;

    +
  • <audio>:  HTML5 specs
  • +
  • WebAudioAPI:  W3C proposal by Google
  • +
  • Java package:  MIDIBridge by Daniel van der Meer
  • +
  • Use this to hook up a MIDI keyboard to your browser!
  • +
  • Access to 128 General MIDI instruments.
  • +
  • Flash package:  SoundManager2 by Scott Schiller
  • +
  • jasmid:  Reads MIDI file byte-code, and translats into a Javascript array.
  • +
  • base642binary.js:  Cleans up XML base64-requests for Web Audio API.
  • +

    Example(s):  Tweet me your app to be included!

    +
  • + Color Piano
    Learn piano songs without reading sheet music. +
    Coded by mud.
  • +
    +
  • + Guitar Player
    Learn how to play chords on the guitar. +
    Coded by mud.
  • +
    +
  • + Whitney Music Box
    Beautiful HTML5 simulation of a Whitney Music Box. +
    Coded by KrazyDad.
  • +
    + + + \ No newline at end of file diff --git a/README.html b/README.html new file mode 100644 index 0000000..c43bd4e --- /dev/null +++ b/README.html @@ -0,0 +1,142 @@ + +

    Description of package;

    +
  • MIDI.loadPlugin.js:  Decides which framework is best to use, and sends request.
  • +
  • +
    +// interface to download soundfont, then execute callback;
    +MIDI.loadPlugin(callback, soundfont);
    +// simple example to get started;
    +MIDI.loadPlugin(function() {
    +	MIDI.noteOn(0, 100, 127, 0); // plays note once loaded
    +}, "soundfont/soundfont-ogg-guitar.js");
    +
    +
  • +
  • MIDI.Soundfont.js:  Customizable base64 Soundfont.
  • +
  • Encode your own soundfonts, Drums, Guitars, and so on.
  • +
  • Share them with the community!
  • +
  • MIDI.Plugin.js:  Ties together the following frameworks;
  • +
  • +MIDI.noteOn(channel, note, velocity, delay);
    +MIDI.noteOff(channel, note, delay);
    +MIDI.chordOn(channel, chord, velocity, delay);
    +MIDI.chordOff(channel, chord, delay);
    +MIDI.keyToNote = object; // A0 => 21
    +MIDI.noteToKey = object; // 21 => A0
    +
  • +
  • MIDI.Player.js:  Streams the MIDI to the browser. +
  • +
    +MIDI.Player.currentTime = integer; // time we are at now within the song.
    +MIDI.Player.endTime = integer; // time when song ends.
    +MIDI.Player.playing = boolean; // are we playing? yes or no.
    +MIDI.Player.loadFile(file, callback); // load .MIDI from base64 or binary XML request.
    +MIDI.Player.start(); // start the MIDI track (you can put this in the loadFile callback)
    +MIDI.Player.resume(); // resume the MIDI track from pause.
    +MIDI.Player.pause(); // pause the MIDI track.
    +MIDI.Player.stop(); // stops all audio being played, and resets currentTime to 0.
    +Callback whenever a note is played;
    +MIDI.Player.removeListener(); // removes current listener.
    +MIDI.Player.addListener(function(data) { // set it to your own function!
    +	var now = data.now; // where we are now
    +	var end = data.end; // time when song ends
    +	var channel = data.channel; // channel note is playing on
    +	var message = data.message; // 128 is noteOff, 144 is noteOn
    +	var note = data.note; // the note
    +	var velocity = data.velocity; // the velocity of the note
    +	// then do whatever you want with the information!
    +});
    +Smooth animation, interpolates between onMidiEvent calls;
    +MIDI.Player.clearAnimation(); // clears current animation.
    +MIDI.Player.setAnimation(function(data) {
    +	var now = data.now; // where we are now
    +	var end = data.end; // time when song ends
    +	var events = data.events; // all the notes currently being processed
    +	// then do what you want with the information!
    +});
  • + +
  • Color.js:  Color conversions, music isn’t complete without!
  • +
  • Color.Space(0xff0000, "HEX>RGB>HSL");
  • +
  • DOMLoader.script.js:  Loads scripts in synchronously, or asynchronously.
  • +
  • DOMLoader.script.add(src, callback);
  • +
  • DOMLoader.XMLHttp.js:  Cross-browser XMLHttpd request.
  • +
  • DOMLoader.sendRequest(src, callback);
  • +
  • MusicTheory.Synesthesia.js:  Note-to-color mappings (from Isaac Newton onwards).
  • +

    Many thanks to the authors of these libraries;

    +
  • <audio>:  HTML5 specs
  • +
  • WebAudioAPI:  W3C proposal by Google
  • +
  • Java package:  MIDIBridge by Daniel van der Meer
  • +
  • Use this to hook up a MIDI keyboard to your browser!
  • +
  • Access to 128 General MIDI instruments.
  • +
  • Flash package:  SoundManager2 by Scott Schiller
  • +
  • jasmid:  Reads MIDI file byte-code, and translats into a Javascript array.
  • +
  • base642binary.js:  Cleans up XML base64-requests for Web Audio API.
  • + diff --git a/WhitneyMusicBox.html b/WhitneyMusicBox.html new file mode 100644 index 0000000..f06ccad --- /dev/null +++ b/WhitneyMusicBox.html @@ -0,0 +1,112 @@ + + + +Whitney Music Box in HTML5 + + + + + + + + + + + + + + + + + + +Whitney Music Box animation in HTML5.
    +Graphics code by Jim Bumgardner.
    +Audio created with MIDI.js
    + + + + \ No newline at end of file diff --git a/images/backward.png b/images/backward.png new file mode 100644 index 0000000000000000000000000000000000000000..e021903ba9607f28ce2f3fd93377c92c3365b6dc GIT binary patch literal 1890 zcmV-o2c7tdP)yq=qpHx|xB`d~-3(?{R@N;_N=i#Vefrce zdGh2IhI8l6{f~)>`Jb4W`2WtGJO5dxPMs>_>FN0dq+D59nGqm>z_xUEcZ2ZWU%!6+ z|Muwy^KJBlnIF z&Z)p!i?S?T7=~WdvMf+aVHgJA6wt(j1sY?J=ed8UX+j*wUj%}^&-0ABt|6sF(=?zw zJR1F7L{(L{EX$t9aUe+&-W4cszpFG&1yj7XZNs{*7{?JD7}NB9Z%&a~YeCB2Q51P@ zs*A4cuH5huK;Urb>+8c71l2$s2*k#q&<=G4fD`+K2@@Ff_4OH~q@)-e92^)*OG_EV#Kah2YCs0OeEE_A?uCqu3-uuz(k)fnahb1ONiCR`o6kgkk&V?Nc@Adh3e;@Ck6DSG?h-4!kH~3Ew zFCfwVuL)wLIf1E!)oNAY-27g^!4)8aJMjAx3c1))EI&vdM4?v~XdY0UQa7K^n+qYfj?4(l^ zQ;)Cte6F3O(`gBUKw7QVQyj*(cDude+-&a_E=f(P(r(91d$iDJ(28 z^~=1%4h<&71`sC=d^j8$gTdg33_Z-}^KZ8TD3{CTy?wf9JRZNnY@r}b`rA?ghAi1^ zHskd4)M&Tcn1#EALSb?tfKsW%IvoX$axn?O6K5R&WgzCVtDTFLIJ0Kpcruxk{eHiuiWv};zCtU= zX0wLfZr6{%YH_(Lk!XT+dnFlTXaQq@&^^x@5jm#QDe<3gtb$xF$K_)pkvJe2?!feB zSFs8J&+k^N^;K@)lJcEfGr%Px>-D|tY3|XMO`|~V{zV5!Io#pnsAaF$`z%AZ>-GB2 zjSQsIX{!njVzJns=~T^Dz6}f?HD^pqqy_S>aD)#&5KH{#w@R2wr7ntjQ_h#dizvo~ z8dFE$6kPuxx^7%?wk(Usw{U<#?k=8>US97X0!R> cziG$6070vN*haTjH~;_u07*qoM6N<$f@e%|i2wiq literal 0 HcmV?d00001 diff --git a/images/forward.png b/images/forward.png new file mode 100644 index 0000000000000000000000000000000000000000..3046db338efd5caa80b0d4644b0f35956478ae85 GIT binary patch literal 1824 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 M07*qoM6N<$f(@P_b^rhX literal 0 HcmV?d00001 diff --git a/images/play.png b/images/play.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cda72f2cb383b746e560622e86db49d45a7eef GIT binary patch literal 1729 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
    AkPg@JID*wc1Dj>P&-T);#`#^bCf5=lm~7|6== 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 DKjvxN literal 0 HcmV?d00001 diff --git a/inc/SoundManager2/license.txt b/inc/SoundManager2/license.txt new file mode 100755 index 0000000..1a17182 --- /dev/null +++ b/inc/SoundManager2/license.txt @@ -0,0 +1,29 @@ +Software License Agreement (BSD License) + +Copyright (c) 2007, Scott Schiller (schillmania.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of schillmania.com nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission from schillmania.com. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/inc/SoundManager2/script/soundmanager2-jsmin.js b/inc/SoundManager2/script/soundmanager2-jsmin.js new file mode 100755 index 0000000..e8b14ae --- /dev/null +++ b/inc/SoundManager2/script/soundmanager2-jsmin.js @@ -0,0 +1,104 @@ +/** @license + + + SoundManager 2: JavaScript Sound for the Web + ---------------------------------------------- + http://schillmania.com/projects/soundmanager2/ + + Copyright (c) 2007, Scott Schiller. All rights reserved. + Code provided under the BSD License: + http://schillmania.com/projects/soundmanager2/license.txt + + V2.97a.20111220 +*/ +(function(G){function W(W,la){function l(b){return function(a){var d=this._t;return!d||!d._a?(d&&d.sID?c._wD(k+"ignoring "+a.type+": "+d.sID):c._wD(k+"ignoring "+a.type),null):b.call(this,a)}}this.flashVersion=8;this.debugMode=!0;this.debugFlash=!1;this.consoleOnly=this.useConsole=!0;this.waitForWindowLoad=!1;this.bgColor="#ffffff";this.useHighPerformance=!1;this.html5PollingInterval=this.flashPollingInterval=null;this.flashLoadTimeout=1E3;this.wmode=null;this.allowScriptAccess="always";this.useFlashBlock= +!1;this.useHTML5Audio=!0;this.html5Test=/^(probably|maybe)$/i;this.preferFlash=!0;this.noSWFCache=!1;this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}}; +this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null, +duration:null};this.movieID="sm2-container";this.id=la||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20111220";this.movieURL=this.version=null;this.url=W||null;this.altURL=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1, +movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};var ma;try{ma="undefined"!==typeof Audio&&"undefined"!==typeof(new Audio).canPlayType}catch(fb){ma=!1}this.hasHTML5=ma;this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only= +!1;var Ea,c=this,i=null,k="HTML5::",u,p=navigator.userAgent,j=G,O=j.location.href.toString(),h=document,na,X,m,B=[],oa=!0,w,P=!1,Q=!1,n=!1,y=!1,Y=!1,o,Za=0,R,v,pa,H,I,Z,Fa,qa,E,$,aa,J,ra,sa,ba,ca,K,Ga,ta,$a=["log","info","warn","error"],Ha,da,Ia,S=null,ua=null,q,va,L,Ja,ea,fa,wa,s,ga=!1,xa=!1,Ka,La,Ma,ha=0,T=null,ia,z=null,Na,ja,U,C,ya,za,Oa,r,Pa=Array.prototype.slice,F=!1,t,ka,Qa,A,Ra,Aa=p.match(/(ipad|iphone|ipod)/i),ab=p.match(/firefox/i),bb=p.match(/droid/i),D=p.match(/msie/i),cb=p.match(/webkit/i), +V=p.match(/safari/i)&&!p.match(/chrome/i),db=p.match(/opera/i),Ba=p.match(/(mobile|pre\/|xoom)/i)||Aa,Ca=!O.match(/usehtml5audio/i)&&!O.match(/sm2\-ignorebadua/i)&&V&&!p.match(/silk/i)&&p.match(/OS X 10_6_([3-7])/i),Sa="undefined"!==typeof console&&"undefined"!==typeof console.log,Da="undefined"!==typeof h.hasFocus?h.hasFocus():null,M=V&&"undefined"===typeof h.hasFocus,Ta=!M,Ua=/(mp3|mp4|mpa)/i,N=h.location?h.location.protocol.match(/http/i):null,Va=!N?"http://":"",Wa=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i, +Xa="mpeg4,aac,flv,mov,mp4,m4v,f4v,m4a,mp4v,3gp,3g2".split(","),eb=RegExp("\\.("+Xa.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!N;this._global_a=null;if(Ba&&(c.useHTML5Audio=!0,c.preferFlash=!1,Aa))F=c.ignoreFlash=!0;this.supported=this.ok=function(){return z?n&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return u(c)||h[c]||j[c]};this.createSound=function(b){function a(){f=ea(f);c.sounds[e.id]=new Ea(e);c.soundIDs.push(e.id); +return c.sounds[e.id]}var d,f=null,e=d=null;d="soundManager.createSound(): "+q(!n?"notReady":"notOK");if(!n||!c.ok())return wa(d),!1;2===arguments.length&&(b={id:arguments[0],url:arguments[1]});f=v(b);f.url=ia(f.url);e=f;e.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+q("badID",e.id),2);c._wD("soundManager.createSound(): "+e.id+" ("+e.url+")",1);if(s(e.id,!0))return c._wD("soundManager.createSound(): "+e.id+" exists",1),c.sounds[e.id];if(ja(e))d=a(),c._wD("Loading sound "+ +e.id+" via HTML5"),d._setup_html5(e);else{if(8=b)return!1;for(;b--;)if(c=x[b],!c.fired&&a.position>=c.position)c.fired=!0,l++,c.method.apply(c.scope,[c.position]);return!0};this._resetOnPosition=function(a){var b,c;b=x.length;if(!b)return!1;for(;b--;)if(c=x[b],c.fired&&a<=c.position)c.fired=!1,l--;return!0};r=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.sID+': "to" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.sID+ +': playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};if(null!==d&&!isNaN(d))b.position=d,b.multiShot=!1,f();return b};Ya=function(){var b=a._iO.onposition;if(b)for(var c in b)if(b.hasOwnProperty(c))a.onPosition(parseInt(c,10),b[c])};n=function(){var b=a._iO.onposition;if(b)for(var c in b)b.hasOwnProperty(c)&&a.clearOnPosition(parseInt(c,10))};g=function(){a.isHTML5&&Ka(a)};h=function(){a.isHTML5&&La(a)};d=function(){x=[];l=0;j=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded= +null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null};d();this._onTimer=function(b){var c,d=!1,e={};if(a._hasTimer||b){if(a._a&&(b||(0f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),void 0===a.durationEstimate)a.durationEstimate=a.duration;3!==a.readyState&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)|| +null===b)return!1;a.position=b;a._processOnPosition();if(!a.isHTML5&&8m)c._wD(q("needfl9")),c.flashVersion=m=9;c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(P&&Q)return!1;if(c.html5Only)return qa(),d(),c.oMC=u(c.movieID),X(),Q=P=!0,!1;var e=a||c.url,i=c.altURL||e,g;g=ba();var j,m,k=L(),l,n=null,n=(n=h.getElementsByTagName("html")[0])&&n.dir&&n.dir.match(/rtl/i),b="undefined"===typeof b?c.id:b;qa();c.url=Ia(N?e:i);a=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;if(null!==c.wmode&&(p.match(/msie 8/i)||!D&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))o("spcWmode"), +c.wmode=null;g={name:b,id:b,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:Va+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)g.FlashVars="debug=1";c.wmode||delete g.wmode;if(D)e=h.createElement("div"),m=['',f("movie",a),f("AllowScriptAccess",c.allowScriptAccess),f("quality",g.quality),c.wmode?f("wmode",c.wmode):"",f("bgcolor",c.bgColor),f("hasPriority","true"),c.debugFlash?f("FlashVars",g.FlashVars):"",""].join("");else for(j in e=h.createElement("embed"),g)g.hasOwnProperty(j)&&e.setAttribute(j,g[j]);ta();k=L();if(g=ba())if(c.oMC=u(c.movieID)||h.createElement("div"), +c.oMC.id){l=c.oMC.className;c.oMC.className=(l?l+" ":"movieContainer")+(k?" "+k:"");c.oMC.appendChild(e);if(D)j=c.oMC.appendChild(h.createElement("div")),j.className="sm2-object-box",j.innerHTML=m;Q=!0}else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+k;j=k=null;if(!c.useFlashBlock)if(c.useHighPerformance)k={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"};else if(k={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},n)k.left=Math.abs(parseInt(k.left, +10))+"px";if(cb)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(l in k)k.hasOwnProperty(l)&&(c.oMC.style[l]=k[l]);try{D||c.oMC.appendChild(e);g.appendChild(c.oMC);if(D)j=c.oMC.appendChild(h.createElement("div")),j.className="sm2-object-box",j.innerHTML=m;Q=!0}catch(r){throw Error(q("domError")+" \n"+r.toString());}}P=!0;d();c._wD("soundManager::createMovie(): Trying to load "+a+(!N&&c.altURL?" (alternate URL)":""),1);return!0};aa=function(){if(c.html5Only)return ca(),!1;if(i)return!1;i=c.getMovie(c.id); +if(!i)S?(D?c.oMC.innerHTML=ua:c.oMC.appendChild(S),S=null,P=!0):ca(c.id,c.url),i=c.getMovie(c.id);i&&o("waitEI");c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};Z=function(){setTimeout(Fa,1E3)};Fa=function(){if(ga)return!1;ga=!0;r.remove(j,"load",Z);if(M&&!Da)return o("waitFocus"),!1;var b;n||(b=c.getMoviePercent(),c._wD(q("waitImpatient",100===b?" (SWF loaded)":0=b)return!1;for(;b--;)if(c=t[b],!c.fired&&a.position>=c.position)c.fired=!0,l++,c.method.apply(c.scope,[c.position]);return!0};this._resetOnPosition=function(a){var b,c;b=t.length;if(!b)return!1;for(;b--;)if(c=t[b],c.fired&&a<=c.position)c.fired=!1,l--;return!0};p=function(){var b=a._iO,c=b.from,d=b.to,e,f;f=function(){a.clearOnPosition(d,f);a.stop()};e= +function(){if(null!==d&&!isNaN(d))a.onPosition(d,f)};if(null!==c&&!isNaN(c))b.position=c,b.multiShot=!1,e();return b};j=function(){var b=a._iO.onposition;if(b)for(var c in b)if(b.hasOwnProperty(c))a.onPosition(parseInt(c,10),b[c])};n=function(){var b=a._iO.onposition;if(b)for(var c in b)b.hasOwnProperty(c)&&a.clearOnPosition(parseInt(c,10))};z=function(){a.isHTML5&&Fa(a)};g=function(){a.isHTML5&&Ga(a)};e=function(){t=[];l=0;k=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal= +null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null};e();this._onTimer=function(b){var c,d=!1,e={};if(a._hasTimer||b){if(a._a&&(b||(0f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),void 0===a.durationEstimate)a.durationEstimate=a.duration;3!==a.readyState&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)||null===b)return!1;a.position=b;a._processOnPosition();if(!a.isHTML5&&8i)c.flashVersion=i=9;c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===i?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(K&&L)return!1;if(c.html5Only)return ka(),c.oMC=S(c.movieID),T(),L=K=!0,!1;var f=a||c.url,d=c.altURL||f,g;g=na();var h,j,i=H(),l,m=null,m=(m=k.getElementsByTagName("html")[0])&&m.dir&&m.dir.match(/rtl/i),b="undefined"===typeof b?c.id:b;ka();c.url=Ea(za?f:d);a=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent": +c.wmode;if(null!==c.wmode&&(p.match(/msie 8/i)||!y&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))c.wmode=null;g={name:b,id:b,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:Oa+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)g.FlashVars="debug=1";c.wmode||delete g.wmode;if(y)f=k.createElement("div"), +j=['',e("movie",a),e("AllowScriptAccess",c.allowScriptAccess),e("quality",g.quality),c.wmode?e("wmode",c.wmode):"",e("bgcolor",c.bgColor),e("hasPriority","true"),c.debugFlash?e("FlashVars",g.FlashVars):"",""].join("");else for(h in f= +k.createElement("embed"),g)g.hasOwnProperty(h)&&f.setAttribute(h,g[h]);oa();i=H();if(g=na())if(c.oMC=S(c.movieID)||k.createElement("div"),c.oMC.id){l=c.oMC.className;c.oMC.className=(l?l+" ":"movieContainer")+(i?" "+i:"");c.oMC.appendChild(f);if(y)h=c.oMC.appendChild(k.createElement("div")),h.className="sm2-object-box",h.innerHTML=j;L=!0}else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+i;h=i=null;if(!c.useFlashBlock)if(c.useHighPerformance)i={position:"fixed",width:"8px",height:"8px",bottom:"0px", +left:"0px",overflow:"hidden"};else if(i={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},m)i.left=Math.abs(parseInt(i.left,10))+"px";if(Ua)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(l in i)i.hasOwnProperty(l)&&(c.oMC.style[l]=i[l]);try{y||c.oMC.appendChild(f);g.appendChild(c.oMC);if(y)h=c.oMC.appendChild(k.createElement("div")),h.className="sm2-object-box",h.innerHTML=j;L=!0}catch(n){throw Error(G("domError")+" \n"+n.toString());}}return K=!0};V=function(){if(c.html5Only)return W(), +!1;if(h)return!1;h=c.getMovie(c.id);if(!h)N?(y?c.oMC.innerHTML=pa:c.oMC.appendChild(N),N=null,K=!0):W(c.id,c.url),h=c.getMovie(c.id);c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};U=function(){setTimeout(Ba,1E3)};Ba=function(){if($)return!1;$=!0;n.remove(j,"load",U);if(I&&!ya)return!1;var b;m||(b=c.getMoviePercent());setTimeout(function(){b=c.getMoviePercent();!m&&Ma&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&qa():X(!0):0!==c.flashLoadTimeout&&X(!0))}, +c.flashLoadTimeout)};A=function(){function b(){n.remove(j,"focus",A);n.remove(j,"load",A)}if(ya||!I)return b(),!0;ya=Ma=!0;Q&&I&&n.remove(j,"mousemove",A);$=!1;b();return!0};La=function(){var b,a=[];if(c.useHTML5Audio&&c.hasHTML5)for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&a.push(b+": "+c.html5[b]+(!c.html5[b]&&r&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&r?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required?"required, ":"")+"and no flash support)":""))}; +M=function(b){if(m)return!1;if(c.html5Only)return m=!0,D(),!0;var a;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())m=!0,w&&(a={type:!r&&s?"NO_FLASH":"INIT_TIMEOUT"});if(w||b){if(c.useFlashBlock&&c.oMC)c.oMC.className=H()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error");C({type:"ontimeout",error:a});F(a);return!1}if(c.waitForWindowLoad&&!ia)return n.add(j,"load",D),!1;D();return!0};T=function(){if(m)return!1;if(c.html5Only){if(!m)n.remove(j,"load",c.beginDelayedInit),c.enabled= +!0,M();return!0}V();try{h._externalInterfaceTest(!1),Ca(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||h._disableDebug(),c.enabled=!0,c.html5Only||n.add(j,"unload",ha)}catch(b){return F({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),X(!0),M(),!1}M();n.remove(j,"load",c.beginDelayedInit);return!0};E=function(){if(ma)return!1;ma=!0;oa();if(!r&&c.hasHTML5)c.useHTML5Audio=!0,c.preferFlash=!1;Ja();c.html5.usingFlash=Ia();s=c.html5.usingFlash;La();if(!r&&s)c.flashLoadTimeout=1;k.removeEventListener&& +k.removeEventListener("DOMContentLoaded",E,!1);V();return!0};ua=function(){"complete"===k.readyState&&(E(),k.detachEvent("onreadystatechange",ua));return!0};la=function(){ia=!0;n.remove(j,"load",la)};da();n.add(j,"focus",A);n.add(j,"load",A);n.add(j,"load",U);n.add(j,"load",la);Q&&I&&n.add(j,"mousemove",A);k.addEventListener?k.addEventListener("DOMContentLoaded",E,!1):k.attachEvent?k.attachEvent("onreadystatechange",ua):F({type:"NO_DOM2_EVENTS",fatal:!0});"complete"===k.readyState&&setTimeout(E,100)} +var ea=null;if("undefined"===typeof SM2_DEFER||!SM2_DEFER)ea=new R;J.SoundManager=R;J.soundManager=ea})(window); \ No newline at end of file diff --git a/inc/SoundManager2/script/soundmanager2-nodebug.js b/inc/SoundManager2/script/soundmanager2-nodebug.js new file mode 100755 index 0000000..ba81243 --- /dev/null +++ b/inc/SoundManager2/script/soundmanager2-nodebug.js @@ -0,0 +1,2377 @@ +/** @license + * + * SoundManager 2: JavaScript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20111220 + */ + +/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */ +/* jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */ + +(function(window) { +var soundManager = null; +function SoundManager(smURL, smID) { + this.flashVersion = 8; + this.debugMode = false; + this.debugFlash = false; + this.useConsole = true; + this.consoleOnly = true; + this.waitForWindowLoad = false; + this.bgColor = '#ffffff'; + this.useHighPerformance = false; + this.flashPollingInterval = null; + this.html5PollingInterval = null; + this.flashLoadTimeout = 1000; + this.wmode = null; + this.allowScriptAccess = 'always'; + this.useFlashBlock = false; + this.useHTML5Audio = true; + this.html5Test = /^(probably|maybe)$/i; + this.preferFlash = true; + this.noSWFCache = false; + this.audioFormats = { + 'mp3': { + 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], + 'required': true + }, + 'mp4': { + 'related': ['aac','m4a'], + 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], + 'required': false + }, + 'ogg': { + 'type': ['audio/ogg; codecs=vorbis'], + 'required': false + }, + 'wav': { + 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], + 'required': false + } + }; + this.defaultOptions = { + 'autoLoad': false, + 'autoPlay': false, + 'from': null, + 'loops': 1, + 'onid3': null, + 'onload': null, + 'whileloading': null, + 'onplay': null, + 'onpause': null, + 'onresume': null, + 'whileplaying': null, + 'onposition': null, + 'onstop': null, + 'onfailure': null, + 'onfinish': null, + 'multiShot': true, + 'multiShotEvents': false, + 'position': null, + 'pan': 0, + 'stream': true, + 'to': null, + 'type': null, + 'usePolicyFile': false, + 'volume': 100 + }; + this.flash9Options = { + 'isMovieStar': null, + 'usePeakData': false, + 'useWaveformData': false, + 'useEQData': false, + 'onbufferchange': null, + 'ondataerror': null + }; + this.movieStarOptions = { + 'bufferTime': 3, + 'serverURL': null, + 'onconnect': null, + 'duration': null + }; + this.movieID = 'sm2-container'; + this.id = (smID || 'sm2movie'); + this.debugID = 'soundmanager-debug'; + this.debugURLParam = /([#?&])debug=1/i; + this.versionNumber = 'V2.97a.20111220'; + this.version = null; + this.movieURL = null; + this.url = (smURL || null); + this.altURL = null; + this.swfLoaded = false; + this.enabled = false; + this.oMC = null; + this.sounds = {}; + this.soundIDs = []; + this.muted = false; + this.didFlashBlock = false; + this.filePattern = null; + this.filePatterns = { + 'flash8': /\.mp3(\?.*)?$/i, + 'flash9': /\.mp3(\?.*)?$/i + }; + this.features = { + 'buffering': false, + 'peakData': false, + 'waveformData': false, + 'eqData': false, + 'movieStar': false + }; + this.sandbox = { + }; + this.hasHTML5 = (function() { + try { + return (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined'); + } catch(e) { + return false; + } + }()); + this.html5 = { + 'usingFlash': null + }; + this.flash = {}; + this.html5Only = false; + this.ignoreFlash = false; + var SMSound, + _s = this, _flash = null, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _doc = document, _doNothing, _init, _fV, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _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, _smTimer, _onTimer, _startTimer, _stopTimer, _timerExecute, _h5TimerCount = 0, _h5IntervalTimer = null, _parseURL, + _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext, _html5Unload, _domContentLoadedIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport, + _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _is_firefox = _ua.match(/firefox/i), _is_android = _ua.match(/droid/i), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), + _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice), + _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && !_ua.match(/silk/i) && _ua.match(/OS X 10_6_([3-7])/i)), + _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i, + _emptyURL = 'about:blank', + _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null), + _http = (!_overHTTP ? 'http:/'+'/' : ''), + _netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i, + _netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2'], + _netStreamPattern = new RegExp('\\.(' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; + this.useAltURL = !_overHTTP; + this._global_a = null; + _swfCSS = { + 'swfBox': 'sm2-object-box', + 'swfDefault': 'movieContainer', + 'swfError': 'swf_error', + 'swfTimedout': 'swf_timedout', + 'swfLoaded': 'swf_loaded', + 'swfUnblocked': 'swf_unblocked', + 'sm2Debug': 'sm2_debug', + 'highPerf': 'high_performance', + 'flashDebug': 'flash_debug' + }; + if (_likesHTML5) { + _s.useHTML5Audio = true; + _s.preferFlash = false; + if (_is_iDevice) { + _s.ignoreFlash = true; + _useGlobalHTML5Audio = true; + } + } + this.ok = function() { + return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); + }; + this.supported = this.ok; + this.getMovie = function(smID) { + return _id(smID) || _doc[smID] || _win[smID]; + }; + this.createSound = function(oOptions) { + var _cs, _cs_string, + thisOptions = null, oSound = null, _tO = null; + if (!_didInit || !_s.ok()) { + _complain(_cs_string); + return false; + } + if (arguments.length === 2) { + oOptions = { + 'id': arguments[0], + 'url': arguments[1] + }; + } + thisOptions = _mixin(oOptions); + thisOptions.url = _parseURL(thisOptions.url); + _tO = thisOptions; + if (_idCheck(_tO.id, true)) { + return _s.sounds[_tO.id]; + } + function make() { + thisOptions = _loopFix(thisOptions); + _s.sounds[_tO.id] = new SMSound(_tO); + _s.soundIDs.push(_tO.id); + return _s.sounds[_tO.id]; + } + if (_html5OK(_tO)) { + oSound = make(); + oSound._setup_html5(_tO); + } else { + if (_fV > 8) { + if (_tO.isMovieStar === null) { + _tO.isMovieStar = (_tO.serverURL || (_tO.type ? _tO.type.match(_netStreamMimeTypes) : false) || _tO.url.match(_netStreamPattern)); + } + if (_tO.isMovieStar) { + if (_tO.usePeakData) { + _tO.usePeakData = false; + } + } + } + _tO = _policyFix(_tO, _cs); + oSound = make(); + if (_fV === 8) { + _flash._createSound(_tO.id, _tO.loops||1, _tO.usePolicyFile); + } else { + _flash._createSound(_tO.id, _tO.url, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile); + if (!_tO.serverURL) { + oSound.connected = true; + if (_tO.onconnect) { + _tO.onconnect.apply(oSound); + } + } + } + if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) { + oSound.load(_tO); + } + } + if (!_tO.serverURL && _tO.autoPlay) { + oSound.play(); + } + return oSound; + }; + this.destroySound = function(sID, _bFromSound) { + if (!_idCheck(sID)) { + return false; + } + var oS = _s.sounds[sID], i; + oS._iO = {}; + oS.stop(); + oS.unload(); + for (i = 0; i < _s.soundIDs.length; i++) { + if (_s.soundIDs[i] === sID) { + _s.soundIDs.splice(i, 1); + break; + } + } + if (!_bFromSound) { + oS.destruct(true); + } + oS = null; + delete _s.sounds[sID]; + return true; + }; + this.load = function(sID, oOptions) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].load(oOptions); + }; + this.unload = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].unload(); + }; + this.onPosition = function(sID, nPosition, oMethod, oScope) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].onposition(nPosition, oMethod, oScope); + }; + this.onposition = this.onPosition; + this.clearOnPosition = function(sID, nPosition, oMethod) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].clearOnPosition(nPosition, oMethod); + }; + this.play = function(sID, oOptions) { + if (!_didInit || !_s.ok()) { + _complain(_sm+'.play(): ' + _str(!_didInit?'notReady':'notOK')); + return false; + } + if (!_idCheck(sID)) { + if (!(oOptions instanceof Object)) { + oOptions = { + url: oOptions + }; + } + if (oOptions && oOptions.url) { + oOptions.id = sID; + return _s.createSound(oOptions).play(); + } else { + return false; + } + } + return _s.sounds[sID].play(oOptions); + }; + this.start = this.play; + this.setPosition = function(sID, nMsecOffset) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPosition(nMsecOffset); + }; + this.stop = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].stop(); + }; + this.stopAll = function() { + var oSound; + for (oSound in _s.sounds) { + if (_s.sounds.hasOwnProperty(oSound)) { + _s.sounds[oSound].stop(); + } + } + }; + this.pause = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].pause(); + }; + this.pauseAll = function() { + var i; + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].pause(); + } + }; + this.resume = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].resume(); + }; + this.resumeAll = function() { + var i; + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].resume(); + } + }; + this.togglePause = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].togglePause(); + }; + this.setPan = function(sID, nPan) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPan(nPan); + }; + this.setVolume = function(sID, nVol) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setVolume(nVol); + }; + this.mute = function(sID) { + var i = 0; + if (typeof sID !== 'string') { + sID = null; + } + if (!sID) { + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].mute(); + } + _s.muted = true; + } else { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].mute(); + } + return true; + }; + this.muteAll = function() { + _s.mute(); + }; + this.unmute = function(sID) { + var i; + if (typeof sID !== 'string') { + sID = null; + } + if (!sID) { + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].unmute(); + } + _s.muted = false; + } else { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].unmute(); + } + return true; + }; + this.unmuteAll = function() { + _s.unmute(); + }; + this.toggleMute = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].toggleMute(); + }; + this.getMemoryUse = function() { + var ram = 0; + if (_flash && _fV !== 8) { + ram = parseInt(_flash._getMemoryUse(), 10); + } + return ram; + }; + this.disable = function(bNoDisable) { + var i; + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + if (_disabled) { + return false; + } + _disabled = true; + for (i = _s.soundIDs.length; i--;) { + _disableObject(_s.sounds[_s.soundIDs[i]]); + } + _initComplete(bNoDisable); + _event.remove(_win, 'load', _initUserOnload); + return true; + }; + this.canPlayMIME = function(sMIME) { + var result; + if (_s.hasHTML5) { + result = _html5CanPlay({type:sMIME}); + } + if (!_needsFlash || result) { + return result; + } else { + return (sMIME ? !!((_fV > 8 ? sMIME.match(_netStreamMimeTypes) : null) || sMIME.match(_s.mimePattern)) : null); + } + }; + this.canPlayURL = function(sURL) { + var result; + if (_s.hasHTML5) { + result = _html5CanPlay({url: sURL}); + } + if (!_needsFlash || result) { + return result; + } else { + return (sURL ? !!(sURL.match(_s.filePattern)) : null); + } + }; + this.canPlayLink = function(oLink) { + if (typeof oLink.type !== 'undefined' && oLink.type) { + if (_s.canPlayMIME(oLink.type)) { + return true; + } + } + return _s.canPlayURL(oLink.href); + }; + this.getSoundById = function(sID, _suppressDebug) { + if (!sID) { + throw new Error(_sm+'.getSoundById(): sID is null/undefined'); + } + var result = _s.sounds[sID]; + return result; + }; + this.onready = function(oMethod, oScope) { + var sType = 'onready'; + if (oMethod && oMethod instanceof Function) { + if (!oScope) { + oScope = _win; + } + _addOnEvent(sType, oMethod, oScope); + _processOnEvents(); + return true; + } else { + throw _str('needFunction', sType); + } + }; + this.ontimeout = function(oMethod, oScope) { + var sType = 'ontimeout'; + if (oMethod && oMethod instanceof Function) { + if (!oScope) { + oScope = _win; + } + _addOnEvent(sType, oMethod, oScope); + _processOnEvents({type:sType}); + return true; + } else { + throw _str('needFunction', sType); + } + }; + this._writeDebug = function(sText, sType, _bTimestamp) { + return true; + }; + this._wD = this._writeDebug; + this._debug = function() { + }; + this.reboot = function() { + var i, j; + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].destruct(); + } + try { + if (_isIE) { + _oRemovedHTML = _flash.innerHTML; + } + _oRemoved = _flash.parentNode.removeChild(_flash); + } catch(e) { + } + _oRemovedHTML = _oRemoved = _needsFlash = null; + _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; + _s.soundIDs = _s.sounds = []; + _flash = null; + for (i in _on_queue) { + if (_on_queue.hasOwnProperty(i)) { + for (j = _on_queue[i].length; j--;) { + _on_queue[i][j].fired = false; + } + } + } + _win.setTimeout(_s.beginDelayedInit, 20); + }; + this.getMoviePercent = function() { + return (_flash && typeof _flash.PercentLoaded !== 'undefined' ? _flash.PercentLoaded() : null); + }; + this.beginDelayedInit = function() { + _windowLoaded = true; + _domContentLoaded(); + setTimeout(function() { + if (_initPending) { + return false; + } + _createMovie(); + _initMovie(); + _initPending = true; + return true; + }, 20); + _delayWaitForEI(); + }; + this.destruct = function() { + _s.disable(true); + }; + SMSound = function(oOptions) { + var _t = 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; + var _lastHTML5State = { + duration: null, + time: null + }; + this.sID = oOptions.id; + this.url = oOptions.url; + this.options = _mixin(oOptions); + this.instanceOptions = this.options; + this._iO = this.instanceOptions; + this.pan = this.options.pan; + this.volume = this.options.volume; + this.isHTML5 = false; + this._a = null; + this.id3 = {}; + this._debug = function() { + }; + this.load = function(oOptions) { + var oS = null, _iO; + if (typeof oOptions !== 'undefined') { + _t._iO = _mixin(oOptions, _t.options); + _t.instanceOptions = _t._iO; + } else { + oOptions = _t.options; + _t._iO = oOptions; + _t.instanceOptions = _t._iO; + if (_lastURL && _lastURL !== _t.url) { + _t._iO.url = _t.url; + _t.url = null; + } + } + if (!_t._iO.url) { + _t._iO.url = _t.url; + } + _t._iO.url = _parseURL(_t._iO.url); + if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { + if (_t.readyState === 3 && _t._iO.onload) { + _t._iO.onload.apply(_t, [(!!_t.duration)]); + } + return _t; + } + _iO = _t._iO; + _lastURL = _t.url; + _t.loaded = false; + _t.readyState = 1; + _t.playState = 0; + if (_html5OK(_iO)) { + oS = _t._setup_html5(_iO); + if (!oS._called_load) { + _t._html5_canplay = false; + _t._a.autobuffer = 'auto'; + _t._a.preload = 'auto'; + oS.load(); + oS._called_load = true; + if (_iO.autoPlay) { + _t.play(); + } + } else { + } + } else { + try { + _t.isHTML5 = false; + _t._iO = _policyFix(_loopFix(_iO)); + _iO = _t._iO; + if (_fV === 8) { + _flash._load(_t.sID, _iO.url, _iO.stream, _iO.autoPlay, (_iO.whileloading?1:0), _iO.loops||1, _iO.usePolicyFile); + } else { + _flash._load(_t.sID, _iO.url, !!(_iO.stream), !!(_iO.autoPlay), _iO.loops||1, !!(_iO.autoLoad), _iO.usePolicyFile); + } + } catch(e) { + _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); + } + } + return _t; + }; + this.unload = function() { + if (_t.readyState !== 0) { + if (!_t.isHTML5) { + if (_fV === 8) { + _flash._unload(_t.sID, _emptyURL); + } else { + _flash._unload(_t.sID); + } + } else { + _stop_html5_timer(); + if (_t._a) { + _t._a.pause(); + _html5Unload(_t._a); + } + } + _resetProperties(); + } + return _t; + }; + this.destruct = function(_bFromSM) { + if (!_t.isHTML5) { + _t._iO.onfailure = null; + _flash._destroySound(_t.sID); + } else { + _stop_html5_timer(); + if (_t._a) { + _t._a.pause(); + _html5Unload(_t._a); + if (!_useGlobalHTML5Audio) { + _remove_html5_events(); + } + _t._a._t = null; + _t._a = null; + } + } + if (!_bFromSM) { + _s.destroySound(_t.sID, true); + } + }; + this.play = function(oOptions, _updatePlayState) { + var fN, allowMulti, a, onready; + _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; + if (!oOptions) { + oOptions = {}; + } + _t._iO = _mixin(oOptions, _t._iO); + _t._iO = _mixin(_t._iO, _t.options); + _t._iO.url = _parseURL(_t._iO.url); + _t.instanceOptions = _t._iO; + if (_t._iO.serverURL && !_t.connected) { + if (!_t.getAutoPlay()) { + _t.setAutoPlay(true); + } + return _t; + } + if (_html5OK(_t._iO)) { + _t._setup_html5(_t._iO); + _start_html5_timer(); + } + if (_t.playState === 1 && !_t.paused) { + allowMulti = _t._iO.multiShot; + if (!allowMulti) { + return _t; + } else { + } + } + if (!_t.loaded) { + if (_t.readyState === 0) { + if (!_t.isHTML5) { + _t._iO.autoPlay = true; + } + _t.load(_t._iO); + } else if (_t.readyState === 2) { + return _t; + } else { + } + } else { + } + if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) { + oOptions.position = 0; + } + if (_t.paused && _t.position && _t.position > 0) { + _t.resume(); + } else { + _t._iO = _mixin(oOptions, _t._iO); + if (_t._iO.from !== null && _t._iO.to !== null && _t.instanceCount === 0 && _t.playState === 0 && !_t._iO.serverURL) { + onready = function() { + _t._iO = _mixin(oOptions, _t._iO); + _t.play(_t._iO); + }; + if (_t.isHTML5 && !_t._html5_canplay) { + _t.load({ + _oncanplay: onready + }); + return false; + } else if (!_t.isHTML5 && !_t.loaded && (!_t.readyState || _t.readyState !== 2)) { + _t.load({ + onload: onready + }); + return false; + } + _t._iO = _applyFromTo(); + } + if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) { + _t.instanceCount++; + } + if (_t.playState === 0 && _t._iO.onposition) { + _attachOnPosition(_t); + } + _t.playState = 1; + _t.paused = false; + _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position) ? _t._iO.position : 0); + if (!_t.isHTML5) { + _t._iO = _policyFix(_loopFix(_t._iO)); + } + if (_t._iO.onplay && _updatePlayState) { + _t._iO.onplay.apply(_t); + _onplay_called = true; + } + _t.setVolume(_t._iO.volume, true); + _t.setPan(_t._iO.pan, true); + if (!_t.isHTML5) { + _flash._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000)); + } else { + _start_html5_timer(); + a = _t._setup_html5(); + _t.setPosition(_t._iO.position); + a.play(); + } + } + return _t; + }; + this.start = this.play; + this.stop = function(bAll) { + var _iO = _t._iO, _oP; + if (_t.playState === 1) { + _t._onbufferchange(0); + _t._resetOnPosition(0); + _t.paused = false; + if (!_t.isHTML5) { + _t.playState = 0; + } + _detachOnPosition(); + if (_iO.to) { + _t.clearOnPosition(_iO.to); + } + if (!_t.isHTML5) { + _flash._stop(_t.sID, bAll); + if (_iO.serverURL) { + _t.unload(); + } + } else { + if (_t._a) { + _oP = _t.position; + _t.setPosition(0); + _t.position = _oP; + _t._a.pause(); + _t.playState = 0; + _t._onTimer(); + _stop_html5_timer(); + } + } + _t.instanceCount = 0; + _t._iO = {}; + if (_iO.onstop) { + _iO.onstop.apply(_t); + } + } + return _t; + }; + this.setAutoPlay = function(autoPlay) { + _t._iO.autoPlay = autoPlay; + if (!_t.isHTML5) { + _flash._setAutoPlay(_t.sID, autoPlay); + if (autoPlay) { + if (!_t.instanceCount && _t.readyState === 1) { + _t.instanceCount++; + } + } + } + }; + this.getAutoPlay = function() { + return _t._iO.autoPlay; + }; + this.setPosition = function(nMsecOffset) { + if (nMsecOffset === undefined) { + nMsecOffset = 0; + } + var original_pos, + position, position1K, + offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); + original_pos = _t.position; + _t.position = offset; + position1K = _t.position/1000; + _t._resetOnPosition(_t.position); + _t._iO.position = offset; + if (!_t.isHTML5) { + position = (_fV === 9 ? _t.position : position1K); + if (_t.readyState && _t.readyState !== 2) { + _flash._setPosition(_t.sID, position, (_t.paused || !_t.playState)); + } + } else if (_t._a) { + if (_t._html5_canplay) { + if (_t._a.currentTime !== position1K) { + try { + _t._a.currentTime = position1K; + if (_t.playState === 0 || _t.paused) { + _t._a.pause(); + } + } catch(e) { + } + } + } else { + } + } + if (_t.isHTML5) { + if (_t.paused) { + _t._onTimer(true); + } + } + return _t; + }; + this.pause = function(_bCallFlash) { + if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { + return _t; + } + _t.paused = true; + if (!_t.isHTML5) { + if (_bCallFlash || _bCallFlash === undefined) { + _flash._pause(_t.sID); + } + } else { + _t._setup_html5().pause(); + _stop_html5_timer(); + } + if (_t._iO.onpause) { + _t._iO.onpause.apply(_t); + } + return _t; + }; + this.resume = function() { + var _iO = _t._iO; + if (!_t.paused) { + return _t; + } + _t.paused = false; + _t.playState = 1; + if (!_t.isHTML5) { + if (_iO.isMovieStar && !_iO.serverURL) { + _t.setPosition(_t.position); + } + _flash._pause(_t.sID); + } else { + _t._setup_html5().play(); + _start_html5_timer(); + } + if (_onplay_called && _iO.onplay) { + _iO.onplay.apply(_t); + _onplay_called = true; + } else if (_iO.onresume) { + _iO.onresume.apply(_t); + } + return _t; + }; + this.togglePause = function() { + if (_t.playState === 0) { + _t.play({ + position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000) + }); + return _t; + } + if (_t.paused) { + _t.resume(); + } else { + _t.pause(); + } + return _t; + }; + this.setPan = function(nPan, bInstanceOnly) { + if (typeof nPan === 'undefined') { + nPan = 0; + } + if (typeof bInstanceOnly === 'undefined') { + bInstanceOnly = false; + } + if (!_t.isHTML5) { + _flash._setPan(_t.sID, nPan); + } + _t._iO.pan = nPan; + if (!bInstanceOnly) { + _t.pan = nPan; + _t.options.pan = nPan; + } + return _t; + }; + this.setVolume = function(nVol, _bInstanceOnly) { + if (typeof nVol === 'undefined') { + nVol = 100; + } + if (typeof _bInstanceOnly === 'undefined') { + _bInstanceOnly = false; + } + if (!_t.isHTML5) { + _flash._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); + } else if (_t._a) { + _t._a.volume = Math.max(0, Math.min(1, nVol/100)); + } + _t._iO.volume = nVol; + if (!_bInstanceOnly) { + _t.volume = nVol; + _t.options.volume = nVol; + } + return _t; + }; + this.mute = function() { + _t.muted = true; + if (!_t.isHTML5) { + _flash._setVolume(_t.sID, 0); + } else if (_t._a) { + _t._a.muted = true; + } + return _t; + }; + this.unmute = function() { + _t.muted = false; + var hasIO = typeof _t._iO.volume !== 'undefined'; + if (!_t.isHTML5) { + _flash._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); + } else if (_t._a) { + _t._a.muted = false; + } + return _t; + }; + this.toggleMute = function() { + return (_t.muted?_t.unmute():_t.mute()); + }; + this.onPosition = function(nPosition, oMethod, oScope) { + _onPositionItems.push({ + position: nPosition, + method: oMethod, + scope: (typeof oScope !== 'undefined' ? oScope : _t), + fired: false + }); + return _t; + }; + this.onposition = this.onPosition; + this.clearOnPosition = function(nPosition, oMethod) { + var i; + nPosition = parseInt(nPosition, 10); + if (isNaN(nPosition)) { + return false; + } + for (i=0; i < _onPositionItems.length; i++) { + if (nPosition === _onPositionItems[i].position) { + if (!oMethod || (oMethod === _onPositionItems[i].method)) { + if (_onPositionItems[i].fired) { + _onPositionFired--; + } + _onPositionItems.splice(i, 1); + } + } + } + }; + this._processOnPosition = function() { + var i, item, j = _onPositionItems.length; + if (!j || !_t.playState || _onPositionFired >= j) { + return false; + } + for (i=j; i--;) { + item = _onPositionItems[i]; + if (!item.fired && _t.position >= item.position) { + item.fired = true; + _onPositionFired++; + item.method.apply(item.scope, [item.position]); + } + } + return true; + }; + this._resetOnPosition = function(nPosition) { + var i, item, j = _onPositionItems.length; + if (!j) { + return false; + } + for (i=j; i--;) { + item = _onPositionItems[i]; + if (item.fired && nPosition <= item.position) { + item.fired = false; + _onPositionFired--; + } + } + return true; + }; + _applyFromTo = function() { + var _iO = _t._iO, + f = _iO.from, + t = _iO.to, + start, end; + end = function() { + _t.clearOnPosition(t, end); + _t.stop(); + }; + start = function() { + if (t !== null && !isNaN(t)) { + _t.onPosition(t, end); + } + }; + if (f !== null && !isNaN(f)) { + _iO.position = f; + _iO.multiShot = false; + start(); + } + return _iO; + }; + _attachOnPosition = function() { + var op = _t._iO.onposition; + if (op) { + var item; + for (item in op) { + if (op.hasOwnProperty(item)) { + _t.onPosition(parseInt(item, 10), op[item]); + } + } + } + }; + _detachOnPosition = function() { + var op = _t._iO.onposition; + if (op) { + var item; + for (item in op) { + if (op.hasOwnProperty(item)) { + _t.clearOnPosition(parseInt(item, 10)); + } + } + } + }; + _start_html5_timer = function() { + if (_t.isHTML5) { + _startTimer(_t); + } + }; + _stop_html5_timer = function() { + if (_t.isHTML5) { + _stopTimer(_t); + } + }; + _resetProperties = function() { + _onPositionItems = []; + _onPositionFired = 0; + _onplay_called = false; + _t._hasTimer = null; + _t._a = null; + _t._html5_canplay = false; + _t.bytesLoaded = null; + _t.bytesTotal = null; + _t.duration = (_t._iO && _t._iO.duration ? _t._iO.duration : null); + _t.durationEstimate = null; + _t.eqData = []; + _t.eqData.left = []; + _t.eqData.right = []; + _t.failures = 0; + _t.isBuffering = false; + _t.instanceOptions = {}; + _t.instanceCount = 0; + _t.loaded = false; + _t.metadata = {}; + _t.readyState = 0; + _t.muted = false; + _t.paused = false; + _t.peakData = { + left: 0, + right: 0 + }; + _t.waveformData = { + left: [], + right: [] + }; + _t.playState = 0; + _t.position = null; + }; + _resetProperties(); + this._onTimer = function(bForce) { + var duration, isNew = false, time, x = {}; + if (_t._hasTimer || bForce) { + if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { + duration = _t._get_html5_duration(); + if (duration !== _lastHTML5State.duration) { + _lastHTML5State.duration = duration; + _t.duration = duration; + isNew = true; + } + _t.durationEstimate = _t.duration; + time = (_t._a.currentTime * 1000 || 0); + if (time !== _lastHTML5State.time) { + _lastHTML5State.time = time; + isNew = true; + } + if (isNew || bForce) { + _t._whileplaying(time,x,x,x,x); + } + return isNew; + } else { + return false; + } + } + }; + this._get_html5_duration = function() { + var _iO = _t._iO, + d = (_t._a ? _t._a.duration*1000 : (_iO ? _iO.duration : undefined)), + result = (d && !isNaN(d) && d !== Infinity ? d : (_iO ? _iO.duration : null)); + return result; + }; + this._setup_html5 = function(oOptions) { + var _iO = _mixin(_t._iO, oOptions), d = decodeURI, + _a = _useGlobalHTML5Audio ? _s._global_a : _t._a, + _dURL = d(_iO.url), + _oldIO = (_a && _a._t ? _a._t.instanceOptions : null); + if (_a) { + if (_a._t) { + if (!_useGlobalHTML5Audio && _dURL === d(_lastURL)) { + return _a; + } else if (_useGlobalHTML5Audio && _oldIO.url === _iO.url && (!_lastURL || (_lastURL === _oldIO.url))) { + return _a; + } + } + if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) { + _a._t.stop(); + } + _resetProperties(); + _a.src = _iO.url; + _t.url = _iO.url; + _lastURL = _iO.url; + _a._called_load = false; + } else { + _a = new Audio(_iO.url); + _a._called_load = false; + if (_is_android) { + _a._called_load = true; + } + if (_useGlobalHTML5Audio) { + _s._global_a = _a; + } + } + _t.isHTML5 = true; + _t._a = _a; + _a._t = _t; + _add_html5_events(); + _a.loop = (_iO.loops>1?'loop':''); + if (_iO.autoLoad || _iO.autoPlay) { + _t.load(); + } else { + _a.autobuffer = false; + _a.preload = 'none'; + } + _a.loop = (_iO.loops > 1 ? 'loop' : ''); + return _a; + }; + _add_html5_events = function() { + if (_t._a._added_events) { + return false; + } + var f; + function add(oEvt, oFn, bCapture) { + return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null; + } + _t._a._added_events = true; + for (f in _html5_events) { + if (_html5_events.hasOwnProperty(f)) { + add(f, _html5_events[f]); + } + } + return true; + }; + _remove_html5_events = function() { + var f; + function remove(oEvt, oFn, bCapture) { + return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null); + } + _t._a._added_events = false; + for (f in _html5_events) { + if (_html5_events.hasOwnProperty(f)) { + remove(f, _html5_events[f]); + } + } + }; + this._onload = function(nSuccess) { + var fN, loadOK = !!(nSuccess); + _t.loaded = loadOK; + _t.readyState = loadOK?3:2; + _t._onbufferchange(0); + if (_t._iO.onload) { + _t._iO.onload.apply(_t, [loadOK]); + } + return true; + }; + this._onbufferchange = function(nIsBuffering) { + if (_t.playState === 0) { + return false; + } + if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { + return false; + } + _t.isBuffering = (nIsBuffering === 1); + if (_t._iO.onbufferchange) { + _t._iO.onbufferchange.apply(_t); + } + return true; + }; + this._onsuspend = function() { + if (_t._iO.onsuspend) { + _t._iO.onsuspend.apply(_t); + } + return true; + }; + this._onfailure = function(msg, level, code) { + _t.failures++; + if (_t._iO.onfailure && _t.failures === 1) { + _t._iO.onfailure(_t, msg, level, code); + } else { + } + }; + this._onfinish = function() { + var _io_onfinish = _t._iO.onfinish; + _t._onbufferchange(0); + _t._resetOnPosition(0); + if (_t.instanceCount) { + _t.instanceCount--; + if (!_t.instanceCount) { + _detachOnPosition(); + _t.playState = 0; + _t.paused = false; + _t.instanceCount = 0; + _t.instanceOptions = {}; + _t._iO = {}; + _stop_html5_timer(); + } + if (!_t.instanceCount || _t._iO.multiShotEvents) { + if (_io_onfinish) { + _io_onfinish.apply(_t); + } + } + } + }; + this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { + var _iO = _t._iO; + _t.bytesLoaded = nBytesLoaded; + _t.bytesTotal = nBytesTotal; + _t.duration = Math.floor(nDuration); + _t.bufferLength = nBufferLength; + if (!_iO.isMovieStar) { + if (_iO.duration) { + _t.durationEstimate = (_t.duration > _iO.duration) ? _t.duration : _iO.duration; + } else { + _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); + } + if (_t.durationEstimate === undefined) { + _t.durationEstimate = _t.duration; + } + if (_t.readyState !== 3 && _iO.whileloading) { + _iO.whileloading.apply(_t); + } + } else { + _t.durationEstimate = _t.duration; + if (_t.readyState !== 3 && _iO.whileloading) { + _iO.whileloading.apply(_t); + } + } + }; + this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { + var _iO = _t._iO; + if (isNaN(nPosition) || nPosition === null) { + return false; + } + _t.position = nPosition; + _t._processOnPosition(); + if (!_t.isHTML5 && _fV > 8) { + if (_iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { + _t.peakData = { + left: oPeakData.leftPeak, + right: oPeakData.rightPeak + }; + } + if (_iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { + _t.waveformData = { + left: oWaveformDataLeft.split(','), + right: oWaveformDataRight.split(',') + }; + } + if (_iO.useEQData) { + if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { + var eqLeft = oEQData.leftEQ.split(','); + _t.eqData = eqLeft; + _t.eqData.left = eqLeft; + if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { + _t.eqData.right = oEQData.rightEQ.split(','); + } + } + } + } + if (_t.playState === 1) { + if (!_t.isHTML5 && _fV === 8 && !_t.position && _t.isBuffering) { + _t._onbufferchange(0); + } + if (_iO.whileplaying) { + _iO.whileplaying.apply(_t); + } + } + return true; + }; + this._onmetadata = function(oMDProps, oMDData) { + var oData = {}, i, j; + for (i = 0, j = oMDProps.length; i < j; i++) { + oData[oMDProps[i]] = oMDData[i]; + } + _t.metadata = oData; + if (_t._iO.onmetadata) { + _t._iO.onmetadata.apply(_t); + } + }; + this._onid3 = function(oID3Props, oID3Data) { + var oData = [], i, j; + for (i = 0, j = oID3Props.length; i < j; i++) { + oData[oID3Props[i]] = oID3Data[i]; + } + _t.id3 = _mixin(_t.id3, oData); + if (_t._iO.onid3) { + _t._iO.onid3.apply(_t); + } + }; + this._onconnect = function(bSuccess) { + bSuccess = (bSuccess === 1); + _t.connected = bSuccess; + if (bSuccess) { + _t.failures = 0; + if (_idCheck(_t.sID)) { + if (_t.getAutoPlay()) { + _t.play(undefined, _t.getAutoPlay()); + } else if (_t._iO.autoLoad) { + _t.load(); + } + } + if (_t._iO.onconnect) { + _t._iO.onconnect.apply(_t, [bSuccess]); + } + } + }; + this._ondataerror = function(sError) { + if (_t.playState > 0) { + if (_t._iO.ondataerror) { + _t._iO.ondataerror.apply(_t); + } + } + }; + }; + _getDocument = function() { + return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]); + }; + _id = function(sID) { + return _doc.getElementById(sID); + }; + _mixin = function(oMain, oAdd) { + var o1 = {}, i, o2, o; + for (i in oMain) { + if (oMain.hasOwnProperty(i)) { + o1[i] = oMain[i]; + } + } + o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); + for (o in o2) { + if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { + o1[o] = o2[o]; + } + } + return o1; + }; + _event = (function() { + var old = (_win.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + function getArgs(oArgs) { + var args = _slice.call(oArgs), len = args.length; + if (old) { + args[1] = 'on' + args[1]; + if (len > 3) { + args.pop(); + } + } else if (len === 3) { + args.push(false); + } + return args; + } + function apply(args, sType) { + var element = args.shift(), + method = [evt[sType]]; + if (old) { + element[method](args[0], args[1]); + } else { + element[method].apply(element, args); + } + } + function add() { + apply(getArgs(arguments), 'add'); + } + function remove() { + apply(getArgs(arguments), 'remove'); + } + return { + 'add': add, + 'remove': remove + }; + }()); + function _html5_event(oFn) { + return function(e) { + var t = this._t; + if (!t || !t._a) { + return null; + } else { + return oFn.call(this, e); + } + }; + } + _html5_events = { + abort: _html5_event(function(e) { + }), + canplay: _html5_event(function(e) { + var t = this._t; + if (t._html5_canplay) { + return true; + } + t._html5_canplay = true; + t._onbufferchange(0); + var position1K = (!isNaN(t.position)?t.position/1000:null); + if (t.position && this.currentTime !== position1K) { + try { + this.currentTime = position1K; + } catch(ee) { + } + } + if (t._iO._oncanplay) { + t._iO._oncanplay(); + } + }), + load: _html5_event(function(e) { + var t = this._t; + if (!t.loaded) { + t._onbufferchange(0); + t._whileloading(t.bytesTotal, t.bytesTotal, t._get_html5_duration()); + t._onload(true); + } + }), + emptied: _html5_event(function(e) { + }), + ended: _html5_event(function(e) { + var t = this._t; + t._onfinish(); + }), + error: _html5_event(function(e) { + this._t._onload(false); + }), + loadeddata: _html5_event(function(e) { + var t = this._t, + bytesTotal = t.bytesTotal || 1; + if (!t._loaded && !_isSafari) { + t.duration = t._get_html5_duration(); + t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration()); + t._onload(true); + } + }), + loadedmetadata: _html5_event(function(e) { + }), + loadstart: _html5_event(function(e) { + this._t._onbufferchange(1); + }), + play: _html5_event(function(e) { + this._t._onbufferchange(0); + }), + playing: _html5_event(function(e) { + this._t._onbufferchange(0); + }), + progress: _html5_event(function(e) { + var t = this._t; + if (t.loaded) { + return false; + } + var i, j, str, buffered = 0, + isProgress = (e.type === 'progress'), + ranges = e.target.buffered, + loaded = (e.loaded||0), + total = (e.total||1); + if (ranges && ranges.length) { + for (i=ranges.length; i--;) { + buffered = (ranges.end(i) - ranges.start(i)); + } + loaded = buffered/e.target.duration; + } + if (!isNaN(loaded)) { + t._onbufferchange(0); + t._whileloading(loaded, total, t._get_html5_duration()); + if (loaded && total && loaded === total) { + _html5_events.load.call(this, e); + } + } + }), + ratechange: _html5_event(function(e) { + }), + suspend: _html5_event(function(e) { + var t = this._t; + _html5_events.progress.call(this, e); + t._onsuspend(); + }), + stalled: _html5_event(function(e) { + }), + timeupdate: _html5_event(function(e) { + this._t._onTimer(); + }), + waiting: _html5_event(function(e) { + var t = this._t; + t._onbufferchange(1); + }) + }; + _html5OK = function(iO) { + return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only)); + }; + _html5Unload = function(oAudio) { + if (oAudio) { + oAudio.src = (_is_firefox ? '' : _emptyURL); + } + }; + _html5CanPlay = function(o) { + if (!_s.useHTML5Audio || !_s.hasHTML5) { + return false; + } + var url = (o.url || null), + mime = (o.type || null), + aF = _s.audioFormats, + result, + offset, + fileExt, + item; + function preferFlashCheck(kind) { + return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind])); + } + if (mime && _s.html5[mime] !== 'undefined') { + return (_s.html5[mime] && !preferFlashCheck(mime)); + } + if (!_html5Ext) { + _html5Ext = []; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + _html5Ext.push(item); + if (aF[item].related) { + _html5Ext = _html5Ext.concat(aF[item].related); + } + } + } + _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i'); + } + fileExt = (url ? url.toLowerCase().match(_html5Ext) : null); + if (!fileExt || !fileExt.length) { + if (!mime) { + return false; + } else { + offset = mime.indexOf(';'); + fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); + } + } else { + fileExt = fileExt[1]; + } + if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { + return (_s.html5[fileExt] && !preferFlashCheck(fileExt)); + } else { + mime = 'audio/'+fileExt; + result = _s.html5.canPlayType({type:mime}); + _s.html5[fileExt] = result; + return (result && _s.html5[mime] && !preferFlashCheck(mime)); + } + }; + _testHTML5 = function() { + if (!_s.useHTML5Audio || typeof Audio === 'undefined') { + return false; + } + var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null), + item, support = {}, aF, i; + function _cp(m) { + var canPlay, i, j, isOK = false; + if (!a || typeof a.canPlayType !== 'function') { + return false; + } + if (m instanceof Array) { + for (i=0, j=m.length; i 1 && sOpt.stream) { + sOpt.stream = false; + } + return sOpt; + }; + _policyFix = function(sOpt, sPre) { + if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { + sOpt.usePolicyFile = true; + } + return sOpt; + }; + _complain = function(sMsg) { + }; + _doNothing = function() { + return false; + }; + _disableObject = function(o) { + var oProp; + for (oProp in o) { + if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { + o[oProp] = _doNothing; + } + } + oProp = null; + }; + _failSafely = function(bNoDisable) { + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + if (_disabled || bNoDisable) { + _s.disable(bNoDisable); + } + }; + _normalizeMovieURL = function(smURL) { + var urlParams = null, url; + if (smURL) { + if (smURL.match(/\.swf(\?.*)?$/i)) { + urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); + if (urlParams) { + return smURL; + } + } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { + smURL += '/'; + } + } + url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + _s.movieURL; + if (_s.noSWFCache) { + url += ('?ts=' + new Date().getTime()); + } + return url; + }; + _setVersionInfo = function() { + _fV = parseInt(_s.flashVersion, 10); + if (_fV !== 8 && _fV !== 9) { + _s.flashVersion = _fV = _defaultFlashVersion; + } + var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); + if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _fV < 9) { + _s.flashVersion = _fV = 9; + } + _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); + if (_fV > 8) { + _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); + _s.features.buffering = true; + _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); + _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + _s.features.movieStar = true; + } else { + _s.features.movieStar = false; + } + _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; + _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); + _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); + }; + _setPolling = function(bPolling, bHighPerformance) { + if (!_flash) { + return false; + } + _flash._setPolling(bPolling, bHighPerformance); + }; + _initDebug = function() { + if (_s.debugURLParam.test(_wl)) { + _s.debugMode = true; + } + }; + _idCheck = this.getSoundById; + _getSWFCSS = function() { + var css = []; + if (_s.debugMode) { + css.push(_swfCSS.sm2Debug); + } + if (_s.debugFlash) { + css.push(_swfCSS.flashDebug); + } + if (_s.useHighPerformance) { + css.push(_swfCSS.highPerf); + } + return css.join(' '); + }; + _flashBlockHandler = function() { + var name = _str('fbHandler'), + p = _s.getMoviePercent(), + css = _swfCSS, + error = {type:'FLASHBLOCK'}; + if (_s.html5Only) { + return false; + } + if (!_s.ok()) { + if (_needsFlash) { + _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); + } + _s.didFlashBlock = true; + _processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); + _catchError(error); + } else { + if (_s.oMC) { + _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); + } + } + }; + _addOnEvent = function(sType, oMethod, oScope) { + if (typeof _on_queue[sType] === 'undefined') { + _on_queue[sType] = []; + } + _on_queue[sType].push({ + 'method': oMethod, + 'scope': (oScope || null), + 'fired': false + }); + }; + _processOnEvents = function(oOptions) { + if (!oOptions) { + oOptions = { + type: 'onready' + }; + } + if (!_didInit && oOptions && !oOptions.ignoreInit) { + return false; + } + if (oOptions.type === 'ontimeout' && _s.ok()) { + return false; + } + var status = { + success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled) + }, + srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), + queue = [], i, j, + args = [status], + canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok()); + if (oOptions.error) { + args[0].error = oOptions.error; + } + for (i = 0, j = srcQueue.length; i < j; i++) { + if (srcQueue[i].fired !== true) { + queue.push(srcQueue[i]); + } + } + if (queue.length) { + for (i = 0, j = queue.length; i < j; i++) { + if (queue[i].scope) { + queue[i].method.apply(queue[i].scope, args); + } else { + queue[i].method.apply(this, args); + } + if (!canRetry) { + queue[i].fired = true; + } + } + } + return true; + }; + _initUserOnload = function() { + _win.setTimeout(function() { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + _processOnEvents(); + if (_s.onload instanceof Function) { + _s.onload.apply(_win); + } + if (_s.waitForWindowLoad) { + _event.add(_win, 'load', _initUserOnload); + } + },1); + }; + _detectFlash = function() { + if (_hasFlash !== undefined) { + return _hasFlash; + } + var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject; + if (nP && nP.length) { + type = 'application/x-shockwave-flash'; + types = n.mimeTypes; + if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { + hasPlugin = true; + } + } else if (typeof AX !== 'undefined') { + try { + obj = new AX('ShockwaveFlash.ShockwaveFlash'); + } catch(e) { + } + hasPlugin = (!!obj); + } + _hasFlash = hasPlugin; + return hasPlugin; + }; + _featureCheck = function() { + var needsFlash, item, + isSpecial = (_is_iDevice && !!(_ua.match(/os (1|2|3_0|3_1)/i))); + if (isSpecial) { + _s.hasHTML5 = false; + _s.html5Only = true; + if (_s.oMC) { + _s.oMC.style.display = 'none'; + } + return false; + } + if (_s.useHTML5Audio) { + if (!_s.html5 || !_s.html5.canPlayType) { + _s.hasHTML5 = false; + return true; + } else { + _s.hasHTML5 = true; + } + if (_isBadSafari) { + if (_detectFlash()) { + return true; + } + } + } else { + return true; + } + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item)) { + if ((_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) { + needsFlash = true; + } + } + } + if (_s.ignoreFlash) { + needsFlash = false; + } + _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash); + return (!_s.html5Only); + }; + _parseURL = function(url) { + var i, j, result = 0; + if (url instanceof Array) { + for (i=0, j=url.length; i'; + } + _setVersionInfo(); + _s.url = _normalizeMovieURL(_overHTTP?remoteURL:localURL); + smURL = _s.url; + _s.wmode = (!_s.wmode && _s.useHighPerformance ? 'transparent' : _s.wmode); + if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { + _s.wmode = null; + } + oEmbed = { + 'name': smID, + 'id': smID, + 'src': smURL, + 'width': side, + 'height': side, + 'quality': 'high', + 'allowScriptAccess': _s.allowScriptAccess, + 'bgcolor': _s.bgColor, + 'pluginspage': _http+'www.macromedia.com/go/getflashplayer', + 'title': swfTitle, + 'type': 'application/x-shockwave-flash', + 'wmode': _s.wmode, + 'hasPriority': 'true' + }; + if (_s.debugFlash) { + oEmbed.FlashVars = 'debug=1'; + } + if (!_s.wmode) { + delete oEmbed.wmode; + } + if (_isIE) { + oMovie = _doc.createElement('div'); + movieHTML = [ + '', + param('movie', smURL), + param('AllowScriptAccess', _s.allowScriptAccess), + param('quality', oEmbed.quality), + (_s.wmode? param('wmode', _s.wmode): ''), + param('bgcolor', _s.bgColor), + param('hasPriority', 'true'), + (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), + '' + ].join(''); + } else { + oMovie = _doc.createElement('embed'); + for (tmp in oEmbed) { + if (oEmbed.hasOwnProperty(tmp)) { + oMovie.setAttribute(tmp, oEmbed[tmp]); + } + } + } + _initDebug(); + extraClass = _getSWFCSS(); + oTarget = _getDocument(); + if (oTarget) { + _s.oMC = (_id(_s.movieID) || _doc.createElement('div')); + if (!_s.oMC.id) { + _s.oMC.id = _s.movieID; + _s.oMC.className = _swfCSS.swfDefault + ' ' + extraClass; + s = null; + oEl = null; + if (!_s.useFlashBlock) { + if (_s.useHighPerformance) { + s = { + 'position': 'fixed', + 'width': '8px', + 'height': '8px', + 'bottom': '0px', + 'left': '0px', + 'overflow': 'hidden' + }; + } else { + s = { + 'position': 'absolute', + 'width': '6px', + 'height': '6px', + 'top': '-9999px', + 'left': '-9999px' + }; + if (isRTL) { + s.left = Math.abs(parseInt(s.left,10))+'px'; + } + } + } + if (_isWebkit) { + _s.oMC.style.zIndex = 10000; + } + if (!_s.debugFlash) { + for (x in s) { + if (s.hasOwnProperty(x)) { + _s.oMC.style[x] = s[x]; + } + } + } + try { + if (!_isIE) { + _s.oMC.appendChild(oMovie); + } + oTarget.appendChild(_s.oMC); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + } catch(e) { + throw new Error(_str('domError')+' \n'+e.toString()); + } + } else { + sClass = _s.oMC.className; + _s.oMC.className = (sClass?sClass+' ':_swfCSS.swfDefault) + (extraClass?' '+extraClass:''); + _s.oMC.appendChild(oMovie); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + } + } + _didAppend = true; + _initMsg(); + return true; + }; + _initMovie = function() { + if (_s.html5Only) { + _createMovie(); + return false; + } + if (_flash) { + return false; + } + _flash = _s.getMovie(_s.id); + if (!_flash) { + if (!_oRemoved) { + _createMovie(_s.id, _s.url); + } else { + if (!_isIE) { + _s.oMC.appendChild(_oRemoved); + } else { + _s.oMC.innerHTML = _oRemovedHTML; + } + _oRemoved = null; + _didAppend = true; + } + _flash = _s.getMovie(_s.id); + } + if (_s.oninitmovie instanceof Function) { + setTimeout(_s.oninitmovie, 1); + } + return true; + }; + _delayWaitForEI = function() { + setTimeout(_waitForEI, 1000); + }; + _waitForEI = function() { + if (_waitingForEI) { + return false; + } + _waitingForEI = true; + _event.remove(_win, 'load', _delayWaitForEI); + if (_tryInitOnFocus && !_isFocused) { + return false; + } + var p; + if (!_didInit) { + p = _s.getMoviePercent(); + } + setTimeout(function() { + p = _s.getMoviePercent(); + if (!_didInit && _okToDisable) { + if (p === null) { + if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + } else { + _failSafely(true); + } + } else { + if (_s.flashLoadTimeout === 0) { + } else { + _failSafely(true); + } + } + } + }, _s.flashLoadTimeout); + }; + _handleFocus = function() { + function cleanup() { + _event.remove(_win, 'focus', _handleFocus); + _event.remove(_win, 'load', _handleFocus); + } + if (_isFocused || !_tryInitOnFocus) { + cleanup(); + return true; + } + _okToDisable = true; + _isFocused = true; + if (_isSafari && _tryInitOnFocus) { + _event.remove(_win, 'mousemove', _handleFocus); + } + _waitingForEI = false; + cleanup(); + return true; + }; + _showSupport = function() { + var item, tests = []; + if (_s.useHTML5Audio && _s.hasHTML5) { + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item)) { + tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : '')))); + } + } + } + }; + _initComplete = function(bNoDisable) { + if (_didInit) { + return false; + } + if (_s.html5Only) { + _didInit = true; + _initUserOnload(); + return true; + } + var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()), + error; + if (!wasTimeout) { + _didInit = true; + if (_disabled) { + error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; + } + } + if (_disabled || bNoDisable) { + if (_s.useFlashBlock && _s.oMC) { + _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_swfCSS.swfTimedout:_swfCSS.swfError); + } + _processOnEvents({type:'ontimeout', error:error}); + _catchError(error); + return false; + } else { + } + if (_s.waitForWindowLoad && !_windowLoaded) { + _event.add(_win, 'load', _initUserOnload); + return false; + } else { + _initUserOnload(); + } + return true; + }; + _init = function() { + if (_didInit) { + return false; + } + function _cleanup() { + _event.remove(_win, 'load', _s.beginDelayedInit); + } + if (_s.html5Only) { + if (!_didInit) { + _cleanup(); + _s.enabled = true; + _initComplete(); + } + return true; + } + _initMovie(); + try { + _flash._externalInterfaceTest(false); + _setPolling(true, (_s.flashPollingInterval || (_s.useHighPerformance ? 10 : 50))); + if (!_s.debugMode) { + _flash._disableDebug(); + } + _s.enabled = true; + if (!_s.html5Only) { + _event.add(_win, 'unload', _doNothing); + } + } catch(e) { + _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); + _failSafely(true); + _initComplete(); + return false; + } + _initComplete(); + _cleanup(); + return true; + }; + _domContentLoaded = function() { + if (_didDCLoaded) { + return false; + } + _didDCLoaded = true; + _initDebug(); + if (!_hasFlash && _s.hasHTML5) { + _s.useHTML5Audio = true; + _s.preferFlash = false; + } + _testHTML5(); + _s.html5.usingFlash = _featureCheck(); + _needsFlash = _s.html5.usingFlash; + _showSupport(); + if (!_hasFlash && _needsFlash) { + _s.flashLoadTimeout = 1; + } + if (_doc.removeEventListener) { + _doc.removeEventListener('DOMContentLoaded', _domContentLoaded, false); + } + _initMovie(); + return true; + }; + _domContentLoadedIE = function() { + if (_doc.readyState === 'complete') { + _domContentLoaded(); + _doc.detachEvent('onreadystatechange', _domContentLoadedIE); + } + return true; + }; + _winOnLoad = function() { + _windowLoaded = true; + _event.remove(_win, 'load', _winOnLoad); + }; + _detectFlash(); + _event.add(_win, 'focus', _handleFocus); + _event.add(_win, 'load', _handleFocus); + _event.add(_win, 'load', _delayWaitForEI); + _event.add(_win, 'load', _winOnLoad); + if (_isSafari && _tryInitOnFocus) { + _event.add(_win, 'mousemove', _handleFocus); + } + if (_doc.addEventListener) { + _doc.addEventListener('DOMContentLoaded', _domContentLoaded, false); + } else if (_doc.attachEvent) { + _doc.attachEvent('onreadystatechange', _domContentLoadedIE); + } else { + _catchError({type:'NO_DOM2_EVENTS', fatal:true}); + } + if (_doc.readyState === 'complete') { + setTimeout(_domContentLoaded,100); + } +} +// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading +if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { + soundManager = new SoundManager(); +} +window.SoundManager = SoundManager; +window.soundManager = soundManager; +}(window)); \ No newline at end of file diff --git a/inc/SoundManager2/script/soundmanager2.js b/inc/SoundManager2/script/soundmanager2.js new file mode 100755 index 0000000..4b115c3 --- /dev/null +++ b/inc/SoundManager2/script/soundmanager2.js @@ -0,0 +1,5019 @@ +/** @license + * + * SoundManager 2: JavaScript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20111220 + */ + +/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */ +/* jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */ + +/** + * About this file + * --------------- + * This is the fully-commented source version of the SoundManager 2 API, + * recommended for use during development and testing. + * + * See soundmanager2-nodebug-jsmin.js for an optimized build (~10KB with gzip.) + * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion + * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.) + * + * You may notice and comments in this source; these are delimiters for + * debug blocks which are removed in the -nodebug builds, further optimizing code size. + * + * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;) + */ + +(function(window) { + +var soundManager = null; + +/** + * The SoundManager constructor. + * + * @constructor + * @param {string} smURL Optional: Path to SWF files + * @param {string} smID Optional: The ID to use for the SWF container element + * @this {SoundManager} + * @return {SoundManager} The new SoundManager instance + */ + +function SoundManager(smURL, smID) { + // Top-level configuration options + + this.flashVersion = 8; // flash build to use (8 or 9.) Some API features require 9. + this.debugMode = true; // enable debugging output (console.log() with HTML fallback) + this.debugFlash = false; // enable debugging output inside SWF, troubleshoot Flash/browser issues + this.useConsole = true; // use console.log() if available (otherwise, writes to #soundmanager-debug element) + this.consoleOnly = true; // if console is being used, do not create/write to #soundmanager-debug + this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload() + this.bgColor = '#ffffff'; // SWF background color. N/A when wmode = 'transparent' + this.useHighPerformance = false; // position:fixed flash movie can help increase js/flash speed, minimize lag + this.flashPollingInterval = null; // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used. + this.html5PollingInterval = null; // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used. + this.flashLoadTimeout = 1000; // msec to wait for flash movie to load before failing (0 = infinity) + this.wmode = null; // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work) + this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), 'always' or 'sameDomain' + this.useFlashBlock = false; // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. + this.useHTML5Audio = true; // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible. + this.html5Test = /^(probably|maybe)$/i; // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative. + this.preferFlash = true; // overrides useHTML5audio. if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers. + this.noSWFCache = false; // if true, appends ?ts={date} to break aggressive SWF caching. + + this.audioFormats = { + + /** + * determines HTML5 support + flash requirements. + * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start. + * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true) + * multiple MIME types may be tested while trying to get a positive canPlayType() response. + */ + + 'mp3': { + 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], + 'required': true + }, + + 'mp4': { + 'related': ['aac','m4a'], // additional formats under the MP4 container + 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], + 'required': false + }, + + 'ogg': { + 'type': ['audio/ogg; codecs=vorbis'], + 'required': false + }, + + 'wav': { + 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], + 'required': false + } + + }; + + this.defaultOptions = { + + /** + * the default configuration for sound objects made with createSound() and related methods + * eg., volume, auto-load behaviour and so forth + */ + + '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) + 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) + 'from': null, // position to start playback within a sound (msec), default = beginning + 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0) + 'onid3': null, // callback function for "ID3 data is added/available" + 'onload': null, // callback function for "load finished" + 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) + 'onplay': null, // callback for "play" start + 'onpause': null, // callback for "pause" + 'onresume': null, // callback for "resume" (pause toggle) + 'whileplaying': null, // callback during play (position update) + 'onposition': null, // object containing times and function callbacks for positions of interest + 'onstop': null, // callback for "user stop" + 'onfailure': null, // callback function for when playing fails + 'onfinish': null, // callback function for "sound finished playing" + 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time + 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled + 'position': null, // offset (milliseconds) to seek to within loaded sound data. + 'pan': 0, // "pan" settings, left-to-right, -100 to 100 + 'stream': true, // allows playing before entire file has loaded (recommended) + 'to': null, // position to end playback within a sound (msec), default = end + 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 + 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) + 'volume': 100 // self-explanatory. 0-100, the latter being the max. + + }; + + this.flash9Options = { + + /** + * flash 9-only options, + * merged into defaultOptions if flash 9 is being used + */ + + 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL + 'usePeakData': false, // enable left/right channel peak (level) data + 'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load. + 'useEQData': false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load. + 'onbufferchange': null, // callback for "isBuffering" property change + 'ondataerror': null // callback for waveform/eq data access error (flash playing audio in other tabs/domains) + + }; + + this.movieStarOptions = { + + /** + * flash 9.0r115+ MPEG4 audio options, + * merged into defaultOptions if flash 9+movieStar mode is enabled + */ + + 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) + 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants + 'onconnect': null, // rtmp: callback for connection to flash media server + 'duration': null // rtmp: song duration (msec) + + }; + + // HTML attributes (id + class names) for the SWF container + + this.movieID = 'sm2-container'; + this.id = (smID || 'sm2movie'); + + this.debugID = 'soundmanager-debug'; + this.debugURLParam = /([#?&])debug=1/i; + + // dynamic attributes + + this.versionNumber = 'V2.97a.20111220'; + this.version = null; + this.movieURL = null; + this.url = (smURL || null); + this.altURL = null; + this.swfLoaded = false; + this.enabled = false; + this.oMC = null; + this.sounds = {}; + this.soundIDs = []; + this.muted = false; + this.didFlashBlock = false; + this.filePattern = null; + + this.filePatterns = { + + 'flash8': /\.mp3(\?.*)?$/i, + 'flash9': /\.mp3(\?.*)?$/i + + }; + + // support indicators, set at init + + this.features = { + + 'buffering': false, + 'peakData': false, + 'waveformData': false, + 'eqData': false, + 'movieStar': false + + }; + + // flash sandbox info, used primarily in troubleshooting + + this.sandbox = { + + // + 'type': null, + 'types': { + 'remote': 'remote (domain-based) rules', + 'localWithFile': 'local with file access (no internet access)', + 'localWithNetwork': 'local with network (internet access only, no local access)', + 'localTrusted': 'local, trusted (local+internet access)' + }, + 'description': null, + 'noRemote': null, + 'noLocal': null + // + + }; + + /** + * basic HTML5 Audio() support test + * try...catch because of IE 9 "not implemented" nonsense + * https://github.com/Modernizr/Modernizr/issues/224 + */ + + this.hasHTML5 = (function() { + try { + return (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined'); + } catch(e) { + return false; + } + }()); + + /** + * format support (html5/flash) + * stores canPlayType() results based on audioFormats. + * eg. { mp3: boolean, mp4: boolean } + * treat as read-only. + */ + + this.html5 = { + 'usingFlash': null // set if/when flash fallback is needed + }; + + this.flash = {}; // file type support hash + + this.html5Only = false; // determined at init time + this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?) + + /** + * a few private internals (OK, a lot. :D) + */ + + var SMSound, + _s = this, _flash = null, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _doc = document, _doNothing, _init, _fV, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _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, _smTimer, _onTimer, _startTimer, _stopTimer, _timerExecute, _h5TimerCount = 0, _h5IntervalTimer = null, _parseURL, + _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext, _html5Unload, _domContentLoadedIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport, + _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _is_firefox = _ua.match(/firefox/i), _is_android = _ua.match(/droid/i), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), + _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice), + _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && !_ua.match(/silk/i) && _ua.match(/OS X 10_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 + _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i, + _emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs) + _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null), + _http = (!_overHTTP ? 'http:/'+'/' : ''), + // mp3, mp4, aac etc. + _netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i, + // Flash v9.0r115+ "moviestar" formats + _netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2'], + _netStreamPattern = new RegExp('\\.(' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + + this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set + + // use altURL if not "online" + this.useAltURL = !_overHTTP; + this._global_a = null; + + _swfCSS = { + + 'swfBox': 'sm2-object-box', + 'swfDefault': 'movieContainer', + 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) + 'swfTimedout': 'swf_timedout', + 'swfLoaded': 'swf_loaded', + 'swfUnblocked': 'swf_unblocked', // or loaded OK + 'sm2Debug': 'sm2_debug', + 'highPerf': 'high_performance', + 'flashDebug': 'flash_debug' + + }; + + if (_likesHTML5) { + + // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point. + _s.useHTML5Audio = true; + _s.preferFlash = false; + + if (_is_iDevice) { + // by default, use global feature. iOS onfinish() -> next may fail otherwise. + _s.ignoreFlash = true; + _useGlobalHTML5Audio = true; + } + + } + + /** + * Public SoundManager API + * ----------------------- + */ + + this.ok = function() { + + return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); + + }; + + this.supported = this.ok; // legacy + + this.getMovie = function(smID) { + + // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version + return _id(smID) || _doc[smID] || _win[smID]; + + }; + + /** + * Creates a SMSound sound object instance. + * + * @param {object} oOptions Sound options (at minimum, id and url are required.) + * @return {object} SMSound The new SMSound object. + */ + + this.createSound = function(oOptions) { + + var _cs, _cs_string, + thisOptions = null, oSound = null, _tO = null; + + // + _cs = _sm+'.createSound(): '; + _cs_string = _cs + _str(!_didInit?'notReady':'notOK'); + // + + if (!_didInit || !_s.ok()) { + _complain(_cs_string); + return false; + } + + if (arguments.length === 2) { + // function overloading in JS! :) ..assume simple createSound(id,url) use case + oOptions = { + 'id': arguments[0], + 'url': arguments[1] + }; + } + + // inherit from defaultOptions + thisOptions = _mixin(oOptions); + + thisOptions.url = _parseURL(thisOptions.url); + + // local shortcut + _tO = thisOptions; + + // + if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) { + _s._wD(_cs + _str('badID', _tO.id), 2); + } + + _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1); + // + + if (_idCheck(_tO.id, true)) { + _s._wD(_cs + _tO.id + ' exists', 1); + return _s.sounds[_tO.id]; + } + + function make() { + + thisOptions = _loopFix(thisOptions); + _s.sounds[_tO.id] = new SMSound(_tO); + _s.soundIDs.push(_tO.id); + return _s.sounds[_tO.id]; + + } + + if (_html5OK(_tO)) { + + oSound = make(); + _s._wD('Loading sound '+_tO.id+' via HTML5'); + oSound._setup_html5(_tO); + + } else { + + if (_fV > 8) { + if (_tO.isMovieStar === null) { + // attempt to detect MPEG-4 formats + _tO.isMovieStar = (_tO.serverURL || (_tO.type ? _tO.type.match(_netStreamMimeTypes) : false) || _tO.url.match(_netStreamPattern)); + } + // + if (_tO.isMovieStar) { + _s._wD(_cs + 'using MovieStar handling'); + } + // + if (_tO.isMovieStar) { + if (_tO.usePeakData) { + _wDS('noPeak'); + _tO.usePeakData = false; + } + // + if (_tO.loops > 1) { + _wDS('noNSLoop'); + } + // + } + } + + _tO = _policyFix(_tO, _cs); + oSound = make(); + + if (_fV === 8) { + _flash._createSound(_tO.id, _tO.loops||1, _tO.usePolicyFile); + } else { + _flash._createSound(_tO.id, _tO.url, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile); + if (!_tO.serverURL) { + // We are connected immediately + oSound.connected = true; + if (_tO.onconnect) { + _tO.onconnect.apply(oSound); + } + } + } + + if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) { + // call load for non-rtmp streams + oSound.load(_tO); + } + + } + + // rtmp will play in onconnect + if (!_tO.serverURL && _tO.autoPlay) { + oSound.play(); + } + + return oSound; + + }; + + /** + * Destroys a SMSound sound object instance. + * + * @param {string} sID The ID of the sound to destroy + */ + + this.destroySound = function(sID, _bFromSound) { + + // explicitly destroy a sound before normal page unload, etc. + + if (!_idCheck(sID)) { + return false; + } + + var oS = _s.sounds[sID], i; + + // Disable all callbacks while the sound is being destroyed + oS._iO = {}; + + oS.stop(); + oS.unload(); + + for (i = 0; i < _s.soundIDs.length; i++) { + if (_s.soundIDs[i] === sID) { + _s.soundIDs.splice(i, 1); + break; + } + } + + if (!_bFromSound) { + // ignore if being called from SMSound instance + oS.destruct(true); + } + + oS = null; + delete _s.sounds[sID]; + + return true; + + }; + + /** + * Calls the load() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {object} oOptions Optional: Sound options + */ + + this.load = function(sID, oOptions) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].load(oOptions); + + }; + + /** + * Calls the unload() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + */ + + this.unload = function(sID) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].unload(); + + }; + + /** + * Calls the onPosition() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nPosition The position to watch for + * @param {function} oMethod The relevant callback to fire + * @param {object} oScope Optional: The scope to apply the callback to + * @return {SMSound} The SMSound object + */ + + this.onPosition = function(sID, nPosition, oMethod, oScope) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].onposition(nPosition, oMethod, oScope); + + }; + + // legacy/backwards-compability: lower-case method name + this.onposition = this.onPosition; + + /** + * Calls the clearOnPosition() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nPosition The position to watch for + * @param {function} oMethod Optional: The relevant callback to fire + * @return {SMSound} The SMSound object + */ + + this.clearOnPosition = function(sID, nPosition, oMethod) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].clearOnPosition(nPosition, oMethod); + + }; + + /** + * Calls the play() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {object} oOptions Optional: Sound options + * @return {SMSound} The SMSound object + */ + + this.play = function(sID, oOptions) { + + if (!_didInit || !_s.ok()) { + _complain(_sm+'.play(): ' + _str(!_didInit?'notReady':'notOK')); + return false; + } + + if (!_idCheck(sID)) { + if (!(oOptions instanceof Object)) { + // overloading use case: play('mySound','/path/to/some.mp3'); + oOptions = { + url: oOptions + }; + } + if (oOptions && oOptions.url) { + // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'}); + _s._wD(_sm+'.play(): attempting to create "' + sID + '"', 1); + oOptions.id = sID; + return _s.createSound(oOptions).play(); + } else { + return false; + } + } + + return _s.sounds[sID].play(oOptions); + + }; + + this.start = this.play; // just for convenience + + /** + * Calls the setPosition() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nMsecOffset Position (milliseconds) + * @return {SMSound} The SMSound object + */ + + this.setPosition = function(sID, nMsecOffset) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPosition(nMsecOffset); + + }; + + /** + * Calls the stop() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.stop = function(sID) { + + if (!_idCheck(sID)) { + return false; + } + + _s._wD(_sm+'.stop(' + sID + ')', 1); + return _s.sounds[sID].stop(); + + }; + + /** + * Stops all currently-playing sounds. + */ + + this.stopAll = function() { + + var oSound; + _s._wD(_sm+'.stopAll()', 1); + + for (oSound in _s.sounds) { + if (_s.sounds.hasOwnProperty(oSound)) { + // apply only to sound objects + _s.sounds[oSound].stop(); + } + } + + }; + + /** + * Calls the pause() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.pause = function(sID) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].pause(); + + }; + + /** + * Pauses all currently-playing sounds. + */ + + this.pauseAll = function() { + + var i; + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].pause(); + } + + }; + + /** + * Calls the resume() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.resume = function(sID) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].resume(); + + }; + + /** + * Resumes all currently-paused sounds. + */ + + this.resumeAll = function() { + + var i; + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].resume(); + } + + }; + + /** + * Calls the togglePause() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.togglePause = function(sID) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].togglePause(); + + }; + + /** + * Calls the setPan() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nPan The pan value (-100 to 100) + * @return {SMSound} The SMSound object + */ + + this.setPan = function(sID, nPan) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPan(nPan); + + }; + + /** + * Calls the setVolume() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nVol The volume value (0 to 100) + * @return {SMSound} The SMSound object + */ + + this.setVolume = function(sID, nVol) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setVolume(nVol); + + }; + + /** + * Calls the mute() method of either a single SMSound object by ID, or all sound objects. + * + * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) + */ + + this.mute = function(sID) { + + var i = 0; + + if (typeof sID !== 'string') { + sID = null; + } + + if (!sID) { + _s._wD(_sm+'.mute(): Muting all sounds'); + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].mute(); + } + _s.muted = true; + } else { + if (!_idCheck(sID)) { + return false; + } + _s._wD(_sm+'.mute(): Muting "' + sID + '"'); + return _s.sounds[sID].mute(); + } + + return true; + + }; + + /** + * Mutes all sounds. + */ + + this.muteAll = function() { + + _s.mute(); + + }; + + /** + * Calls the unmute() method of either a single SMSound object by ID, or all sound objects. + * + * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) + */ + + this.unmute = function(sID) { + + var i; + + if (typeof sID !== 'string') { + sID = null; + } + + if (!sID) { + + _s._wD(_sm+'.unmute(): Unmuting all sounds'); + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].unmute(); + } + _s.muted = false; + + } else { + + if (!_idCheck(sID)) { + return false; + } + _s._wD(_sm+'.unmute(): Unmuting "' + sID + '"'); + return _s.sounds[sID].unmute(); + + } + + return true; + + }; + + /** + * Unmutes all sounds. + */ + + this.unmuteAll = function() { + + _s.unmute(); + + }; + + /** + * Calls the toggleMute() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.toggleMute = function(sID) { + + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].toggleMute(); + + }; + + /** + * Retrieves the memory used by the flash plugin. + * + * @return {number} The amount of memory in use + */ + + this.getMemoryUse = function() { + + // flash-only + var ram = 0; + + if (_flash && _fV !== 8) { + ram = parseInt(_flash._getMemoryUse(), 10); + } + + return ram; + + }; + + /** + * Undocumented: NOPs soundManager and all SMSound objects. + */ + + this.disable = function(bNoDisable) { + + // destroy all functions + var i; + + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + + if (_disabled) { + return false; + } + + _disabled = true; + _wDS('shutdown', 1); + + for (i = _s.soundIDs.length; i--;) { + _disableObject(_s.sounds[_s.soundIDs[i]]); + } + + // fire "complete", despite fail + _initComplete(bNoDisable); + _event.remove(_win, 'load', _initUserOnload); + + return true; + + }; + + /** + * Determines playability of a MIME type, eg. 'audio/mp3'. + */ + + this.canPlayMIME = function(sMIME) { + + var result; + + if (_s.hasHTML5) { + result = _html5CanPlay({type:sMIME}); + } + + if (!_needsFlash || result) { + // no flash, or OK + return result; + } else { + // if flash 9, test netStream (movieStar) types as well. + return (sMIME ? !!((_fV > 8 ? sMIME.match(_netStreamMimeTypes) : null) || sMIME.match(_s.mimePattern)) : null); + } + + }; + + /** + * Determines playability of a URL based on audio support. + * + * @param {string} sURL The URL to test + * @return {boolean} URL playability + */ + + this.canPlayURL = function(sURL) { + + var result; + + if (_s.hasHTML5) { + result = _html5CanPlay({url: sURL}); + } + + if (!_needsFlash || result) { + // no flash, or OK + return result; + } else { + return (sURL ? !!(sURL.match(_s.filePattern)) : null); + } + + }; + + /** + * Determines playability of an HTML DOM <a> object (or similar object literal) based on audio support. + * + * @param {object} oLink an HTML DOM <a> object or object literal including href and/or type attributes + * @return {boolean} URL playability + */ + + this.canPlayLink = function(oLink) { + + if (typeof oLink.type !== 'undefined' && oLink.type) { + if (_s.canPlayMIME(oLink.type)) { + return true; + } + } + + return _s.canPlayURL(oLink.href); + + }; + + /** + * Retrieves a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.getSoundById = function(sID, _suppressDebug) { + + if (!sID) { + throw new Error(_sm+'.getSoundById(): sID is null/undefined'); + } + + var result = _s.sounds[sID]; + + // + if (!result && !_suppressDebug) { + _s._wD('"' + sID + '" is an invalid sound ID.', 2); + } + // + + return result; + + }; + + /** + * Queues a callback for execution when SoundManager has successfully initialized. + * + * @param {function} oMethod The callback method to fire + * @param {object} oScope Optional: The scope to apply to the callback + */ + + this.onready = function(oMethod, oScope) { + + var sType = 'onready'; + + if (oMethod && oMethod instanceof Function) { + + // + if (_didInit) { + _s._wD(_str('queue', sType)); + } + // + + if (!oScope) { + oScope = _win; + } + + _addOnEvent(sType, oMethod, oScope); + _processOnEvents(); + + return true; + + } else { + + throw _str('needFunction', sType); + + } + + }; + + /** + * Queues a callback for execution when SoundManager has failed to initialize. + * + * @param {function} oMethod The callback method to fire + * @param {object} oScope Optional: The scope to apply to the callback + */ + + this.ontimeout = function(oMethod, oScope) { + + var sType = 'ontimeout'; + + if (oMethod && oMethod instanceof Function) { + + // + if (_didInit) { + _s._wD(_str('queue', sType)); + } + // + + if (!oScope) { + oScope = _win; + } + + _addOnEvent(sType, oMethod, oScope); + _processOnEvents({type:sType}); + + return true; + + } else { + + throw _str('needFunction', sType); + + } + + }; + + /** + * Writes console.log()-style debug output to a console or in-browser element. + * Applies when SoundManager.debugMode = true + * + * @param {string} sText The console message + * @param {string} sType Optional: Log type of 'info', 'warn' or 'error' + * @param {object} Optional: The scope to apply to the callback + */ + + this._writeDebug = function(sText, sType, _bTimestamp) { + + // pseudo-private console.log()-style output + // + + var sDID = 'soundmanager-debug', o, oItem, sMethod; + + if (!_s.debugMode) { + return false; + } + + if (typeof _bTimestamp !== 'undefined' && _bTimestamp) { + sText = sText + ' | ' + new Date().getTime(); + } + + if (_hasConsole && _s.useConsole) { + sMethod = _debugLevels[sType]; + if (typeof console[sMethod] !== 'undefined') { + console[sMethod](sText); + } else { + console.log(sText); + } + if (_s.consoleOnly) { + return true; + } + } + + try { + + o = _id(sDID); + + if (!o) { + return false; + } + + oItem = _doc.createElement('div'); + + if (++_wdCount % 2 === 0) { + oItem.className = 'sm2-alt'; + } + + if (typeof sType === 'undefined') { + sType = 0; + } else { + sType = parseInt(sType, 10); + } + + oItem.appendChild(_doc.createTextNode(sText)); + + if (sType) { + if (sType >= 2) { + oItem.style.fontWeight = 'bold'; + } + if (sType === 3) { + oItem.style.color = '#ff3333'; + } + } + + // top-to-bottom + // o.appendChild(oItem); + + // bottom-to-top + o.insertBefore(oItem, o.firstChild); + + } catch(e) { + // oh well + } + + o = null; + // + + return true; + + }; + + // alias + this._wD = this._writeDebug; + + /** + * Provides debug / state information on all SMSound objects. + */ + + this._debug = function() { + + // + var i, j; + _wDS('currentObj', 1); + + for (i = 0, j = _s.soundIDs.length; i < j; i++) { + _s.sounds[_s.soundIDs[i]]._debug(); + } + // + + }; + + /** + * Restarts and re-initializes the SoundManager instance. + */ + + this.reboot = function() { + + // attempt to reset and init SM2 + _s._wD(_sm+'.reboot()'); + + // + if (_s.soundIDs.length) { + _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...'); + } + // + + var i, j; + + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].destruct(); + } + + // trash ze flash + + try { + if (_isIE) { + _oRemovedHTML = _flash.innerHTML; + } + _oRemoved = _flash.parentNode.removeChild(_flash); + _s._wD('Flash movie removed.'); + } catch(e) { + // uh-oh. + _wDS('badRemove', 2); + } + + // actually, force recreate of movie. + _oRemovedHTML = _oRemoved = _needsFlash = null; + + _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; + _s.soundIDs = _s.sounds = []; + _flash = null; + + for (i in _on_queue) { + if (_on_queue.hasOwnProperty(i)) { + for (j = _on_queue[i].length; j--;) { + _on_queue[i][j].fired = false; + } + } + } + + _s._wD(_sm + ': Rebooting...'); + _win.setTimeout(_s.beginDelayedInit, 20); + + }; + + /** + * Undocumented: Determines the SM2 flash movie's load progress. + * + * @return {number or null} Percent loaded, or if invalid/unsupported, null. + */ + + this.getMoviePercent = function() { + + return (_flash && typeof _flash.PercentLoaded !== 'undefined' ? _flash.PercentLoaded() : null); + + }; + + /** + * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload(). + */ + + this.beginDelayedInit = function() { + + _windowLoaded = true; + _domContentLoaded(); + + setTimeout(function() { + + if (_initPending) { + return false; + } + + _createMovie(); + _initMovie(); + _initPending = true; + + return true; + + }, 20); + + _delayWaitForEI(); + + }; + + /** + * Destroys the SoundManager instance and all SMSound instances. + */ + + this.destruct = function() { + + _s._wD(_sm+'.destruct()'); + _s.disable(true); + + }; + + /** + * SMSound() (sound object) constructor + * ------------------------------------ + * + * @param {object} oOptions Sound options (id and url are required attributes) + * @return {SMSound} The new SMSound object + */ + + SMSound = function(oOptions) { + + var _t = 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; + + var _lastHTML5State = { + // tracks duration + position (time) + duration: null, + time: null + }; + + this.sID = oOptions.id; + this.url = oOptions.url; + this.options = _mixin(oOptions); + + // per-play-instance-specific options + this.instanceOptions = this.options; + + // short alias + this._iO = this.instanceOptions; + + // assign property defaults + this.pan = this.options.pan; + this.volume = this.options.volume; + this.isHTML5 = false; + this._a = null; + + /** + * SMSound() public methods + * ------------------------ + */ + + this.id3 = {}; + + /** + * Writes SMSound object parameters to debug console + */ + + this._debug = function() { + + // + // pseudo-private console.log()-style output + + if (_s.debugMode) { + + var stuff = null, msg = [], sF, sfBracket, maxLength = 64; + + for (stuff in _t.options) { + if (_t.options[stuff] !== null) { + if (_t.options[stuff] instanceof Function) { + // handle functions specially + sF = _t.options[stuff].toString(); + // normalize spaces + sF = sF.replace(/\s\s+/g, ' '); + sfBracket = sF.indexOf('{'); + msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }'); + } else { + msg.push(' ' + stuff + ': ' + _t.options[stuff]); + } + } + } + + _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}'); + + } + // + + }; + + // + this._debug(); + // + + /** + * Begins loading a sound per its *url*. + * + * @param {object} oOptions Optional: Sound options + * @return {SMSound} The SMSound object + */ + + this.load = function(oOptions) { + + var oS = null, _iO; + + if (typeof oOptions !== 'undefined') { + _t._iO = _mixin(oOptions, _t.options); + _t.instanceOptions = _t._iO; + } else { + oOptions = _t.options; + _t._iO = oOptions; + _t.instanceOptions = _t._iO; + if (_lastURL && _lastURL !== _t.url) { + _wDS('manURL'); + _t._iO.url = _t.url; + _t.url = null; + } + } + + if (!_t._iO.url) { + _t._iO.url = _t.url; + } + + _t._iO.url = _parseURL(_t._iO.url); + + _s._wD('SMSound.load(): ' + _t._iO.url, 1); + + if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { + _wDS('onURL', 1); + // if loaded and an onload() exists, fire immediately. + if (_t.readyState === 3 && _t._iO.onload) { + // assume success based on truthy duration. + _t._iO.onload.apply(_t, [(!!_t.duration)]); + } + return _t; + } + + // local shortcut + _iO = _t._iO; + + _lastURL = _t.url; + _t.loaded = false; + _t.readyState = 1; + _t.playState = 0; + + // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio. + + if (_html5OK(_iO)) { + + oS = _t._setup_html5(_iO); + + if (!oS._called_load) { + + _s._wD(_h5+'load: '+_t.sID); + _t._html5_canplay = false; + + // given explicit load call, try to get whole file. + // early HTML5 implementation (non-standard) + _t._a.autobuffer = 'auto'; + // standard + _t._a.preload = 'auto'; + + oS.load(); + oS._called_load = true; + + if (_iO.autoPlay) { + _t.play(); + } + + } else { + _s._wD(_h5+'ignoring request to load again: '+_t.sID); + } + + } else { + + try { + _t.isHTML5 = false; + _t._iO = _policyFix(_loopFix(_iO)); + // re-assign local shortcut + _iO = _t._iO; + if (_fV === 8) { + _flash._load(_t.sID, _iO.url, _iO.stream, _iO.autoPlay, (_iO.whileloading?1:0), _iO.loops||1, _iO.usePolicyFile); + } else { + _flash._load(_t.sID, _iO.url, !!(_iO.stream), !!(_iO.autoPlay), _iO.loops||1, !!(_iO.autoLoad), _iO.usePolicyFile); + } + } catch(e) { + _wDS('smError', 2); + _debugTS('onload', false); + _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); + + } + + } + + return _t; + + }; + + /** + * Unloads a sound, canceling any open HTTP requests. + * + * @return {SMSound} The SMSound object + */ + + this.unload = function() { + + // Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL + // Flash 9/AS3: Close stream, preventing further load + // HTML5: Most UAs will use empty URL + + if (_t.readyState !== 0) { + + _s._wD('SMSound.unload(): "' + _t.sID + '"'); + + if (!_t.isHTML5) { + if (_fV === 8) { + _flash._unload(_t.sID, _emptyURL); + } else { + _flash._unload(_t.sID); + } + } else { + _stop_html5_timer(); + if (_t._a) { + _t._a.pause(); + _html5Unload(_t._a); + } + } + + // reset load/status flags + _resetProperties(); + + } + + return _t; + + }; + + /** + * Unloads and destroys a sound. + */ + + this.destruct = function(_bFromSM) { + + _s._wD('SMSound.destruct(): "' + _t.sID + '"'); + + if (!_t.isHTML5) { + + // kill sound within Flash + // Disable the onfailure handler + _t._iO.onfailure = null; + _flash._destroySound(_t.sID); + + } else { + + _stop_html5_timer(); + + if (_t._a) { + _t._a.pause(); + _html5Unload(_t._a); + if (!_useGlobalHTML5Audio) { + _remove_html5_events(); + } + // break obvious circular reference + _t._a._t = null; + _t._a = null; + } + + } + + if (!_bFromSM) { + // ensure deletion from controller + _s.destroySound(_t.sID, true); + + } + + }; + + /** + * Begins playing a sound. + * + * @param {object} oOptions Optional: Sound options + * @return {SMSound} The SMSound object + */ + + this.play = function(oOptions, _updatePlayState) { + + var fN, allowMulti, a, onready; + + // + fN = 'SMSound.play(): '; + // + + _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; // default to true + + if (!oOptions) { + oOptions = {}; + } + + _t._iO = _mixin(oOptions, _t._iO); + _t._iO = _mixin(_t._iO, _t.options); + _t._iO.url = _parseURL(_t._iO.url); + _t.instanceOptions = _t._iO; + + // RTMP-only + if (_t._iO.serverURL && !_t.connected) { + if (!_t.getAutoPlay()) { + _s._wD(fN+' Netstream not connected yet - setting autoPlay'); + _t.setAutoPlay(true); + } + // play will be called in _onconnect() + return _t; + } + + if (_html5OK(_t._iO)) { + _t._setup_html5(_t._iO); + _start_html5_timer(); + } + + if (_t.playState === 1 && !_t.paused) { + allowMulti = _t._iO.multiShot; + if (!allowMulti) { + _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1); + return _t; + } else { + _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1); + } + } + + if (!_t.loaded) { + + if (_t.readyState === 0) { + + _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1); + + // try to get this sound playing ASAP + if (!_t.isHTML5) { + // assign directly because setAutoPlay() increments the instanceCount + _t._iO.autoPlay = true; + } + + _t.load(_t._iO); + + } else if (_t.readyState === 2) { + + _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2); + return _t; + + } else { + + _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1); + + } + + } else { + + _s._wD(fN + '"' + _t.sID + '"'); + + } + + if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) { + // flash 9 needs a position reset if play() is called while at the end of a sound. + _s._wD(fN + '"' + _t.sID + '": Sound at end, resetting to position:0'); + oOptions.position = 0; + } + + /** + * Streams will pause when their buffer is full if they are being loaded. + * In this case paused is true, but the song hasn't started playing yet. + * If we just call resume() the onplay() callback will never be called. + * So only call resume() if the position is > 0. + * Another reason is because options like volume won't have been applied yet. + */ + + if (_t.paused && _t.position && _t.position > 0) { + + // https://gist.github.com/37b17df75cc4d7a90bf6 + _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1); + _t.resume(); + + } else { + + _t._iO = _mixin(oOptions, _t._iO); + + // apply from/to parameters, if they exist (and not using RTMP) + if (_t._iO.from !== null && _t._iO.to !== null && _t.instanceCount === 0 && _t.playState === 0 && !_t._iO.serverURL) { + + onready = function() { + // sound "canplay" or onload() + // re-apply from/to to instance options, and start playback + _t._iO = _mixin(oOptions, _t._iO); + _t.play(_t._iO); + }; + + // HTML5 needs to at least have "canplay" fired before seeking. + if (_t.isHTML5 && !_t._html5_canplay) { + + // this hasn't been loaded yet. load it first, and then do this again. + _s._wD(fN+'Beginning load of "'+ _t.sID+'" for from/to case'); + + _t.load({ + _oncanplay: onready + }); + + return false; + + } else if (!_t.isHTML5 && !_t.loaded && (!_t.readyState || _t.readyState !== 2)) { + + // to be safe, preload the whole thing in Flash. + + _s._wD(fN+'Preloading "'+ _t.sID+'" for from/to case'); + + _t.load({ + onload: onready + }); + + return false; + + } + + // otherwise, we're ready to go. re-apply local options, and continue + + _t._iO = _applyFromTo(); + + } + + _s._wD(fN+'"'+ _t.sID+'" is starting to play'); + + if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) { + _t.instanceCount++; + } + + // if first play and onposition parameters exist, apply them now + if (_t.playState === 0 && _t._iO.onposition) { + _attachOnPosition(_t); + } + + _t.playState = 1; + _t.paused = false; + + _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position) ? _t._iO.position : 0); + + if (!_t.isHTML5) { + _t._iO = _policyFix(_loopFix(_t._iO)); + } + + if (_t._iO.onplay && _updatePlayState) { + _t._iO.onplay.apply(_t); + _onplay_called = true; + } + + _t.setVolume(_t._iO.volume, true); + _t.setPan(_t._iO.pan, true); + + if (!_t.isHTML5) { + + _flash._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000)); + + } else { + + _start_html5_timer(); + a = _t._setup_html5(); + _t.setPosition(_t._iO.position); + a.play(); + + } + + } + + return _t; + + }; + + // just for convenience + this.start = this.play; + + /** + * Stops playing a sound (and optionally, all sounds) + * + * @param {boolean} bAll Optional: Whether to stop all sounds + * @return {SMSound} The SMSound object + */ + + this.stop = function(bAll) { + + var _iO = _t._iO, _oP; + + if (_t.playState === 1) { + + _t._onbufferchange(0); + _t._resetOnPosition(0); + _t.paused = false; + + if (!_t.isHTML5) { + _t.playState = 0; + } + + // remove onPosition listeners, if any + _detachOnPosition(); + + // and "to" position, if set + if (_iO.to) { + _t.clearOnPosition(_iO.to); + } + + if (!_t.isHTML5) { + + _flash._stop(_t.sID, bAll); + + // hack for netStream: just unload + if (_iO.serverURL) { + _t.unload(); + } + + } else { + + if (_t._a) { + + _oP = _t.position; + + // act like Flash, though + _t.setPosition(0); + + // hack: reflect old position for onstop() (also like Flash) + _t.position = _oP; + + // html5 has no stop() + // NOTE: pausing means iOS requires interaction to resume. + _t._a.pause(); + + _t.playState = 0; + + // and update UI + _t._onTimer(); + + _stop_html5_timer(); + + } + + } + + _t.instanceCount = 0; + _t._iO = {}; + + if (_iO.onstop) { + _iO.onstop.apply(_t); + } + + } + + return _t; + + }; + + /** + * Undocumented/internal: Sets autoPlay for RTMP. + * + * @param {boolean} autoPlay state + */ + + this.setAutoPlay = function(autoPlay) { + + _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off')); + _t._iO.autoPlay = autoPlay; + + if (!_t.isHTML5) { + _flash._setAutoPlay(_t.sID, autoPlay); + if (autoPlay) { + // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) + if (!_t.instanceCount && _t.readyState === 1) { + _t.instanceCount++; + _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount); + } + } + } + + }; + + /** + * Undocumented/internal: Returns the autoPlay boolean. + * + * @return {boolean} The current autoPlay value + */ + + this.getAutoPlay = function() { + + return _t._iO.autoPlay; + + }; + + /** + * Sets the position of a sound. + * + * @param {number} nMsecOffset Position (milliseconds) + * @return {SMSound} The SMSound object + */ + + this.setPosition = function(nMsecOffset) { + + if (nMsecOffset === undefined) { + nMsecOffset = 0; + } + + var original_pos, + position, position1K, + // Use the duration from the instance options, if we don't have a track duration yet. + // position >= 0 and <= current available (loaded) duration + offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); + + original_pos = _t.position; + _t.position = offset; + position1K = _t.position/1000; + _t._resetOnPosition(_t.position); + _t._iO.position = offset; + + if (!_t.isHTML5) { + + position = (_fV === 9 ? _t.position : position1K); + if (_t.readyState && _t.readyState !== 2) { + // if paused or not playing, will not resume (by playing) + _flash._setPosition(_t.sID, position, (_t.paused || !_t.playState)); + } + + } else if (_t._a) { + + // Set the position in the canplay handler if the sound is not ready yet + if (_t._html5_canplay) { + if (_t._a.currentTime !== position1K) { + /** + * DOM/JS errors/exceptions to watch out for: + * if seek is beyond (loaded?) position, "DOM exception 11" + * "INDEX_SIZE_ERR": DOM exception 1 + */ + _s._wD('setPosition('+position1K+'): setting position'); + try { + _t._a.currentTime = position1K; + if (_t.playState === 0 || _t.paused) { + // allow seek without auto-play/resume + _t._a.pause(); + } + } catch(e) { + _s._wD('setPosition('+position1K+'): setting position failed: '+e.message, 2); + } + } + } else { + _s._wD('setPosition('+position1K+'): delaying, sound not ready'); + } + + } + + if (_t.isHTML5) { + if (_t.paused) { + // if paused, refresh UI right away + // force update + _t._onTimer(true); + } + } + + return _t; + + }; + + /** + * Pauses sound playback. + * + * @return {SMSound} The SMSound object + */ + + this.pause = function(_bCallFlash) { + + if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { + return _t; + } + + _s._wD('SMSound.pause()'); + _t.paused = true; + + if (!_t.isHTML5) { + if (_bCallFlash || _bCallFlash === undefined) { + _flash._pause(_t.sID); + } + } else { + _t._setup_html5().pause(); + _stop_html5_timer(); + } + + if (_t._iO.onpause) { + _t._iO.onpause.apply(_t); + } + + return _t; + + }; + + /** + * Resumes sound playback. + * + * @return {SMSound} The SMSound object + */ + + /** + * When auto-loaded streams pause on buffer full they have a playState of 0. + * We need to make sure that the playState is set to 1 when these streams "resume". + * When a paused stream is resumed, we need to trigger the onplay() callback if it + * hasn't been called already. In this case since the sound is being played for the + * first time, I think it's more appropriate to call onplay() rather than onresume(). + */ + + this.resume = function() { + + var _iO = _t._iO; + + if (!_t.paused) { + return _t; + } + + _s._wD('SMSound.resume()'); + _t.paused = false; + _t.playState = 1; + + if (!_t.isHTML5) { + if (_iO.isMovieStar && !_iO.serverURL) { + // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition. + _t.setPosition(_t.position); + } + // flash method is toggle-based (pause/resume) + _flash._pause(_t.sID); + } else { + _t._setup_html5().play(); + _start_html5_timer(); + } + + if (_onplay_called && _iO.onplay) { + _iO.onplay.apply(_t); + _onplay_called = true; + } else if (_iO.onresume) { + _iO.onresume.apply(_t); + } + + return _t; + + }; + + /** + * Toggles sound playback. + * + * @return {SMSound} The SMSound object + */ + + this.togglePause = function() { + + _s._wD('SMSound.togglePause()'); + + if (_t.playState === 0) { + _t.play({ + position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000) + }); + return _t; + } + + if (_t.paused) { + _t.resume(); + } else { + _t.pause(); + } + + return _t; + + }; + + /** + * Sets the panning (L-R) effect. + * + * @param {number} nPan The pan value (-100 to 100) + * @return {SMSound} The SMSound object + */ + + this.setPan = function(nPan, bInstanceOnly) { + + if (typeof nPan === 'undefined') { + nPan = 0; + } + + if (typeof bInstanceOnly === 'undefined') { + bInstanceOnly = false; + } + + if (!_t.isHTML5) { + _flash._setPan(_t.sID, nPan); + } // else { no HTML5 pan? } + + _t._iO.pan = nPan; + + if (!bInstanceOnly) { + _t.pan = nPan; + _t.options.pan = nPan; + } + + return _t; + + }; + + /** + * Sets the volume. + * + * @param {number} nVol The volume value (0 to 100) + * @return {SMSound} The SMSound object + */ + + this.setVolume = function(nVol, _bInstanceOnly) { + + /** + * Note: Setting volume has no effect on iOS "special snowflake" devices. + * Hardware volume control overrides software, and volume + * will always return 1 per Apple docs. (iOS 4 + 5.) + * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html + */ + + if (typeof nVol === 'undefined') { + nVol = 100; + } + + if (typeof _bInstanceOnly === 'undefined') { + _bInstanceOnly = false; + } + + if (!_t.isHTML5) { + _flash._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); + } else if (_t._a) { + // valid range: 0-1 + _t._a.volume = Math.max(0, Math.min(1, nVol/100)); + } + + _t._iO.volume = nVol; + + if (!_bInstanceOnly) { + _t.volume = nVol; + _t.options.volume = nVol; + } + + return _t; + + }; + + /** + * Mutes the sound. + * + * @return {SMSound} The SMSound object + */ + + this.mute = function() { + + _t.muted = true; + + if (!_t.isHTML5) { + _flash._setVolume(_t.sID, 0); + } else if (_t._a) { + _t._a.muted = true; + } + + return _t; + + }; + + /** + * Unmutes the sound. + * + * @return {SMSound} The SMSound object + */ + + this.unmute = function() { + + _t.muted = false; + var hasIO = typeof _t._iO.volume !== 'undefined'; + + if (!_t.isHTML5) { + _flash._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); + } else if (_t._a) { + _t._a.muted = false; + } + + return _t; + + }; + + /** + * Toggles the muted state of a sound. + * + * @return {SMSound} The SMSound object + */ + + this.toggleMute = function() { + + return (_t.muted?_t.unmute():_t.mute()); + + }; + + /** + * Registers a callback to be fired when a sound reaches a given position during playback. + * + * @param {number} nPosition The position to watch for + * @param {function} oMethod The relevant callback to fire + * @param {object} oScope Optional: The scope to apply the callback to + * @return {SMSound} The SMSound object + */ + + this.onPosition = function(nPosition, oMethod, oScope) { + + // TODO: basic dupe checking? + + _onPositionItems.push({ + position: nPosition, + method: oMethod, + scope: (typeof oScope !== 'undefined' ? oScope : _t), + fired: false + }); + + return _t; + + }; + + // legacy/backwards-compability: lower-case method name + this.onposition = this.onPosition; + + /** + * Removes registered callback(s) from a sound, by position and/or callback. + * + * @param {number} nPosition The position to clear callback(s) for + * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position + * @return {SMSound} The SMSound object + */ + + this.clearOnPosition = function(nPosition, oMethod) { + + var i; + + nPosition = parseInt(nPosition, 10); + + if (isNaN(nPosition)) { + // safety check + return false; + } + + for (i=0; i < _onPositionItems.length; i++) { + + if (nPosition === _onPositionItems[i].position) { + // remove this item if no method was specified, or, if the method matches + if (!oMethod || (oMethod === _onPositionItems[i].method)) { + if (_onPositionItems[i].fired) { + // decrement "fired" counter, too + _onPositionFired--; + } + _onPositionItems.splice(i, 1); + } + } + + } + + }; + + this._processOnPosition = function() { + + var i, item, j = _onPositionItems.length; + + if (!j || !_t.playState || _onPositionFired >= j) { + return false; + } + + for (i=j; i--;) { + item = _onPositionItems[i]; + if (!item.fired && _t.position >= item.position) { + item.fired = true; + _onPositionFired++; + item.method.apply(item.scope, [item.position]); + } + } + + return true; + + }; + + this._resetOnPosition = function(nPosition) { + + // reset "fired" for items interested in this position + var i, item, j = _onPositionItems.length; + + if (!j) { + return false; + } + + for (i=j; i--;) { + item = _onPositionItems[i]; + if (item.fired && nPosition <= item.position) { + item.fired = false; + _onPositionFired--; + } + } + + return true; + + }; + + /** + * SMSound() private internals + * -------------------------------- + */ + + _applyFromTo = function() { + + var _iO = _t._iO, + f = _iO.from, + t = _iO.to, + start, end; + + end = function() { + + // end has been reached. + _s._wD(_t.sID + ': "to" time of ' + t + ' reached.'); + + // detach listener + _t.clearOnPosition(t, end); + + // stop should clear this, too + _t.stop(); + + }; + + start = function() { + + _s._wD(_t.sID + ': playing "from" ' + f); + + // add listener for end + if (t !== null && !isNaN(t)) { + _t.onPosition(t, end); + } + + }; + + if (f !== null && !isNaN(f)) { + + // apply to instance options, guaranteeing correct start position. + _iO.position = f; + + // multiShot timing can't be tracked, so prevent that. + _iO.multiShot = false; + + start(); + + } + + // return updated instanceOptions including starting position + return _iO; + + }; + + _attachOnPosition = function() { + + var op = _t._iO.onposition; + + // attach onposition things, if any, now. + + if (op) { + + var item; + + for (item in op) { + if (op.hasOwnProperty(item)) { + _t.onPosition(parseInt(item, 10), op[item]); + } + } + + } + + }; + + _detachOnPosition = function() { + + var op = _t._iO.onposition; + + // detach any onposition()-style listeners. + + if (op) { + + var item; + + for (item in op) { + if (op.hasOwnProperty(item)) { + _t.clearOnPosition(parseInt(item, 10)); + } + } + + } + + }; + + _start_html5_timer = function() { + + if (_t.isHTML5) { + _startTimer(_t); + } + + }; + + _stop_html5_timer = function() { + + if (_t.isHTML5) { + _stopTimer(_t); + } + + }; + + _resetProperties = function() { + + _onPositionItems = []; + _onPositionFired = 0; + _onplay_called = false; + + _t._hasTimer = null; + _t._a = null; + _t._html5_canplay = false; + _t.bytesLoaded = null; + _t.bytesTotal = null; + _t.duration = (_t._iO && _t._iO.duration ? _t._iO.duration : null); + _t.durationEstimate = null; + + // legacy: 1D array + _t.eqData = []; + + _t.eqData.left = []; + _t.eqData.right = []; + + _t.failures = 0; + _t.isBuffering = false; + _t.instanceOptions = {}; + _t.instanceCount = 0; + _t.loaded = false; + _t.metadata = {}; + + // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success + _t.readyState = 0; + + _t.muted = false; + _t.paused = false; + + _t.peakData = { + left: 0, + right: 0 + }; + + _t.waveformData = { + left: [], + right: [] + }; + + _t.playState = 0; + _t.position = null; + + }; + + _resetProperties(); + + /** + * Pseudo-private SMSound internals + * -------------------------------- + */ + + this._onTimer = function(bForce) { + + /** + * HTML5-only _whileplaying() etc. + * called from both HTML5 native events, and polling/interval-based timers + * mimics flash and fires only when time/duration change, so as to be polling-friendly + */ + + var duration, isNew = false, time, x = {}; + + if (_t._hasTimer || bForce) { + + // TODO: May not need to track readyState (1 = loading) + + if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { + + duration = _t._get_html5_duration(); + + if (duration !== _lastHTML5State.duration) { + + _lastHTML5State.duration = duration; + _t.duration = duration; + isNew = true; + + } + + // TODO: investigate why this goes wack if not set/re-set each time. + _t.durationEstimate = _t.duration; + + time = (_t._a.currentTime * 1000 || 0); + + if (time !== _lastHTML5State.time) { + + _lastHTML5State.time = time; + isNew = true; + + } + + if (isNew || bForce) { + + _t._whileplaying(time,x,x,x,x); + + } + + return isNew; + + } else { + + // _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_t._a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK')); + + return false; + + } + + } + + }; + + this._get_html5_duration = function() { + + var _iO = _t._iO, + d = (_t._a ? _t._a.duration*1000 : (_iO ? _iO.duration : undefined)), + result = (d && !isNaN(d) && d !== Infinity ? d : (_iO ? _iO.duration : null)); + + return result; + + }; + + this._setup_html5 = function(oOptions) { + + var _iO = _mixin(_t._iO, oOptions), d = decodeURI, + _a = _useGlobalHTML5Audio ? _s._global_a : _t._a, + _dURL = d(_iO.url), + _oldIO = (_a && _a._t ? _a._t.instanceOptions : null); + + if (_a) { + + if (_a._t) { + + if (!_useGlobalHTML5Audio && _dURL === d(_lastURL)) { + // same url, ignore request + return _a; + } else if (_useGlobalHTML5Audio && _oldIO.url === _iO.url && (!_lastURL || (_lastURL === _oldIO.url))) { + // iOS-type reuse case + return _a; + } + + } + + _s._wD('setting new URL on existing object: ' + _dURL + (_lastURL ? ', old URL: ' + _lastURL : '')); + + /** + * "First things first, I, Poppa.." (reset the previous state of the old sound, if playing) + * Fixes case with devices that can only play one sound at a time + * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state + */ + + if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) { + _a._t.stop(); + } + + // new URL, so reset load/playstate and so on + _resetProperties(); + + _a.src = _iO.url; + _t.url = _iO.url; + _lastURL = _iO.url; + _a._called_load = false; + + } else { + + _s._wD('creating HTML5 Audio() element with URL: '+_dURL); + _a = new Audio(_iO.url); + + _a._called_load = false; + + // android (seen in 2.3/Honeycomb) sometimes fails first .load() -> .play(), results in playback failure and ended() events? + if (_is_android) { + _a._called_load = true; + } + + if (_useGlobalHTML5Audio) { + _s._global_a = _a; + } + + } + + _t.isHTML5 = true; + + // store a ref on the track + _t._a = _a; + + // store a ref on the audio + _a._t = _t; + + _add_html5_events(); + _a.loop = (_iO.loops>1?'loop':''); + + if (_iO.autoLoad || _iO.autoPlay) { + + _t.load(); + + } else { + + // early HTML5 implementation (non-standard) + _a.autobuffer = false; + + // standard + _a.preload = 'none'; + + } + + // boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop + _a.loop = (_iO.loops > 1 ? 'loop' : ''); + + return _a; + + }; + + _add_html5_events = function() { + + if (_t._a._added_events) { + return false; + } + + var f; + + function add(oEvt, oFn, bCapture) { + return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null; + } + + _s._wD(_h5+'adding event listeners: '+_t.sID); + _t._a._added_events = true; + + for (f in _html5_events) { + if (_html5_events.hasOwnProperty(f)) { + add(f, _html5_events[f]); + } + } + + return true; + + }; + + _remove_html5_events = function() { + + // Remove event listeners + + var f; + + function remove(oEvt, oFn, bCapture) { + return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null); + } + + _s._wD(_h5+'removing event listeners: '+_t.sID); + _t._a._added_events = false; + + for (f in _html5_events) { + if (_html5_events.hasOwnProperty(f)) { + remove(f, _html5_events[f]); + } + } + + }; + + /** + * Pseudo-private event internals + * ------------------------------ + */ + + this._onload = function(nSuccess) { + + + var fN, loadOK = !!(nSuccess); + _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2)); + + // + fN = 'SMSound._onload(): '; + if (!loadOK && !_t.isHTML5) { + if (_s.sandbox.noRemote === true) { + _s._wD(fN + _str('noNet'), 1); + } + if (_s.sandbox.noLocal === true) { + _s._wD(fN + _str('noLocal'), 1); + } + } + // + + _t.loaded = loadOK; + _t.readyState = loadOK?3:2; + _t._onbufferchange(0); + + if (_t._iO.onload) { + _t._iO.onload.apply(_t, [loadOK]); + } + + return true; + + }; + + this._onbufferchange = function(nIsBuffering) { + + if (_t.playState === 0) { + // ignore if not playing + return false; + } + + if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { + return false; + } + + _t.isBuffering = (nIsBuffering === 1); + if (_t._iO.onbufferchange) { + _s._wD('SMSound._onbufferchange(): ' + nIsBuffering); + _t._iO.onbufferchange.apply(_t); + } + + return true; + + }; + + /** + * Notify Mobile Safari that user action is required + * to continue playing / loading the audio file. + */ + + this._onsuspend = function() { + + if (_t._iO.onsuspend) { + _s._wD('SMSound._onsuspend()'); + _t._iO.onsuspend.apply(_t); + } + + return true; + + }; + + /** + * flash 9/movieStar + RTMP-only method, should fire only once at most + * at this point we just recreate failed sounds rather than trying to reconnect + */ + + this._onfailure = function(msg, level, code) { + + _t.failures++; + _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures); + + if (_t._iO.onfailure && _t.failures === 1) { + _t._iO.onfailure(_t, msg, level, code); + } else { + _s._wD('SMSound._onfailure(): ignoring'); + } + + }; + + this._onfinish = function() { + + // store local copy before it gets trashed.. + var _io_onfinish = _t._iO.onfinish; + + _t._onbufferchange(0); + _t._resetOnPosition(0); + + // reset some state items + if (_t.instanceCount) { + + _t.instanceCount--; + + if (!_t.instanceCount) { + + // remove onPosition listeners, if any + _detachOnPosition(); + + // reset instance options + _t.playState = 0; + _t.paused = false; + _t.instanceCount = 0; + _t.instanceOptions = {}; + _t._iO = {}; + _stop_html5_timer(); + + } + + if (!_t.instanceCount || _t._iO.multiShotEvents) { + // fire onfinish for last, or every instance + if (_io_onfinish) { + _s._wD('SMSound._onfinish(): "' + _t.sID + '"'); + _io_onfinish.apply(_t); + } + } + + } + + }; + + this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { + + var _iO = _t._iO; + + _t.bytesLoaded = nBytesLoaded; + _t.bytesTotal = nBytesTotal; + _t.duration = Math.floor(nDuration); + _t.bufferLength = nBufferLength; + + if (!_iO.isMovieStar) { + + if (_iO.duration) { + // use options, if specified and larger + _t.durationEstimate = (_t.duration > _iO.duration) ? _t.duration : _iO.duration; + } else { + _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); + + } + + if (_t.durationEstimate === undefined) { + _t.durationEstimate = _t.duration; + } + + if (_t.readyState !== 3 && _iO.whileloading) { + _iO.whileloading.apply(_t); + } + + } else { + + _t.durationEstimate = _t.duration; + if (_t.readyState !== 3 && _iO.whileloading) { + _iO.whileloading.apply(_t); + } + + } + + }; + + this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { + + var _iO = _t._iO; + + if (isNaN(nPosition) || nPosition === null) { + // flash safety net + return false; + } + + _t.position = nPosition; + _t._processOnPosition(); + + if (!_t.isHTML5 && _fV > 8) { + + if (_iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { + _t.peakData = { + left: oPeakData.leftPeak, + right: oPeakData.rightPeak + }; + } + + if (_iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { + _t.waveformData = { + left: oWaveformDataLeft.split(','), + right: oWaveformDataRight.split(',') + }; + } + + if (_iO.useEQData) { + if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { + var eqLeft = oEQData.leftEQ.split(','); + _t.eqData = eqLeft; + _t.eqData.left = eqLeft; + if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { + _t.eqData.right = oEQData.rightEQ.split(','); + } + } + } + + } + + if (_t.playState === 1) { + + // special case/hack: ensure buffering is false if loading from cache (and not yet started) + if (!_t.isHTML5 && _fV === 8 && !_t.position && _t.isBuffering) { + _t._onbufferchange(0); + } + + if (_iO.whileplaying) { + // flash may call after actual finish + _iO.whileplaying.apply(_t); + } + + } + + return true; + + }; + + this._onmetadata = function(oMDProps, oMDData) { + + /** + * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature + * RTMP may include song title, MovieStar content may include encoding info + * + * @param {array} oMDProps (names) + * @param {array} oMDData (values) + */ + + _s._wD('SMSound._onmetadata(): "' + this.sID + '" metadata received.'); + + var oData = {}, i, j; + + for (i = 0, j = oMDProps.length; i < j; i++) { + oData[oMDProps[i]] = oMDData[i]; + } + _t.metadata = oData; + + if (_t._iO.onmetadata) { + _t._iO.onmetadata.apply(_t); + } + + }; + + this._onid3 = function(oID3Props, oID3Data) { + + /** + * internal: flash 8 + flash 9 ID3 feature + * may include artist, song title etc. + * + * @param {array} oID3Props (names) + * @param {array} oID3Data (values) + */ + + _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.'); + + var oData = [], i, j; + + for (i = 0, j = oID3Props.length; i < j; i++) { + oData[oID3Props[i]] = oID3Data[i]; + } + _t.id3 = _mixin(_t.id3, oData); + + if (_t._iO.onid3) { + _t._iO.onid3.apply(_t); + } + + }; + + // flash/RTMP-only + + this._onconnect = function(bSuccess) { + + bSuccess = (bSuccess === 1); + _s._wD('SMSound._onconnect(): "'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2)); + _t.connected = bSuccess; + + if (bSuccess) { + + _t.failures = 0; + + if (_idCheck(_t.sID)) { + if (_t.getAutoPlay()) { + // only update the play state if auto playing + _t.play(undefined, _t.getAutoPlay()); + } else if (_t._iO.autoLoad) { + _t.load(); + } + } + + if (_t._iO.onconnect) { + _t._iO.onconnect.apply(_t, [bSuccess]); + } + + } + + }; + + this._ondataerror = function(sError) { + + // flash 9 wave/eq data handler + // hack: called at start, and end from flash at/after onfinish() + if (_t.playState > 0) { + _s._wD('SMSound._ondataerror(): ' + sError); + if (_t._iO.ondataerror) { + _t._iO.ondataerror.apply(_t); + } + } + + }; + + }; // SMSound() + + /** + * Private SoundManager internals + * ------------------------------ + */ + + _getDocument = function() { + + return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]); + + }; + + _id = function(sID) { + + return _doc.getElementById(sID); + + }; + + _mixin = function(oMain, oAdd) { + + // non-destructive merge + var o1 = {}, i, o2, o; + + // clone c1 + for (i in oMain) { + if (oMain.hasOwnProperty(i)) { + o1[i] = oMain[i]; + } + } + + o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); + for (o in o2) { + if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { + o1[o] = o2[o]; + } + } + return o1; + + }; + + _event = (function() { + + var old = (_win.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + + function getArgs(oArgs) { + + var args = _slice.call(oArgs), len = args.length; + + if (old) { + // prefix + args[1] = 'on' + args[1]; + if (len > 3) { + // no capture + args.pop(); + } + } else if (len === 3) { + args.push(false); + } + + return args; + + } + + function apply(args, sType) { + + var element = args.shift(), + method = [evt[sType]]; + + if (old) { + element[method](args[0], args[1]); + } else { + element[method].apply(element, args); + } + + } + + function add() { + + apply(getArgs(arguments), 'add'); + + } + + function remove() { + + apply(getArgs(arguments), 'remove'); + + } + + return { + 'add': add, + 'remove': remove + }; + + }()); + + /** + * Internal HTML5 event handling + * ----------------------------- + */ + + function _html5_event(oFn) { + + // wrap html5 event handlers so we don't call them on destroyed sounds + + return function(e) { + + var t = this._t; + + if (!t || !t._a) { + // + if (t && t.sID) { + _s._wD(_h5+'ignoring '+e.type+': '+t.sID); + } else { + _s._wD(_h5+'ignoring '+e.type); + } + // + return null; + } else { + return oFn.call(this, e); + } + + }; + + } + + _html5_events = { + + // HTML5 event-name-to-handler map + + abort: _html5_event(function(e) { + + _s._wD(_h5+'abort: '+this._t.sID); + + }), + + // enough has loaded to play + + canplay: _html5_event(function(e) { + + var t = this._t; + + if (t._html5_canplay) { + // this event has already fired. ignore. + return true; + } + + t._html5_canplay = true; + _s._wD(_h5+'canplay: '+t.sID+', '+t.url); + t._onbufferchange(0); + var position1K = (!isNaN(t.position)?t.position/1000:null); + + // set the position if position was set before the sound loaded + if (t.position && this.currentTime !== position1K) { + _s._wD(_h5+'canplay: setting position to '+position1K); + try { + this.currentTime = position1K; + } catch(ee) { + _s._wD(_h5+'setting position failed: '+ee.message, 2); + } + } + + // hack for HTML5 from/to case + if (t._iO._oncanplay) { + t._iO._oncanplay(); + } + + }), + + load: _html5_event(function(e) { + + var t = this._t; + + if (!t.loaded) { + t._onbufferchange(0); + // should be 1, and the same + t._whileloading(t.bytesTotal, t.bytesTotal, t._get_html5_duration()); + t._onload(true); + } + + }), + + emptied: _html5_event(function(e) { + + _s._wD(_h5+'emptied: '+this._t.sID); + + }), + + ended: _html5_event(function(e) { + + var t = this._t; + + _s._wD(_h5+'ended: '+t.sID); + t._onfinish(); + + }), + + error: _html5_event(function(e) { + + _s._wD(_h5+'error: '+this.error.code); + // call load with error state? + this._t._onload(false); + + }), + + loadeddata: _html5_event(function(e) { + + var t = this._t, + // at least 1 byte, so math works + bytesTotal = t.bytesTotal || 1; + + _s._wD(_h5+'loadeddata: '+this._t.sID); + + // safari seems to nicely report progress events, eventually totalling 100% + if (!t._loaded && !_isSafari) { + t.duration = t._get_html5_duration(); + // fire whileloading() with 100% values + t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration()); + t._onload(true); + } + + }), + + loadedmetadata: _html5_event(function(e) { + + _s._wD(_h5+'loadedmetadata: '+this._t.sID); + + }), + + loadstart: _html5_event(function(e) { + + _s._wD(_h5+'loadstart: '+this._t.sID); + // assume buffering at first + this._t._onbufferchange(1); + + }), + + play: _html5_event(function(e) { + + _s._wD(_h5+'play: '+this._t.sID+', '+this._t.url); + // once play starts, no buffering + this._t._onbufferchange(0); + + }), + + playing: _html5_event(function(e) { + + _s._wD(_h5+'playing: '+this._t.sID); + + // once play starts, no buffering + this._t._onbufferchange(0); + + }), + + progress: _html5_event(function(e) { + + var t = this._t; + + if (t.loaded) { + return false; + } + + var i, j, str, buffered = 0, + isProgress = (e.type === 'progress'), + ranges = e.target.buffered, + + // firefox 3.6 implements e.loaded/total (bytes) + loaded = (e.loaded||0), + + total = (e.total||1); + + if (ranges && ranges.length) { + + // if loaded is 0, try TimeRanges implementation as % of load + // https://developer.mozilla.org/en/DOM/TimeRanges + + for (i=ranges.length; i--;) { + buffered = (ranges.end(i) - ranges.start(i)); + } + + // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges + loaded = buffered/e.target.duration; + + // + if (isProgress && ranges.length > 1) { + str = []; + j = ranges.length; + for (i=0; i + + } + + if (!isNaN(loaded)) { + + // if progress, likely not buffering + t._onbufferchange(0); + t._whileloading(loaded, total, t._get_html5_duration()); + if (loaded && total && loaded === total) { + // in case "onload" doesn't fire (eg. gecko 1.9.2) + _html5_events.load.call(this, e); + } + + } + + }), + + ratechange: _html5_event(function(e) { + + _s._wD(_h5+'ratechange: '+this._t.sID); + + }), + + suspend: _html5_event(function(e) { + + // download paused/stopped, may have finished (eg. onload) + var t = this._t; + + _s._wD(_h5+'suspend: '+t.sID); + _html5_events.progress.call(this, e); + t._onsuspend(); + + }), + + stalled: _html5_event(function(e) { + + _s._wD(_h5+'stalled: '+this._t.sID); + + }), + + timeupdate: _html5_event(function(e) { + + this._t._onTimer(); + + }), + + waiting: _html5_event(function(e) { + + var t = this._t; + + // see also: seeking + _s._wD(_h5+'waiting: '+t.sID); + + // playback faster than download rate, etc. + t._onbufferchange(1); + + }) + + }; + + _html5OK = function(iO) { + + // Use type, if specified. If HTML5-only mode, no other options, so just give 'er + return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only)); + + }; + + _html5Unload = function(oAudio) { + + /** + * Internal method: Unload media, and cancel any current/pending network requests. + * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download. + * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media + * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL. + */ + + if (oAudio) { + // Firefox likes '' for unload, most other UAs don't and fail to unload. + oAudio.src = (_is_firefox ? '' : _emptyURL); + } + + }; + + _html5CanPlay = function(o) { + + /** + * Try to find MIME, test and return truthiness + * o = { + * url: '/path/to/an.mp3', + * type: 'audio/mp3' + * } + */ + + if (!_s.useHTML5Audio || !_s.hasHTML5) { + return false; + } + + var url = (o.url || null), + mime = (o.type || null), + aF = _s.audioFormats, + result, + offset, + fileExt, + item; + + function preferFlashCheck(kind) { + + // whether flash should play a given type + return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind])); + + } + + // account for known cases like audio/mp3 + + if (mime && _s.html5[mime] !== 'undefined') { + return (_s.html5[mime] && !preferFlashCheck(mime)); + } + + if (!_html5Ext) { + _html5Ext = []; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + _html5Ext.push(item); + if (aF[item].related) { + _html5Ext = _html5Ext.concat(aF[item].related); + } + } + } + _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i'); + } + + // TODO: Strip URL queries, etc. + fileExt = (url ? url.toLowerCase().match(_html5Ext) : null); + + if (!fileExt || !fileExt.length) { + if (!mime) { + return false; + } else { + // audio/mp3 -> mp3, result should be known + offset = mime.indexOf(';'); + // strip "audio/X; codecs.." + fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); + } + } else { + // match the raw extension name - "mp3", for example + fileExt = fileExt[1]; + } + + if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { + // result known + return (_s.html5[fileExt] && !preferFlashCheck(fileExt)); + } else { + mime = 'audio/'+fileExt; + result = _s.html5.canPlayType({type:mime}); + _s.html5[fileExt] = result; + // _s._wD('canPlayType, found result: '+result); + return (result && _s.html5[mime] && !preferFlashCheck(mime)); + } + + }; + + _testHTML5 = function() { + + if (!_s.useHTML5Audio || typeof Audio === 'undefined') { + return false; + } + + // 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. :/ + var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null), + item, support = {}, aF, i; + + function _cp(m) { + + var canPlay, i, j, isOK = false; + + if (!a || typeof a.canPlayType !== 'function') { + return false; + } + + if (m instanceof Array) { + // iterate through all mime types, return any successes + for (i=0, j=m.length; i + notReady: 'Not loaded yet - wait for soundManager.onload()/onready()', + notOK: 'Audio support is not available.', + domError: _smc + 'createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.', + spcWmode: _smc + 'createMovie(): Removing wmode, preventing known SWF loading issue(s)', + swf404: _sm + ': Verify that %s is a valid path.', + tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)', + checkSWF: 'See SWF output for more debug info.', + localFail: _sm + ': 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/', + waitFocus: _sm + ': Special case: Waiting for focus-related event..', + waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...', + waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...', + needFunction: _sm + ': Function object expected for %s', + badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character', + currentObj: '--- ' + _sm + '._debug(): Current sound objects ---', + waitEI: _smc + 'initMovie(): Waiting for ExternalInterface call from Flash..', + waitOnload: _sm + ': Waiting for window.onload()', + docLoaded: _sm + ': Document already loaded', + onload: _smc + 'initComplete(): calling soundManager.onload()', + onloadOK: _sm + '.onload() complete', + init: _smc + 'init()', + didInit: _smc + 'init(): Already called?', + flashJS: _sm + ': Attempting to call Flash from JS..', + 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', + badRemove: 'Warning: Failed to remove flash movie.', + noPeak: 'Warning: peakData features unsupported for movieStar formats', + shutdown: _sm + '.disable(): Shutting down', + queue: _sm + ': Queueing %s handler', + smFail: _sm + ': Failed to initialise.', + smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', + fbTimeout: 'No flash response, applying .'+_swfCSS.swfTimedout+' CSS..', + fbLoaded: 'Flash loaded', + fbHandler: _smc+'flashBlockHandler()', + manURL: 'SMSound.load(): Using manually-assigned URL', + onURL: _sm + '.load(): current URL already assigned.', + badFV: _sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', + as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', + noNSLoop: 'Note: Looping not implemented for MovieStar formats', + needfl9: 'Note: Switching to flash 9, required for MP4 formats.', + mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', + mfOn: 'mobileFlash::enabling on-screen flash repositioning', + policy: 'Enabling usePolicyFile for data access' + // + + }; + + _str = function() { + + // internal string replace helper. + // arguments: o [,items to replace] + // + + // real array, please + var args = _slice.call(arguments), + + // first arg + o = args.shift(), + + str = (_strings && _strings[o]?_strings[o]:''), i, j; + if (str && args && args.length) { + for (i = 0, j = args.length; i < j; i++) { + str = str.replace('%s', args[i]); + } + } + + return str; + // + + }; + + _loopFix = function(sOpt) { + + // flash 8 requires stream = false for looping to work + if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) { + _wDS('as2loop'); + sOpt.stream = false; + } + + return sOpt; + + }; + + _policyFix = function(sOpt, sPre) { + + if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { + _s._wD((sPre || '') + _str('policy')); + sOpt.usePolicyFile = true; + } + + return sOpt; + + }; + + _complain = function(sMsg) { + + // + if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { + console.warn(sMsg); + } else { + _s._wD(sMsg); + } + // + + }; + + _doNothing = function() { + + return false; + + }; + + _disableObject = function(o) { + + var oProp; + + for (oProp in o) { + if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { + o[oProp] = _doNothing; + } + } + + oProp = null; + + }; + + _failSafely = function(bNoDisable) { + + // general failure exception handler + + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + + if (_disabled || bNoDisable) { + _wDS('smFail', 2); + _s.disable(bNoDisable); + } + + }; + + _normalizeMovieURL = function(smURL) { + + var urlParams = null, url; + + if (smURL) { + if (smURL.match(/\.swf(\?.*)?$/i)) { + urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); + if (urlParams) { + // assume user knows what they're doing + return smURL; + } + } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { + // append trailing slash, if needed + smURL += '/'; + } + } + + url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + _s.movieURL; + + if (_s.noSWFCache) { + url += ('?ts=' + new Date().getTime()); + } + + return url; + + }; + + _setVersionInfo = function() { + + // short-hand for internal use + + _fV = parseInt(_s.flashVersion, 10); + + if (_fV !== 8 && _fV !== 9) { + _s._wD(_str('badFV', _fV, _defaultFlashVersion)); + _s.flashVersion = _fV = _defaultFlashVersion; + } + + // debug flash movie, if applicable + + var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); + + if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _fV < 9) { + _s._wD(_str('needfl9')); + _s.flashVersion = _fV = 9; + } + + _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); + + // set up default options + if (_fV > 8) { + // +flash 9 base options + _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); + _s.features.buffering = true; + // +moviestar support + _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); + _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + _s.features.movieStar = true; + } else { + _s.features.movieStar = false; + } + + // regExp for flash canPlay(), etc. + _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; + + // if applicable, use _debug versions of SWFs + _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); + + _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); + + }; + + _setPolling = function(bPolling, bHighPerformance) { + + if (!_flash) { + return false; + } + + _flash._setPolling(bPolling, bHighPerformance); + + }; + + _initDebug = function() { + + // starts debug mode, creating output
    for UAs without console object + + // allow force of debug mode via URL + if (_s.debugURLParam.test(_wl)) { + _s.debugMode = true; + } + + // + if (_id(_s.debugID)) { + return false; + } + + var oD, oDebug, oTarget, oToggle, tmp; + + if (_s.debugMode && !_id(_s.debugID) && (!_hasConsole || !_s.useConsole || !_s.consoleOnly)) { + + oD = _doc.createElement('div'); + oD.id = _s.debugID + '-toggle'; + + oToggle = { + 'position': 'fixed', + 'bottom': '0px', + 'right': '0px', + 'width': '1.2em', + 'height': '1.2em', + 'lineHeight': '1.2em', + 'margin': '2px', + 'textAlign': 'center', + 'border': '1px solid #999', + 'cursor': 'pointer', + 'background': '#fff', + 'color': '#333', + 'zIndex': 10001 + }; + + oD.appendChild(_doc.createTextNode('-')); + oD.onclick = _toggleDebug; + oD.title = 'Toggle SM2 debug console'; + + if (_ua.match(/msie 6/i)) { + oD.style.position = 'absolute'; + oD.style.cursor = 'hand'; + } + + for (tmp in oToggle) { + if (oToggle.hasOwnProperty(tmp)) { + oD.style[tmp] = oToggle[tmp]; + } + } + + oDebug = _doc.createElement('div'); + oDebug.id = _s.debugID; + oDebug.style.display = (_s.debugMode?'block':'none'); + + if (_s.debugMode && !_id(oD.id)) { + try { + oTarget = _getDocument(); + oTarget.appendChild(oD); + } catch(e2) { + throw new Error(_str('domError')+' \n'+e2.toString()); + } + oTarget.appendChild(oDebug); + } + + } + + oTarget = null; + // + + }; + + _idCheck = this.getSoundById; + + // + _wDS = function(o, errorLevel) { + + if (!o) { + return ''; + } else { + return _s._wD(_str(o), errorLevel); + } + + }; + + // last-resort debugging option + + if (_wl.indexOf('sm2-debug=alert') + 1 && _s.debugMode) { + _s._wD = function(sText) {window.alert(sText);}; + } + + _toggleDebug = function() { + + var o = _id(_s.debugID), + oT = _id(_s.debugID + '-toggle'); + + if (!o) { + return false; + } + + if (_debugOpen) { + // minimize + oT.innerHTML = '+'; + o.style.display = 'none'; + } else { + oT.innerHTML = '-'; + o.style.display = 'block'; + } + + _debugOpen = !_debugOpen; + + }; + + _debugTS = function(sEventType, bSuccess, sMessage) { + + // troubleshooter debug hooks + + if (typeof sm2Debugger !== 'undefined') { + try { + sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); + } catch(e) { + // oh well + } + } + + return true; + + }; + // + + _getSWFCSS = function() { + + var css = []; + + if (_s.debugMode) { + css.push(_swfCSS.sm2Debug); + } + + if (_s.debugFlash) { + css.push(_swfCSS.flashDebug); + } + + if (_s.useHighPerformance) { + css.push(_swfCSS.highPerf); + } + + return css.join(' '); + + }; + + _flashBlockHandler = function() { + + // *possible* flash block situation. + + var name = _str('fbHandler'), + p = _s.getMoviePercent(), + css = _swfCSS, + error = {type:'FLASHBLOCK'}; + + if (_s.html5Only) { + return false; + } + + if (!_s.ok()) { + + if (_needsFlash) { + // make the movie more visible, so user can fix + _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); + _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':'')); + } + + _s.didFlashBlock = true; + + // fire onready(), complain lightly + _processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); + _catchError(error); + + } else { + + // SM2 loaded OK (or recovered) + + // + if (_s.didFlashBlock) { + _s._wD(name+': Unblocked'); + } + // + + if (_s.oMC) { + _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); + } + + } + + }; + + _addOnEvent = function(sType, oMethod, oScope) { + + if (typeof _on_queue[sType] === 'undefined') { + _on_queue[sType] = []; + } + + _on_queue[sType].push({ + 'method': oMethod, + 'scope': (oScope || null), + 'fired': false + }); + + }; + + _processOnEvents = function(oOptions) { + + // assume onready, if unspecified + + if (!oOptions) { + oOptions = { + type: 'onready' + }; + } + + if (!_didInit && oOptions && !oOptions.ignoreInit) { + // not ready yet. + return false; + } + + if (oOptions.type === 'ontimeout' && _s.ok()) { + // invalid case + return false; + } + + var status = { + success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled) + }, + + // queue specified by type, or none + srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), + + queue = [], i, j, + args = [status], + canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok()); + + if (oOptions.error) { + args[0].error = oOptions.error; + } + + for (i = 0, j = srcQueue.length; i < j; i++) { + if (srcQueue[i].fired !== true) { + queue.push(srcQueue[i]); + } + } + + if (queue.length) { + _s._wD(_sm + ': Firing ' + queue.length + ' '+oOptions.type+'() item' + (queue.length === 1?'':'s')); + for (i = 0, j = queue.length; i < j; i++) { + if (queue[i].scope) { + queue[i].method.apply(queue[i].scope, args); + } else { + queue[i].method.apply(this, args); + } + if (!canRetry) { + // flashblock case doesn't count here + queue[i].fired = true; + } + } + } + + return true; + + }; + + _initUserOnload = function() { + + _win.setTimeout(function() { + + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + + _processOnEvents(); + + // call user-defined "onload", scoped to window + + if (_s.onload instanceof Function) { + _wDS('onload', 1); + _s.onload.apply(_win); + _wDS('onloadOK', 1); + } + + if (_s.waitForWindowLoad) { + _event.add(_win, 'load', _initUserOnload); + } + + },1); + + }; + + _detectFlash = function() { + + // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt + + if (_hasFlash !== undefined) { + // this work has already been done. + return _hasFlash; + } + + var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject; + + if (nP && nP.length) { + type = 'application/x-shockwave-flash'; + types = n.mimeTypes; + if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { + hasPlugin = true; + } + } else if (typeof AX !== 'undefined') { + try { + obj = new AX('ShockwaveFlash.ShockwaveFlash'); + } catch(e) { + // oh well + } + hasPlugin = (!!obj); + } + + _hasFlash = hasPlugin; + + return hasPlugin; + + }; + + _featureCheck = function() { + + var needsFlash, item, + + // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works. + isSpecial = (_is_iDevice && !!(_ua.match(/os (1|2|3_0|3_1)/i))); + + if (isSpecial) { + + // has Audio(), but is broken; let it load links directly. + _s.hasHTML5 = false; + + // ignore flash case, however + _s.html5Only = true; + + if (_s.oMC) { + _s.oMC.style.display = 'none'; + } + + return false; + + } + + if (_s.useHTML5Audio) { + + if (!_s.html5 || !_s.html5.canPlayType) { + _s._wD('SoundManager: No HTML5 Audio() support detected.'); + _s.hasHTML5 = false; + return true; + } else { + _s.hasHTML5 = true; + } + if (_isBadSafari) { + _s._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); + if (_detectFlash()) { + return true; + } + } + } else { + + // flash needed (or, HTML5 needs enabling.) + return true; + + } + + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item)) { + if ((_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) { + // flash may be required, or preferred for this format + needsFlash = true; + } + } + } + + // sanity check.. + if (_s.ignoreFlash) { + needsFlash = false; + } + + _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash); + + return (!_s.html5Only); + + }; + + _parseURL = function(url) { + + /** + * Internal: Finds and returns the first playable URL (or failing that, the first URL.) + * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects. + */ + + var i, j, result = 0; + + if (url instanceof Array) { + + // find the first good one + for (i=0, j=url.length; i + var sb = _s.sandbox; + + sb.type = sandboxType; + sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')]; + + _s._wD('Flash security sandbox type: ' + sb.type); + + if (sb.type === 'localWithFile') { + + sb.noRemote = true; + sb.noLocal = false; + _wDS('secNote', 2); + + } else if (sb.type === 'localWithNetwork') { + + sb.noRemote = false; + sb.noLocal = true; + + } else if (sb.type === 'localTrusted') { + + sb.noRemote = false; + sb.noLocal = false; + + } + // + + }; + + this._externalInterfaceOK = function(flashDate, swfVersion) { + + // flash callback confirming flash loaded, EI working etc. + // flashDate = approx. timing/delay info for JS/flash bridge + // swfVersion: SWF build string + + if (_s.swfLoaded) { + return false; + } + + var e, eiTime = new Date().getTime(); + + _s._wD(_smc+'externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':'')); + _debugTS('swf', true); + _debugTS('flashtojs', true); + _s.swfLoaded = true; + _tryInitOnFocus = false; + + if (_isBadSafari) { + _badSafariFix(); + } + + // complain if JS + SWF build/version strings don't match, excluding +DEV builds + // + if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== _s.versionNumber.replace(/\+dev/i, '')) { + + e = _sm + ': Fatal: JavaScript file build "' + _s.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + _s.url + '. Ensure both are up-to-date.'; + + // escape flash -> JS stack so this error fires in window. + setTimeout(function versionMismatch() { + throw new Error(e); + }, 0); + + // exit, init will fail with timeout + return false; + + } + // + + if (_isIE) { + // IE needs a timeout OR delay until window.onload - may need TODO: investigating + setTimeout(_init, 100); + } else { + _init(); + } + + }; + + /** + * Private initialization helpers + * ------------------------------ + */ + + _createMovie = function(smID, smURL) { + + if (_didAppend && _appendSuccess) { + // ignore if already succeeded + return false; + } + + function _initMsg() { + _s._wD('-- SoundManager 2 ' + _s.version + (!_s.html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (!_s.html5Only ? (_s.useHighPerformance?', high performance mode, ':', ') + (( _s.flashPollingInterval ? 'custom (' + _s.flashPollingInterval + 'ms)' : 'normal') + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') : '') + ' --', 1); + } + + if (_s.html5Only) { + + // 100% HTML5 mode + _setVersionInfo(); + + _initMsg(); + _s.oMC = _id(_s.movieID); + _init(); + + // prevent multiple init attempts + _didAppend = true; + + _appendSuccess = true; + + return false; + + } + + // flash path + var remoteURL = (smURL || _s.url), + localURL = (_s.altURL || remoteURL), + swfTitle = 'JS/Flash audio component (SoundManager 2)', + oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), + s, x, sClass, side = 'auto', isRTL = null, + html = _doc.getElementsByTagName('html')[0]; + + isRTL = (html && html.dir && html.dir.match(/rtl/i)); + smID = (typeof smID === 'undefined'?_s.id:smID); + + function param(name, value) { + return ''; + } + + // safety check for legacy (change to Flash 9 URL) + _setVersionInfo(); + _s.url = _normalizeMovieURL("inc/SoundManager2/swf/"); + smURL = _s.url; + + _s.wmode = (!_s.wmode && _s.useHighPerformance ? 'transparent' : _s.wmode); + + if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { + /** + * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here + * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout + * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?) + */ + _wDS('spcWmode'); + _s.wmode = null; + } + + oEmbed = { + 'name': smID, + 'id': smID, + 'src': smURL, + 'width': side, + 'height': side, + 'quality': 'high', + 'allowScriptAccess': _s.allowScriptAccess, + 'bgcolor': _s.bgColor, + 'pluginspage': _http+'www.macromedia.com/go/getflashplayer', + 'title': swfTitle, + 'type': 'application/x-shockwave-flash', + 'wmode': _s.wmode, + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + 'hasPriority': 'true' + }; + + if (_s.debugFlash) { + oEmbed.FlashVars = 'debug=1'; + } + + if (!_s.wmode) { + // don't write empty attribute + delete oEmbed.wmode; + } + + if (_isIE) { + + // IE is "special". + oMovie = _doc.createElement('div'); + movieHTML = [ + '', + param('movie', smURL), + param('AllowScriptAccess', _s.allowScriptAccess), + param('quality', oEmbed.quality), + (_s.wmode? param('wmode', _s.wmode): ''), + param('bgcolor', _s.bgColor), + param('hasPriority', 'true'), + (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), + '' + ].join(''); + + } else { + + oMovie = _doc.createElement('embed'); + for (tmp in oEmbed) { + if (oEmbed.hasOwnProperty(tmp)) { + oMovie.setAttribute(tmp, oEmbed[tmp]); + } + } + + } + + _initDebug(); + extraClass = _getSWFCSS(); + oTarget = _getDocument(); + + if (oTarget) { + + _s.oMC = (_id(_s.movieID) || _doc.createElement('div')); + + if (!_s.oMC.id) { + + _s.oMC.id = _s.movieID; + _s.oMC.className = _swfCSS.swfDefault + ' ' + extraClass; + s = null; + oEl = null; + + if (!_s.useFlashBlock) { + if (_s.useHighPerformance) { + // on-screen at all times + s = { + 'position': 'fixed', + 'width': '8px', + 'height': '8px', + // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. + 'bottom': '0px', + 'left': '0px', + 'overflow': 'hidden' + }; + } else { + // hide off-screen, lower priority + s = { + 'position': 'absolute', + 'width': '6px', + 'height': '6px', + 'top': '-9999px', + 'left': '-9999px' + }; + if (isRTL) { + s.left = Math.abs(parseInt(s.left,10))+'px'; + } + } + } + + if (_isWebkit) { + // soundcloud-reported render/crash fix, safari 5 + _s.oMC.style.zIndex = 10000; + } + + if (!_s.debugFlash) { + for (x in s) { + if (s.hasOwnProperty(x)) { + _s.oMC.style[x] = s[x]; + } + } + } + + try { + if (!_isIE) { + _s.oMC.appendChild(oMovie); + } + oTarget.appendChild(_s.oMC); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + } catch(e) { + throw new Error(_str('domError')+' \n'+e.toString()); + } + + } else { + + // SM2 container is already in the document (eg. flashblock use case) + sClass = _s.oMC.className; + _s.oMC.className = (sClass?sClass+' ':_swfCSS.swfDefault) + (extraClass?' '+extraClass:''); + _s.oMC.appendChild(oMovie); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + + } + + } + + _didAppend = true; + _initMsg(); + _s._wD(_smc+'createMovie(): Trying to load ' + smURL + (!_overHTTP && _s.altURL?' (alternate URL)':''), 1); + + return true; + + }; + + _initMovie = function() { + + if (_s.html5Only) { + _createMovie(); + return false; + } + + // attempt to get, or create, movie + // may already exist + if (_flash) { + return false; + } + + // inline markup case + _flash = _s.getMovie(_s.id); + + if (!_flash) { + if (!_oRemoved) { + // try to create + _createMovie(_s.id, _s.url); + } else { + // try to re-append removed movie after reboot() + if (!_isIE) { + _s.oMC.appendChild(_oRemoved); + } else { + _s.oMC.innerHTML = _oRemovedHTML; + } + _oRemoved = null; + _didAppend = true; + } + _flash = _s.getMovie(_s.id); + } + + // + if (_flash) { + _wDS('waitEI'); + } + // + + if (_s.oninitmovie instanceof Function) { + setTimeout(_s.oninitmovie, 1); + } + + return true; + + }; + + _delayWaitForEI = function() { + + setTimeout(_waitForEI, 1000); + + }; + + _waitForEI = function() { + + if (_waitingForEI) { + return false; + } + + _waitingForEI = true; + _event.remove(_win, 'load', _delayWaitForEI); + + if (_tryInitOnFocus && !_isFocused) { + // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event + _wDS('waitFocus'); + return false; + } + + var p; + if (!_didInit) { + p = _s.getMoviePercent(); + _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':'')))); + } + + setTimeout(function() { + + p = _s.getMoviePercent(); + + // + if (!_didInit) { + _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2); + if (!_overHTTP && p) { + _wDS('localFail', 2); + if (!_s.debugFlash) { + _wDS('tryDebug', 2); + } + } + if (p === 0) { + // if 0 (not null), probably a 404. + _s._wD(_str('swf404', _s.url)); + } + _debugTS('flashtojs', false, ': Timed out' + _overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); + } + // + + // give up / time-out, depending + + if (!_didInit && _okToDisable) { + if (p === null) { + // SWF failed. Maybe blocked. + if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + _wDS('waitForever'); + } else { + // old SM2 behaviour, simply fail + _failSafely(true); + } + } else { + // flash loaded? Shouldn't be a blocking issue, then. + if (_s.flashLoadTimeout === 0) { + _wDS('waitForever'); + } else { + _failSafely(true); + } + } + } + + }, _s.flashLoadTimeout); + + }; + + _handleFocus = function() { + + function cleanup() { + _event.remove(_win, 'focus', _handleFocus); + _event.remove(_win, 'load', _handleFocus); + } + + if (_isFocused || !_tryInitOnFocus) { + cleanup(); + return true; + } + + _okToDisable = true; + _isFocused = true; + _s._wD(_smc+'handleFocus()'); + + if (_isSafari && _tryInitOnFocus) { + _event.remove(_win, 'mousemove', _handleFocus); + } + + // allow init to restart + _waitingForEI = false; + + cleanup(); + return true; + + }; + + _showSupport = function() { + + var item, tests = []; + + if (_s.useHTML5Audio && _s.hasHTML5) { + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item)) { + tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : '')))); + } + } + _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1); + } + + }; + + _initComplete = function(bNoDisable) { + + if (_didInit) { + return false; + } + + if (_s.html5Only) { + // all good. + _s._wD('-- SoundManager 2: loaded --'); + _didInit = true; + _initUserOnload(); + _debugTS('onload', true); + return true; + } + + var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()), + error; + + if (!wasTimeout) { + _didInit = true; + if (_disabled) { + error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; + } + } + + _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1); + + if (_disabled || bNoDisable) { + if (_s.useFlashBlock && _s.oMC) { + _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_swfCSS.swfTimedout:_swfCSS.swfError); + } + _processOnEvents({type:'ontimeout', error:error}); + _debugTS('onload', false); + _catchError(error); + return false; + } else { + _debugTS('onload', true); + } + + if (_s.waitForWindowLoad && !_windowLoaded) { + _wDS('waitOnload'); + _event.add(_win, 'load', _initUserOnload); + return false; + } else { + // + if (_s.waitForWindowLoad && _windowLoaded) { + _wDS('docLoaded'); + } + // + _initUserOnload(); + } + + return true; + + }; + + _init = function() { + + _wDS('init'); + + // called after onload() + + if (_didInit) { + _wDS('didInit'); + return false; + } + + function _cleanup() { + _event.remove(_win, 'load', _s.beginDelayedInit); + } + + if (_s.html5Only) { + if (!_didInit) { + // we don't need no steenking flash! + _cleanup(); + _s.enabled = true; + _initComplete(); + } + return true; + } + + // flash path + _initMovie(); + + try { + + _wDS('flashJS'); + + // attempt to talk to Flash + _flash._externalInterfaceTest(false); + + // apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling + // (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates) + _setPolling(true, (_s.flashPollingInterval || (_s.useHighPerformance ? 10 : 50))); + + if (!_s.debugMode) { + // stop the SWF from making debug output calls to JS + _flash._disableDebug(); + } + + _s.enabled = true; + _debugTS('jstoflash', true); + + if (!_s.html5Only) { + // prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead + // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/ + _event.add(_win, 'unload', _doNothing); + } + + } catch(e) { + + _s._wD('js/flash exception: ' + e.toString()); + _debugTS('jstoflash', false); + _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); + // don't disable, for reboot() + _failSafely(true); + _initComplete(); + + return false; + + } + + _initComplete(); + + // disconnect events + _cleanup(); + + return true; + + }; + + _domContentLoaded = function() { + + if (_didDCLoaded) { + return false; + } + + _didDCLoaded = true; + _initDebug(); + + /** + * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1 + * Ditto for sm2-preferFlash, too. + */ + // + (function(){ + + var a = 'sm2-usehtml5audio=', l = _wl.toLowerCase(), b = null, + a2 = 'sm2-preferflash=', b2 = null, hasCon = (typeof console !== 'undefined' && typeof console.log !== 'undefined'); + + if (l.indexOf(a) !== -1) { + b = (l.charAt(l.indexOf(a)+a.length) === '1'); + if (hasCon) { + console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); + } + _s.useHTML5Audio = b; + } + + if (l.indexOf(a2) !== -1) { + b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1'); + if (hasCon) { + console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter'); + } + _s.preferFlash = b2; + } + + }()); + // + + if (!_hasFlash && _s.hasHTML5) { + _s._wD('SoundManager: No Flash detected'+(!_s.useHTML5Audio?', enabling HTML5.':'. Trying HTML5-only mode.')); + _s.useHTML5Audio = true; + // make sure we aren't preferring flash, either + // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak. + _s.preferFlash = false; + } + + _testHTML5(); + _s.html5.usingFlash = _featureCheck(); + _needsFlash = _s.html5.usingFlash; + _showSupport(); + + if (!_hasFlash && _needsFlash) { + _s._wD('SoundManager: Fatal error: Flash is needed to play some required formats, but is not available.'); + // TODO: Fatal here vs. timeout approach, etc. + // hack: fail sooner. + _s.flashLoadTimeout = 1; + } + + if (_doc.removeEventListener) { + _doc.removeEventListener('DOMContentLoaded', _domContentLoaded, false); + } + + _initMovie(); + return true; + + }; + + _domContentLoadedIE = function() { + + if (_doc.readyState === 'complete') { + _domContentLoaded(); + _doc.detachEvent('onreadystatechange', _domContentLoadedIE); + } + + return true; + + }; + + _winOnLoad = function() { + // catch edge case of _initComplete() firing after window.load() + _windowLoaded = true; + _event.remove(_win, 'load', _winOnLoad); + }; + + // sniff up-front + _detectFlash(); + + // focus and window load, init (primarily flash-driven) + _event.add(_win, 'focus', _handleFocus); + _event.add(_win, 'load', _handleFocus); + _event.add(_win, 'load', _delayWaitForEI); + _event.add(_win, 'load', _winOnLoad); + + + if (_isSafari && _tryInitOnFocus) { + // massive Safari 3.1 focus detection hack + _event.add(_win, 'mousemove', _handleFocus); + } + + if (_doc.addEventListener) { + + _doc.addEventListener('DOMContentLoaded', _domContentLoaded, false); + + } else if (_doc.attachEvent) { + + _doc.attachEvent('onreadystatechange', _domContentLoadedIE); + + } else { + + // no add/attachevent support - safe to assume no JS -> Flash either + _debugTS('onload', false); + _catchError({type:'NO_DOM2_EVENTS', fatal:true}); + + } + + if (_doc.readyState === 'complete') { + // DOMReady has already happened. + setTimeout(_domContentLoaded,100); + } + +} // SoundManager() + +// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading + +if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { + soundManager = new SoundManager(); +} + +/** + * SoundManager public interfaces + * ------------------------------ + */ + +window.SoundManager = SoundManager; // constructor +window.soundManager = soundManager; // public API, flash callbacks etc. + +}(window)); \ No newline at end of file diff --git a/inc/SoundManager2/swf/soundmanager2.swf b/inc/SoundManager2/swf/soundmanager2.swf new file mode 100755 index 0000000000000000000000000000000000000000..14850f2158003034fdca9fbada7c2b70438324ba GIT binary patch literal 2850 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/inc/SoundManager2/swf/soundmanager2_debug.swf b/inc/SoundManager2/swf/soundmanager2_debug.swf new file mode 100755 index 0000000000000000000000000000000000000000..aa4750a6e277d1d70b561a6051d8bac20aab3fce GIT binary patch literal 3280 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 O2LJ&7{{sO3qBe>|LR~Ka literal 0 HcmV?d00001 diff --git a/inc/SoundManager2/swf/soundmanager2_flash9.swf b/inc/SoundManager2/swf/soundmanager2_flash9.swf new file mode 100755 index 0000000000000000000000000000000000000000..2705986ac107a092aad7fa094d19c15c38278460 GIT binary patch literal 8682 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 I0++K_Y73U(2><{9 literal 0 HcmV?d00001 diff --git a/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf b/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf new file mode 100755 index 0000000000000000000000000000000000000000..243d6495b488ace9e5f2f076edf88f561650731b GIT binary patch literal 16806 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 ZjVD?oaIiY)Vkm6eEAtWi{{cd~Z1|p1w|W2o literal 0 HcmV?d00001 diff --git a/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip b/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip new file mode 100755 index 0000000000000000000000000000000000000000..29737aaf13e7166d6ee83816b332d1acae2b88ba GIT binary patch literal 32404 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

    )s`;JPK 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 Java Applet -> Javascript Midibridge API -> a GUI in Javascript, Flash, SVG, C# (Silverlight) + +Because the midibridge is written in native Javascript, you can use it conflict-free with any Javascript framework. + + +The only files you need to get started are: + +/lib/midibridge-0.5.1.min.js +/java/midiapplet.jar + + +/lib/MidiBridge.js is the non-minified version of /lib/midibridge-0.5.1.min.js + +The other files and notably the files in the /js folder are code snippets that i have used in the quick start guide and the documentation on my blogpost, see: + +http://www.abumarkub.net/abublog/?p=399 + diff --git a/inc/midibridge/index.html b/inc/midibridge/index.html new file mode 100644 index 0000000..0808ae1 --- /dev/null +++ b/inc/midibridge/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + \ No newline at end of file diff --git a/inc/midibridge/java/midiapplet.jar b/inc/midibridge/java/midiapplet.jar new file mode 100644 index 0000000000000000000000000000000000000000..ea4e6e971b51dd6b76d313cecc81a747b6fd07d1 GIT binary patch literal 14830 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'; + html += ''; + html += ''; + html += ''; + html += ''; + //html += 'Your browser needs the Java plugin to use the midibridge. You can download it here'; + html += ''; + javaDiv.innerHTML = html; + document.body.appendChild(javaDiv); + } + + /** + * class MidiMessage is used to wrap the midi note data that arrives from the applet + */ + var MidiMessage = (function()//constructor + { + var _constructor = function(data) { + this.data1 = data.data1; + this.data2 = data.data2; + this.status = data.status; + this.status = this.data2 == 0 && this.status == midiBridge.NOTE_ON ? midiBridge.NOTE_OFF : this.status; + this.channel = data.channel; + this.noteName = midiBridge.getNoteName(this.data1, midiBridge.noteNameModus); + this.statusCode = midiBridge.getStatus(this.status); + this.microsecond = data.microsecond; + this.time = midiBridge.getNiceTime(this.microsecond); + }; + + _constructor.prototype = { + toString : function() { + var s = ""; + s += this.noteName + " " + this.statusCode + " " + this.data1 + " " + this.data2 + " " + this.status; + s += this.microsecond ? this.microsecond + " " + this.time : ""; + //console.log(s); + return s; + }, + toJSONString : function() { + var s; + if(this.microsecond){ + s= "{'notename':" + this.noteName + ", 'status':" + this.status + ", 'data1':" + this.data1 + ", 'data2':" + this.data2 + ", 'microsecond':" + this.microsecond + ", 'time':" + this.time + "}"; + }else{ + s= "{'notename':" + this.noteName + ", 'status':" + this.status + ", 'data1':" + this.data1 + ", 'data2':" + this.data2 + "}"; + } + //console.log(s); + return s; + } + } + + return _constructor; + })(); + + + midiBridge.getNoteName = function(noteNumber, mode) { + + var octave = Math.floor(((noteNumber) / 12) - 1); + var noteName = noteNames[mode][noteNumber % 12]; + return noteName + "" + octave; + }; + + + midiBridge.getNoteNumber = function(noteName, octave) { + var index = -1; + noteName = noteName.toUpperCase(); + for(var key in noteNames) { + var modus = noteNames[key]; + for(var i = 0, max = modus.length; i < max; i++) { + if(modus[i] === noteName) { + index = i; + break; + } + } + } + if(index === -1) { + return "invalid note name"; + } + noteNumber = (12 + index) + (octave * 12); + return noteNumber; + } + + + midiBridge.getStatus = function($statusCode) { + return status[$statusCode]; + }; + + midiBridge.getNiceTime = function(microseconds) + { + //console.log(microseconds); + var r = ""; + + var t = (microseconds / 1000 / 1000) >> 0; + var h = (t / (60 * 60)) >> 0; + var m = ((t % (60 * 60)) / 60) >> 0; + var s = t % (60); + var ms = (((microseconds /1000) - (h * 3600000) - (m * 60000) - (s * 1000)) + 0.5) >> 0; + + //console.log(t,h,m,s,ms); + + r += h > 0 ? h + ":" : ""; + r += h > 0 ? m < 10 ? "0" + m : m : m; + r += ":"; + r += s < 10 ? "0" + s : s; + r += ":"; + r += ms == 0 ? "000" : ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms; + + return r; + } + + + function getApplet() { + try { + applet = midiBridge.getObject("midibridge-applet"); + } catch(e) { + //console.log(e) + //Firefox needs more time to initialize the Applet + setTimeout(getApplet, 25); + return; + } + } + + midiBridge.getObject = function(objectName) { + var ua = navigator.userAgent.toLowerCase(); + //console.log(ua); + if(ua.indexOf("msie") !== -1 || ua.indexOf("webkit") !== -1) { + return window[objectName]; + } else { + return document[objectName]; + } + } + + //add addEventListener to IE8 + if(!window.addEventListener) { + window.addEventListener = function($id, $callback, $bubble) { + window.attachEvent('onload', $callback); + } + + } + + window.midiBridge = midiBridge; + +})(window); \ No newline at end of file diff --git a/js/Color.js b/js/Color.js new file mode 100644 index 0000000..11428b2 --- /dev/null +++ b/js/Color.js @@ -0,0 +1,154 @@ +/* + + Color.Space : 0.3 : mudcu.be + ----------------------------- + STRING <-> HEX <-> RGB <-> HSL + ----------------------------- + var HEX = 0xFF0000; + var HSL = Color.Space(HEX, "HEX>RGB>HSL"); + +*/ + +if (!window.Color) Color = {}; +if (!window.Color.Space) Color.Space = {}; + +(function () { + +var DEG_RAD = Math.PI / 180; +var RAD_DEG = 1 / DEG_RAD; + +var shortcuts = { }; +var root = Color.Space = function(color, route) { + if (shortcuts[route]) { + route = shortcuts[route]; + } + var arr = route.split(">"); + var key = ""; + for (var n = 0; n < arr.length; n ++) { + if (n > 1) { + key = key.split("_"); + key.shift(); + key = key.join("_"); + } + key += (n == 0 ? "" : "_") + arr[n]; + if (n > 0) color = root[key](color); + } + return color; +}; + +// STRING = 'FFFFFF' | 'FFFFFFFF' + +root.STRING_HEX = function (o) { + return parseInt('0x' + o); +}; + +// HEX = 0x000000 -> 0xFFFFFF + +root.HEX_STRING = function (o, maxLength) { + if (!maxLength) maxLength = 6; + if (!o) o = 0; + var z = o.toString(16); + // when string is lesser than maxLength + var n = z.length; + while (n < maxLength) { + z = '0' + z; + n++; + } + // when string is greater than maxLength + var n = z.length; + while (n > maxLength) { + z = z.substr(1); + n--; + } + return z; +}; + +root.HEX_RGB = function (o) { + return { + R: (o >> 16), + G: (o >> 8) & 0xFF, + B: o & 0xFF + }; +}; + +// RGB = R: Red / G: Green / B: Blue + +root.RGB_HEX = function (o) { + if (o.R < 0) o.R = 0; + if (o.G < 0) o.G = 0; + if (o.B < 0) o.B = 0; + if (o.R > 255) o.R = 255; + if (o.G > 255) o.G = 255; + if (o.B > 255) o.B = 255; + return o.R << 16 | o.G << 8 | o.B; +}; + +root.RGB_HSL = function (o) { // RGB from 0 to 1 + // http://www.easyrgb.com/index.php?X=MATH&H=18#text18 + var _R = o.R / 255, + _G = o.G / 255, + _B = o.B / 255, + min = Math.min(_R, _G, _B), + max = Math.max(_R, _G, _B), + D = max - min, + H, + S, + L = (max + min) / 2; + if (D == 0) { // No chroma + H = 0; + S = 0; + } else { // Chromatic data + if (L < 0.5) S = D / (max + min); + else S = D / (2 - max - min); + var DR = (((max - _R) / 6) + (D / 2)) / D; + var DG = (((max - _G) / 6) + (D / 2)) / D; + var DB = (((max - _B) / 6) + (D / 2)) / D; + if (_R == max) H = DB - DG; + else if (_G == max) H = (1 / 3) + DR - DB; + else if (_B == max) H = (2 / 3) + DG - DR; + if (H < 0) H += 1; + if (H > 1) H -= 1; + } + return { + H: H * 360, + S: S * 100, + L: L * 100 + }; +}; + +// HSL (1978) = H: Hue / S: Saturation / L: Lightess + +root.HSL_RGB = function (o) { + // http://www.easyrgb.com/index.php?X=MATH&H=19 + var H = o.H / 360, + S = o.S / 100, + L = o.L / 100, + R, G, B, _1, _2; + function Hue_2_RGB(v1, v2, vH) { + if (vH < 0) vH += 1; + if (vH > 1) vH -= 1; + if ((6 * vH) < 1) return v1 + (v2 - v1) * 6 * vH; + if ((2 * vH) < 1) return v2; + if ((3 * vH) < 2) return v1 + (v2 - v1) * ((2 / 3) - vH) * 6; + return v1; + } + if (S == 0) { // HSL from 0 to 1 + R = L * 255; + G = L * 255; + B = L * 255; + } else { + if (L < 0.5) _2 = L * (1 + S); + else _2 = (L + S) - (S * L); + _1 = 2 * L - _2; + R = 255 * Hue_2_RGB(_1, _2, H + (1 / 3)); + G = 255 * Hue_2_RGB(_1, _2, H); + B = 255 * Hue_2_RGB(_1, _2, H - (1 / 3)); + } + return { + R: R, + G: G, + B: B + }; +}; + +})(); \ No newline at end of file diff --git a/js/DOMLoader.XMLHttp.js b/js/DOMLoader.XMLHttp.js new file mode 100644 index 0000000..99b48e0 --- /dev/null +++ b/js/DOMLoader.XMLHttp.js @@ -0,0 +1,126 @@ +/* + + DOMLoader.XMLHttp : 0.1 : mudcu.be + ----------------------------------- + DOMLoader.sendRequest({ + url: "./dir/something.extension", + error: function(event) { + console.log(event); + }, + callback: function(response) { + console.log(response.responseText); + }, + progress: function (event) { + var percent = event.loaded / event.total * 100 >> 0; + loader.message("loading: " + percent + "%"); + } + }); + +*/ + +if (typeof(DOMLoader) === "undefined") DOMLoader = {}; + +(function() { "use strict"; + +// Add XMLHttpRequest when not available + +if (typeof (window.XMLHttpRequest) === "undefined") { + (function () { // http://www.quirksmode.org/js/xmlhttp.html + var factories = [ + function () { + return new ActiveXObject("Msxml2.XMLHTTP"); + }, function () { + return new ActiveXObject("Msxml3.XMLHTTP"); + }, function () { + return new ActiveXObject("Microsoft.XMLHTTP"); + }]; + for (var i = 0; i < factories.length; i++) { + try { + factories[i](); + } catch (e) { + continue; + } + break; + } + window.XMLHttpRequest = factories[i]; + })(); +} + +if (typeof ((new XMLHttpRequest()).responseText) === "undefined") { + // http://stackoverflow.com/questions/1919972/how-do-i-access-xhr-responsebody-for-binary-data-from-javascript-in-ie + var IEBinaryToArray_ByteStr_Script = + "\r\n"+ + "\r\n"; + + // inject VBScript + document.write(IEBinaryToArray_ByteStr_Script); + + DOMLoader.sendRequest = function(config) { + // helper to convert from responseBody to a "responseText" like thing + function getResponseText(binary) { + var byteMapping = {}; + for (var i = 0; i < 256; i++) { + for (var j = 0; j < 256; j++) { + byteMapping[String.fromCharCode(i + j * 256)] = String.fromCharCode(i) + String.fromCharCode(j); + } + } + // call into VBScript utility fns + var rawBytes = IEBinaryToArray_ByteStr(binary); + var lastChr = IEBinaryToArray_ByteStr_Last(binary); + return rawBytes.replace(/[\s\S]/g, function (match) { + return byteMapping[match]; + }) + lastChr; + } + // + var req = new XMLHttpRequest(); + req.open("GET", config.url, true); + req.setRequestHeader("Accept-Charset", "x-user-defined"); + if (config.responseType) req.responseType = config.responseType; + if (config.error) req.onerror = config.error; + if (config.progress) req.onprogress = config.progress; + req.onreadystatechange = function (event) { + if (req.readyState === 4) { + if (req.status === 200) { + req.responseText = getResponseText(req.responseBody); + } else { + req = false; + } + if (config.callback) config.callback(req); + } + }; + req.send(null); + return req; + } +} else { + DOMLoader.sendRequest = function(config) { + var req = new XMLHttpRequest(); + req.open('GET', config.url, true); + if (req.overrideMimeType) req.overrideMimeType("text/plain; charset=x-user-defined"); + if (config.responseType) req.responseType = config.responseType; + if (config.error) req.onerror = config.error; + if (config.progress) req.onprogress = config.progress; + req.onreadystatechange = function (event) { + if (req.readyState === 4) { + if (req.status !== 200) req = false; + if (config.callback) config.callback(req); + } + }; + req.send(""); + return req; + }; +} + +})(); \ No newline at end of file diff --git a/js/DOMLoader.script.js b/js/DOMLoader.script.js new file mode 100644 index 0000000..3474983 --- /dev/null +++ b/js/DOMLoader.script.js @@ -0,0 +1,131 @@ +/* + + DOMLoader : 0.2 : mudcu.be + --------------------------- + DOMLoader.script.add({ + strictOrder: true, + srcs: [ + { + src: "../js/jszip/jszip.js", + verify: "JSZip", + callback: function() { + console.log(1) + } + }, + { + src: "../inc/downloadify/js/swfobject.js", + verify: "swfobject", + callback: function() { + console.log(2) + } + } + ], + callback: function() { + console.log(3) + } + }); + +*/ + +if (typeof(DOMLoader) === "undefined") DOMLoader = {}; + +DOMLoader.script = function() { + this.loaded = {}; + this.loading = {}; + return this; +}; + +DOMLoader.script.prototype.add = function(config) { + var that = this; + var srcs = config.srcs; + if (typeof(srcs) === "undefined") { + srcs = [{ + src: config.src, + verify: config.verify + }]; + } + /// adding the elements to the head + var doc = document.getElementsByTagName("head")[0]; + /// + var testElement = function(element, test) { + if (that.loaded[element.src]) return; + if (test && !eval(test)) return; + that.loaded[element.src] = true; + // + if (that.loading[element.src]) that.loading[element.src](); + delete that.loading[element.src]; + // + if (element.callback) element.callback(); + if (typeof(getNext) !== "undefined") getNext(); + }; + /// + var batchTest = []; + var addElement = function(element) { + if (/([\w\d.\[\]])$/.test(element.verify)) { // check whether its a variable reference + element.test = "(typeof(" + element.verify + ") !== \"undefined\")"; + batchTest.push(element.test); + } + var script = document.createElement("script"); + script.onreadystatechange = function() { + if (this.readyState !== "loaded" && this.readyState !== "complete") return; + testElement(element); + }; + script.onload = function() { + testElement(element); + }; + script.setAttribute("type", "text/javascript"); + script.setAttribute("src", element.src); + doc.appendChild(script); + that.loading[element.src] = function() {}; + }; + /// checking to see whether everything loaded properly + var onLoad = function(element) { + if (element) { + testElement(element, element.test); + } else { + for (var n = 0; n < srcs.length; n ++) { + testElement(srcs[n], srcs[n].test); + } + } + if (!config.strictOrder && eval(batchTest.join(" && "))) { // finished loading all the requested scripts + if (config.callback) config.callback(); + } else { // keep calling back the function + setTimeout(function() { //- should get slower over time? + onLoad(element); + }, 10); + } + }; + /// loading methods; strict ordering or loose ordering + if (config.strictOrder) { + var ID = -1; + var getNext = function() { + ID ++; + if (!srcs[ID]) { // all elements are loaded + if (config.callback) config.callback(); + } else { // loading new script + var element = srcs[ID]; + var src = element.src; + if (that.loading[src]) { // already loading from another call (attach to event) + that.loading[src] = function() { + if (element.callback) element.callback(); + getNext(); + } + } else if (!that.loaded[src]) { // create script element + addElement(element); + onLoad(element); + } else { // it's already been successfully loaded + getNext(); + } + } + }; + getNext(); + } else { // loose ordering + for (var ID = 0; ID < srcs.length; ID ++) { + if (that.loaded[srcs[ID].src]) return; + addElement(srcs[ID]); + } + onLoad(); + } +}; + +DOMLoader.script = (new DOMLoader.script()); \ No newline at end of file diff --git a/js/Event.Mouse.js b/js/Event.Mouse.js new file mode 100644 index 0000000..fdf5e0f --- /dev/null +++ b/js/Event.Mouse.js @@ -0,0 +1,155 @@ +/* + + Event.Mouse : 0.3.1 : mudcu.be + ------------------------------------- + Event.add(document, "mousedown", function(event) { + Event.drag({ + type: "absolute", + event: event, + element: document, + callback: function (event, coords, state, self) { + Event.stopPropagation(event); + Event.preventDefault(event); + console.log(coords); + } + }); + }); + + // this does the same thing + Event.drag({ + type: "absolute", + element: document, + callback: function (event, coords, state, self) { + console.log(coords); + } + }); + + /// easier mousewheel events + Event.mousewheel(window, function(event, state, wheelData, self) { + self.stop.prevent.remove(); + }); + +*/ + +if (typeof(Event) === "undefined") var Event = {}; + +Event.drag = +Event.dragElement = function(props) { + var el = props.element || document.body; + var doc = el.ownerDocument; // could be within an iframe + if (typeof(props.event) === "undefined") { // create event + Event.add(el, "mousedown", function(event) { + props.event = event; + Event.dragElement(props); + Event.preventDefault(event); + Event.stopPropagation(event); + }); + return; + } + // functions accessible externally + var self = { + cancel: function() { + Event.remove(doc, "mousemove", mouseMove); + Event.remove(doc, "mouseup", mouseUp); + } + }; + // event move + var mouseMove = function (event, state) { + if (typeof(state) === "undefined") state = "move"; + var coord = Event.coords(event); + switch (props.type) { + case "move": // move + props.callback(event, { + x: coord.x + oX - eX, + y: coord.y + oY - eY + }, state, self); + break; + case "difference": // relative, from position within element + props.callback(event, { + x: coord.x - oX, + y: coord.y - oY + }, state, self); + break; + case "relative": // eveything is relative from origin + props.callback(event, { + x: coord.x - eX, + y: coord.y - eY + }, state, self); + break; + default: // "absolute", origin is 0x0 + props.callback(event, { + x: coord.x, + y: coord.y + }, state, self); + break; + } + }; + // event up + var mouseUp = function(event) { + self.cancel(); + mouseMove(event, "up"); + }; + // current element position + var origin = abPos(el); + var oX = origin.x; + var oY = origin.y; + // current mouse position + var event = props.event; + var coord = Event.coords(event); + var eX = coord.x; + var eY = coord.y; + // events + Event.add(doc, "mousemove", mouseMove); + Event.add(doc, "mouseup", mouseUp); + mouseMove(event, "down"); // run mouse-down + // + return self; +}; + +Event.coords = (function() { + if (window.ActiveXObject) { + return function(event) { + return { + x: event.clientX + document.documentElement.scrollLeft, + y: event.clientY + document.documentElement.scrollTop + }; + }; + } else { + return function(event) { + return { + x: event.pageX, + y: event.pageY + }; + }; + } +})(); + +//////////////// MouseWheel //////////////// + +Event.mousewheel = function(target, listener, timeout) { + var interval = 0; + var self = Event(target, "mousewheel", function(event) { + event = event || window.event; + var wheelData = event.detail ? event.detail * -1 : event.wheelDelta / 40; + listener(event, "wheel", wheelData); + window.clearInterval(interval); + interval = window.setInterval(function() { + window.clearInterval(interval); + listener(event, "wheelup", wheelData, self); + }, timeout || 150); + }); + return self; +}; + +///// DOM.absPos + +var abPos = function(o) { + o = typeof(o) === 'object' ? o : document.getElementById(o); + var offset = { x: 0, y: 0 }; + while(o != null) { + offset.x += o.offsetLeft; + offset.y += o.offsetTop; + o = o.offsetParent; + }; + return offset; +}; \ No newline at end of file diff --git a/js/Event.js b/js/Event.js new file mode 100644 index 0000000..b5b37e3 --- /dev/null +++ b/js/Event.js @@ -0,0 +1,203 @@ +/* + + Event.js : v1.1 : mudcu.be + ----------------------- + /// calling "Event" with "new" provides additional support; + Event(syntax.area, "click", function(event, self) { + self.stop().prevent().remove(); + }); + + /// calling "Event" without "new" also works, but requires more work (and is faster); + var click = Event.add(syntax.area, "click", function(event) { + Event.stop(event); + Event.prevent(event); + Event.remove(syntax.area, "click", click); + }); + + /// multiple event-types bound to one function + var binding = Event(window, "click,mousemove,mousemove,mouseup", function(event, self) { + self.stop().prevent(); // stopPropagation and preventDefault + binding.remove(); // removes all the listeners + }); + + /// multiple events bound to one element + var binding = Event(window, { + "mousedown": function(event, self) { + self.remove(); // remove all the listeners + }, + "mouseup": function(event, self) { + binding.remove(); // just remove this listener + } + }); + +*/ + +var Event = (function(root) { "use strict"; + var add = document.addEventListener ? 'addEventListener' : 'attachEvent'; + var remove = document.removeEventListener ? 'removeEventListener' : 'detachEvent'; + var isEvent = (function () { + var events = {}; + var types = [ + 'abort', 'beforeunload', 'blur', 'broadcast', 'change', 'click', 'close', + 'command', 'commandupdate', 'contextmenu', 'dblclick', 'dragdrop', + 'dragenter', 'dragexit', 'draggesture', 'dragover', 'error', 'focus', + 'input', 'keydown', 'keypress', 'keyup', 'load', 'mousedown', + 'mousewheel', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover', + 'mouseup', 'move', 'overflow', 'overflowchanged', 'popuphidden', + 'popuphiding', 'popupshowing', 'popupshown', 'select', 'scroll', + 'syncfrompreference', 'synctopreference', 'readystatechange', + 'reset', 'resize', 'select', 'submit', 'underflow', 'unload' + ]; + for (var n = 0, length = types.length; n < length; n ++) { + events[types[n]] = true; + } + return events; + })(); + // event wrappers, and associated variables + var wrappers = {}; + var counter = 0; + var testElement = document.createElement("div"); + var getEventID = function(object) { + if (object === window) return "#window"; + if (object === document) return "#document"; + if (!object) object = {}; // FIXME: Happens in iOS + if (!object.uniqueID) { + object.uniqueID = "id" + counter ++; + } + return object.uniqueID; + }; + // function to create new Events + root = {}; // double type the root function as object + function + root = function(target, type, listener, scope) { + // find the where function was called from (window is undefined) + var that = typeof(this) !== "undefined" ? this : {}; + // check for multiple events in one string + if (type.indexOf && type.indexOf(",") !== -1) { + type = type.split(","); + } + // check type for multipel events + if (typeof(type) !== "string") { // has multiple events + that.events = {}; + if (typeof(type.length) === "undefined") { // has multiple listeners (object) + for (var key in type) { + if (isEvent[key] && typeof(type[key]) === "function") { + that.events[key] = Event(target, key, type[key], scope); + } + } + } else { // has multiple listeners glued together (array) + for (var n = 0, length = type.length; n < length; n ++) { + that.events[type[n]] = Event(target, type[n], listener, scope); + } + } + that.remove = function() { // remove multiple events + for (var key in that.events) { + that.events[key].remove(); + } + return that; + }; + that.add = function() { // add multiple events + for (var key in that.events) { + that.events[key].add(); + } + return that; + }; + return that; + } else { // is single call + if (!(target && type && listener)) return "missing data."; + type = standardize(type); + } + // tracked wrapper + var wrapperID = type + getEventID(target) + "." + getEventID(listener); + if (!wrappers[wrapperID]) { // create new wrapper + wrappers[wrapperID] = function(event) { + return listener.call(scope, that.event = event, that); + }; + } + // the wrapped listener + var wrapper = wrappers[wrapperID]; + target[add](type, wrapper, false); + // + that.stop = function(event) { + event = event || that.event; + if (event.stopPropagation) { + event.stopPropagation(); + } else { // <= IE8 + event.cancelBubble = true; + } + return that; + }; + that.prevent = function(event) { + event = event || that.event; + if (event.preventDefault) { + event.preventDefault(); + } else { // <= IE8 + event.returnValue = false; + } + return that; + }; + that.add = function() { // so you can add it back + target[add](type, wrapper, false); + return that; + }; + that.remove = function() { + target[remove](type, wrapper, false); + return that; + }; + return that; + }; + + root.add = function(target, type, listener, scope) { + type = standardize(type); + target[add](type, wrap(type, target, listener, scope || target), false); + return listener; + }; + + root.remove = function(target, type, listener, scope) { + type = standardize(type); + target[remove](type, wrap(type, target, listener, scope || target), false); + return listener; + }; + + root.stop = + root.stopPropagation = function(event) { + if (event.stopPropagation) { + event.stopPropagation(); + } else { // <= IE8 + event.cancelBubble = true; + } + }; + + root.prevent = + root.preventDefault = function(event) { + if (event.preventDefault) { + event.preventDefault(); + } else { // <= IE8 + event.returnValue = false; + } + }; + + ///////////// + + var standardize = function(type) { // fix any browser discrepancies + if (!document.addEventListener) { + return "on" + type; + } else if (type === "mousewheel" && !("onmousewheel" in testElement)) { + return "DOMMouseScroll"; + } else { // + return type; + } + }; + + var wrap = function(type, target, listener, scope) { // un-tracked wrapper + var wrapperID = type + getEventID(target) + "." + getEventID(listener); + if (!wrappers[wrapperID]) { + wrappers[wrapperID] = function(event) { + return listener.call(scope, event); + }; + } + return wrappers[wrapperID]; + }; + // + return root; + // +})(Event); \ No newline at end of file diff --git a/js/MIDI.Player.js b/js/MIDI.Player.js new file mode 100644 index 0000000..6c940ed --- /dev/null +++ b/js/MIDI.Player.js @@ -0,0 +1,279 @@ +/* + + MIDI.Player : 0.3 + ------------------------------------- + https://github.com/mudx/MIDI.js + ------------------------------------- + requires jasmid + +*/ + +if (typeof (MIDI) === "undefined") var MIDI = {}; +if (typeof (MIDI.Player) === "undefined") MIDI.Player = {}; + +(function() { "use strict"; + +var root = MIDI.Player; +root.callback = undefined; // your custom callback goes here! +root.currentTime = 0; +root.endTime = 0; +root.restart = 0; +root.playing = false; +root.timeWarp = 1; + +// +root.start = +root.resume = function () { + if (root.currentTime < -1) root.currentTime = -1; + startAudio(root.currentTime); +}; + +root.pause = function () { + var tmp = root.restart; + stopAudio(); + root.restart = tmp; +}; + +root.stop = function () { + stopAudio(); + root.restart = 0; + root.currentTime = 0; +}; + +root.addListener = function(callback) { + onMidiEvent = callback; +}; + +root.removeListener = function() { + onMidiEvent = undefined; +}; + +root.clearAnimation = function() { + if (root.interval) { + window.clearInterval(root.interval); + } +}; + +root.setAnimation = function(config) { + var callback = (typeof(config) === "function") ? config : config.callback; + var delay = config.delay || 100; + var currentTime = 0; + var tOurTime = 0; + var tTheirTime = 0; + // + root.clearAnimation(); + root.interval = window.setInterval(function (){ + if (root.endTime === 0) return; + if (root.playing) { + currentTime = (tTheirTime == root.currentTime) ? tOurTime-(new Date()).getTime() : 0; + if (root.currentTime === 0) { + currentTime = 0; + } else { + currentTime = root.currentTime - currentTime; + } + if (tTheirTime != root.currentTime) { + tOurTime = (new Date()).getTime(); + tTheirTime = root.currentTime; + } + } else { // paused + currentTime = root.currentTime; + } + var endTime = root.endTime; + var percent = currentTime / endTime; + var total = currentTime / 1000; + var minutes = total / 60; + var seconds = total - (minutes * 60); + var t1 = minutes * 60 + seconds; + var t2 = (endTime / 1000); + if (t2 - t1 < -1) return; + callback({ + now: t1, + end: t2, + events: noteRegistrar + }); + }, delay); +}; + +// helpers + +var loadMidiFile = function() { // reads midi into javascript array of events + root.replayer = new Replayer(MidiFile(root.currentData), root.timeWarp); + root.data = root.replayer.getData(); + root.endTime = getLength(); +}; + +root.loadFile = function (file, callback) { + root.stop(); + if (file.indexOf("base64,") !== -1) { + var data = window.atob(file.split(",")[1]); + root.currentData = data; + loadMidiFile(); + if (callback) callback(data); + return; + } + var fetch = new XMLHttpRequest(); + fetch.open('GET', file); + fetch.overrideMimeType("text/plain; charset=x-user-defined"); + fetch.onreadystatechange = function () { + if (this.readyState === 4 && this.status === 200) { + var t = this.responseText || ""; + var ff = []; + var mx = t.length; + var scc = String.fromCharCode; + for (var z = 0; z < mx; z++) { + ff[z] = scc(t.charCodeAt(z) & 255); + } + var data = window.atob(ff.join("")); + root.currentData = data; + loadMidiFile(); + if (callback) callback(data); + } + }; + fetch.send(); +}; + +// Playing the audio + +var eventQueue = []; // hold events to be triggered +var queuedTime; // +var startTime = 0; // to measure time elapse +var noteRegistrar = {}; // get event for requested note +var onMidiEvent = undefined; // listener callback +var scheduleTracking = function (channel, note, currentTime, offset, message, velocity) { + var interval = window.setInterval(function () { + window.clearInterval(interval); + var data = { + channel: channel, + note: note, + now: currentTime, + end: root.endTime, + message: message, + velocity: velocity + }; + // + if (message === 128) { + delete noteRegistrar[note]; + } else { + noteRegistrar[note] = data; + } + if (onMidiEvent) { + onMidiEvent(data); + } + root.currentTime = currentTime; + if (root.currentTime === queuedTime && queuedTime < root.endTime) { // grab next sequence + startAudio(queuedTime, true); + } + }, currentTime - offset); + return interval; +}; + +var getContext = function() { + if (MIDI.lang === 'WebAudioAPI') { + return MIDI.Player.ctx; + } else if (!root.ctx) { + root.ctx = { currentTime: 0 }; + } + return root.ctx; +}; + +var getLength = function() { + var data = root.data; + var length = data.length; + var totalTime = 0.5; + for (var n = 0; n < length; n++) { + totalTime += data[n][1]; + } + return totalTime; +}; + +var startAudio = function (currentTime, fromCache) { + if (!root.replayer) return; + if (!fromCache) { + if (typeof (currentTime) === "undefined") currentTime = root.restart; + if (root.playing) stopAudio(); + root.playing = true; + root.data = root.replayer.getData(); + root.endTime = getLength(); + } + var note; + var offset = 0; + var messages = 0; + var data = root.data; + var ctx = getContext(); + var length = data.length; + // + queuedTime = 0.5; + startTime = ctx.currentTime; + // + for (var n = 0; n < length && messages < 100; n++) { + queuedTime += data[n][1]; + if (queuedTime <= currentTime) { + offset = queuedTime; + continue; + } + currentTime = queuedTime - offset; + var event = data[n][0].event; + if (event.type !== "channel") continue; + var channel = event.channel; + switch (event.subtype) { + case 'noteOn': + if (MIDI.channels[channel].mute) break; + note = event.noteNumber - (root.MIDIOffset || 0); + eventQueue.push({ + event: event, + source: MIDI.noteOn(channel, event.noteNumber, event.velocity, currentTime / 1000 + ctx.currentTime), + interval: scheduleTracking(channel, note, queuedTime, offset, 144, event.velocity) + }); + messages ++; + break; + case 'noteOff': + if (MIDI.channels[channel].mute) break; + note = event.noteNumber - (root.MIDIOffset || 0); + eventQueue.push({ + event: event, + source: MIDI.noteOff(channel, event.noteNumber, currentTime / 1000 + ctx.currentTime), + interval: scheduleTracking(channel, note, queuedTime, offset - 10, 128) + }); + break; + default: + break; + } + } +}; + +var stopAudio = function () { + var ctx = getContext(); + root.playing = false; + root.restart += (ctx.currentTime - startTime) * 1000; + // stop the audio, and intervals + while (eventQueue.length) { + var o = eventQueue.pop(); + window.clearInterval(o.interval); + if (!o.source) continue; // is not webaudio + if (typeof(o.source) === "number") { + window.clearTimeout(o.source); + } else { // webaudio + var source = o.source; + source.disconnect(0); + source.noteOff(0); + } + } + // run callback to cancel any notes still playing + for (var key in noteRegistrar) { + var o = noteRegistrar[key] + if (noteRegistrar[key].message === 144 && onMidiEvent) { + onMidiEvent({ + channel: o.channel, + note: o.note, + now: o.now, + end: o.end, + message: 128, + velocity: o.velocity + }); + } + } + // reset noteRegistrar + noteRegistrar = {}; +}; + +})(); \ No newline at end of file diff --git a/js/MIDI.Plugin.js b/js/MIDI.Plugin.js new file mode 100644 index 0000000..9d26203 --- /dev/null +++ b/js/MIDI.Plugin.js @@ -0,0 +1,486 @@ +/* + + MIDI.Plugin : 0.3 + ------------------------------------- + https://github.com/mudx/MIDI.js + ------------------------------------- + MIDI.WebAudioAPI + MIDI.Flash + MIDI.HTML5 + MIDI.instruments + MIDI.channels + MIDI.keyToNote + MIDI.noteToKey + + setMute? + getInstruments? + +*/ + +if (typeof (MIDI) === "undefined") var MIDI = {}; +if (typeof (MIDI.Plugin) === "undefined") MIDI.Plugin = {}; + +(function() { "use strict"; + +/* + Web Audio API - OGG or MPEG Soundbank + -------------------------------------- + https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html +*/ + +if (typeof (MIDI.WebAudioAPI) === "undefined") MIDI.WebAudioAPI = {}; + +if (window.AudioContext || window.webkitAudioContext) (function () { + + var AudioContext = window.AudioContext || window.webkitAudioContext; + var root = MIDI.WebAudioAPI; + var ctx; + var sources = {}; + var masterVolume = 1; + var audioBuffers = {}; + var audioLoader = function (urlList, index, bufferList, oncomplete) { + var url = urlList[index]; + var base64 = MIDI.Soundfont[url].split(",")[1]; + var buffer = Base64Binary.decodeArrayBuffer(base64); + ctx.decodeAudioData(buffer, function (buffer) { + var msg = url; while(msg.length < 3) msg += " "; + if (typeof(loader) !== "undefined") { + loader.message("Downloading: 100%
    Processing: "+(index/87 * 100 >> 0)+"%
    " + msg); + } + buffer.id = url; + bufferList[index] = buffer; + // + if (bufferList.length === urlList.length) { + while (bufferList.length) { + buffer = bufferList.pop(); + var nodeId = MIDI.keyToNote[buffer.id]; + audioBuffers[nodeId] = buffer; + } + oncomplete(); + } + }); + }; + + root.setVolume = function (n) { + masterVolume = n; + }; + + root.programChange = function (instrument) { + + }; + + root.noteOn = function (channel, note, velocity, delay) { + /// check whether the note exists + if (!audioBuffers[note]) return; + /// convert relative delay to absolute delay + if (delay < ctx.currentTime) delay += ctx.currentTime; + /// crate audio buffer + var source = ctx.createBufferSource(); + sources[channel + "" + note] = source; + source.buffer = audioBuffers[note]; + source.connect(ctx.destination); + // + var gainNode = ctx.createGainNode(); + var value = -0.5 + (velocity / 100) * 2; + var minus = (1 - masterVolume) * 2; + gainNode.connect(ctx.destination); + gainNode.gain.value = Math.max(-1, value - minus); + source.connect(gainNode); + // +// source.playbackRate.value = 2; + /// + source.noteOn(delay || 0); + return source; + }; + + root.chordOn = function (channel, chord, velocity, delay) { + var ret = {}, note; + for (var n = 0, length = chord.length; n < length; n ++) { + ret[note = chord[n]] = root.noteOn(channel, note, velocity, delay); + } + return ret; + }; + + // FIX: needs some way to fade out smoothly.. + root.noteOff = function (channel, note, delay) { +// var source = sources[channel+""+note]; +// if (!source) return; +// source.noteOff(delay || 0); +// return source; + }; + + root.chordOff = function (channel, chord, delay) { + + }; + + root.connect = function (callback) { + + MIDI.lang = 'WebAudioAPI'; + MIDI.setVolume = root.setVolume; + MIDI.programChange = root.programChange; + MIDI.noteOn = root.noteOn; + MIDI.noteOff = root.noteOff; + MIDI.chordOn = root.chordOn; + MIDI.chordOff = root.chordOff; + // + MIDI.Player.ctx = ctx = new AudioContext(); + /// + var urlList = []; + var keyToNote = MIDI.keyToNote; + for (var key in keyToNote) urlList.push(key); + var bufferList = []; + for (var i = 0; i < urlList.length; i++) { + audioLoader(urlList, i, bufferList, callback); + } + }; + +})(); + +/* + HTML5