From 702bf1ac09f57c4822b26b9db24a7f1daf50038b Mon Sep 17 00:00:00 2001
From: olivier <>
Date: Fri, 12 Dec 2008 18:12:30 +0000
Subject: [PATCH] add SoundManager 2 v291a-20081205
---
telemeta/htdocs/js/soundmanager2.js | 1471 ++++++++++++++++++
telemeta/htdocs/swf/soundmanager2.swf | Bin 0 -> 2433 bytes
telemeta/htdocs/swf/soundmanager2_flash9.swf | Bin 0 -> 8079 bytes
3 files changed, 1471 insertions(+)
create mode 100644 telemeta/htdocs/js/soundmanager2.js
create mode 100644 telemeta/htdocs/swf/soundmanager2.swf
create mode 100644 telemeta/htdocs/swf/soundmanager2_flash9.swf
diff --git a/telemeta/htdocs/js/soundmanager2.js b/telemeta/htdocs/js/soundmanager2.js
new file mode 100644
index 00000000..631814fd
--- /dev/null
+++ b/telemeta/htdocs/js/soundmanager2.js
@@ -0,0 +1,1471 @@
+/*!
+ SoundManager 2: Javascript Sound for the Web
+ --------------------------------------------
+ http://schillmania.com/projects/soundmanager2/
+
+ Copyright (c) 2008, Scott Schiller. All rights reserved.
+ Code licensed under the BSD License:
+ http://schillmania.com/projects/soundmanager2/license.txt
+
+ V2.91a.20081205
+*/
+
+var soundManager = null;
+
+function SoundManager(smURL,smID) {
+
+ this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9.
+ this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available + configured)
+ this.useConsole = true; // use firebug/safari console.log()-type debug console if available
+ this.consoleOnly = false; // 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.nullURL = 'null.mp3'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)
+ this.allowPolling = true; // allow flash to poll for status update (required for "while playing", peak, sound spectrum functions to work.)
+ this.useMovieStar = false; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio + video formats (AAC, M4V, FLV, MOV etc.)
+ this.useHighPerformance = true; // flash positioning trick, improves JS/flash callback speed, minimizes delay
+ this.bgColor = '#ffffff'; // movie (.swf) background color, useful if showing on-screen for video etc.
+
+ this.defaultOptions = {
+ '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)
+ 'stream': true, // allows playing before entire file has loaded (recommended)
+ 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)
+ '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)
+ 'onstop': null, // callback for "user stop"
+ 'onfinish': null, // callback function for "sound finished playing"
+ 'onbeforefinish': null, // callback for "before sound finished playing (at [time])"
+ 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)
+ 'onbeforefinishcomplete':null, // function to call when said sound finishes playing
+ 'onjustbeforefinish':null, // callback for [n] msec before end of current sound
+ 'onjustbeforefinishtime':200, // [n] - if not using, set to 0 (or null handler) and event will not fire.
+ 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time
+ 'position': null, // offset (milliseconds) to seek to within loaded sound data.
+ 'pan': 0, // "pan" settings, left-to-right, -100 to 100
+ '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/video 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) - WARNING: CPU-INTENSIVE: may set CPUs on fire.
+ 'useEQData': false // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
+ };
+
+ this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio/video options, merged into defaultOptions if flash 9 + movieStar mode is enabled
+ 'onmetadata': null, // callback for when video width/height etc. are received
+ 'useVideo': false // if loading movieStar content, whether to show video
+ };
+
+ // jslint global declarations
+ /*global alert, console, document, navigator, setTimeout, window */
+
+ var SMSound = null; // defined later
+
+ var _s = this;
+ this.version = null;
+ this.versionNumber = 'V2.91a.20081205';
+ this.movieURL = null;
+ this.url = null;
+ this.altURL = null;
+ this.swfLoaded = false;
+ this.enabled = false;
+ this.o = null;
+ this.id = (smID||'sm2movie');
+ this.oMC = null;
+ this.sounds = {};
+ this.soundIDs = [];
+ this.muted = false;
+ this.isIE = (navigator.userAgent.match(/MSIE/i));
+ this.isSafari = (navigator.userAgent.match(/safari/i));
+ this.isGecko = (navigator.userAgent.match(/gecko/i));
+ this.debugID = 'soundmanager-debug';
+ this._debugOpen = true;
+ this._didAppend = false;
+ this._appendSuccess = false;
+ this._didInit = false;
+ this._disabled = false;
+ this._windowLoaded = false;
+ this._hasConsole = (typeof console != 'undefined' && typeof console.log != 'undefined');
+ this._debugLevels = ['log','info','warn','error'];
+ this._defaultFlashVersion = 8;
+
+ this.filePatterns = {
+ flash8: /.mp3/i,
+ flash9: /.mp3/i
+ };
+
+ this.netStreamTypes = ['aac','flv','mov','mp4','m4v','f4v','m4a','mp4v','3gp','3g2']; // Flash v9.0r115+ "moviestar" formats
+ this.netStreamPattern = new RegExp('.('+this.netStreamTypes.join('|')+')','i');
+ this.filePattern = null;
+ this.features = {
+ peakData: false,
+ waveformData: false,
+ eqData: false
+ };
+
+ 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
+ };
+
+ this._setVersionInfo = function() {
+ if (_s.flashVersion != 8 && _s.flashVersion != 9) {
+ alert('soundManager.flashVersion must be 8 or 9. "'+_s.flashVersion+'" is invalid. Reverting to '+_s._defaultFlashVersion+'.');
+ _s.flashVersion = _s._defaultFlashVersion;
+ }
+ _s.version = _s.versionNumber+(_s.flashVersion==9?' (AS3/Flash 9)':' (AS2/Flash 8)');
+ // set up default options
+ if (_s.flashVersion > 8) {
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.flash9Options);
+ }
+ if (_s.flashVersion > 8 && _s.useMovieStar) {
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.movieStarOptions);
+ _s.filePatterns.flash9 = new RegExp('.(mp3|'+_s.netStreamTypes.join('|')+')','i');
+ } else {
+ _s.useMovieStar = false;
+ }
+ _s.filePattern = _s.filePatterns[(_s.flashVersion!=8?'flash9':'flash8')];
+ _s.movieURL = (_s.flashVersion==8?'soundmanager2.swf':'soundmanager2_flash9.swf');
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_s.flashVersion==9);
+ };
+
+ this._overHTTP = (document.location?document.location.protocol.match(/http/i):null);
+ this._waitingforEI = false;
+ this._initPending = false;
+ this._tryInitOnFocus = (this.isSafari && typeof document.hasFocus == 'undefined');
+ this._isFocused = (typeof document.hasFocus != 'undefined'?document.hasFocus():null);
+ this._okToDisable = !this._tryInitOnFocus;
+
+ this.useAltURL = !this._overHTTP; // use altURL if not "online"
+
+ var flashCPLink = 'http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html';
+
+ // --- public methods ---
+
+ this.supported = function() {
+ return (_s._didInit && !_s._disabled);
+ };
+
+ this.getMovie = function(smID) {
+ return _s.isIE?window[smID]:(_s.isSafari?document.getElementById(smID)||document[smID]:document.getElementById(smID));
+ };
+
+ this.loadFromXML = function(sXmlUrl) {
+ try {
+ _s.o._loadFromXML(sXmlUrl);
+ } catch(e) {
+ _s._failSafely();
+ return true;
+ }
+ };
+
+ this.createSound = function(oOptions) {
+ if (!_s._didInit) {
+ throw new Error('soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods');
+ }
+ if (arguments.length == 2) {
+ // function overloading in JS! :) ..assume simple createSound(id,url) use case
+ oOptions = {'id':arguments[0],'url':arguments[1]};
+ }
+ var thisOptions = _s._mergeObjects(oOptions); // inherit SM2 defaults
+ var _tO = thisOptions; // alias
+ _s._wD('soundManager.createSound(): '+_tO.id+' ('+_tO.url+')',1);
+ if (_s._idCheck(_tO.id,true)) {
+ _s._wD('soundManager.createSound(): '+_tO.id+' exists',1);
+ return _s.sounds[_tO.id];
+ }
+ if (_s.flashVersion > 8 && _s.useMovieStar) {
+ if (_tO.isMovieStar === null) {
+ _tO.isMovieStar = (_tO.url.match(_s.netStreamPattern)?true:false);
+ }
+ if (_tO.isMovieStar) {
+ _s._wD('soundManager.createSound(): using MovieStar handling');
+ }
+ if (_tO.isMovieStar && (_tO.usePeakData || _tO.useWaveformData || _tO.useEQData)) {
+ _s._wD('Warning: peak/waveform/eqData features unsupported for non-MP3 formats');
+ _tO.usePeakData = false;
+ _tO.useWaveformData = false;
+ _tO.useEQData = false;
+ }
+ }
+ _s.sounds[_tO.id] = new SMSound(_tO);
+ _s.soundIDs[_s.soundIDs.length] = _tO.id;
+ // AS2:
+ if (_s.flashVersion == 8) {
+ _s.o._createSound(_tO.id,_tO.onjustbeforefinishtime);
+ } else {
+ _s.o._createSound(_tO.id,_tO.url,_tO.onjustbeforefinishtime,_tO.usePeakData,_tO.useWaveformData,_tO.useEQData,_tO.isMovieStar,(_tO.isMovieStar?_tO.useVideo:false));
+ }
+ if (_tO.autoLoad || _tO.autoPlay) {
+ window.setTimeout(function() {
+ if (_s.sounds[_tO.id]) {
+ _s.sounds[_tO.id].load(_tO);
+ }
+ },20);
+ }
+ if (_tO.autoPlay) {
+ if (_s.flashVersion == 8) {
+ _s.sounds[_tO.id].playState = 1; // we can only assume this sound will be playing soon.
+ } else {
+ _s.sounds[_tO.id].play();
+ }
+ }
+ return _s.sounds[_tO.id];
+ };
+
+ this.createVideo = function(oOptions) {
+ if (arguments.length==2) {
+ oOptions = {'id':arguments[0],'url':arguments[1]};
+ }
+ if (_s.flashVersion >= 9) {
+ oOptions.isMovieStar = true;
+ oOptions.useVideo = true;
+ } else {
+ _s._wD('soundManager.createVideo(): flash 9 required for video. Exiting.',2);
+ return false;
+ }
+ if (!_s.useMovieStar) {
+ _s._wD('soundManager.createVideo(): MovieStar mode not enabled. Exiting.',2);
+ }
+ return _s.createSound(oOptions);
+ };
+
+ this.destroySound = function(sID,bFromSound) {
+ // explicitly destroy a sound before normal page unload, etc.
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ for (var i=0; i<_s.soundIDs.length; i++) {
+ if (_s.soundIDs[i] == sID) {
+ _s.soundIDs.splice(i,1);
+ continue;
+ }
+ }
+ // conservative option: avoid crash with ze flash 8
+ // calling destroySound() within a sound onload() might crash firefox, certain flavours of winXP + flash 8??
+ // if (_s.flashVersion != 8) {
+ _s.sounds[sID].unload();
+ // }
+ if (!bFromSound) {
+ // ignore if being called from SMSound instance
+ _s.sounds[sID].destruct();
+ }
+ delete _s.sounds[sID];
+ };
+
+ this.destroyVideo = this.destroySound;
+
+ this.load = function(sID,oOptions) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].load(oOptions);
+ };
+
+ this.unload = function(sID) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].unload();
+ };
+
+ this.play = function(sID,oOptions) {
+ if (!_s._idCheck(sID)) {
+ if (typeof oOptions != 'Object') {
+ oOptions = {url:oOptions}; // overloading use case: play('mySound','/path/to/some.mp3');
+ }
+ if (oOptions && oOptions.url) {
+ // overloading use case, creation + playing of sound: .play('someID',{url:'/path/to.mp3'});
+ _s._wD('soundController.play(): attempting to create "'+sID+'"',1);
+ oOptions.id = sID;
+ _s.createSound(oOptions);
+ } else {
+ return false;
+ }
+ }
+ _s.sounds[sID].play(oOptions);
+ };
+
+ this.start = this.play; // just for convenience
+
+ this.setPosition = function(sID,nMsecOffset) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].setPosition(nMsecOffset);
+ };
+
+ this.stop = function(sID) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s._wD('soundManager.stop('+sID+')',1);
+ _s.sounds[sID].stop();
+ };
+
+ this.stopAll = function() {
+ _s._wD('soundManager.stopAll()',1);
+ for (var oSound in _s.sounds) {
+ if (_s.sounds[oSound] instanceof SMSound) {
+ _s.sounds[oSound].stop(); // apply only to sound objects
+ }
+ }
+ };
+
+ this.pause = function(sID) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].pause();
+ };
+
+ this.pauseAll = function() {
+ for (var i=_s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].pause();
+ }
+ };
+
+ this.resume = function(sID) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].resume();
+ };
+
+ this.resumeAll = function() {
+ for (var i=_s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].resume();
+ }
+ };
+
+ this.togglePause = function(sID) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].togglePause();
+ };
+
+ this.setPan = function(sID,nPan) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].setPan(nPan);
+ };
+
+ this.setVolume = function(sID,nVol) {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s.sounds[sID].setVolume(nVol);
+ };
+
+ this.mute = function(sID) {
+ if (typeof sID != 'string') {
+ sID = null;
+ }
+ if (!sID) {
+ _s._wD('soundManager.mute(): Muting all sounds');
+ for (var i=_s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].mute();
+ }
+ _s.muted = true;
+ } else {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s._wD('soundManager.mute(): Muting "'+sID+'"');
+ _s.sounds[sID].mute();
+ }
+ };
+
+ this.muteAll = function() {
+ _s.mute();
+ };
+
+ this.unmute = function(sID) {
+ if (typeof sID != 'string') {
+ sID = null;
+ }
+ if (!sID) {
+ _s._wD('soundManager.unmute(): Unmuting all sounds');
+ for (var i=_s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].unmute();
+ }
+ _s.muted = false;
+ } else {
+ if (!_s._idCheck(sID)) {
+ return false;
+ }
+ _s._wD('soundManager.unmute(): Unmuting "'+sID+'"');
+ _s.sounds[sID].unmute();
+ }
+ };
+
+ this.unmuteAll = function() {
+ _s.unmute();
+ };
+
+ this.setPolling = function(bPolling) {
+ if (!_s.o || !_s.allowPolling) {
+ return false;
+ }
+ // _s._wD('soundManager.setPolling('+bPolling+')');
+ _s.o._setPolling(bPolling);
+ };
+
+ this.disable = function(bUnload) {
+ // destroy all functions
+ if (_s._disabled) {
+ return false;
+ }
+ _s._disabled = true;
+ _s._wD('soundManager.disable(): Disabling all functions - future calls will return false.',1);
+ for (var i=_s.soundIDs.length; i--;) {
+ _s._disableObject(_s.sounds[_s.soundIDs[i]]);
+ }
+ _s.initComplete(); // fire "complete", despite fail
+ _s._disableObject(_s);
+ };
+
+ this.canPlayURL = function(sURL) {
+ return (sURL?(sURL.match(_s.filePattern)?true:false):null);
+ };
+
+ this.getSoundById = function(sID,suppressDebug) {
+ if (!sID) {
+ throw new Error('SoundManager.getSoundById(): sID is null/undefined');
+ }
+ var result = _s.sounds[sID];
+ if (!result && !suppressDebug) {
+ _s._wD('"'+sID+'" is an invalid sound ID.',2);
+ // soundManager._wD('trace: '+arguments.callee.caller);
+ }
+ return result;
+ };
+
+ this.onload = function() {
+ // window.onload() equivalent for SM2, ready to create sounds etc.
+ // this is a stub - you can override this in your own external script, eg. soundManager.onload = function() {}
+ soundManager._wD('Warning: soundManager.onload() is undefined.',2);
+ };
+
+ this.onerror = function() {
+ // stub for user handler, called when SM2 fails to load/init
+ };
+
+ // --- "private" methods ---
+
+ this._idCheck = this.getSoundById;
+
+ var _doNothing = function() {
+ return false;
+ };
+ _doNothing._protected = true;
+
+ this._disableObject = function(o) {
+ for (var oProp in o) {
+ if (typeof o[oProp] == 'function' && typeof o[oProp]._protected == 'undefined') {
+ o[oProp] = _doNothing;
+ }
+ }
+ oProp = null;
+ };
+
+ this._failSafely = function() {
+ // exception handler for "object doesn't support this property or method" or general failure
+ if (!_s._disabled) {
+ _s._wD('soundManager: Failed to initialise.',2);
+ _s.disable();
+ }
+ };
+
+ this._normalizeMovieURL = function(smURL) {
+ if (smURL) {
+ if (smURL.match(/.swf/)) {
+ smURL = smURL.substr(0,smURL.lastIndexOf('.swf'));
+ }
+ if (smURL.lastIndexOf('/') != smURL.length-1) {
+ smURL = smURL+'/';
+ }
+ }
+ return(smURL && smURL.lastIndexOf('/')!=-1?smURL.substr(0,smURL.lastIndexOf('/')+1):'./')+_s.movieURL;
+ };
+
+ this._getDocument = function() {
+ return (document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName('div')[0]));
+ };
+
+ this._getDocument._protected = true;
+
+ this._createMovie = function(smID,smURL) {
+ if (_s._didAppend && _s._appendSuccess) {
+ return false; // ignore if already succeeded
+ }
+ if (window.location.href.indexOf('debug=1')+1) {
+ _s.debugMode = true; // allow force of debug mode via URL
+ }
+ _s._didAppend = true;
+
+ // safety check for legacy (change to Flash 9 URL)
+ _s._setVersionInfo();
+ var remoteURL = (smURL?smURL:_s.url);
+ var localURL = (_s.altURL?_s.altURL:remoteURL);
+ _s.url = _s._normalizeMovieURL(_s._overHTTP?remoteURL:localURL);
+ smURL = _s.url;
+
+ var specialCase = null;
+ if (_s.useHighPerformance && navigator.userAgent.match(/firefox\/2/i)) {
+ // no highPerformance for firefox 2. Causes failure on some pages, exact cause unknown at this point.
+ specialCase = 'Warning: disabling highPerformance, incompatible with Firefox 2.x';
+ _s.useHighPerformance = false;
+ }
+
+ if (_s.useHighPerformance && _s.useMovieStar) {
+ specialCase = 'Warning: disabling highPerformance, not applicable with movieStar mode on';
+ _s.useHighPerformance = false;
+ }
+
+ var oEmbed = {
+ name: smID,
+ id: smID,
+ src: smURL,
+ width: '100%',
+ height: '100%',
+ quality: 'high',
+ allowScriptAccess: 'always',
+ bgcolor: _s.bgColor,
+ pluginspage: 'http://www.macromedia.com/go/getflashplayer',
+ type: 'application/x-shockwave-flash'
+ };
+
+ var oObject = {
+ id: smID,
+ data: smURL,
+ type: 'application/x-shockwave-flash',
+ width: '100%',
+ height: '100%'
+ };
+
+ var oObjectParams = {
+ movie: smURL,
+ AllowScriptAccess: 'always',
+ quality: 'high',
+ bgcolor: _s.bgColor
+ };
+
+ if (_s.useHighPerformance && !_s.useMovieStar) {
+ oEmbed.wmode = 'transparent';
+ oObjectParams.wmode = 'transparent';
+ }
+
+ var oMovie = null;
+ var tmp = null;
+
+ if (_s.isIE) {
+
+ // IE is "special".
+ oMovie = document.createElement('div');
+ var movieHTML = '';
+
+ } else {
+
+ oMovie = document.createElement('embed');
+ for (tmp in oEmbed) {
+ if (oEmbed.hasOwnProperty(tmp)) {
+ oMovie.setAttribute(tmp,oEmbed[tmp]);
+ }
+ }
+ }
+
+ var oD = document.createElement('div');
+ oD.id = _s.debugID+'-toggle';
+ var 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(document.createTextNode('-'));
+ oD.onclick = _s._toggleDebug;
+ oD.title = 'Toggle SM2 debug console';
+
+ if (navigator.userAgent.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];
+ }
+ }
+
+ var appXHTML = 'soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.';
+
+ var oTarget = _s._getDocument();
+
+ if (oTarget) {
+
+ _s.oMC = document.getElementById('sm2-container')?document.getElementById('sm2-container'):document.createElement('div');
+
+ if (!_s.oMC.id) {
+ _s.oMC.id = 'sm2-container';
+ _s.oMC.className = 'movieContainer';
+ // "hide" flash movie
+ var s = null;
+ if (_s.useHighPerformance) {
+ s = {
+ position: 'fixed',
+ width: '8px',
+ height: '8px', // must be at least 6px for flash to run fast. odd? yes.
+ bottom: '0px',
+ left: '0px',
+ zIndex:-1 // sit behind everything else
+ };
+ } else {
+ s = {
+ position: 'absolute',
+ width: '1px',
+ height: '1px',
+ bottom: '0px',
+ left: '0px'
+ };
+ }
+ var x = null;
+ for (x in s) {
+ if (s.hasOwnProperty(x)) {
+ _s.oMC.style[x] = s[x];
+ }
+ }
+ try {
+ if (!_s.isIE) {
+ _s.oMC.appendChild(oMovie);
+ }
+ oTarget.appendChild(_s.oMC);
+ if (_s.isIE) {
+ _s.oMC.innerHTML = movieHTML;
+ }
+ _s._appendSuccess = true;
+ } catch(e) {
+ throw new Error(appXHTML);
+ }
+ } else {
+ // it's already in the document.
+ _s.oMC.appendChild(oMovie);
+ if (_s.isIE) {
+ // possibly destructive write
+ _s.oMC.innerHTML = movieHTML;
+ }
+ _s._appendSuccess = true;
+ }
+
+ if (!document.getElementById(_s.debugID) && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))) {
+ var oDebug = document.createElement('div');
+ oDebug.id = _s.debugID;
+ oDebug.style.display = (_s.debugMode?'block':'none');
+ if (_s.debugMode) {
+ try {
+ // var oD = document.createElement('div');
+ oTarget.appendChild(oD);
+ // oD.innerHTML = toggleElement;
+ } catch(e2) {
+ throw new Error(appXHTML);
+ }
+ }
+ oTarget.appendChild(oDebug);
+ }
+ oTarget = null;
+ }
+
+ if (specialCase) {
+ _s._wD(specialCase);
+ }
+
+ _s._wD('-- SoundManager 2 '+_s.version+(_s.useMovieStar?', MovieStar mode':'')+(_s.useHighPerformance?', high performance mode':'')+' --',1);
+ _s._wD('soundManager._createMovie(): Trying to load '+smURL+(!_s._overHTTP && _s.altURL?'(alternate URL)':''),1);
+ };
+
+ // aliased to this._wD()
+ this._writeDebug = function(sText,sType,bTimestamp) {
+ if (!_s.debugMode) {
+ return false;
+ }
+ if (typeof bTimestamp != 'undefined' && bTimestamp) {
+ sText = sText + ' | '+new Date().getTime();
+ }
+ if (_s._hasConsole && _s.useConsole) {
+ var sMethod = _s._debugLevels[sType];
+ if (typeof console[sMethod] != 'undefined') {
+ console[sMethod](sText);
+ } else {
+ console.log(sText);
+ }
+ if (_s.useConsoleOnly) {
+ return true;
+ }
+ }
+ var sDID = 'soundmanager-debug';
+ try {
+ var o = document.getElementById(sDID);
+ if (!o) {
+ return false;
+ }
+ var oItem = document.createElement('div');
+ // sText = sText.replace(/\n/g,'
');
+ if (typeof sType == 'undefined') {
+ sType = 0;
+ } else {
+ sType = parseInt(sType,10);
+ }
+ oItem.appendChild(document.createTextNode(sText));
+ if (sType) {
+ if (sType >= 2) {
+ oItem.style.fontWeight = 'bold';
+ }
+ if (sType == 3) {
+ oItem.style.color = '#ff3333';
+ }
+ }
+ // o.appendChild(oItem); // top-to-bottom
+ o.insertBefore(oItem,o.firstChild); // bottom-to-top
+ } catch(e) {
+ // oh well
+ }
+ o = null;
+ };
+ this._writeDebug._protected = true;
+ this._wD = this._writeDebug;
+
+ this._wDAlert = function(sText) { alert(sText); };
+
+ if (window.location.href.indexOf('debug=alert')+1 && _s.debugMode) {
+ _s._wD = _s._wDAlert;
+ }
+
+ this._toggleDebug = function() {
+ var o = document.getElementById(_s.debugID);
+ var oT = document.getElementById(_s.debugID+'-toggle');
+ if (!o) {
+ return false;
+ }
+ if (_s._debugOpen) {
+ // minimize
+ oT.innerHTML = '+';
+ o.style.display = 'none';
+ } else {
+ oT.innerHTML = '-';
+ o.style.display = 'block';
+ }
+ _s._debugOpen = !_s._debugOpen;
+ };
+
+ this._toggleDebug._protected = true;
+
+ this._debug = function() {
+ _s._wD('--- soundManager._debug(): Current sound objects ---',1);
+ for (var i=0,j=_s.soundIDs.length; i Flash either.
+ soundManager.onerror();
+ soundManager.disable();
+ }
+
+ if (document.addEventListener) {
+ document.addEventListener('DOMContentLoaded',_s.domContentLoaded,false);
+ }
+
+} // SoundManager()
+
+soundManager = new SoundManager();
+
diff --git a/telemeta/htdocs/swf/soundmanager2.swf b/telemeta/htdocs/swf/soundmanager2.swf
new file mode 100644
index 0000000000000000000000000000000000000000..e78fafae9609cf1df28311373ae4c0918a653e58
GIT binary patch
literal 2433
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
literal 0
HcmV?d00001
diff --git a/telemeta/htdocs/swf/soundmanager2_flash9.swf b/telemeta/htdocs/swf/soundmanager2_flash9.swf
new file mode 100644
index 0000000000000000000000000000000000000000..d10a9e5e5286eeb45bc74331c5d8b6a37eec7a97
GIT binary patch
literal 8079
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
literal 0
HcmV?d00001
--
2.39.5