/*
:: Script Information ::
Title       : JavaScript Player Core
Author      : livibetter
Created date: 02:53 9/27/2006
Updated date: 21:51 10/4/2006
Version     : 0.0.1.1
Credit      : 
License     : GNU Lesser General Public License
Copyright   : 2006 livibetter

:: Contact Information ::
eMail		: web@livibetter.com
MSN			: livibetter@gmail.com
Website		: http://www.livibetter.com
*/

// *********************
// QTP detection process
var haveqt = false;
// for IE
document.writeln('<script language="VBScript">');
document.writeln('	On Error Resume Next');
document.writeln('	Set theObject = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1")');
document.writeln('	On Error goto 0');
document.writeln('	If IsObject(theObject) Then');
document.writeln('		If theObject.IsQuickTimeAvailable(0) Then');
document.writeln('			haveqt = true');
document.writeln('			End If');
document.writeln('		End If');
document.writeln('<\/script>');
// non-IE
if(navigator.plugins){
	for(i=0; i<navigator.plugins.length; i++){
		if(navigator.plugins[i].name.indexOf("QuickTime")>=0){
			haveqt = true;
			}
		}
	}
if((navigator.appVersion.indexOf("Mac")>0) &&
	 (navigator.appName.substring(0,9)=="Microsoft") &&
	 (parseInt(navigator.appVersion)<5)){
	haveqt = true;
	}

// *********************
// WMP detection process
//Detect ActiveX Architecture on Both IE and on Gecko
//Defer to plugin architecture for other browsers
var wmpInfo = {
	installed: false,
	scriptable: false,
	type: null,
	versionInfo: null
	};
var wmp64 = "MediaPlayer.MediaPlayer.1";
var wmp7 = "WMPlayer.OCX.7";
if((window.ActiveXObject && navigator.userAgent.indexOf('Windows') != -1) || window.GeckoActiveXObject){
	wmpInfo.type = "ActiveX";
	var player = createActiveXObject(wmp7);
	if(player){
		wmpInfo.installed = true;
		wmpInfo.scriptable = true;
		wmpInfo.versionInfo = player.versionInfo;
		}
	else{
		player = createActiveXObject(wmp64);
		if(player){
			wmpInfo.installed = true;
			wmpInfo.scriptable = true;
			wmpInfo.versionInfo = "6.4";
			}
		else{
			wmpInfo.versionInfo = "none";
			}
		}
	}
else if(navigator.mimeTypes){
	wmpInfo.type = "NetscapePlugin";
	var player = navigator.mimeTypes['application/x-mplayer2'].enabledPlugin;
	if(player){
		wmpInfo.installed = true;
		//wmpInfo.scriptable = false;
		wmpInfo.versionInfo = "PluginVersion";
		}
	}
function createActiveXObject(id)
{
  var error;
  var control = null;

  try
  {
    if (window.ActiveXObject)
    {
      control = new ActiveXObject(id);
    }
    else if (window.GeckoActiveXObject)
    {
      control = new GeckoActiveXObject(id);
    }
  }
  catch (error)
  {
    ;
  }
  return control;
}

