//from:http://www.schillmania.com/projects/soundmanager
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];
		}
		var div = document.createElement("div");
		div.appendChild(this.mC);
		document.body.appendChild(div);
	}

	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, '/Sources/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);
}

if (typeof addEventHandler == "function")
	addEventHandler(window, "load", function() {
		window.soundManager = new SoundManager();
	});