

var isIE = navigator.appName.toLowerCase().indexOf('internet explorer')+1;

var isMac = navigator.appVersion.toLowerCase().indexOf('mac')+1;



function SoundManager(container) {

  // DHTML-controlled sound via Flash

  var self = this;

  this.movies = []; // movie references

  this.container = container;

  this.unsupported = 0; // assumed to be supported

  this.defaultName = 'default'; // default movie

  

  this.FlashObject = function(url) {

    var me = this;

    this.o = null;

    this.loaded = false;

    this.isLoaded = function() {

      if (me.loaded) return true;

      if (!me.o) return false;

      me.loaded = ((typeof(me.o.readyState)!='undefined' && me.o.readyState == 4) || (typeof(me.o.PercentLoaded)!='undefined' && me.o.PercentLoaded() == 100));

      return me.loaded;

    }

    this.mC = document.createElement('div');

    this.mC.className = 'movieContainer';

    with (this.mC.style) {

      // "hide" flash movie

      position = 'absolute';

      left = '-256px';

      width = '64px';

      height = '64px';

    }

    var html = ['<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"><param name="movie" value="'+url+'"><param name="quality" value="high"></object>','<embed src="'+url+'" width="1" height="1" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>'];

    if (navigator.appName.toLowerCase().indexOf('microsoft')+1) {

      this.mC.innerHTML = html[0];

      this.o = this.mC.getElementsByTagName('object')[0];

    } else {

      this.mC.innerHTML = html[1];

      this.o = this.mC.getElementsByTagName('embed')[0];

    }

    document.getElementsByTagName('div')[0].appendChild(this.mC);

  }



  this.addMovie = function(movieName,url) {

    self.movies[movieName] = new self.FlashObject(url);

  }



  this.checkMovie = function(movieName) {

    movieName = movieName||self.defaultName;

    if (!self.movies[movieName]) {

      self.errorHandler('checkMovie','Exception: Could not find movie',arguments);

      return false;

    } else {

      return (self.movies[movieName].isLoaded())?self.movies[movieName]:false;

    }

  }



  this.errorHandler = function(methodName,message,oArguments,e) {

    writeDebug('<div class="error">soundManager.'+methodName+'('+self.getArgs(oArguments)+'): '+message+(e?' ('+e.name+' - '+(e.message||e.description||'no description'):'')+'.'+(e?')':'')+'</div>');

  }



  this.play = function(soundID,loopCount,noDebug,movieName) {

    if (self.unsupported) return false;

    movie = self.checkMovie(movieName);

    if (!movie) return false;

    if (typeof(movie.o.TCallLabel)!='undefined') {

      try {

        self.setVariable(soundID,'loopCount',loopCount||1,movie);

        movie.o.TCallLabel('/'+soundID,'start');

        if (!noDebug) writeDebug('soundManager.play('+self.getArgs(arguments)+')');

      } catch(e) {

        self.errorHandler('play','Failed: Flash unsupported / undefined sound ID (check XML)',arguments,e);

      }

    }

  }



  this.stop = function(soundID,movieName) {

    if (self.unsupported) return false;

    movie = self.checkMovie(movieName);

    if (!movie) return false;

    try {

      movie.o.TCallLabel('/'+soundID,'stop');

      writeDebug('soundManager.stop('+self.getArgs(arguments)+')');

    } catch(e) {

      // Something blew up. Not supported?

      self.errorHandler('stop','Failed: Flash unsupported / undefined sound ID (check XML)',arguments,e);

    }

  }



  this.getArgs = function(params) {

    var x = params?params.length:0;

    if (!x) return '';

    var result = '';

    for (var i=0; i<x; i++) {

      result += (i&&i<x?', ':'')+(params[i].toString().toLowerCase().indexOf('object')+1?typeof(params[i]):params[i]);

    }

    return result

  }



  this.setVariable = function(soundID,property,value,oMovie) {

    // set Flash variables within a specific movie clip

    if (!oMovie) return false;

    try {

      oMovie.o.SetVariable('/'+soundID+':'+property,value);

      // writeDebug('soundManager.setVariable('+self.getArgs(arguments)+')');

    } catch(e) {

      // d'oh

      self.errorHandler('setVariable','Failed',arguments,e);

    }

  }



  this.setVariableExec = function(soundID,fromMethodName,oMovie) {

    try {

      oMovie.o.TCallLabel('/'+soundID,'setVariable');

    } catch(e) {

      self.errorHandler(fromMethodName||'undefined','Failed',arguments,e);

    }

  }



  this.callMethodExec = function(soundID,fromMethodName,oMovie) {

    try {

      oMovie.o.TCallLabel('/'+soundID,'callMethod');

    } catch(e) {

      // Something blew up. Not supported?

      self.errorHandler(fromMethodName||'undefined','Failed',arguments,e);

    }

  }



  this.callMethod = function(soundID,methodName,methodParam,movieName) {

    movie = self.checkMovie(movieName||self.defaultName);

    if (!movie) return false;

    self.setVariable(soundID,'jsProperty',methodName,movie);

    self.setVariable(soundID,'jsPropertyValue',methodParam,movie);

    self.callMethodExec(soundID,methodName,movie);

  }



  this.setPan = function(soundID,pan,movieName) {

    self.callMethod(soundID,'setPan',pan,movieName);

  }



  this.setVolume = function(soundID,volume,movieName) {

    self.callMethod(soundID,'setVolume',volume,movieName);

  }



  // constructor - create flash objects



  if (isIE && isMac) {

    this.unsupported = 1;

  }



  if (!this.unsupported) {

    this.addMovie(this.defaultName,'soundcontroller.swf');

    // this.addMovie('rc','rubber-chicken-audio.swf');

  }



}



function SoundManagerNull() {

  // Null object for unsupported case

  this.movies = []; // movie references

  this.container = null;

  this.unsupported = 1;

  this.FlashObject = function(url) {}

  this.addMovie = function(name,url) {}

  this.play = function(movieName,soundID) {

    return false;

  }

  this.defaultName = 'default';

}



function writeDebug(msg) {

  var o = document.getElementById('debugContainer');

  if (!o) return false;

  var d = document.createElement('div');

  d.innerHTML = msg;

  o.appendChild(d);

}



var soundManager = null;



function soundManagerInit() {

  soundManager = new SoundManager();

}