// ***********
// Main script
lb_JSPlayer_core_count = 0;
/*	Class: clb_JSPlayer_core
		Encapsulate WMP or QTP
	Parameters:
		sCore:
			"WMP"
				Using Windows Media Player.
			"QTP"
				Using QuickTime Player.
			Default "QTP"
		blankMP3URL:
			string
				The URL of blank MP3 file.
*/
function clb_JSPlayer_core(sCore, sBlankMP3URL){
	// ****************
	// Parameters Check
	switch(sCore){
		case "WMP":/*
			if(!(wmpInfo.installed && wmpInfo.scriptable)){
				alert("Unable to use Windows Media Player");
				return;
				}*/
			document.write("<object " +
								"classid='clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6' " +
								"id='lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core' width='0' height='0'>");
			document.write("<param name='uiMode' value='invisible' /><param name='autoStart' value='false' /></object>");
			this.corePlayer = document.getElementById("lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core");
			this.corePlayer.settings.enableErrorDialogs = false;	// TODO: Useless statement???
			// Hook Error Event
			document.write("<script for='lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core' event=error()>");
			document.write("document.getElementById('lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core').parent.error()");
			document.write("</script>");
			break;
		case "QTP":
		case null:
		case undefined:
			if(!haveqt){
				alert("Unable to use QuickTime Player");
				return;
				}
			document.write("<object " +
								"classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B' " +
								"codebase='http://www.apple.com/qtactivex/qtplugin.cab' " +
								"width='0' height='0' " +
								"id='lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core'>" +
								"<param name='src' value='" + sBlankMP3URL + "'>" +
								"<param name='autoplay' value='false'>" +
								"<embed src='" + sBlankMP3URL + "' " +
									"type='video/quicktime' " + 
									"pluginspage='www.apple.com/quicktime/download' " + 
									"width='0' height='0' " + 
									"controller='false' " +
									"autoplay='false' " +
									"enablejavascript='true' " +
									"name='lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core' />" +
								"</object>");		
			this.corePlayer = eval("document.lb_JSPlayer_" + lb_JSPlayer_core_count.toString() + "_core");
			break;
		default:
			alert("Wrong parameter sCore=" + sCore);
			return;
		}
	this.corePlayer.parent = this;
	// Increase counter
	lb_JSPlayer_core_count++;
	this.core = sCore;
	/*	Method: getState
		Return:
			"unload", "playing", "stopped", "paused", "loading", "error"
	*/
	this.getState = function(){
		switch(this.core){
			case 'WMP':
				if(this.corePlayer.error.errorCount>0){
					this.corePlayer.error.clearErrorQueue();
					return 'error';
					}
				switch(this.corePlayer.playState){
					case 0: // undefined
						return 'unload';
					case 1: // stopped
						if(this.corePlayer.controls.isAvailable('Play'))
							return 'stopped';
						else
							switch(this.corePlayer.openState){
								case 0:
								case 6:
								case 7:
								case 13:
									return 'unload';
								default:
									return 'loading';
								}
					case 8: // mediaended
					case 10:// ready
						return 'stopped';
					case 2: // paused
						return 'paused';
					case 6: // buffering
					case 7: // waiting
					case 9: // transitioning
					case 11:// reconnecting
						return 'loading';
					case 3:
						return 'playing';
					case 4:
					case 5:
					default:
						return 'error'
					}
				break;
			case 'QTP':
				try{
					if(this.corePlayer.GetRate()>0) // If play rate > 0, then it is playing
						return 'playing';
					else if(this.corePlayer.GetURL().indexOf('blank.mp3')>0)
						return 'unload';
					else
						switch(this.corePlayer.GetPluginStatus()){
							case 'Waiting':
							case 'Loading':
								return 'loading';
							case 'Playable':
							case 'Complete':
								if((this.corePlayer.GetTime() > 0) && (this.corePlayer.GetTime() != this.corePlayer.GetDuration()))
									return 'paused'; // 0 < time < duration
								else
									return 'stopped'; // time = 0 or time = duration
							default:
								return 'error';//this.corePlayer.GetPluginStatus();
							}
					}
				catch(e){
					return 'error';
					}
				break;
			}
		}
	/*
		Method: getPosition
		Return:
			Current position in seconds
	*/
	this.getPosition = function (){
		switch(this.core){
			case "WMP":
				// Windows Media Player returns a number in seconds.
				return this.corePlayer.controls.currentPosition;
				break;
			case "QTP":
				return this.corePlayer.GetTime() / this.corePlayer.GetTimeScale();
				break;
			}
		}
	/*	Method: playPause
			Play Audio or pause it.
	*/
	this.playPause = function (){
		switch(this.getState()){
			case "paused":
			case "stopped":
				switch(this.core){
					case "WMP":
						this.corePlayer.controls.play();
						break
					case "QTP":
						this.corePlayer.Play();
						break;
					}
				break;
			case "playing":
				switch(this.core){
					case "WMP":
						this.corePlayer.controls.pause();
						break
					case "QTP":
						this.corePlayer.Stop();
						break;
					}
				break;
			}
		}
	/*	Method: stop
			Stop Audio.
	*/
	this.stop = function (){
		switch(this.core){
			case "WMP":
				this.corePlayer.controls.stop();
				break;
			case "QTP":
				this.corePlayer.Stop();
				this.corePlayer.SetTime(0);
				break;
			}
		}
	/*	Method: loadAudio
			Load Audio from specific URL.
		Parameters:
			sAudioURL:
				string
					The URL of Audio file.
	*/
	this.loadAudio = function (sAudioURL){
		switch(this.core){
			case "WMP":
				//alert('lll');
				this.corePlayer.URL = sAudioURL;
				//this.corePlayer.controls.play();
				//this.corePlayer.newMedia(sAudioURL);
				//this.corePlayer.newPlaylist("pp1",sAudioURL);
				this.URL = sAudioURL;
				break;
			case "QTP":
				this.corePlayer.SetResetPropertiesOnReload(false);
				this.corePlayer.SetURL(sAudioURL);
				break;
			}
		}
	/*	Event: error
			Invoked when error
		Parameters:
	*/
	this.error = function (){
		if(this.corePlayer.error.errorCount>0){
			for(var i=0; i<this.corePlayer.error.errorCount; i++){
				var err = this.corePlayer.error.item(i);
				alert(err.errorDescription + err.errorCode);
				}
			//this.corePlayer.error.clearErrorQueue();
			}
		}
	}
