From: olivier <> Date: Fri, 12 Dec 2008 18:12:30 +0000 (+0000) Subject: add SoundManager 2 v291a-20081205 X-Git-Tag: 1.1~777 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=702bf1ac09f57c4822b26b9db24a7f1daf50038b;p=telemeta.git add SoundManager 2 v291a-20081205 --- 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 = ''+(_s.useHighPerformance && !_s.useMovieStar?' ':'')+''; + + } 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 00000000..e78fafae Binary files /dev/null and b/telemeta/htdocs/swf/soundmanager2.swf differ diff --git a/telemeta/htdocs/swf/soundmanager2_flash9.swf b/telemeta/htdocs/swf/soundmanager2_flash9.swf new file mode 100644 index 00000000..d10a9e5e Binary files /dev/null and b/telemeta/htdocs/swf/soundmanager2_flash9.swf differ