/*
 * Sound.js - Playing sounds
 * Supported and tested so far:
 * - Opera 9.23 on Windows XP [Audio object]
 * - Opera 9.51 beta 3 on Linux (can't force stop) [Audio object]
 * - IE 6 on Windows 2000 [bgsound]
 * - IE 7 on Windows XP [bgsound]
 * - Opera 8.53 on Windows XP [iframe embed]
 * - Safari 3.0.2 on Windows XP [embed]
 * - Firefox with plugin for audio/x-wav [embed]
 * - Anything with a plugin for application/x-shockwave-flash [flash]
 * Author - robert@cosmicrealms.com
 */

var Sound = null;

(function() {
	var _engineType = "disabled";
	var _internalCounter = 0;
	var _removeDelayAppendage = 10000;
	var _objectsPlaying = [];
	
	Sound = 
	{
		init : function()
		{
			var browser = P.getBrowser();
			
			if(typeof Audio!="undefined")
			{
				_engineType = "Audio";
			}
			else if(browser=="ie" || browser=="ie7")
			{
				_engineType = "bgsound";
			}
			else if(browser=="opera")
			{
				_engineType = "iframe";
			}
			else if(browser=="safari")
			{
				_engineType = "embed_generic";
			}
			else
			{
				if(typeof navigator!="undefined" && typeof navigator.plugins!="undefined" && typeof navigator.plugins.length!="undefined")
				{
					var wavHandlerFound = false;
					var flashHandlerFound = false;
					for(var i=0;i<navigator.plugins.length;i++)
					{
						var plugin = navigator.plugins[i];
						if(typeof plugin.length!="undefined")
						{
							for(var z=0;z<plugin.length;z++)
							{
								var mimeTypeObject = plugin[z];
								var mimeType = mimeTypeObject.type;
								
								if(mimeType=="audio/x-wav")
									wavHandlerFound = true;
								else if(mimeType=="application/x-shockwave-flash")
									flashHandlerFound = true;
							}
						}
					}
					
					if(wavHandlerFound)							
						_engineType = "embed_generic";
					else if(flashHandlerFound)
						_engineType = "flash";
				}
			}
			
			if(_engineType=="flash")
			{
				_engineType = "disabled";
				soundManager.onload = function() { _engineType = "flash"; };
				soundManager.beginDelayedInit();
				E.add(window, "beforeunload", soundManager.destruct);
			}
			
			return _engineType;
		},
		
		isDisabled : function()
		{
			return (_engineType=="disabled");
		},
		
		/**
	 	 * Plays the given sound
		 * @param {Object} file The sound to play
		 */
		play : function(soundFileURL, duration)
		{
			var soundID = "SoundObject" + _internalCounter;
			var soundNumber = _internalCounter;
			
			if(typeof duration=="undefined" || duration===null)
				duration = 0;
			
			var soundObject = {};
			if(_engineType=="Audio")
			{
				soundObject = new Audio(soundFileURL + ".wav");
				soundObject.onload = function() { soundObject.play(); };
			}
			else if(_engineType=="bgsound")
			{
				soundObject = document.createElement("bgsound");
				soundObject.src = soundFileURL + ".wav"
				soundObject.id = soundID;
				soundObject.loop = 1;
                                 				
				document.body.appendChild(soundObject);
				
				setTimeout(function() { Sound.stop(soundNumber); }, (duration*1000)+_removeDelayAppendage);
			}
			else if(_engineType=="iframe")
			{
				soundObject = document.createElement("iframe");
				soundObject.src = soundFileURL + ".html"
				soundObject.id = soundID;
				soundObject.width = 0;
				soundObject.height = 0;
				soundObject.style.visibility = "hidden";
				soundObject.style.position = "absolute";
				soundObject.style.left = "-1000px";
				soundObject.style.top = "-1000px";
				
				document.body.appendChild(soundObject);		
				
				setTimeout(function() { Sound.stop(soundNumber); }, (duration*1000)+_removeDelayAppendage);		
			}
			else if(_engineType=="embed_generic")
			{
				soundObject = document.createElement("embed");
				soundObject.setAttribute("src", soundFileURL + ".wav");
				soundObject.setAttribute("type", "audio/wav");
				soundObject.setAttribute("id", soundID);
				soundObject.setAttribute("hidden", true);
				soundObject.setAttribute("autostart", true);
				soundObject.setAttribute("loop", false);
				soundObject.style.position = "absolute";
				soundObject.style.left = "-1000px";
				soundObject.style.top = "-1000px";
				
				document.body.appendChild(soundObject);
				
				setTimeout(function() { Sound.stop(soundNumber); }, (duration*1000)+_removeDelayAppendage);
			}
			else if(_engineType=="flash")
			{
				soundObject = soundFileURL;
				soundManager.createSound({ id  : soundFileURL,
 										   url : soundFileURL + ".mp3" });
				soundManager.play(soundFileURL);
			}
			
			_objectsPlaying.push(soundObject);
			_internalCounter++;
		},
		
		stop : function(soundNumber)
		{
			if(_objectsPlaying.length<=soundNumber)
				return;
			
			if(_objectsPlaying[soundNumber]===null)
				return;
			var objectPlaying = _objectsPlaying[soundNumber];
				
			if(_engineType=="Audio")
				objectPlaying.stop();
			else if(_engineType=="flash")
				soundManager.stop(objectPlaying);
			else
				document.body.removeChild(objectPlaying);
			
			_objectsPlaying[soundNumber] = null;
		},
		
		stopAll : function()
		{
			if(_engineType=="flash")
			{
				soundManager.stopAll();
			}
			else
			{
				for(var i=0;i<_internalCounter;i++)
				{
					if(_objectsPlaying[i]===null)
						continue;
					
					Sound.stop(i);
				}
			}
		}
	};
})();
