From 04e0dc8242713735f7a7a16de706d4a62be6ca56 Mon Sep 17 00:00:00 2001 From: Stephanie Chung Date: Wed, 7 May 2014 19:18:16 -0700 Subject: [PATCH] - committing sound files - added functionality to play sound on click - work in progress: key bindings. --- Makefile | 6 +- inc/Base64.js | 67 + 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/WebMIDIAPI.js | 421 ++ inc/base64binary.js | 80 + inc/jasmid/LICENSE | 24 + inc/jasmid/midifile.js | 238 + inc/jasmid/replayer.js | 96 + inc/jasmid/stream.js | 69 + js/libs/backbone-min.js | 2 - js/libs/fiber.min.js | 7 - js/libs/require.js | 36 - js/libs/underscore-min.js | 6 - js/main.js | 24 +- soundfont/acoustic_grand_piano-mp3.js | 93 + soundfont/acoustic_grand_piano-mp3/A0.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/A7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Ab7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B0.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/B7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb0.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Bb7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/C8.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/D7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Db8.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/E7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Eb7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/F7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/G7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb1.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb2.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb3.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb4.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb5.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb6.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-mp3/Gb7.mp3 | Bin 0 -> 12065 bytes soundfont/acoustic_grand_piano-ogg.js | 93 + 114 files changed, 8809 insertions(+), 59 deletions(-) create mode 100755 inc/Base64.js 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 100755 inc/WebMIDIAPI.js create mode 100755 inc/base64binary.js create mode 100755 inc/jasmid/LICENSE create mode 100755 inc/jasmid/midifile.js create mode 100755 inc/jasmid/replayer.js create mode 100755 inc/jasmid/stream.js delete mode 100644 js/libs/backbone-min.js delete mode 100644 js/libs/fiber.min.js delete mode 100644 js/libs/require.js delete mode 100644 js/libs/underscore-min.js create mode 100755 soundfont/acoustic_grand_piano-mp3.js create mode 100755 soundfont/acoustic_grand_piano-mp3/A0.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/A7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Ab7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B0.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/B7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb0.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Bb7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/C8.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/D7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Db8.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/E7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Eb7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/F7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/G7.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb1.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb2.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb3.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb4.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb5.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb6.mp3 create mode 100755 soundfont/acoustic_grand_piano-mp3/Gb7.mp3 create mode 100755 soundfont/acoustic_grand_piano-ogg.js diff --git a/Makefile b/Makefile index c1229b3..12cdd17 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,7 @@ commonjs: @node_modules/requirejs/bin/r.js -convert js/src js/app/ - @echo "JS Compiled." \ No newline at end of file + @echo "JS Compiled." + +watch-css: + @compass watch + @echo "Watching you..." \ No newline at end of file diff --git a/inc/Base64.js b/inc/Base64.js new file mode 100755 index 0000000..7c1ef07 --- /dev/null +++ b/inc/Base64.js @@ -0,0 +1,67 @@ +// http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html + +// window.atob and window.btoa + +(function (window) { + + var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + + window.btoa || (window.btoa = function encode64(input) { + input = escape(input); + var output = ""; + var chr1, chr2, chr3 = ""; + var enc1, enc2, enc3, enc4 = ""; + var i = 0; + do { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); + chr1 = chr2 = chr3 = ""; + enc1 = enc2 = enc3 = enc4 = ""; + } while (i < input.length); + return output; + }); + + window.atob || (window.atob = function(input) { + var output = ""; + var chr1, chr2, chr3 = ""; + var enc1, enc2, enc3, enc4 = ""; + var i = 0; + // remove all characters that are not A-Z, a-z, 0-9, +, /, or = + var base64test = /[^A-Za-z0-9\+\/\=]/g; + if (base64test.exec(input)) { + alert("There were invalid base64 characters in the input text.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" + "Expect errors in decoding."); + } + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + do { + enc1 = keyStr.indexOf(input.charAt(i++)); + enc2 = keyStr.indexOf(input.charAt(i++)); + enc3 = keyStr.indexOf(input.charAt(i++)); + enc4 = keyStr.indexOf(input.charAt(i++)); + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + output = output + String.fromCharCode(chr1); + if (enc3 != 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) { + output = output + String.fromCharCode(chr3); + } + chr1 = chr2 = chr3 = ""; + enc1 = enc2 = enc3 = enc4 = ""; + } while (i < input.length); + return unescape(output); + }); + +}(this)); \ No newline at end of file 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 zcmbT7Q>-XJv!%Cfoo(A^+qP}nwr$(CZQHhO+k4J`Cz+ecJl*MZJ#0Q^bD}vT zrXk-P^g_mZ+EH-V5&Kw>-aw#9)7qz0gCNO`%5Of_3KYS`Q*1{RQM>h9op@7ay5DZ0 z*)qkFwY!v)5<-rnsfxc7*+z|^W9^Qc4h5_%xCyI?TJ+kj1!%Q$9)0_~MZ3%vSiLeQ zgmVHXN_Yyy(aAP40P%Aj6C{7Nuo&PYFb|mfV5fAix^V@}fnv8giw0%yR+C0ql^?=? zO^f%8Di73YHYskldlk+$!_}f#0n%&vQ2;b1G-SnFDHt;~!^gc`-Q*W-S|bUC5y^~l z_w`HIaS?i&5QUe1d67p%VckSN2vvHPHL?&Xk_4&UVsjf|UXR@*%dD~XONSLd3Z$e` zPUI|I+PK9V+Pglzx+JOHC>=-ln(hy${+e!9uJ6N{Q+2zrt%<C^Ts#m93-2h;+1UVaFOPG}Y_T zl+A&o^!(+cWb(`tmXZ`0Jcc+FwN?Z%Yt)r{A^vk>%1T$zW`x^5(^2s|BX+o`!X+V| zujF#8eTi~^#ENJ>E&j7*0laDdkZo9Udrfnq#})pv0PEQX z#QXcEoB8+_aGuXlWdgk+APd-A%^5z>Ibx2t3kDF)OS^ad^82Dd1Uosn@)4rymrmLU zsTT6ersMXas8#ONGkaspZ^5$-Jb~TUk9jz0@8uhVqVI~%ljo0^fi@4?)kq`Sp|Xld zz+$y4(iRULUH~PLT>K_4YEXg*+d3Ih?36sWu*5*vrubBKKqfE)t-@m}sWR#bI*ayO zb_lIA%`n%Z`udu;9sZ_mQG2Lped~hu{v?CEV}U1g7?SXFEid!b_&apRIftZUGDb=q zwH}$hVd5^PdTvmqN$O3V$P)zA+C*&m=YWlw0QFCUL6FP(WoHOlvVAkSR~_=(2)+ky zvMvlF7c@&Dwt>iX*zP#K3E1h2SN-M?Q*i!u(Hj>4QA~8XwDk9GuwO3OL?!=JI9Q9Z z#m2lDymLJ>5s&bdXWdf1$wTtQ0r?CO5in7X=%*)^@o^woCrsUtLJI7YvU)6awCu{c z+WJ({_6`#%>j*I=hY7ZBpt%Lh^w=A$jlIZeTQ@>uuC*eVW zV`H_QV6#)>4--B$d)7=|fn>I^`tRDh230B{0T-Ka0IkVCVc(`BmdpEB&WF(zAflPW zcty+)W*E?{P*iNW6L`k_tWl96Dr>|etmmq$Ea6f_4Xt5UD2dq&Q!q-gGKXQwmx?2s z*m(y!R@ju@qPZ2gIVGC%9%xN`PdO$5uJF3ytDX+xWroRuP&2C}>(hHStZQc<{92Da%uZoy?|LGP4>o;XfngljhZkO zgkq!$f6hO9a!$g&vJB%Pq6T04C16Nka43(JwOLPI%*6TR4OW=qXCDWYTYfQrX|IM? z;%^$Q-a^B3@R-z&iep16)>Y!aBJ~4us4&)9*EkOiaZ->9c}+HCUq-kFl2eBvfI$M# z0f0>3!KDo{#go|uSCQ!rk~TaWNo}xucJdV6ZwnC{S7{ zVOp7Is(uX9<{2-U)MNFq&u54`CgX294Lc@1N+ceq9-nr4F(N*kYw@9xyPNiJlX;V}(UAEDCcM5oUe#U__hmgE?5p+9q^% z(8Mkq?_AMo#ssByCE^kpS}0%bz=95Gn#!g|4`XP9ui;j~YtqbXk`W`XloO<*S>}U# zxsj=hb8UaNbLEt0Pz_R`nsYZbl4;g?vPzcZS@R;(K?fNfEBn4U#}Re0WY5j$)3bP! z_3gcCXbM_9-r)E!8N6`XzXY#H)g1GU>pzunEEYLpK~!t8|KOfY&Nt}GgY znmWa?tRDH(z$j-uGNMz6>;RF#uEsj0xJVBl=ZR*^*rkymu*Di%S-WuUg3&-sqcnmN zKK5bzB+Q3$Kwn>4_-zkRHPyMtm{h^@TO(C9$5>Wlv`K$K4Mo#G=f|@BmU7l4Nmf&@ z9N!z>4gXHrn~!0%MsEgJz_3O|ySdRNMu@yVTRod)KqtQCF!mtinJ|xv z@1!w}|GqQ?9Ze2GhvC^A4#t6uCQiZvY?2Tvf?;8178J^-nFfx&tY?9TrjFE+{qg;NTmGpPZ2EN|X;&Hsa|F=AeOCEUuzzYYSJImmm?6zn z3`nefDPqBDb-JfB^pgI$Kht68sJ&b+RK-XhiBOYInLS<8iveUJ3iXwqSrKGkuy6Zi zKr=I#=G)R)T&OcSI-sKQsahoYR^FB7$jxcevuR}2U(%LRqsF7KkzsZI7r(4TJb)C*06EhkCvmFn ziN!m6RzPEBz-&nqG1WT@TDO7jn`OwRs)K*b1Ds^reEBJ^3e|G%4JJR9Ziu6E}(ced^<# z`3EhWuOnpf)sm{EWpws(HPl?LN$htjGFBZyuXlg_IEA8FSxSrzRw)H(&l=B?@_|7z?t z?+yN`)|hm;41vWOc%)hNw=^tP)nSk@Jf+iWqi1p9(Wu4X$;vK|iKbl(*OD$<_h06JplztjS}BferMT#JTOejXU8E{8R)HO@>U32Jx;^xs zqxYzGsnY`~^Q|WO^X(So%0KP6&BqX8!Dspvq92L6in7oh>dfJ*VSjsw|6A&EQXmz)5kF&$2D7iA*MZ*kYM9Bq? z+J*v`az|Ke&LqaYDYFi^67SOg%pn5M8GRXPlLy~F$F99~PUsd?4liyZ*l~F-XdWX-V!&>gq2iauYQ;U!vV*EK`apr? zwT(DNWcS=Lr*uJ8N{Q1W-ZG^7P`Sdhl7W+y|qQ{3=X@UfMG1_Y;7p%R%os7Dmw3B1k<|`&&Kg95Dvq|G@KM}g_ym=jIA#l zg{kO)%J!=jk!Jwg9_n8i;r? z?t)8TU8JuWz3DO6;?;d%bL#k!0z3G_438S_XZvJp$;pb;vC_m_5>}5p(jQLmRIKD<`lurf_zP*4WQv)_e?~IBXTPIyi;Fxp5RfVWp)y zh6GRp$TYqE-G5)-08(xOGtx$~Q+%@{tfLxKDLGYLMn<2gsAEPM#@v#-+*!IrP@I%k z{>!o^+8`zg;aedEQ&D0XRwn96S&~gW(~cXsMy<$BZEr>& z^!%+u7+{+(l;~W6DaSOkC@fzedNA^pB7OfP=ORzhxy-P0Ptk>0%8@opFiqw)2jY0^+1xzwk}=6m%xB>Z`mf`+7^sW_W3n^NWe4Q8+)1wtz+%26V77?`G3Au- zNq{?I$wU1$cE3R`XH|_H3`^q=t~!;tEhQZ^Fb_55 zHwp8e(*)1nS?JTWUkKln6{sUIYo||n11`U)L6_*ym~0q#nfM$k6h(*ZHD_z1fX787 zh$Fjefggk#WwF^RmJ)8fbwplW^275%KCoPo8(j)Jh=tCDy8D4h$ai0T`1eR-b64z~ z1P5ykmMnkk-lfxs;R6Mv-xHWJS7L;=OjRMl9ShvHbYSbGRwK$PsWc1cNx{d_Zh{qSfm z5QaVm?3PH26nWS5do;!R;x8ND&TPqoN~K62J|zT8mWiM6kfCeFHDC>D0*t)1wW*>yL~iO7-{s z3>4|&ajawGBPReC@d;1XgD|+uaNHH-9BlBJY$&9jaa{LGYD9HFcWl*pJ=<~#V^P7l za&_f-xW+nLI*Eu(;}Fs4?S)89o^n(TB6ZF-Dogk1}7%*vzqpO zv(KGO)>5RWwVL9zowd{t8=IT5fJW^pi_Plbx(~@F$emhpG``9$YrZl;^2zjT=rs_# zfFX21ok(;9)i|!AG;l$KeB(HiXpl65d*U-1**#GcqxC5pT^pnG;$#3LbNmOTV=QCI z^Q9x}ItT2f&Vo~2jo(muXv>7$-<6h=c`NtIceCZFiWQ{+)6*N-u~0g z(TWaP&P&{$>196Uz^~k_a%;x(Tx1blCKe|3grUyWxUk$7f835Lfs?Zbvr39?+-c(K zrjHpG>PC^jAB%of8o}(lRmb%C?)!lC7A z+f9!T(UTqCXk*;OxBsr0nsH_voXV(PSUn{E~R+Nn#r%T=mi$&CGoM@uQ zm-;K2Rx78w9M|J9S~(;&|Ju>fh!P*RIW2l_f(k@qwnG9>T+iqks)xJ@tBQFMf0~7l zJB~XPxwfUVfRb1;aPPkSyvX@BB=oYC%|zgtR%b$Pz8LNIyHg!y=G;1ChH9`dMN2VK zkAW|E#&6`_!X;X*;q4?NaKS$)JEjh#u@(%a9}i*l^I~O~FqDJ_{w6R6_OE;Zis>pG?G`>d0`a!01OAzO8TIZ#*%G%}h45#-uG+1vMU)LXuGk3~4&N!`P4W;={-cIk(l!F`h#f56u!E z-9Pq-{NQ->=@pf07q{n&EZC3U%hBz&IpRovbO#izMd%p9H#v!Cb@%$nf_0{nE zy!r}|V%r6*hIhPhWkld1?Y*hVJhZ6;=%bu6OVIK97^D)p5olGxxfb(Uu6@!4yzwV# zngNvk{rM&T%z55iPWyNl@cb%Ofh?^?$t6Z2ABCA{`XO^1s4Js8U~o2vpO)&9ak+hC zVoCwy%oo1%hiHPAok16=0O6+%{k*&`fSgI{@X7Zd0R0D(PyksX{~MDe|6!8Hjy>`t z0RX_wzhL?wVbXtnTd@BZC*2Sr?)>8579A-#(*g>~)b_U5h&aV}NTDuIi!X^8@c=IXZh+ueT6pk+ry z@%)XlN{+Qg}AO)88>wL?V`PNh*~Fw4NSk$sngv1#cf zb9My-4i?=p@uXA5=7hR?r5uH8?S)2g)IzzlOMMb6)#Y@3y%vixQs)g3)nvNC#hkw5 zfQI?$l*38H4JN^Jxe*n+<@bowU-RbY(<&nCKdshPlhL1Bx`{Hv?di$y!yT zRZ3E^rE;WL>f(R65;&Ss!p>DEt>(*Z8^^(J_nrv)+dXLi>nws zTKfP2V7pqgN3-ubv;L9x!=+LE2W|x2gVcL|#mj?O;H!0~r@YZhZwc!pjJDMVh%3Wi zmHq^owGJiHD2?ZRdc{dJQ4!L^1~UxM`t9i2Dag8iUlmVVn*Y!; zIkq3{?-QLH>`bABXd53cZKJ6nif0&G>e)Hg%Tb^@vM2Rwk(sM?D?7rCu^Ru5D2#Je zj4eevh(U7djGs)1*s=&;ny18kP_1_O9d9Ddhu9DAcR+d0v`SWPVUTMHw9LY#6H_=h4Hj{AiJy^u^mrEzl)J^S1RWc?@ zprEYyKtB9EbTaus4M4I{2@)nY{m@uaOva=?@3hCjhRZe>#j)K7cCb*zI5e3qCFX`k z^Jd_*+G*uUGNmg^wWOZi5DiL&mP;)Z{fxm?lQp^!qT@onj&fvYdvkjv?MfWERl+E~ z>~w8UU0VMk?})|IzW+&Dlq#iZ%*?yd3Q~<#p1TOQfg*@;%Q!u>EFbdn^HQB)#}#(j z>)5(m1LJsMUge_^)G5@XB8*W?d5*=JQIeFhIT>!_fmvnYkmS6Sh;5Y#34y4cMS6W+ zpx#LNKJR=ZscLSiAVIaD&U~w-TH)7?_H-6C($E;#S!vz$M2;1Rgg}9!=s`(Aoh$hu zSP7UTaaw{e$?wlZ#}jSajk`__lLXEUMS3v9G;Rm5veV=T6Qi5|Pjn zW|PP(S1V6$Jibn+Rqh}5sT!#B#b0??EEA&krYC_rHZbC`n^fJG11-tcur$k1$;x4Cj!sihrx6s4 zt))R5!``xBiuGtt**Ks`s?beN3ZWrS?P7o4r~5H;P-0g}JP4!6HIGLeDqCUEDbrZ!XyM~O zk>;2%&sVKmXog%2m=Bsf^Pmp11dm)7@FPC!6dAk!tO+j%T*^{7^AM#0_7-PTxZ?1h(9AM z!bBcfBoP&;6S~(jWVd^>{jX_OuA(99(ZeAZm#7F^6e;HLIAw=8FxI@Oz#hh%OqDWU z89NR-J;2YeU^V1MMx<9(S9moZ_*oT&h@a+!96J*5#OTl{z4wEjj^@(FPp6RzT%G8G zN~=x*9lFkzGlPb;B+&M)6{Qe%pMY99e8rNioK_} zxHXDIpN7wje5LEQ6jlI@-{JBP6K!zAGl6_;dbSiAe)J8e87bUF4y` zZpEl8h)uy#bs?KKGENH7o(r+?pcQp4sNwwG)Eula@kFEW!B5-!y?$aI)Rb8<2W`k* za*?}J)i>tga-<)aleKcXu?QpMdwO0tdfIyW{-p9x_=)A06#>&O^z?1u9(ew{;GU_^ z%EH-OKKZ`1Ia?$-BoB2y;V^qZWFRWJ` zHu(K-HD82%V0=uxfm3k=Y52oO#31;ZM3dZV>OUcmeR zl0t8qbGkxcyL~=)BtfYNIw0TpJU?*znhZ>~YPgkRtTvj{#hchEtd$-2}u0Z?V5U=}{;0U-vZvd;j zWA?ncM;+&jp>;3%HM|qvABJm~9uch{PfRL2{#y2rp*-Pt)GnVW1EuV=ST1icE4has zpY@C1Ll=$Ms=&E)d4_wblbcL&B;b2W4tOa%)PZ{Fdyju*KmagX0`TkuvECG;0iQ*> zM@Ywm9PgkUGMbjJ4z|b5+``eP%OuvE& zN5{`Fs75*IXw)v1VjcB9xbKJo9W;0uFBtO}s% zL{c|=>EEmcTICE}SB&MKeYjf$zTU2CV*=Bx&6=t+@}b6SsJW&x(ozpNQe(0yzJjB) zDc&4};*d&R8-Hwb!7et8JA^Tva$RhIhx%FGmJ$IR1-kCsF!|ij#h)VB&?TQTC^q0t zZqbb1xK3`EZpSvc#_tk_ep;7$GPzh04BbFIVPn`gBS@3ui(CgS z(Z?~-$3fMX5)0gE2ecM3*hk9&MD2sJHo*#X`2nrB?F(6TYNA)U17h`@>0iwb)<@d| z8YvlLXis5i9Yq&Nf0I4gSNpdut4i{fom+FxYYYfW)Fybyx-aAaC!9@>YSl|*F;T4E zcX*N;tqI3+`V)IJ2d@`g#srP+Q>|njLxZa>%@_^QA%}74?_58_AGXaj!%|3VY7$Nq$+Y)fuF5tZpPb0|_T=e!oSFQqAmuy$v2)lc0 zsU$m~Sr=G1pANMhq5BxG7-v6N1&( zkDKd!RHep!?jIsMurHo^z{ESyMToiu11)+0-z2}VynwgByWV~DjC!}CWbS|JH0>Q* z5=s|gn@=!Toec9A57#0|uRr(Gev=oQ^h!&SLe1~L_ZFkUJi3`8d}yfgQ2l~!QvLL-EY>i$yA2sO0~r-k$;J^DnxUInL=F7oQyck`#DZ@ zhtOs20MXq5Qghu3IL799K*`KazTts1l!)&E?}QB;q|c8XA4o=3aMdL+GYO-+37J_M zxFQ_e?cGI9+)r1E`E^HC+CH+=K*Wc=5Ks>d;q!IaIKwUa`9ZfP}>z*5L)y&y2qjt1NB42jz4Sm$i-8Vv$0A zeg<4rNK<0E@qfB9(!bHOqI@xAPJr1AtsvrP5#r=$Vi!wF;ak=D?icDXm6da^eh};M z$dq;YHj>%88Sp~c*C;wG7YQkCpsU_Mzcemr?&Oy;M{@YOLDwjjGW&CcY;EgG=XSBK z4A1V_7o+{=pF+vaX^Wr5V3{@RxO(MO{){`+Q)?QnUsTveEV+2J_|(IUDU30Qk>so| z4az|y7l`WeP_Hwq&86EG6@*7XWE?Nf{o3mxzn6jHyrVbI6dLf*tc9b_=PjVGje8jF z3gI-o3c(0orF=94dbVn0fQ4g6&>Tvwh!jRB5xkJuZ3ik}rB|RLyokp^^B9SJ_1&Y& zOK0@o`vC8PR5;BJfbt^3r;3Az-NrI6I81zmeN)I?7i4>T2~!skqb;Ylz5Oi#!OH)0 zQtH=4KdbFc=z)THDGqc}sEjmC;_gNoZo;EQa^FcDJ4<|D81GKZpL(=NUz$sIO%;%u;CuKhK>m2b;Vs9WVPyBWBWpk^+rrcz5g|;=?~-T`rO2bp zNSe5hA`kqkPGqPy7H!j!WmHi?-v$#3z1#O+vwdjY-2u)bx^z6t-2VQ@2F9y?=Z*dF z4h&*agYSmYo0zAsspx{t*~$31%43++qe(__n8!(6aZ?|EOA3>3{7-pP99#zo?(GB0 z03&_)@zGMbb>t&b$9fGTNZBC~KG;?&mq2Vbjb4b=Wun#GuxjN75((;s<7>h@m-q{R z|A_c8Vwze0UsXT-qCOl_UERmiD1{oV;9vGaE7#_Cps7sVQfV*!9{lHZ;`(gbbyd^E zYo=bxar%iPG^wdLrWL`YM(mkZ3Y|6;MBjAWX|nNU@>6H+FPI_S_?92A)oN_fl5O0@ zokM4W^EvyWt>t}Z=iU25BQ2W5+l>#G36uHRa}QQhF5Ua&UqfOMVB zYX%v~iDBI0g1~jBND}R$3H#G5Y)vhR*uxoiww4ta*y~>r2L$`jjHfqZ?x^msHe#L_ zh>3Jf>UX4d*E4U)ug)j4>V*6d;GFf*6L%=DnaDidLi}}JL+xDPM@zdDuwKlDihf~Q{O;#6x_$27;zLHnQ`h1@pNH* zT2%TqR(c}lwcUgDbv?R+bM~>G@Y7R#Pe|E0z!z7ykefoUO8-V%K+C7U;IfN6Ea9i- zc$ovp&9T{FXpi-_hvOTgIwOt$j{S?xvE2cumNP%NvTOV=@NOd~SIS(*jxVupGbdM^ zZVM+jqKMWyty zIRjto&94+r*G10OEbOpQH+irbyJi^y>g8UW^}$J&3xbK^g}=`WZ{AYz<76hdwPQ>l zpLSfu!Utst&VuS zr_M36g8L9WB!4>P%QG)7&H5g+4tn-|CSwZpM+x zai--0uL`*}2c|yr7chwSTtr`wiMjt>D$9$R;1=zeSQUF`B;Fd(4bknlEw105ygh`U zfCiJM>F?b~0$J}(q%!0cZhUM+KMg^|ey5NkwJE6#a+eO7cj_fwB|g*Om$Mc=tU{Hr zXrdM8wXQJod)O%&i+uYVQ*YmsTXaDjfB`Ko8kN@>mz`vO640{#*Z1$(p6t509)91F z9YZM8M(6ZspYWGX1?*^Y0;=%9S1e}3i7hw402W8{E4#_Od2KYX|o87vKJn zv{A8}V92t2KMq{YH^H7$Z{6p3dGB4?5mR@nj6Ye5+pHu44LKSS-`A6<%L(W!k+u6?$oxlnP z9pDgu5td2$;r_y%acS_gay9>C}=XbW&)a)`rxa_<5r7 zd%?p?Y05`~ZW-fExw}L zDT%Fm$r)1`Fx4?0o-y5Y@0TL+oauJ2S<1x4YcPvcBlqHMO9`BjgAO`*;!9C{cx!wJ zO{eW0t$e_B5cp2++eBb?8umq{Tp*c}S|rn&gQs1aF|Ogz>$Hr{#XyMvGGK!klunX12uEI7O$$H!_N=cmxSR z2qOB0_!Iq5ibVz@j}WGB@k~XLT{=n3_JYgAr(LTN;Y#>ah=wu`$J_)Xjo6-#tA;>5 z&b*MY43_0GosXnU9Q$JDCcV4S*L4$* zXz7Ox57HTi`=473ch&(d_YLM-bX*<^{c8_*_GaVkqm!Ghc>v6$RO?QG$YwTVdFo z(^a82?&tLcLo)l)x-suGMRq}qE2cO=$EEuFS~Ij`WO#v@xqkn^sVNSZje1*#-Pz;F zCT#B}B70tNGJ6<1bVu9ntMPEP$WIL0Mh-|$r@;q;8{AEzOp|K_qdS1w944GkejkP( z`T?Sco2egwR$jGgZXsO|W+-?pu{StJ-RnM@(EJ#@^hU#>w9eH-$JY;*%*NF%0TCWH zSGu%DMYPpn2f8YwORD?WheaAd4sQ|q_*mY31B8A(Ox|Myt^kf$-gAQ)thIL@UA~~PZL6HDi{3EX zV*Pf6BQsivx8NVE>&Elzhl=4&t^8pfOv$lX2roZID^*oW)9unSx-y^l`Zq(Zoj!5V z2rwkyj9jj8?#mm+qRR%nlZEwv;A%XNyV_=f`OU!nH*F&qBo#BTfMEo9bh-NLQu{@0 zoHmOh9SeI|I#z`&({=iAs^=sg$xCZS@I>5cIB=8yIQSg)y3MwQ{+Fn12S9s$&;E2U zi`E|Z*eU!Gy;L#_4tCjxnPa*%{*up>Q_?Hwb1pG`^O$BE;Kb&7gXows-qGl##e1x8 zj-Cz4(Al*(*H+(C18 zkC=1X@{(&P>|1{430_5n~dXSt2l+ymL@F-|l$gSk%(B z#c1LN><p3X=?|=QL9HQo zzNa}811VlDX;BO#g{dFsjk~}eJWEID*ZhL zYwi!@Vhz!+xERa1EWaMVmLkZ#aUU^z=sWizeJEWZ%a!&`d}w`n%Cp{$rW0-N-K6@z zV2eU5?G>5ErTKHuk~}H1!kXthr_;I#E-g*#UvA84^l)40X3*{>8?kak)9Ffl6%_O6 zq@o#jv1>!lvB=Ic^9vbFu|0V)Cap#%WL*+SPqCqk)7cn>Pwtpv2|Ulxt~xjs@0O@B>Y zngm~b=UG*M{@X zA=uroaxo60^YBR^NFLpsdu>FL+#Wl(jExHuBwstcGkCEl>FK69=ChAd>*=RV!k)VF zP&KMa^-}6;Tr%=WyD@G#6chgUar16d0==(IHDXNjVRQV(IO9hZBNG$Lm8z;$HPvCm zswyh1OiW5D%StOtQ$QnCLm6fab{kb@1{&*J{CfIq^SHNK$yZUr-9q#TQO;!WlvIsn zAsdWBs?MWC0Y+ur4A_va!G+^O#?Hdb5WyQ*(P~{(aan)Vnkg67aq%6JOQ$8AhBjo? zan2xT83_G_M*Wjn2#>{GNQw5{rSsM3ubxE*O5II8Gq1jYGz$ zA5=2X!yQ1`^T2TE0_}uxcEp^W1NNd^SrBBRwGg=}Fr$V3V+rJ5M02<{kYouOvQ>;s z24W`(6`;%pjWGCfg{&ZH{BK$cn4l?U15cJlOb5Omf$2$7_R^t5ib6 z$nFgK>UT$Wo(mL*ThN@F;gP`i%Umzb0`!@U}-vO7~4Nb&^T2G5vTF8*G zkV1s@%jY7sbw$)23auRkrR-Zf(H7O?iS5XiNaJ>@HDk?kPD!0)*s^(0R6yZ>chq-Y z+^FNzNIvJVV!#68?ZhHS4a8lE(IA2kB@0BRx+xLhor34hAyWb1Z>5NF^6lz8kJAWn zLUriM%QFoi6aVS7_=${)ijN6BS5xA33>@}6Ml55~6qqP2a!(Bxq-T0C4(wbm1o0>n zfb9+BlrUtl5_o(D`I2Byu~{Zs!q^4iaTka>#S=O-Ht2HqNTblBswi+3XQvi2>~La{ zaT*^@PQmdQEkIn%8?E*DDac{q%GiFrQxJiCP@L>|IhjX9=A9Fje@zmOZ1>|bsDt(; zLYOPWeKXgXDpglgeU&357;PUHa8GB;AcxIP1jJ3s+u<==E}1I#1^r$+dd(XV zuAm-3*@&1Ikb-jE=}qU-`EsUC#jfNMoNE;5X1pZw^78*C%)JsMX<7`PQMctI9ING^^5jW`O^<8UFhpdX zhYu`Mka6<42MZkiAlPF@SHj}R3(7e$IH4FW)KFqa4`7h_@iD@f;1*Np379+_6Y5Wl zu#0i)WT!BEGOW9b(4=v!SJsu(jCWA9=)iYud^fOEx_&K=SK4FIlK?Sc8Wme$BhY9uTRO3QGy|5@p6g2_^< z)ub`Cl!~gRNx<8><|`2c;T5g1Jg@E?#l@3b5DMcq|5s(-7@SEIt{K}lC$`Or?POxx zwr$&XGO_J^v7Jn8eBnepclXD=TXnZ~w@+7{M%DZD>FOVS>O9E0^B6;yPLA9bBf*0k zQ?U8fOsgB~WSu@pUfMSoGoqv+ORz|Q#B*qPYwGz89&+ym4R!h}HdEtFKPGYQ&-&sPySjbdG-u$1#UYd}_2NOYQL0&O%LsB`dk#%@cIyZ597vK; z1SF!Pd6^X025a5vH5KnE`FPQH>$Mau)?<`k+B`;#qZ-$Q8%Sxc#F^Z^m(8fPi2ZWcQihDm932^1B2UbZRgab^ODfl@r5oOW zW1HzoiCB%GMTTTpakBR*#Q&r|Yn+cYf*`auKhv&v97ts;@qJ*%ZKg^?&3xKYpteZk0P97_{Na=M7hgcjYP5Vqygse2TC|&p3=X8294)3!#!?a@ znGgxwkssTQhn9dF(waLF9Ts02t|L?lO>LVfW?b1SIT^x^sV7Y9F}&wI+RNf7BL!nx z+5T}6aB&-J>{9_=ym`E|U)(yQEWT=CN8Oi8@&WUt*FXRq?Lj%$N`Q$6-2UW?0%1ObRBQL8XTu@(b7$a6W={=VFW%M zm^kxXx@AR=rsQpO5)z41nas%Rx3EAYt@9wp_t)4gQ!?RCQc12PTr|JGT3>3=n{X8lGyb?!hWY1;Zg*`^=xIpJo_E0B?r6c78 zl-Ywydw*U>ger&jD?FJ-Z)vd%n4rnsM-3!Q!PQBHXM{K+33S-f7Jvet3?EimTcmfw zj%GDc4C5~?9hEQ+;&8QVgq1E+4{%ykt5U1<7(Il0j?B>*gk6QJixJZ)TD4F@FgFMW zV(-$_inU5!7-g#C0ZBblo0>a5*ELNV>LVy-o`&;iH!7KGpsDx(U1I({yzx#_q85Y6 z-^NiyRUC)M_}B=|#cb|A`YsTDfo&(=H7bL z-taJ8w55^MqCD*AGEH@`1vZi&ExJM5krQz;(rJ8fsb=9pQ>TIVmUJP%L@Y_OMX1OH zduyylz$9uNdRX(ic0^*bL(^d*6c;R2#o$fx_xA82B?l+sGS^IMq&RSQl)dCo1{H`d zS)!Xy>Jqt@8L;r2o#R~H-KNSkMq3cF{5;w$EDL6)>}i~0^7!Je;>^a(h;43MO>~Ra zlg)}1f%FEC<&2zBT7*>T#4a5~BiY1wOPF#E%X#~*jp?x@{EC`=J*2C zYY(GJyDbYvNYXH$*Pu)$y)h|pMeRu&molM;>kdo_l5l0QW)nxHos%?SH44iycsuzA zb08<(Y0AmTGAflLvAfK9=$>Un2~^JM^g6%KGELG652FjY2lYxINNwK!lv!3E{F6WL zV3e!Jabb+TL2?##X399q317n?lS>DuPH&23sLiyIR03D_Q-ThEKJdz^qsKqPq-V3y zv3lY6N*dcF)xkl8YbtEU?JBE0vn_Stv_T}a&CQXKVw)FlvY_&suUvslsa` z7|Lr$B@!4mP>b4LS}FnQjygfyJg!njbohUJrJTQU4@8&r9~%K25i(j|#-ouh#~ycy zYq$tzjIgxXNwQ^95r>=!cZjqP(`FDSM?K5O)I7Q=pcU~&%^Z>0y(5&bz@3i+w@hlX z$x!nki2HulhK1vMh)yJpQ*ism5`pHCsv|Z1DFmrOCDwuuUOZ!H3R5ffs+ja$UTj(3 zoLZ*Sv>gVJv1-Qi=Zf4K!N$&Px#AM#lli&w zcvGkx9`WH*E6rJVC(9FM?X71E*43xWHXIzS&8^v+*-#&VyqXn&edUt%g|$sf_Fvu~ zfGTKq4*_nUc7>X{>Z)-?zd8*aJq~Q4Czw^Wxs{6=n-fbHNBY{CEIlEe95xGu zv{fYobya$(+!hJ%pi&M%UA>2z=1e}{R?x*v{mhIuF==_5IgYXp!mw*Xq5KV31adcEv<6YV%x~B(hXQe$w~``Vzr>Jd@bZ zb&%`o)oPoQ)mZmN7GHMaYrH%@@8z@mcq<+XlMPQ!|G%$`_hyF{u}s85E|0kj&P|oi4x!c(|D8tbe{Uo#i!1dTtlh^)~i9NfkA3UD}m3;$0fGHAH%ZMSPMM z7nXX2B{e2)e!2Au^D9wZT?O?DtLhE)3RwfLZUK5v=NI&Pb@MASdUcB{)_Qd-E4(|Z z4L&Cq)+O~sh22QYD@yiR?F7M*mfFdAgUO{P%ksgPuTUovPnRUet|1XdH z;u=)F>&2DI`Y~6xwEFz&8mFDKxGpi*C)-czczZGb@ll{P`QvEoZFP;-Hd?& zsN2VKr}+DvLwZ4Xa(bWOE>CPHT~IgL9d(X2nU~(4T+D_Xm*ft?9&FnT6OMErTl@AA z-67{CHzD1`_s9cwAwDQKq#Ybxf0=tE_rD<4kUbE$H98~@h(fyaJBcJ|0z_#p&>al6$(MZ<}+wE`>>TgAJ~EOz~8=hL>^wCwgcHUaa0`m#J!;zsdK9vy-nGE`avxumRfMq zb;)z|igf)-bdV94^{0NkQqcpc&T{1R3QEMPcbpDDk)eMChRFi}>N^A1SP^)ml&M==7WAbl?YYHFs|aNPQ(GhY0=N&B2|2ZrU~X zJiY5P#}I|o9eH1Mw0l#vg@=Z-Y|)+5Zuoh0j008PJL2ikT;JN#(ni+zg!*GURG}A= z&>No@9U@;;El8Lo^%D1Ze2=XMJ9Dln?@IldxjR{C^yWloW7FLV67_m=Si|Ajdh_}x0_V0*`h|1k&^&@xzH>)3$!T#eghv2Iv^m~Rzgv9ZsKuj>$E zv9%9{zikw!VtBNJT#^+gt*1}$Wcu<3hX78}drGjO7l`%aqCB=GX0KZORV z+vi$yN)GnPML4Z*MthJ0nGVVpGVenRHAtkA#$?QIAc%HU9`vO!FdC(rip@_c6*87d zDQ-$~$#KLrQPWBJV_336IXXE8uvc;Ae5T(mJ!*8?(n|SbeApjxYL322%9M<8l48PQjusrZ_Z9-sck8S z)eN1Y%}I5#m2gX8%}-lnr$Ju_Y*Lz`ZS~hnZzQ}q-kPxfbs;Ua(FoHtq8~3Suf`(J z{)sOCD#yX~o70?GNONjtrdFQesitVn!$st`oigR%a*imTNv%# zgJGE9Q!}Z+4aZ#J{>mnOr>0C%mzMyptaFS2%u@oYnZ^>TeUu{p>Qf$(APQw_d%>wJ zOZ`GjT!&;G)Ml?@%%s6zsVuS(DP$eoW@?d!?Jz{ythC~dk`NiCv9zeV48gLh60I=# zl)({Yv3RJu@LKnG8uyV(FVy?CGudtv>`IeV!cs6;$V!0 zPb2po#P7~hSu`Phel4(zORL*8@QP%0+L*6=oz1anZDAP5W=dv$gNQ%AloIG4jlJfL zs`QzNkJ}oaxk^q>pqW*Lpf_aUqoONsA+i5!*>fL2PoB&N53c5q1>)q=f4&V=cme%m5zUi^b?!FUZ zk5vp&y9DS}E_jdSLs5D9D3X-5^uo9NuJ_K)nnS@Csd?pOHM!!Ix@xAr8eu5)o}YJ4 z*4#69pB{*Gp&nubee#MI>Cd$kL~i5H;EsEFpEXhW*&}77!HcH7;tPA;ZxZaFs;r&8kPuipdc)HVuQM^waLFOB2QG_m3XBpBHE% z(eDWnL+gm43;@NBhTp{{(u?kirPt}n&%Dx`W%N4B04^<^oLg4D_=mp9O$Ank%|DYO z;=9IFd1{+Z$!|zw#wzjFeG&Q={Q?CBQ}}o*m~b}g{#AEa6or*k)VvxqH_|xK{U+3a zfMVAEjI_7JvMJtpHlgC8IVZyb{X)=pP4j_z^DBchntwdan229dqQl_^@*lj3jrG%3 zh^EaCOy*xXU&F=Iaqd&5Uy@Lrs4|5mLh=zqumDM)MN)E><_erRG;q7xQk2rB9x>@3 zT?FN@EvZR|?`gM{*OoS*%$Mc2zX1g?9Q;g`P2(aZ8t9YEm3$~>Kiz95!b@0kaptm$7FEs zi9Y<|j6Ta$R6PL@0o2W-6CeohoMQn-rZK@Who)3aH>WE(-&ODHA`sY=Uk?Vfg~iCm z|Dj}R4>6z4p8REBR#CIQ9cpN$m@&Rhk1COQDrH#eMHC1_&cYOKU+iQekpQE;Js7(J zj;1&a6RZvZz8M3_OxxZpjWDZwioP;r?g$7)c>qj`5;Fa z`95qenuXR6_E3I4lW$|8^Z0LN9IOZi#8M2TuC1^4+WwXN+Zx5VvmGtfa*S|tU)aV~ zuKYLCiIVmFgdw#)gW3Zv2P`bRK87AF49AV1b(ePXQQ7TjAPdlghDFX`Ytt`2aFl?e*ly8&pZhF{N;0S-F zgnuTQ^WucXZ&bBQ$)-jZFbfu-qSd3&bgEme+J(E#d>+LV;WBFa4YrCOytv^i){t(o zlrP;CiqYJy(rQYuv6UeqTfrZ8ks`)7$6zSmi(-QB`*>%dRT6)s(HFfd0-Jvfo~Nrg zjgg-?Eq|Hf*}a9QGEG!~68ZJcP2$D-FC@sj3=y~iWmlAH;71{p_NJv+f(5IJ!RrPd z)()us4k%b9E8A+besX)>dE-7HV~KPyqk+Wq{&>Td+T=!t+`&*Z(mnGU9UB`b{0TYmSk(TdBXNtaCvm4~(d!3sY>f=tJN|!3cH~;*a@x&)q>*H^oU4@1Tpa z7(*Z3ke#E}Pvoe@O@g2p$^y{fZ$c0%cDY{aF#c1jeb}awKkYu`9fNjneUw3F{aIXY zMX;uXQ~RVWumxPoTiJiFqdNQ6XjN+&ndc(sQ9``RPDy%Ix}xnjppZhm;>+Ov7}zs6 zN&yMTkoZbMgMz(N{5A1oz-MW~kA2S!_D-$kMJ~GeLIlhgYp59S@(1(cwiFJzz&p5? zDpnKJ(aeQoFh%(eJPb#I7)MF}oS8s=itw?hjPtKiJZz~IM`bK4&3!O){a6^a(t&MJ znj7}NVQ8O=^sXNJqP34pXZ_HD=N73O$ihcmk!Ds1D!s;1^F%y#wU|p&BXWs}3}fbF zqk#61u~hS_I<@kMWQK#V3EvRCKW-Rvv9g(`x-B=}aG1yhPYg{H2-vzZx_7c9d(=&T znM~G^cS^AclQd}POH}OBM??mH*80W3AvXI2hO;<8!+Be$dO?HOoJWohl@dgFH30lN zYd8Hc{(jeOf|J#J!&Ps#)mGojtq`S-EUEiMRzG`pfvKo`L0~AiN`fNPZW@^0&>iC# zRsR*hXMtt#RT+aHG#pE#zwiPLYZ%ZBIt{+#2|YCJvq<)cRUT7?B! z-=f!?jR?>ew|*JPj)ji}-j#j33o^5kui)&CzpAeJveDPNEq@ z>2zz%VTaT}?OgkTn8l_5Oon$w^;{M+I@QO_2g&lIk<`n~;0EIm8 zBZ|hK6AsFa0cHr5JJYGZ8K(T?aMy~r=Th$(roiR0=8HQxuAUM`>W4>I4vC%#RRxEi4}8W@ zp0c8^hv;aA&2neZx}ysz^-fM{piJYv0lZuNn(m|GLN zY2DkHB=@a_(b)lY*?W<@E#BUI*ZYn0w928DezKhpxs}t9Y7Z}DI?WHg>r;)yYCvc= zK08W}ETL$)D`wusvhUIxW}?t&+p)VFb&pgiqM@oZ$^?oLf7A|R^u}SBYvv(7gpebY z4~@QIE!eL?qtRbK=c~-+mTh~(vyW|%JPzDi77p%Un7`7$7OjEr>&E*uyWW5Gwjv8+7_qW z*n*K8?vkk^Zfv!$V!mr1bjk))SmUsdm;MBkEkrlJFkgvLUCrl!sNK#n z%#7{WhS_^^t*5Z%I*4bJT9^GMDJEJzU%>rREC%FV=w#2*f~Ss83rL7qwOxxTZ34;m z3js+YlQ@v(>>uE@^uwT^{tj-SWpLeY)TL1&)nrr37+1!2;=JRYRms^n%zg_E|4G+3 z{7R=Vb>?_3{pZ0UluZ=*n;CPEm8Y4lGLRKr9cHXwnQIjGDKMU za2rLzap)@c^j@E=Yt@IKOD5Xg=F0+f`fZcw(|%*`dPT>{a}yBmy2i*LUK&b9S6$4b zRjd?%T@2Px7V>3b#qkIQSCJ>AfGr--OOx_Dbka7qHjSt{X}7UIOm59F=-VByKNOPF z$Q)gSOfs!d{+-h2aun?=gjD6$Mm+7jwWxRJBhd3zdn%lW1WBP_9v;a(^LxTN6QG8vF+ zN?|LHz(l@qcsmD)m-XFqRnm4z7M~}|gAu-zd2a(XqjA99{P|zsJb+}LZzWla$UgyS zzG5D+regcI>c!MNKnKuuko>^fnr*(`XT(~c0U(kUv)|FOaq&t;Dp`FK#Qvc~b;c)* zB!_atcb!La=zesUx)nLUPTi$E?trCgf9l>>K7%#bm@J z0jsomaDo|#2!7{aM;ku#hb1VVh`V3ekUV$2ikazOHU1!%B)IB08l0s-k{bI=H|+q> ziD{$`f;%t+X@6~QGUP8%Us+2(Q<(36%X99T&>Y#Yd3`vb7C5+Rk;Mg*1Z#+_DT}y9 zN)#{>;n6QL0wu}jkVelBXKdW07C!i(6b?+*Wf-|#7* znbkN3r)Ld=IHA}4n#Itpc|fjZ37MJ@oe}usgEo>wcy2aRz}=1ekLX>ILwLdfWA@bU zwhSwcp}JDH%$|=Gx`k5Qcn_r$k@CeyVE3KcoYE@sN>zt?0~pcvV=}&Vo(FT;r%LLs zk|b*F(&xCvG)se=H9YYH1Dut4~S1F5ZpBv|$iL&n88zR6^@FM|f5fHcx)NGNYorB= z{_VJ;ik4biG5;>H0}{x7JcgRX2pE0jq(w>nZG@mr&-WZpI@nwsATsaEVcdSvlzr92O}0XwRC

)s`;JPK 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