var __isFireFox = navigator.userAgent.match(/gecko/i);
//returns the absolute position of some element within document  
function getElementAbsolutePos(element) {
    var res = new Object();  
    res.x = 0; res.y = 0;  
    if (element !== null) {  
        res.x = element.offsetLeft;   
        res.y = element.offsetTop;   
          
        var offsetParent = element.offsetParent;  
        var parentNode = element.parentNode;  
  
        while (offsetParent !== null) {  
            res.x += offsetParent.offsetLeft;  
            res.y += offsetParent.offsetTop;  
  
            if (offsetParent != document.body && offsetParent != document.documentElement) {  
                res.x -= offsetParent.scrollLeft;  
                res.y -= offsetParent.scrollTop;  
            }  
            //next lines are necessary to support FireFox problem with offsetParent  
            if (__isFireFox) {  
                while (offsetParent != parentNode && parentNode !== null) {  
                    res.x -= parentNode.scrollLeft;  
                    res.y -= parentNode.scrollTop;  
                      
                    parentNode = parentNode.parentNode;  
                }      
            }  
            parentNode = offsetParent.parentNode;  
            offsetParent = offsetParent.offsetParent;  
        }  
    }  
    return res;  
}  

// loadSong() must be called after entire page has loaded.
function loadSong(_params,_btn) {
  try {
    if (pluginController.initAVX()) {
      loadSongController.withPlugin(_params,_btn);
    } else {
      loadSongController.withoutPlugin(_params,_btn);            
    } // if
  } catch(e) { pluginErr("loadSong",e); }
}

function flashPlayer_DoFSCommand(_cmnd,_args){     
    try {
	    playerControllerCmd.onFSCommand(_cmnd,_args);
	} catch(e) {pluginErr("flashPlayer_DoFSCommand", e);}
}

function logPlugin(_lg) {		
	try{
		document.getElementById("callbackFromPlugin").innerHTML += "<span style=\"color:#8C0003;\"><span style=\"font-size:9px;\">" + _lg + "</span><hr></hr></span>";		
	} catch(e) {}
}

function pluginErr(desc, e) {
    //alert(desc + ": " + e);
}

function OnStreamInProgressChange(lCurrentCount,lTotalCount,lStatus) {
  try {
    if (lStatus == -1) {
      alert("Song Download Failed.");
      lCurrentCount = lTotalCount = 0;
    } // if
    pluginController.dispatchEvent_OnStreamInProgressChange(lCurrentCount,lTotalCount,lStatus);
  } catch(e) {pluginErr("OnStreamInProgressChange", e);}
}
function OnRecordProgressChange(lCurrentCount,lTotalCount,lStatus) {
  try {
    pluginController.dispatchEvent_OnRecordProgressChange(lCurrentCount,lTotalCount,lStatus);
  } catch(e) {pluginErr("OnRecordProgressChange", e);}
}
function OnPlayProgressChange(lCurrentCount,lTotalCount,lStatus) {
  try {
    pluginController.dispatchEvent_OnPlayProgressChange(lCurrentCount,lTotalCount,lStatus);
  } catch(e) {pluginErr("OnPlayProgressChange", e);}
}
function OnAudioSignalChange(bstrSignalData) {
  try {    
    pluginController.dispatchEvent_OnAudioSignalChange(bstrSignalData);
  } catch(e) {pluginErr("OnAudioSignalChange", e);}
}
function OnWindowCreated() {
  // Left empty intentionally. Called by plugin: for debug only.
}
function OnUploadProgressChange(lCurrentCount,lTotalCount,lStatus) {
  try {
    pluginController.dispatchEvent_OnUploadProgressChange(lCurrentCount,lTotalCount,lStatus);
  } catch(e) {pluginErr("OnUploadProgressChange", e);}
}

function OnMixerChange() {
  try {	
	logPlugin("OnMixerChange Called");
			
	//GET RECORD VOLUME
	pluginController.getOnMixerChangeRecordVolumeSlider();

	//GET MONITOR VOLUME
	pluginController.getOnMixerChangeMonitorVolumeSlider();
			
	//GET MIC BOOST
	pluginController.getOnMixerChangeMicBoostValue();

	//GET MONITOR MUTE
	pluginController.getOnMixerChangeMonitorMuteValue();

	//GET AUDIO CAPTURE DEVICE ID
	pluginController.getOnMixerChangeAudioInDeviceIndex();
	
  } catch(e) { pluginErr("OnMixerChange",e); }
}
//***********************************************************		


function OnDeviceChange(lChangeInfoBits) {
	logPlugin("OnDeviceChange Called");
	
	/*
	var num = AVControl.lNumVideoDevices;
	var arr = "";
	for (var i=0; i < num; i++) {
		arr += ((arr.length != 0) ? "," : "" ) + AVControl.sVideoDeviceName(i);
	}
	
	playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_CAMERA_TYPES,arr);
	*/

	if (lChangeInfoBits){
	
	  var ODC_LIST_CHANGED=1<<0;      // The list has changed: should always be set if you receive this event.
    var ODC_LOST_AUDIO_DEVICE=1<<1; // Lost current audio in device
    var ODC_LOST_VIDEO_DEVICE=1<<2; // Lost current video device
    var ODC_ADDED_AUDIO_DEVICE=1<<3;
    var ODC_ADDED_VIDEO_DEVICE=1<<4;
    var ODC_AUDIO_DEVICE_INIT_FAILED=1<<5;
    var ODC_VIDEO_DEVICE_INIT_FAILED=1<<6;       

		if (lChangeInfoBits & ODC_LOST_AUDIO_DEVICE){
			//SEND A FLAG TO THE FLASH PLAYER TO LET IT KNOW THAT A DEVICE HAS BEEN PLUGGED/UNPLUGGED
			AVControl.bDocked = true;
			AVControl.style.width = "1px";
			AVControl.style.height = "1px";
			pluginController.onCaptureDeviceUnplugged();
			//alert("audio capture device unplugged");
		}

		if (lChangeInfoBits & ODC_LOST_VIDEO_DEVICE){
			//SEND A FLAG TO THE FLASH PLAYER TO LET IT KNOW THAT A DEVICE HAS BEEN PLUGGED/UNPLUGGED
			AVControl.bDocked = true;
			AVControl.style.width = "1px";
			AVControl.style.height = "1px";
			pluginController.onCaptureDeviceUnplugged();
			//alert("Your video capture device has been lost.  Please reconnect and try again");
		}			

    if (lChangeInfoBits & (ODC_ADDED_AUDIO_DEVICE|ODC_ADDED_VIDEO_DEVICE)) {
      if (pluginController.currentPluginState == pluginController.PS_STOP) {
        pluginController.initPlugin();
      } else {
        pluginController.bResetCaptureDevicesOnStop = true;
      } // if
    } // if
    
		if (lChangeInfoBits & ODC_AUDIO_DEVICE_INIT_FAILED) {
			alert("Your recording device failed to initialize");
		}

		if (lChangeInfoBits & ODC_VIDEO_DEVICE_INIT_FAILED) {
			AVControl.bDocked = true;
			AVControl.style.width = "1px";
			AVControl.style.height = "1px";
			playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_VIDEO_INITIALIZATION_ERROR, "videoInitError");
			//alert("Your video device failed to initialize");
		}
    
		if (lChangeInfoBits & ODC_LIST_CHANGED){ // When only the low bit is set, just refresh the UI lists.
			//GET AUDIO CAPTURE DEVICE ID
			pluginController.getAudioInDeviceFromDeviceChange();
			
			//GET VIDEO CAPTURE DEVICE ID
			pluginController.getVideoInDeviceFromDeviceChange();
			
			//SEND BACK THE LIST OF MICROPHONES AVAILABLE
			pluginController.sendAvaliableMicrophonesBack();
	
			//SEND BACK THE LIST OF CAMERAS AVAILABLE
			pluginController.sendAvailableCamerasBack();
		}	
	}
}

function OnDockChange(bIsDocked) {
// <TODO> Add new code.
}

var playerControllerCmd = {
  MESSAGE_EXTENSION_STATE : "extensionState",
	MESSAGE_PARAMETER_EXTENSION_STATE_LOADED : "LOADED",
	MESSAGE_PARAMETER_EXTENSION_STATE_NOT_LOADED : "",
	
	MESSAGE_PARAMETERS_FROM_CLIENT : "paramsFromClients",
	MESSAGE_JAVASCRIPT_LOAD_SONG : "javascriptLoadSong",
	MESSAGE_SELECTED_GREETINGCARD_FOR_INITIATION : "selectedGreetingCardForDisplayForUser",
	MESSAGE_SELECTED_BUTTON_FOR_INITIATION : "slctdbtn",
	MESSAGE_INITIATE_NEW_SONG : "initiateNewSong",
	MESSAGE_JOINED_FOR_RATE_PARAMETERS : "jfrParameters",
	
	MESSAGE_IS_FSCOMMAND_INITIATED : "isFscommandReady",
	MESSAGE_INITIATE_PLAYER : "initPlayerRequestFromJavascript",
	
	MESSAGE_PLUGIN_VERSION : "pluginVersionFromJavascript",
	MESSAGE_PLUGIN_VIDEO_DEVICE_COUNT : "pluginVideoDeviceCountFromJavascript",
	MESSAGE_PLUGIN_STATE : "pluginStateFromJavascript",
	MESSAGE_PARAMETER_PLUGIN_STATE_LOADED : "loaded",
	MESSAGE_PARAMETER_PLUGIN_STATE_NO_PLUGIN : "dead",
	
	MESSAGE_PLUGIN_NEW_STATE_RECORDER_PLAYER : "commandsFromMixerRecorderAndPlayer",
	MESSAGE_PLUGIN_NEW_STATE_VOLUMES : "commandsFromMixerVolumes",
	MESSAGE_PLUGIN_NEW_STATE_UPLOADER : "commandsFromMixerUploader",
	MESSAGE_PLUGIN_PLUGIN_EVENT : "commandsFromMixer",
	MESSAGE_PLUGIN_TIMING_EVENT : "timingfromPlugin",
	MESSAGE_PLUGIN_EQ_EVENT : "eqfromPlugin",
	MESSAGE_PLUGIN_DOWNLOAD_PROGRESS : "donwloadprgrsFromPlugin",
	MESSAGE_PLUGIN_SONG_LENGTH : "pluginSongLength",
	MESSAGE_SHOW_FEEDBACK_WINDOW : "showFeedbackWindowRequest",

	
	MESSAGE_PLUGIN_MICROPHONE_TYPES : "avaliableMicrophonesList",
	
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_VOLUMES_MIC_VOL : "volumes.set.mic.",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_VOLUMES_MIC_MUTE : "volumes.mute.mic.",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_PROGRESS : "upload.progress.",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_DONE : "upload.done.",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_FAILED : "upload.failed",
	
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_PLAY : "player.play",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_STOP : "player.stop",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_RECORD : "player.record",
	MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_PAUSE : "player.pause",
	
	MESSAGE_PARAMETER_PLUGIN_PLUGIN_EVENT_ERROR_NODEVICE : "errors.nodevice",
	MESSAGE_PARAMETER_PLUGIN_GET_SELECTED_DEVICE : "returnedCaptureDeviceId",
	
	//********VIDEO CODE***********
	MESSAGE_PARAMETER_PLUGIN_GET_CAPTURE_MODE : "returnedCaptureMode",
	MESSAGE_PARAMETER_PLUGIN_VIDEO_INITIALIZATION_ERROR : "returnedVideoInitializationFailed",
	MESSAGE_PLUGIN_CAMERA_TYPES : "returnedCamerasList",
	MESSAGE_PLUGIN_CAMERA_COUNT : "returnedCameraCount",
	MESSAGE_PARAMETER_PLUGIN_GET_SELECTED_VIDEO_DEVICE : "returnedVideoInDeviceIndex",
	MESSAGE_PARAMETER_PLUGIN_GET_IS_CAPTURE_RES_SUPPORTED : "returnedIsCaptureResSupported",
	
	//SET A FLAG WHEN THE USER PLUGS OR UNPLUGS AN AUDIO/VIDEO DEVICE
	MESSAGE_PARAMETER_AUDIO_VIDEO_DEVICE_CHANGED : "returnedAudioVideoDevicePluggedUnpluggedFlag",
	
	//OnMixerChange
	AUDIO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_MIXER_CHANGE : "updateAudioCaptureDeviceIDOnMixerChange",
	VIDEO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_MIXER_CHANGE : "updateVideoCaptureDeviceIDOnMixerChange",
	
	//OnDeviceChange
	AUDIO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_DEVICE_CHANGE : "updateAudioCaptureDeviceIDOnDeviceChange",
	VIDEO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_DEVICE_CHANGE : "updateVideoCaptureDeviceIDOnDeviceChange",
	//*********************************
	
	MESSAGE_PARAMETER_PLUGIN_GET_VIDEO_DEVICE_INDEX : "returnedVideoDeviceIndex",
	MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_IN_DEVICE_INDEX : "returnedAudioInDeviceIndex",
	MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_OUT_DEVICE_INDEX : "returnedAudioOutDeviceIndex",
	MESSAGE_PARAMETER_PLUGIN_GET_MUSIC_MIX_LEVEL : "returnedMusicMixLevel",
	MESSAGE_PARAMETER_PLUGIN_GET_MIC_MIX_LEVEL : "returnedMicMixLevel",
	MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_CLIP_TYPE : "returnedAudioClipType",
	MESSAGE_PARAMETER_PLUGIN_GET_VIDEO_SYNC_MODE : "returnedVideoSyncMode",
	//MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_LATENCY : "returnedAudioLatency",
	MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_VOLUME : "returnedMonitorVolume",
	MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_MUTE : "returnedMonitorMute",

	MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_MUTE_AVAILABLE : "returnedMonitorMuteAvailable",
	MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME_AVAILABLE : "returnedMasterVolumeAvailable",
	MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_VOLUME_AVAILABLE : "returnedMonitorVolumeAvailable",
	MESSAGE_PARAMETER_PLUGIN_GET_RECORD_VOLUME_AVAILABLE : "returnedRecordVolumeAvailable",
	MESSAGE_PARAMETER_PLUGIN_GET_MASTER_MUTE_AVAILABLE : "returnedMasterMuteAvailable",
	MESSAGE_PARAMETER_PLUGIN_GET_MIC_BOOST_AVAILABLE : "returnedMicBoostAvailable",

	MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_PREFERENCE : "returnedMonitorPreference",
	MESSAGE_PARAMETER_PLUGIN_GET_RECORD_VOLUME : "returnedRecordVolume",
	MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME : "returnedMasterVolume",
	MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME_MUTE : "returnedMasterVolumeMute",
	MESSAGE_PARAMETER_PLUGIN_GET_MIC_MUTE : "returnedMicMute",
	MESSAGE_PARAMETER_PLUGIN_GET_NOTIFIER_VALUE : "returnedNotifierValue",
	MESSAGE_PARAMETER_PLUGIN_GET_RESTORE_NOTIFIER_VALUE : "returnedRestoreNotifierValue",
	MESSAGE_PARAMETER_PLUGIN_GET_MIC_BOOST : "returnedMicBoost",
	
	//AUDIO EFFECTS
	MESSAGE_PARAMETER_LOAD_AUDIO_EFFECT_PRESETS : "returnedPresetListItem",
	MESSAGE_PARAMETER_LOAD_SELECTED_AUDIO_EFFECT_PRESETS : "returnedSelectedAudioEffectPreset",
	MESSAGE_PARAMETER_LOAD_SELECTED_AUDIO_EFFECT_PRESETS_COMPLETED : "returnedSelectedAudioEffectPresetCompleted",

	MASTER_VOLUME_SLIDER_VALUE : "updateMasterVolumeSlider",
	MONITOR_VOLUME_SLIDER_VALUE : "updateMonitorVolumeSlider",
	MICROPHONE_VOLUME_SLIDER_VALUE : "updateMicrophoneVolumeSlider",
	MASTER_VOLUME_MUTE_VALUE : "updateMasterMuteCheckBox",
	MIC_BOOST_MUTE_VALUE : "updateMicBoostMuteCheckBox",
	MONITOR_MUTE_VALUE : "updateMonitorMuteCheckBox",
	CAPTURE_DEVICE_ID : "updateAudioCaptureDeviceID",
	
	//SET THE SPONSOR LOGO
	MESSAGE_PARAMETER_RETURNED_SPONSOR_LOGO_PATH: "returnedSponsorLogoPath",
	
	//START A SONG CHAIN FLAG - WILL BE CALLED WHEN THE USER WANTS TO CREATE
	//A SONG CHAIN FROM AN HTML PAGE
	MESSAGE_PARAMETER_START_SONG_CHAIN_MODE:"startSongChainModeFromHTML",
		
	//FSCOMMAND_GET_RECORD_VOLUME				: "getRecordVolume",
	//FSCOMMAND_GET_MASTER_VOLUME				: "getMasterVolume",
	//FSCOMMAND_GET_MIC_BOOST			 	: "sendBackBoostMode",
	
	//REQUEST THE SPONSOR LOGO
	FSCOMMAND_GET_SPONSOR_LOGO_PATH : "getSponsorLogoPath",
	FSCOMMAND_OPEN_PREVIEW_GREETING_CARD 	: "openPreviewGreeting",
	FSCOMMAND_ON_LYRICS_EVENT 				: "setLyrics",
	FSCOMMAND_OPEN_EXTENSION				: "openLargeWindow",
	FSCOMMAND_OPEN_VIDEO					: "openVideoWindow",
	FSCOMMAND_ON_EXTENSION_COMMAND 		: "extensionCommand",
	FSCOMMAND_CLOSE_PLAYER 				: "closePlayer",
	FSCOMMAND_LOAD_PLUGIN 					: "loadPlugin",
	FSCOMMAND_PLAYER_READY 				: "playerReady",
	FSCOMMAND_FSCOMMAND_READY 				: "fscommandReady",
	FSCOMMAND_GET_VOLUMES_STATES 			: "mixGetVolumesStates",
	FSCOMMAND_SET_CAPTURE_MODE				: "mixSetCapture",
	FSCOMMAND_START_DOWNLOAD 				: "mixStartDownload",
	FSCOMMAND_START_RECORDING 				: "mixStartRecording",
	FSCOMMAND_STOP_RECORDING 				: "mixStopRecording",
	FSCOMMAND_STOP_PLAYING 				: "mixStopPlaying",
	FSCOMMAND_PAUSE_PLAYING 				: "mixPausePlaying",
	FSCOMMAND_START_PLAYING 				: "mixStartPlaying",
	FSCOMMAND_START_PLAYING_STREAM 		: "mixStartPlayingStream",
	FSCOMMAND_SAVE_RECORDING 				: "mixSaveRecording",
	//FSCOMMAND_SAVE_RECORDING_FOR_SONG_CHAIN	: "mixSaveRecordingForSongChain",
	FSCOMMAND_SET_VOLUME_MONITOR			: "mixSetMonitorVolume",
	FSCOMMAND_SET_MONITOR_MUTE				: "mixSetMonitorMute",
	FSCOMMAND_GET_SOFTWARE_RECORD_MUTE : "mixGetMonitorMute", // <TODO> Rename Monitor to SoftwareRecord here and in Flash.
	FSCOMMAND_SET_MUSIC_KEY_CHANGE			: "mixSetMusicKeyChange",
	FSCOMMAND_SET_MIX_PROFILE				: "mixSetProfile",

	FSCOMMAND_GET_MASTER_VOLUME_AVAILABLE	: "mixGetMasterVolumeAvailable",
	FSCOMMAND_GET_MONITOR_VOLUME_AVAILABLE	: "mixGetMonitorVolumeAvailable",
	FSCOMMAND_GET_RECORD_VOLUME_AVAILABLE	: "mixGetRecordVolumeAvailable",
	FSCOMMAND_GET_MIC_BOOST_AVAILABLE		: "mixGetMicBoostAvailable",
	FSCOMMAND_GET_MASTER_MUTE_AVAILABLE	: "mixGetMasterMuteAvailable",
	FSCOMMAND_GET_MONITOR_MUTE_AVAILABLE	: "mixGetMonitorMuteAvailable",

	FSCOMMAND_SET_MONITOR_PREFERENCE		: "mixSetMonitorPreference",
	FSCOMMAND_SET_PLAY_MIC_THROUGH_SPEAKERS : "mixSetPlayMicThroughSpeakers",
	 
	FSCOMMAND_SET_VOLUME_MIC 				: "mixSetMicVolume",
	FSCOMMAND_SET_MIC_MIX_VOLUME 			: "mixSetMicMixVolume",
	FSCOMMAND_SET_MUTE_MIC 				: "mixSetMicMute",
	FSCOMMAND_SET_MUSIC_WAVE				: "mixSetWaveVolume",
	FSCOMMAND_SET_MASTER_VOLUME_MUTE		: "mixSetMasterVolumeMute",
	FSCOMMAND_SET_VOLUME_MASTER			: "mixSetVolume",
	FSCOMMAND_SET_AUDIO_CLIP_TYPE			: "mixSetAudioClipType",
	FSCOMMAND_SET_MIC_BOOST			 	: "mixSetMicBoost",
	FSCOMMAND_OPEN_SEND_SONG_TO_EMAIL 		: "openSendToEmail",
	FSCOMMAND_SAVE_SOUND_SETTING			: "saveSoundSettings",

	FSCOMMAND_SEND_MICROPHONES_LIST 		: "sendBackMicrophonesList",
	FSCOMMAND_SET_CAPTURE_DEVICE	 		: "setCaptureDevice",
	FSCOMMAND_GET_CAPTURE_DEVICE	 		: "sendBackSelectedDeviceId",

	FSCOMMAND_PLAYLIST_NEXT		 		: "playlistNextSong",
	FSCOMMAND_PLAYLIST_PREV		 		: "playlistPrevSong",
	
	//********VIDEO CODE***********
	FSCOMMAND_SEND_CAMERAS_LIST 		: "sendBackCamerasList",
	FSCOMMAND_GET_SELECTED_CAMERA_ID 	: "getVideoInDeviceIndex",
	FSCOMMAND_SET_VIDEO_CAPTURE_DEVICE	 : "setVideoInDeviceIndex",
	FSCOMMAND_DOCK_VIDEO_WINDOW	 	: "unDockVideoWindow",
	FSCOMMAND_SET_DOCKED_VIDEO_DIMENSIONS : "dockedVideoDimensions",
	FSCOMMAND_GET_CAMERA_COUNT : "getCameraCount",
	FSCOMMAND_GET_IS_CAPTURE_RES_SUPPORTED : "getIsCaptureResSupported",
	
	//********************************
	
	//RESTORING THE SOUND SETTINGS VALUES TO THEIR "SAVED" STATE
	FSCOMMAND_LOAD_SAVED_SOUND_SETTINGS	: "loadSavedSoundSettings",

	//AUDIO EFFECTS
	FSCOMMAND_LOAD_SELECTED_AUDIO_EFFECT_PRESETS	: "loadSelectedAudioEffectPresets",
	FSCOMMAND_LOAD_AUDIO_EFFECT_PRESETS	: "loadAudioEffectPresets",
	FSCOMMAND_ADD_AUDIO_EFFECT		 		: "addAudioEffect",
	FSCOMMAND_REMOVE_ALL_AUDIO_EFFECTS		: "removeAllAudioEffects",
	
	onFSCommand : function(command,args) {
		args = args.split(",");

		switch (command){			
			case this.FSCOMMAND_GET_SPONSOR_LOGO_PATH: // requests the sponsor's logo path
				getSponsorLogoPath(); // globalJavascript.js
				break;
			case this.FSCOMMAND_OPEN_PREVIEW_GREETING_CARD: // opens the popup with the greeting card
				openGreetingCard(args); // globalJavascript.js
				break;
			case this.FSCOMMAND_ON_LYRICS_EVENT: // sends the lyrics to the big screen
				onLyricsReceived(args);
				break;
			case this.FSCOMMAND_OPEN_EXTENSION:
				openPopupLargeExtensionWindow(args);
				break;
			case this.FSCOMMAND_OPEN_VIDEO:
				this.openVideoScreen();
				break;
			case this.FSCOMMAND_ON_EXTENSION_COMMAND:
				passActionToExtension(args);
				break;
			case this.FSCOMMAND_OPEN_SEND_SONG_TO_EMAIL:  // open send to email window
				openSendToEmail(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
				break;
			case this.FSCOMMAND_CLOSE_PLAYER: // close the player
				closePlayer();
				break;
			case this.FSCOMMAND_LOAD_PLUGIN: //this is now for loadSong
				//window.pluginController.loadPlugin();
				playerController.playerReadyTimer.stop();
				loadSong(songPlaylist[playerController.songId],playerController.btn);				
				break;
			case this.FSCOMMAND_PLAYER_READY: // called when player is initiated								
				break;
			case this.FSCOMMAND_FSCOMMAND_READY:
				//window.loadStatesMonitor.setLoadState(	window.loadStatesMonitor.LOAD_STATE_FSCOMMAND_READY,
				//										window.loadStatesMonitor.LOAD_STATE_LOADED);				
				break;
    } // switch

    if (pluginController.PLUGIN_INSTALLED) {       
		  switch (command) {	
			  case this.FSCOMMAND_GET_VOLUMES_STATES:
				  pluginController.dispatchState_micMute();
				  break;
			  case this.FSCOMMAND_SET_CAPTURE_MODE: // plugin control : set capture mode
				  pluginController.setCaptureMode(args);
				  break;
			  case this.FSCOMMAND_START_DOWNLOAD: // plugin control : start downloading song				
				  args = args + "";
				  if (args.indexOf("http://") != -1) {
					  args = args.substring(7,args.length);
				  } else if (args.indexOf("https://") != -1) {
					  args = args.substring(8,args.length);
				  }
  			
				  if (args.indexOf(".com") !=-1 ){
					  pluginController.startDownload(args.substring(0,args.indexOf(".com/")+4),
                                           args.substring(args.indexOf(".com/")+4,args.length));
				  } else {
					  pluginController.startDownload(args.substring(0,args.indexOf(".co.uk/")+6),
                                           args.substring(args.indexOf(".co.uk/")+6,args.length));
				  }
				  break;
			  case this.FSCOMMAND_START_RECORDING: // plugin control : start record
				  pluginController.record();
				  break;
			  case this.FSCOMMAND_STOP_RECORDING: // plugin control : stop record
				  pluginController.stop();
				  break;
			  case this.FSCOMMAND_STOP_PLAYING: // plugin control : start playing
				  pluginController.stop();
				  break;
			  case this.FSCOMMAND_PAUSE_PLAYING: // plugin control : pause playing
				  pluginController.pause();
				  break;
			  case this.FSCOMMAND_START_PLAYING:  // plugin control : stop playing
				  pluginController.play(args[0]);
				  break;
			  case this.FSCOMMAND_START_PLAYING_STREAM:  // plugin control : stop playing
				  pluginController.playStream(args[0]);
				  break;
			  case this.FSCOMMAND_SAVE_RECORDING:  // plugin control : save recording
				  pluginController.save(args[0] +""+ args[1] +""+ args[2] + "" + args[5] + "" + args[6],args[3],args[4],args[7], args[8], args[9], args[10], args[11], args[12], args[13]);
				  break;
			  /*
			  case this.FSCOMMAND_SAVE_RECORDING_FOR_SONG_CHAIN:
				  pluginController.saveForSongChain(args[0] +""+ args[1] +""+ args[2] + "" + args[5] + "" + args[6],args[3],args[4],args[7], args[8], args[9], args[10], args[11]);
				  break;
			  */
			  case this.FSCOMMAND_SET_VOLUME_MIC:  // plugin control : set microphone volume
				  pluginController.setMicVolume(args);
				  break;
			  case this.FSCOMMAND_SET_VOLUME_MONITOR:  // plugin control : set monitor volume
				  pluginController.setMonitorVolume(args);
				  break;
			  case this.FSCOMMAND_SET_MONITOR_MUTE:  // plugin control : set monitor mute
				  pluginController.setMonitorMute(args);
				  break;
			  case this.FSCOMMAND_GET_SOFTWARE_RECORD_MUTE:  // plugin control : get software record mute state.
				  pluginController.getSoftwareRecordMute(); // Not reading hardware monitor mute for this API call. Should rename Flash code as well.
				  break;
			  case this.FSCOMMAND_GET_MONITOR_MUTE_AVAILABLE:  // plugin control : check if monitor mute is available
				  pluginController.getMonitorMuteAvailable();
				  break;
			  case this.FSCOMMAND_SET_MUSIC_KEY_CHANGE:  // plugin control : set music key change
				  pluginController.setMusicKeyChange(args);
				  break;
			  case this.FSCOMMAND_GET_MASTER_VOLUME_AVAILABLE:  // plugin control : check if master volume is available
				  pluginController.getMasterVolumeAvailable();
				  break;
			  case this.FSCOMMAND_GET_MONITOR_VOLUME_AVAILABLE:  // plugin control : check if monitor volume is available
				  pluginController.getMonitorVolumeAvailable();
				  break;
			  case this.FSCOMMAND_GET_RECORD_VOLUME_AVAILABLE:  // plugin control : check if record volume is available
				  pluginController.getRecordVolumeAvailable();
				  break;
			  case this.FSCOMMAND_GET_MASTER_MUTE_AVAILABLE:  // plugin control : check if master mute is available
				  pluginController.getMasterMuteAvailable();
				  break;
			  case this.FSCOMMAND_GET_MIC_BOOST_AVAILABLE:  // plugin control : check if mic boost is available
				  pluginController.getMicBoostAvailable();
				  break;

			  case this.FSCOMMAND_SET_MONITOR_PREFERENCE:  // plugin control : set monitor mute
				  pluginController.setMonitorPreference(args);
				  break;
  				
        case this.FSCOMMAND_SET_PLAY_MIC_THROUGH_SPEAKERS:  // plugin control : set play mic through speakers value
				  pluginController.setPlayMicThroughSpeakers(args);
				  break;
  				
			  case this.FSCOMMAND_SET_MIC_MIX_VOLUME:  // plugin control : set micScale
				  pluginController.setMicMixVolume(args);
				  break;
			  case this.FSCOMMAND_SET_MUTE_MIC:  // plugin control : set microphone volume
				  pluginController.setMicMute(args);
				  break;
			  case this.FSCOMMAND_SET_VOLUME_MASTER:  // plugin control : set master volume				
				  pluginController.setMasterVolume(args);
				  break;
			  case this.FSCOMMAND_SET_AUDIO_CLIP_TYPE:  // plugin control : set audio clip type			
				  pluginController.setAudioClipType(args);
				  break;
			  case this.FSCOMMAND_SET_MASTER_VOLUME_MUTE:  // plugin control : set master volume mute			
				  pluginController.setMasterVolumeMute(args);
				  break;
			  case this.FSCOMMAND_SET_MUSIC_WAVE:  // plugin control : set master volume
				  pluginController.setMusicVolume(args);
				  break;
  				
			  case this.FSCOMMAND_GET_MIC_BOOST:  // plugin control : get mic boost
				  pluginController.getMicBoost();
				  break;
			  case this.FSCOMMAND_SET_MIC_BOOST:  // plugin control : set master volume
				  pluginController.setMicBoost(args[0]);
				  break;	
  				
			  case this.FSCOMMAND_SAVE_SOUND_SETTING:
				  pluginController.saveSettings();
				  break;
  				

			  case this.FSCOMMAND_SEND_MICROPHONES_LIST: // sends back a list of available microphones
				  pluginController.sendAvaliableMicrophonesBack();
				  break;
				  
				  
				//********VIDEO CODE***********
				case this.FSCOMMAND_SEND_CAMERAS_LIST: // sends back a list of available cameras
					pluginController.sendAvailableCamerasBack();
					break;
					
				case this.FSCOMMAND_GET_CAMERA_COUNT: // sends back the camera count
					pluginController.getCameraCount();
					break;
					
				case this.FSCOMMAND_GET_IS_CAPTURE_RES_SUPPORTED: // send back true or false if capture resolution is supported by the currently selected camera
				  pluginController.getIsCaptureResSupported(args[0],args[1]); // width,height
          break;
					
				case this.FSCOMMAND_GET_SELECTED_CAMERA_ID: // sends back the selected camera
					pluginController.getVideoInDeviceIndex();
					break;
					
				case this.FSCOMMAND_SET_VIDEO_CAPTURE_DEVICE: // sets the selected camera
					pluginController.setVideoInDeviceIndex(args[0]);
					break;

				case this.FSCOMMAND_DOCK_VIDEO_WINDOW: // docks or undocks the video window
					pluginController.unDockVideoWindow(args[0]);
					break;
					
				case this.FSCOMMAND_SET_DOCKED_VIDEO_DIMENSIONS: // sets the width and height for the docked window
					pluginController.setDockedVideoDimensions(args[0], args[1]);
					break;
				case this.FSCOMMAND_SET_MIX_PROFILE:  // plugin control : set video profile
					pluginController.setMixProfile(args);
					break;
				//***********************************
				
  				
			  case this.FSCOMMAND_SET_CAPTURE_DEVICE:
				  pluginController.setCaptureDevice(args[0]);
				  break;
  				
			  case this.FSCOMMAND_GET_CAPTURE_DEVICE: // sends back a list of available microphones
				  pluginController.getCaptureDevice();
				  break;

			  case this.FSCOMMAND_PLAYLIST_NEXT: 
				  //nextPlaylistSong();
				  break;
  				
			  case this.FSCOMMAND_PLAYLIST_PREV:
				  //previousPlaylistSong();
				  break;

			  case this.FSCOMMAND_LOAD_SAVED_SOUND_SETTINGS: //loads the plugin sound settings back to their saved state
				  pluginController.loadSavedSoundSettingsFromPlugin();
				  break;
  			
			  //AUDIO EFFECTS
			  case this.FSCOMMAND_LOAD_AUDIO_EFFECT_PRESETS: //Calls plugin to send back all audio effect presets
				  pluginController.loadAudioEffectPresets();
				  break;

			  case this.FSCOMMAND_LOAD_SELECTED_AUDIO_EFFECT_PRESETS: //Calls plugin to send back all selected audio effect presets
				  pluginController.loadSelectedAudioEffectPresets();
				  break;

			  case this.FSCOMMAND_ADD_AUDIO_EFFECT: //Calls plugin to add an audio effect
				  pluginController.addAudioEffect(args);
				  break;

			  case this.FSCOMMAND_REMOVE_ALL_AUDIO_EFFECTS: //Calls plugin to remove all audio effects
				  pluginController.removeAllAudioEffects();
				  break;
		  } // switch
    
    } // if   

		if (command != this.FSCOMMAND_ON_LYRICS_EVENT) {
			if (document.getElementById("traceOut")) {
				document.getElementById("traceOut").innerHTML += "<span style=\"color:#006600\"><span style=\"font-size:9px;\">FROM PLAYER - </span><strong>" + command + "</strong>(<strong>" + args + "</strong>)</span><hr></hr>";
			} // if
		} else {
			if (document.getElementById("lyricsOut")) {
				document.getElementById("lyricsOut").innerHTML = args;
			} // if
		} // if
	}
}

var playerController = {
  kSoloFlashPlayer : null,  
  songId : "0",
  btn : "0",    //0=PLAY, 1=RECORD
  playerReadyTimer : null,
  
  sendMessageToKaraokePlayer : function(_cmd,_arg) {
    try {
      //alert('cmd: '+_cmd);
      if (this.kSoloFlashPlayer == null) {
        this.kSoloFlashPlayer = document.getElementById("flashPlayer"); // Try to be fault tolerant.
        if (this.kSoloFlashPlayer == null) {
          return;
        } // if
      } // if
      this.kSoloFlashPlayer.SetVariable(_cmd,_arg);
      if (_cmd != "soundLevelSpect" &&
          _cmd != "micLevelSpect" && 
          _cmd != playerControllerCmd.MESSAGE_PLUGIN_EQ_EVENT &&
          _cmd != playerControllerCmd.MESSAGE_PLUGIN_DOWNLOAD_PROGRESS &&
          _cmd != playerControllerCmd.MESSAGE_PLUGIN_TIMING_EVENT &&
          document.getElementById("traceOut")) {
//        alert('cmd: '+_cmd);
        document.getElementById("traceOut").innerHTML += "<span style=\"color:#8C0003;\"><span style=\"font-size:9px;\">TO PLAYER - </span><strong>" + _cmd + "</strong>(<strong>" + _arg + "</strong>)<hr></hr></span>";						    	
      } // if
    } catch(e) { 
		//We're swallowing the error message - if the flash player is not installed, it causes an infinite loop
		//pluginErr("playerController.sendMessageToKaraokePlayer",e);
	}
  },
  
	showFeedbackWindow : function()
	{
		this.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SHOW_FEEDBACK_WINDOW,0);
		//alert("showFeedbackWindow");
	}
}

var pluginController = {        
  PLUGIN_INSTALLED : false,
  AVX_INIT_NOT_STARTED : 0,
  AVX_INIT_WINDOW_CREATED : 100,
  AVX_INIT_COMPLETE : 200,
  lastRequestedPlayback : "",
  lastSongLength : 0,
  PS_PLAY : 1,
  PS_STOP : 2,
  PS_REC  : 3,
  PS_PAUSE  : 4,
  CAPTURE_VIDEO : 1,
  CAPTURE_AUDIO : 0,

  PROFILE_160_15 : 0,
  PROFILE_320_15 : 1,
  PROFILE_320_30 : 2,
  PROFILE_640    : 3,
  PROFILE_800    : 4,
  PROFILE_960    : 5,

  PROFILE_CURRENT : 1, // 320@15
  
//  profile320 : "<profile version=\"589824\" storageformat=\"1\" name=\"AVX AVC 320\" description=\"\"> <streamconfig majortype=\"{73647561-0000-0010-8000-00AA00389B71}\" streamnumber=\"1\" streamname=\"Audio Stream\" inputname=\"Audio409\" bitrate=\"96040\" bufferwindow=\"-1\" reliabletransport=\"0\" decodercomplexity=\"\" rfc1766langid=\"en-us\"> <wmmediatype subtype=\"{00000161-0000-0010-8000-00AA00389B71}\" bfixedsizesamples=\"1\" btemporalcompression=\"0\" lsamplesize=\"2230\"> <waveformatex wFormatTag=\"353\" nChannels=\"2\" nSamplesPerSec=\"44100\" nAvgBytesPerSec=\"12005\" nBlockAlign=\"2230\" wBitsPerSample=\"16\" codecdata=\"008800000F0000000000\"/> </wmmediatype></streamconfig><streamconfig majortype=\"{73646976-0000-0010-8000-00AA00389B71}\" streamnumber=\"2\" streamname=\"Video Stream\" inputname=\"Video409\" bitrate=\"400000\" bufferwindow=\"-1\" reliabletransport=\"0\" decodercomplexity=\"AU\" rfc1766langid=\"en-us\"> <videomediaprops maxkeyframespacing=\"40000000\" quality=\"50\"/>  <wmmediatype subtype=\"{32564D57-0000-0010-8000-00AA00389B71}\" bfixedsizesamples=\"0\" btemporalcompression=\"1\" lsamplesize=\"0\"> <videoinfoheader dwbitrate=\"400000\" dwbiterrorrate=\"0\" avgtimeperframe=\"333333\"> <rcsource left=\"0\" top=\"0\" right=\"320\" bottom=\"240\"/> <rctarget left=\"0\" top=\"0\" right=\"320\" bottom=\"240\"/> <bitmapinfoheader biwidth=\"320\" biheight=\"240\" biplanes=\"1\" bibitcount=\"24\" bicompression=\"WMV2\" bisizeimage=\"0\" bixpelspermeter=\"0\" biypelspermeter=\"0\" biclrused=\"0\" biclrimportant=\"0\"/> </videoinfoheader></wmmediatype></streamconfig></profile>",
//  profile640 : "<profile version=\"589824\" storageformat=\"1\" name=\"AVX AVC 640\" description=\"\"> <streamconfig majortype=\"{73647561-0000-0010-8000-00AA00389B71}\" streamnumber=\"1\" streamname=\"Audio Stream\" inputname=\"Audio409\" bitrate=\"96040\" bufferwindow=\"-1\" reliabletransport=\"0\" decodercomplexity=\"\" rfc1766langid=\"en-us\"> <wmmediatype subtype=\"{00000161-0000-0010-8000-00AA00389B71}\" bfixedsizesamples=\"1\" btemporalcompression=\"0\" lsamplesize=\"2230\"> <waveformatex wFormatTag=\"353\" nChannels=\"2\" nSamplesPerSec=\"44100\" nAvgBytesPerSec=\"12005\" nBlockAlign=\"2230\" wBitsPerSample=\"16\" codecdata=\"008800000F0000000000\"/> </wmmediatype></streamconfig><streamconfig majortype=\"{73646976-0000-0010-8000-00AA00389B71}\" streamnumber=\"2\" streamname=\"Video Stream\" inputname=\"Video409\" bitrate=\"700000\" bufferwindow=\"-1\" reliabletransport=\"0\" decodercomplexity=\"AU\" rfc1766langid=\"en-us\"> <videomediaprops maxkeyframespacing=\"80000000\" quality=\"50\"/>  <wmmediatype subtype=\"{32564D57-0000-0010-8000-00AA00389B71}\" bfixedsizesamples=\"0\" btemporalcompression=\"1\" lsamplesize=\"0\"> <videoinfoheader dwbitrate=\"700000\" dwbiterrorrate=\"0\" avgtimeperframe=\"333333\"> <rcsource left=\"0\" top=\"0\" right=\"640\" bottom=\"480\"/> <rctarget left=\"0\" top=\"0\" right=\"640\" bottom=\"480\"/> <bitmapinfoheader biwidth=\"640\" biheight=\"480\" biplanes=\"1\" bibitcount=\"24\" bicompression=\"WMV2\" bisizeimage=\"0\" bixpelspermeter=\"0\" biypelspermeter=\"0\" biclrused=\"0\" biclrimportant=\"0\"/> </videoinfoheader></wmmediatype></streamconfig></profile>",
  profile160_15 : '<profile version="589824" storageformat="1" name="160x120@15" description=""> <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio409" bitrate="128040" bufferwindow="5000" reliabletransport="0" decodercomplexity="" rfc1766langid="en-us" > <wmmediatype subtype="{00000161-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="1" btemporalcompression="0" lsamplesize="2973"> <waveformatex wFormatTag="353" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="16005" nBlockAlign="2973" wBitsPerSample="16" codecdata="008800000F0000000000"/> </wmmediatype></streamconfig><streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video409" bitrate="200000" bufferwindow="5000" reliabletransport="0" decodercomplexity="AU" rfc1766langid="en-us" > <videomediaprops maxkeyframespacing="60000000" quality="50"/> <wmmediatype subtype="{32564D57-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="0" btemporalcompression="1" lsamplesize="0"> <videoinfoheader dwbitrate="200000" dwbiterrorrate="0" avgtimeperframe="666666"> <rcsource left="0" top="0" right="160" bottom="120"/> <rctarget left="0" top="0" right="160" bottom="120"/> <bitmapinfoheader biwidth="160" biheight="120" biplanes="1" bibitcount="24" bicompression="WMV2" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0"/> </videoinfoheader></wmmediatype></streamconfig></profile>',
  profile320_15 : '<profile version="589824" storageformat="1" name="320x240@15" description=""> <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio409" bitrate="128040" bufferwindow="5000" reliabletransport="0" decodercomplexity="" rfc1766langid="en-us" > <wmmediatype subtype="{00000161-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="1" btemporalcompression="0" lsamplesize="2973"> <waveformatex wFormatTag="353" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="16005" nBlockAlign="2973" wBitsPerSample="16" codecdata="008800000F0000000000"/> </wmmediatype></streamconfig><streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video409" bitrate="400000" bufferwindow="5000" reliabletransport="0" decodercomplexity="AU" rfc1766langid="en-us" > <videomediaprops maxkeyframespacing="60000000" quality="70"/> <wmmediatype subtype="{32564D57-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="0" btemporalcompression="1" lsamplesize="0"> <videoinfoheader dwbitrate="400000" dwbiterrorrate="0" avgtimeperframe="666666"> <rcsource left="0" top="0" right="320" bottom="240"/> <rctarget left="0" top="0" right="320" bottom="240"/> <bitmapinfoheader biwidth="320" biheight="240" biplanes="1" bibitcount="24" bicompression="WMV2" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0"/> </videoinfoheader></wmmediatype></streamconfig></profile>',
  profile320_30 : '<profile version="589824" storageformat="1" name="320x240@30" description=""> <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio409" bitrate="128040" bufferwindow="5000" reliabletransport="0" decodercomplexity="" rfc1766langid="en-us" > <wmmediatype subtype="{00000161-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="1" btemporalcompression="0" lsamplesize="2973"> <waveformatex wFormatTag="353" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="16005" nBlockAlign="2973" wBitsPerSample="16" codecdata="008800000F0000000000"/> </wmmediatype></streamconfig><streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video409" bitrate="400000" bufferwindow="5000" reliabletransport="0" decodercomplexity="CP" rfc1766langid="en-us" > <videomediaprops maxkeyframespacing="60000000" quality="100"/> <wmmediatype subtype="{32564D57-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="0" btemporalcompression="1" lsamplesize="0"> <videoinfoheader dwbitrate="400000" dwbiterrorrate="0" avgtimeperframe="333333"> <rcsource left="0" top="0" right="320" bottom="240"/> <rctarget left="0" top="0" right="320" bottom="240"/> <bitmapinfoheader biwidth="320" biheight="240" biplanes="1" bibitcount="24" bicompression="WMV2" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0"/> </videoinfoheader></wmmediatype></streamconfig></profile>',
  profile640 : '<profile version="589824" storageformat="1" name="640x480" description=""> <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio409" bitrate="128040" bufferwindow="5000" reliabletransport="0" decodercomplexity="" rfc1766langid="en-us" > <wmmediatype subtype="{00000161-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="1" btemporalcompression="0" lsamplesize="2973"> <waveformatex wFormatTag="353" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="16005" nBlockAlign="2973" wBitsPerSample="16" codecdata="008800000F0000000000"/> </wmmediatype></streamconfig><streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video409" bitrate="700000" bufferwindow="5000" reliabletransport="0" decodercomplexity="CP" rfc1766langid="en-us" > <videomediaprops maxkeyframespacing="60000000" quality="100"/> <wmmediatype subtype="{32564D57-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="0" btemporalcompression="1" lsamplesize="0"> <videoinfoheader dwbitrate="700000" dwbiterrorrate="0" avgtimeperframe="333333"> <rcsource left="0" top="0" right="640" bottom="480"/> <rctarget left="0" top="0" right="640" bottom="480"/> <bitmapinfoheader biwidth="640" biheight="480" biplanes="1" bibitcount="24" bicompression="WMV2" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0"/> </videoinfoheader></wmmediatype></streamconfig></profile>', 
  profile800 : '<profile version="589824" storageformat="1" name="800x600" description=""> <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio409" bitrate="128040" bufferwindow="5000" reliabletransport="0" decodercomplexity="" rfc1766langid="en-us" > <wmmediatype subtype="{00000161-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="1" btemporalcompression="0" lsamplesize="2973"> <waveformatex wFormatTag="353" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="16005" nBlockAlign="2973" wBitsPerSample="16" codecdata="008800000F0000000000"/> </wmmediatype></streamconfig><streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video409" bitrate="900000" bufferwindow="5000" reliabletransport="0" decodercomplexity="CP" rfc1766langid="en-us" > <videomediaprops maxkeyframespacing="60000000" quality="100"/> <wmmediatype subtype="{32564D57-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="0" btemporalcompression="1" lsamplesize="0"> <videoinfoheader dwbitrate="900000" dwbiterrorrate="0" avgtimeperframe="333333"> <rcsource left="0" top="0" right="800" bottom="600"/> <rctarget left="0" top="0" right="800" bottom="600"/> <bitmapinfoheader biwidth="800" biheight="600" biplanes="1" bibitcount="24" bicompression="WMV2" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0"/> </videoinfoheader></wmmediatype></streamconfig></profile>',
  profile960 : '<profile version="589824" storageformat="1" name="960x720" description=""> <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio409" bitrate="128040" bufferwindow="5000" reliabletransport="0" decodercomplexity="" rfc1766langid="en-us" > <wmmediatype subtype="{00000161-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="1" btemporalcompression="0" lsamplesize="2973"> <waveformatex wFormatTag="353" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="16005" nBlockAlign="2973" wBitsPerSample="16" codecdata="008800000F0000000000"/> </wmmediatype></streamconfig><streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video409" bitrate="1200000" bufferwindow="5000" reliabletransport="0" decodercomplexity="CP" rfc1766langid="en-us" > <videomediaprops maxkeyframespacing="60000000" quality="100"/> <wmmediatype subtype="{32564D57-0000-0010-8000-00AA00389B71}"  bfixedsizesamples="0" btemporalcompression="1" lsamplesize="0"> <videoinfoheader dwbitrate="1200000" dwbiterrorrate="0" avgtimeperframe="333333"> <rcsource left="0" top="0" right="960" bottom="720"/> <rctarget left="0" top="0" right="960" bottom="720"/> <bitmapinfoheader biwidth="960" biheight="720" biplanes="1" bibitcount="24" bicompression="WMV2" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0"/> </videoinfoheader></wmmediatype></streamconfig></profile>',
  
  bPlayActive : false,
  bResetCaptureDevicesOnStop : false,

  currentPluginState : this.PS_STOP,

  PROGRESS_STATUS_OK    :  0,
  PROGRESS_STATUS_DONE  :  1,
  PROGRESS_STATUS_ERROR : -1,

	addPluginToPage : function() {
	  try {
      if (navigator.userAgent.toLowerCase().indexOf("ie") != -1) {
        // Internet Explorer
        //document.writeln('<div id="ieVidDiv" style="position:absolute;z-index:10;left:5;top:206;" > ');
        document.writeln('<OBJECT style="width:1px;height:1px;position:absolute;z-index:-1;left:8px;top:5px;" ID="AVControl" CLASSID=CLSID:17C6F032-F383-4B69-BE00-23327184FD85 VIEWASTEXT></OBJECT>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnDeviceChange(lChangeInfoBits)">OnDeviceChange(lChangeInfoBits);</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnDockChange(bIsDocked)">OnDockChange(bIsDocked);</script>');               
        document.writeln('<script type="text/javascript" for="AVControl" event="OnStreamInProgressChange(lCurrentCount,lTotalCount,lStatus)">OnStreamInProgressChange(lCurrentCount,lTotalCount,lStatus);</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnRecordProgressChange(lCurrentCount,lTotalCount,lStatus)">OnRecordProgressChange(lCurrentCount,lTotalCount,lStatus);</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnPlayProgressChange(lCurrentCount,lTotalCount,lStatus)">OnPlayProgressChange(lCurrentCount,lTotalCount,lStatus);</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnUploadProgressChange(lCurrentCount,lTotalCount,lStatus)">OnUploadProgressChange(lCurrentCount,lTotalCount,lStatus);</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnAudioSignalChange(bstrSignalData)">OnAudioSignalChange(bstrSignalData);</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnMixerChange()">OnMixerChange();</script>');
        document.writeln('<script type="text/javascript" for="AVControl" event="OnWindowCreated()">OnWindowCreated();</script>');

        document.writeln('<SCRIPT LANGUAGE=VBScript\> \n');
        document.writeln('on error resume next \n');
        document.writeln('Sub flashPlayer_FSCommand(ByVal command, ByVal args)\n');
        document.writeln('  call flashPlayer_doFSCommand(command, args)\n');
        document.writeln('end sub\n');
        document.writeln('</' + 'SCRIPT\> \n');
        //document.writeln('</div>');
   			//var pos = getElementAbsolutePos($('leftCol'));  
   			//var viddiv = $('AVControl');
   			//viddiv.style.zIndex = 5;
   			//viddiv.style.top = 125;
   			//viddiv.style.left = pos.x;
      } else {
        // FireFox
        for (var x = 0 ; x < navigator.plugins.length ; x++) {
          if (navigator.plugins[x].name.toLowerCase().indexOf("ksolo") != -1) {
   			var pos = getElementAbsolutePos($('playerTopHeaderImg'));  
   			var viddiv = $('vidDiv');
   			viddiv.style.zIndex = 5;
   			viddiv.style.top = pos.y;
   			viddiv.style.left = pos.x;
   			viddiv.innerHTML = '<EMBED style="width:1px;height:1px" ID="AVControlFF" TYPE="application/x-avx" />';
            AVControl = document.getElementById('AVControlFF');
            break;
          } // if
        } // for
      } // if
        
    } catch(e) { pluginErr("pluginController.addPluginToPage",e); }
  },
	   
  // Must be called after entire page loads.    
  initAVX : function() {
    try {                 
      if (AVControl.GetInitState() < this.AVX_INIT_WINDOW_CREATED) {
        this.PLUGIN_INSTALLED = false;
//        alert('AVX Failed to Initialize Window'); // <TODO> Re-enable this error message when Phong's change for addPluginToPage() have been implemented.
        return false;
      } // if
      this.PLUGIN_INSTALLED = true;
      return true;
    } catch(e) {
      this.PLUGIN_INSTALLED = false;
      return false;
    } // try
  },   
  
  // Call this function only after entire page loads.
  init : function() {
    try {
      playerController.kSoloFlashPlayer = document.getElementById("flashPlayer");
      //this.addPluginToPage(); // <TODO> Remove and call from HTML page to place in the correct location on the page. 
      this.initAVX();
    } catch(e) { pluginErr("pluginController.init",e); }
  },

  initPlugin : function() {
    try {
      logPlugin("bUseVMR = false");
      AVControl.bUseVMR = false;
      logPlugin("Init");
      try {     
        this.setMixProfile(this.PROFILE_CURRENT);
//        AVControl.SetAVCProfile(this.profile320);//document.getElementById("DivAVCProfile320").innerHTML.replace(/\[/g,"<").replace(/\]/g,">"));               	
//        pluginController.setCaptureMode(pluginController.CAPTURE_AUDIO);
        AVControl.Init();
      } catch(e) {
        if (AVControl.lCaptureMode == this.CAPTURE_AUDIO) {
          alert("kSolo Recorder Microphone init failed. Please try another microphone.");
        } else if (AVControl.lCaptureMode == this.CAPTURE_VIDEO) {
          alert("kSolo Recorder Camera init failed.");
        } else {
          pluginErr("AVControl.Init",e);
        }
      }		    			
      //pluginController.dispatchEvent_onMicVolume(Math.round(Math.max(Math.min(100, AVControl.fMonitorVolume),0)*100));
      this.loadSoundSettingsFromPlugin4InitPlugin();
    } catch(e) {pluginErr("pluginController.initPlugin",e); }
  },
    
  dispatchEvent_onNoDevice : function() {
    try {
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_PLUGIN_EVENT,
                                                  playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_PLUGIN_EVENT_ERROR_NODEVICE);
    } catch(e) { pluginErr("pluginController.dispatchEvent_onNoDevice",e); }
  },

  dispatchEvent_OnStreamInProgressChange : function (lCurrentCount,lTotalCount,lStatus) {
    try {
      var percent = (lCurrentCount*100/lTotalCount);
      percent = parseInt(percent,10);
	  
	  //GET THE LENGTH OF THE SONG AND SEND IT TO THE PLAYER
	  //lTotalCount / 16384 will give us the time value instead of bytes for the length of the song.
	  var songLength = (lTotalCount / 16384);

	  if(this.lastSongLength != songLength){
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_SONG_LENGTH, songLength);
		this.lastSongLength = songLength;
	  }
	  
	  //LET THE PLAYER KNOW THE DOWNLOAD PROGRESS FROM PLUGIN
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_DOWNLOAD_PROGRESS,percent);
    } catch(e) { pluginErr("pluginController.dispatchEvent_OnStreamInProgressChange",e); }
	},
	
	dispatchEvent_OnRecordProgressChange : function(lCurrentCount,lTotalCount,lStatus) {
	    try {
		    if (lStatus == this.PROGRESS_STATUS_ERROR) {
		        alert("Recording Error");                   
            } else {
              playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_TIMING_EVENT,
              parseInt(lCurrentCount*1000/44100,10));
              if (lStatus == this.PROGRESS_STATUS_DONE) {
                this.stop();
              }
            }
		} catch(e) { pluginErr("pluginController.dispatchEvent_OnRecordProgressChange",e); }
	},
	
	//If we're done uploading this song, send the first parameter as the record id.
	dispatchEvent_OnUploadProgressChange : function(lCurrentCount,lTotalCount,lStatus) {
    try {
      if (lStatus == this.PROGRESS_STATUS_DONE) {
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_UPLOADER,
                                                    playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_DONE + lCurrentCount);
        return;
      }

      if (lStatus == this.PROGRESS_STATUS_ERROR) {
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_UPLOADER,
                                                    playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_FAILED);
        return;
      }

      var percent = (lCurrentCount*100/lTotalCount);
      percent = parseInt(percent,10);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_UPLOADER,
      playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_PROGRESS + percent);
    } catch(e) { pluginErr("pluginController.dispatchEvent_OnUploadProgressChange", e); }
	},

  dispatchEvent_onMicVolume : function(_vol) {
    try {
      //alert('dispatchEvent_onMicVolume');
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_VOLUMES,
      playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_VOLUMES_MIC_VOL + _vol);
    } catch(e) { pluginErr("pluginController.dispatchEvent_onMicVolume",e); }
  },
    
  dispatchEvent_onPluginStateChanged : function(_state){
    try {
      if (this.currentPluginState == _state) return;
      this.currentPluginState = _state;
      switch (_state){
      case this.PS_PLAY:
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_RECORDER_PLAYER,
                                                    playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_PLAY);
        break;
      case this.PS_STOP:
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_RECORDER_PLAYER,
                                                    playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_STOP);
        break;
      case this.PS_PAUSE:
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_RECORDER_PLAYER,
                                                    playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_PAUSE);
        break;
      case this.PS_REC:
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_RECORDER_PLAYER,
                                                    playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_RECORDER_PLAYER_RECORD);
        break;
      }
    } catch(e) { pluginErr("pluginController.dispatchEvent_onPluginStateChanged", e); }
  },
	
	dispatchEvent_OnPlayProgressChange : function(lCurrentCount,lTotalCount,lStatus) {
    try {	  
      onbeforeunload = "";      
      if(lCurrentCount == 0) return;
      if (lStatus == this.PROGRESS_STATUS_DONE){
        this.stop();
      } else if (lStatus == this.PROGRESS_STATUS_ERROR){
        this.stop();
      }
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_TIMING_EVENT, lCurrentCount);
    } catch(e) {pluginErr("pluginController.dispatchEvent_OnPlayProgressChange", e);}
  },
    
  dispatchEvent_OnAudioSignalChange : function(bstrSignalData) {
    try {
      playerController.sendMessageToKaraokePlayer("micLevelSpect",
                                                  (Math.min((2* Math.max(0,((bstrSignalData.charCodeAt(0)-0x7f00) ))) ,255)/255)*100);

      if (this.currentPluginState == this.PS_PLAY || this.currentPluginState == this.PS_REC) {
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_EQ_EVENT,bstrSignalData);																	
        playerController.sendMessageToKaraokePlayer("soundLevelSpect", 
                                                    (Math.min((2* Math.max(0,((bstrSignalData.charCodeAt(3)-0x7f00) ))),255)/255)*100);
      }
    } catch(e) {pluginErr("pluginController.dispatchEvent_OnAudioSignalChange", e);}
  },
    
  dispatchState_micMute : function() {
    try {
      pluginController.dispatchEvent_onMicMute(AVControl.bMonitorMute);
    } catch(e) {
      //pluginErr("pluginController.dispatchState_micMute", e);
    }															    
  },
    
  dispatchEvent_onMicMute : function(_isMuted){
    try {
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_VOLUMES,
                                                  playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_VOLUMES_MIC_MUTE + _isMuted);
    } catch(e) { pluginErr("pluginController.dispatchEvent_onMicMute", e); }														
  },
    
  dispatchEvent_onUploadPercents : function(_prec) {
    try {
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_NEW_STATE_UPLOADER,
                                                  playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_NEW_STATE_UPLOADER_PROGRESS + _prec);
    } catch(e) { pluginErr("pluginController.dispatchEvent_onUploadPercents",e); }
  },
    
  loadAudioEffectPresets : function() {
    try {
      var audioFilterCount = AVControl.lNumAudioFilters;
      for(i = 0; i < audioFilterCount; i++) {
        var filterName = AVControl.sAudioFilterName(i);
        var audioPresetCount = AVControl.lNumAudioFilterPresets(i);
        for(j = 0; j < audioPresetCount; j++) {
          var presetName = AVControl.sAudioFilterPresetName(i,j);
          var fullFilterPresetName = filterName + "~" + presetName;
          playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_LOAD_AUDIO_EFFECT_PRESETS,fullFilterPresetName);
        }	
      }
    } catch(e) {pluginErr("pluginController.loadAudioEffectPresets", e);}
  },
    
  loadSelectedAudioEffectPresets : function() {     
    try{
      //CLEAR ALL EFFECTS FROM MIX
      AVControl.RemoveAllEffectsFromMix();
      //LOAD THE SOUND SETTINGS FROM PLUGIN TO RESTORE EFFECT VALUES
      AVControl.LoadSettings();
      for (var i=0; i < AVControl.lNumEffectsInMix; i++) {
        var filterName = AVControl.GetNameFromMix(i,0);
        var presetName = AVControl.GetNameFromMix(i,1);
        var fullFilterPresetName = filterName + "~" + presetName;		
        playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_LOAD_SELECTED_AUDIO_EFFECT_PRESETS, fullFilterPresetName);
      }
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_LOAD_SELECTED_AUDIO_EFFECT_PRESETS_COMPLETED,Math.random());
    } catch(e) { pluginErr("pluginController.loadSelectedAudioEffectPresets", e); }
  },
    
  loadSavedSoundSettingsFromPlugin : function() {	
    try { 
      //LOAD THE SOUND SETTINGS FROM PLUGIN AUDIO SETTINGS FILE
      AVControl.LoadSettings();
	
      this.getMasterVolume();
      this.getMusicScale();
      this.getMicMixLevel();
      //NOT USED ANYMORE - NOT SAVED BY THE PLUGIN
      //this.getRecordVolume();
      //this.getMonitorVolume();
      //this.getMicBoost();
      //this.getMasterMuteAvailable();
      this.getMonitorMuteAvailable();
      this.getMasterVolumeAvailable();
      this.getMonitorVolumeAvailable();
      this.getRecordVolumeAvailable();
      this.getMicBoostAvailable();
      this.getAudioInDeviceIndex();
	  
      //********VIDEO CODE***********
      this.getVideoInDeviceIndex();
      this.getCameraCount();
      //*****************************
	  
      //BOOLEANS
      //NOT USED IN THE PLAYER ANYMORE
      //this.getMasterVolumeMute();
      //this.getMicMute();
      this.getSoftwareRecordMute();
      this.getMonitorPreference();
      this.getAudioClipType();

      //NOTIFIER - COMPLETE
      this.getRestoreSettingsNotifierValue();

      //LOAD EFFECT PRESETS
      //this.loadAudioEffectPresets();
      this.loadSelectedAudioEffectPresets();
    } catch(e) { pluginErr("pluginController.loadSavedSoundSettingsFromPlugin",e); }
  },
	
  loadSoundSettingsFromPlugin4InitPlugin : function() {
    try {
	
	  //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_START_SONG_CHAIN_MODE,true);

	
      //alert("loadSoundSettingsFromPlugin");
      this.getMasterVolume();
      this.getMusicScale();
      this.getMicMixLevel();
      this.getRecordVolume();
      this.getMonitorVolume();
      this.getMicBoost();
	  
      //********VIDEO CODE***********
      this.getVideoInDeviceIndex();
      this.getCameraCount();
      //*****************************

      //this.getMasterMuteAvailable();
      this.getSoftwareRecordMute();
      this.getMonitorMuteAvailable();
      this.getMasterVolumeAvailable();
      this.getMonitorVolumeAvailable();
      this.getRecordVolumeAvailable();
      this.getMicBoostAvailable();		    

      //BOOLEANS
      //this.getMasterVolumeMute();
      //this.getMicMute();		    
    } catch(e) { pluginErr("pluginController.loadSoundSettingsFromPlugin4InitPlugin",e); }
  },
	
  loadSoundSettingsFromPlugin : function() {
    try {		        
      //alert("loadSoundSettingsFromPlugin");
      //this.loadSoundSettingsFromPlugin4InitPlugin();

      this.getAudioInDeviceIndex();
	  
      //********VIDEO CODE***********
	  this.getVideoInDeviceIndex();
	  this.getCameraCount();
	  //*****************************
	  
      //BOOLEANS
      //this.getMasterVolumeMute();
      //this.getMicMute();		    
      this.getMonitorPreference();		    
      this.getAudioClipType();
      //NOTIFIER - COMPLETE
      this.getNotifierValue();

      //LOAD EFFECT PRESETS
      this.loadAudioEffectPresets();
      this.loadSelectedAudioEffectPresets();
    } catch(e) { pluginErr("pluginController.loadSoundSettingsFromPlugin",e); }
  },

	addAudioEffect : function(arg) {
		try {
			var effectFullName = String(arg);
			var filterName = effectFullName.substr(0, effectFullName.indexOf("~"));
			var presetName = effectFullName.substr(effectFullName.indexOf("~") + 1, effectFullName.length);	
			//Add the preset
			AVControl.AddEffectToMix(filterName, presetName);
		} catch(e) {pluginErr("pluginController.addAudioEffect", e);}
	},

	removeAllAudioEffects : function() {
		try {
			AVControl.RemoveAllEffectsFromMix();
		} catch(e) {pluginErr("pluginController.removeAllAudioEffects", e);}
	},
	
	saveSettings : function() {
    try {	
      AVControl.SaveSettings();
		} catch(e) {pluginErr("pluginController.saveSettings", e);}
	},
		
	setMusicKeyChange : function(args) {
		try {
			var semitone = Math.round((2*(args/100) -1)*12);
								
			AVControl.AudioFilterEnable(0, true);
			this.setAudioFilterParameterValue(0,0,args); // Param 0 is pitch shift. value = 0 to 100. 0 = min, 50 = off, 100 = max.

		
			if( semitone == 0) {
				AVControl.AudioFilterEnable(0, false);
			} else {
				AVControl.AudioFilterEnable(0, true);
				this.setAudioFilterParameterValue(0,0,args); // Param 0 is pitch shift. value = 0 to 100. 0 = min, 50 = off, 100 = max.
			}
		} catch(e) {pluginErr("pluginController.setMusicKeyChange", e);}
	},
	
	setAudioFilterParameterValue : function(lAudioFilterIndex,lParameterIndex,n_value) {
		try {
			var min = AVControl.fAudioFilterParameterMin(lAudioFilterIndex,lParameterIndex);
			var max = AVControl.fAudioFilterParameterMax(lAudioFilterIndex,lParameterIndex);
			var range = max-min;
			var val = (n_value/100.)*range + min;
			AVControl.AudioFilterSetParameterValue(lAudioFilterIndex,lParameterIndex,val);
		} catch(e) { pluginErr("pluginController.setAudioFilterParameterValue",e); }
	},		
    
  setCaptureMode : function(_cm) {
	try {
		logPlugin("lCaptureMode = " + _cm);
		if(AVControl.lCaptureMode == this.CAPTURE_VIDEO && AVControl.lCaptureMode == _cm){
			//If we're already running in video mode, don't initialize again.  Make sure the video is visible though
			AVControl.style.width = "227px";
			AVControl.style.height = "170px";
			if(document.URL.indexOf("http://ksolo.myspace.com/actions/recordAudition.do")!=-1){
				AVControl.style.width = "320px";
				AVControl.style.height = "240px";
				if(navigator.userAgent.match("MSIE")){
					AVControl.style.left = '90px';
					AVControl.style.marginTop = '530px';
				}
			}
			this.hideSongProperties();
			this.shrinkRecordImage();
			this.shrinkSongImage();
			return;
		}
		
		if(AVControl.lCaptureMode == this.CAPTURE_AUDIO && AVControl.lCaptureMode == _cm){
			//If we're already running in audio mode, don't initialize again.  Make sure the video window is invisible though
			this.showSongProperties();
			this.enlargeRecordImage();
			this.enlargeSongImage();
			AVControl.style.width = "1px";
			AVControl.style.height = "1px";
			return;
		}
		
		AVControl.lCaptureMode = parseInt(_cm);
		//this.initPlugin();
		if (_cm == this.CAPTURE_VIDEO) {
			try{
				AVControl.style.width = "227px";
				AVControl.style.height = "170px";
				AVControl.Init();
				this.hideSongProperties();
				this.shrinkRecordImage();
				this.shrinkSongImage();
				if(document.URL.indexOf("http://ksolo.myspace.com/actions/recordAudition.do")!=-1){
					AVControl.style.width = "320px";
					AVControl.style.height = "240px";
					if(navigator.userAgent.match("MSIE")){
						AVControl.style.left = '90px';
						AVControl.style.marginTop = '530px';
					}
				}
			}catch(e){
				this.enlargeRecordImage();
				this.enlargeSongImage();
				
				AVControl.style.width = "1px";
				AVControl.style.height = "1px";
				playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_VIDEO_INITIALIZATION_ERROR, "videoInitError");
			}
		}else{
			try{
				this.showSongProperties();
				this.enlargeRecordImage();
				this.enlargeSongImage();
				AVControl.style.width = "1px";
				AVControl.style.height = "1px";
				AVControl.Init();
			}catch(e){
				alert("problem initializing audio capture device");
			}	
		}
	}catch(e){
		//pluginErr("pluginController.setCaptureMode", e);
	}
  },
	
	getCaptureMode : function(){
		return AVControl.lCaptureMode;
	},

	enlargeRecordImage:function(){
		if($('songImage')){
			$('songImage').style.height = "185px";
			$('songImage').style.width = "225px";
		}
	},
	shrinkRecordImage:function(){
		if($('songImage')){
			$('songImage').style.width = "225px";
			$('songImage').style.height = "1px";
		}
	},

	enlargeSongImage:function(){
		if($('playerTopHeaderImg')){
			$('playerTopHeaderImg').style.height = "185px";
			$('playerTopHeaderImg').style.width = "227px";
		}
	},
	shrinkSongImage:function(){
		if($('playerTopHeaderImg')){
			$('playerTopHeaderImg').style.width = "227px";
			$('playerTopHeaderImg').style.height = "1px";
		}
	},

	showSongProperties:function(){
		if($("editSong") && $("editSong").value == "true"){
			document.getElementById("playerTopWrapper").style.display = "none";
			document.getElementById("EditSongProfile").style.display = "block";
		}
	},
	
	hideSongProperties:function(){
		if($("editSong") && $("editSong").value == "true"){
			document.getElementById("playerTopWrapper").style.display = "block";
			document.getElementById("EditSongProfile").style.display = "none";
		}
	},
	
	setAudioClipType : function(_val) {
		//alert("Audio Clip Type: " + _val);
		try {
			logPlugin("Audio Clip Type = " + _val);
			AVControl.lAudioClipType = parseInt(_val);
		} catch(e) { pluginErr("pluginController.setAudioClipType",e); }
	},
    
  setMasterVolume : function(_vol) {
    try {
      logPlugin("fMasterVolume = " + Math.max(Math.round(_vol)/100,0.00));
      AVControl.fApplicationVolume=Math.max(Math.round(_vol)/100,0.00);
    } catch(e) { pluginErr("pluginController.setMasterVolume",e); }
  },
    
  setMasterVolumeMute : function(_mute) {	
    //alert("Master Mute: " + _mute);
    try {
      logPlugin("fMasterVolumeMute = " + _mute);
      AVControl.bApplicationMute = _mute;
    } catch(e) { pluginErr("pluginController.setMasterVolumeMute",e); }
  },	
	
	setMusicVolume : function(_vol){
		try {
			logPlugin("fMusicScale = " + Math.max(Math.round(_vol)/100,0.01));
			AVControl.fMusicScale=Math.max(Math.round(_vol)/100,0.01);
			if(top.location.href.indexOf("recordSongChain.do") != -1) {

				// this is where  aparticipant starts a recording.. need to store participant's 
				//original background Volume, then set volume to 100% before recording a song chain
				

				// First Store original value in a hidden div
				
				if(!$("StoreBGVolume")){
					$("recNum").innerHTML+='<div id="StoreBGVolume" style="display:none">'+Math.round(AVControl.fMusicScale*100)/100+'</div>';
				}
				AVControl.fMusicScale = 1.0;	// Set Volume to max
				this.getMusicScale();
			}
		} catch(e) {pluginErr("pluginController.setMusicVolume", e);}
	},
	
	setMonitorPreference : function(_preference) {
		try {
			AVControl.bHWMonitorMutePref = parseInt(_preference);
		} catch(e) { pluginErr("pluginController.setMonitorPreference",e); }
	},
    
	setPlayMicThroughSpeakers : function(_preference) {
		try {
			if (parseInt(_preference) == 1) { // set to on
				AVControl.bPlayMicThroughSpeakers = true;
//				if (AVControl.bIsVista) {
//				  AVControl.lAudioLatencyMS = 20;
//				} else {
          AVControl.lAudioLatencyMS = 30;			
//				} // if
			} else if(parseInt(_preference) == 0) { // set to off
				AVControl.bPlayMicThroughSpeakers = false;
				AVControl.lAudioLatencyMS = 100;
			} // if
		} catch(e) { pluginErr("pluginController.setPlayMicThroughSpeakers",e); }
	},
    
  setMicVolume : function(_vol) {
    try {            
      logPlugin("fRecordVolume = " + (Math.round(_vol)/100));
      AVControl.fRecordVolume = (Math.round(_vol)/100);
	  } catch(e) {}
  },
    
  setMicMixVolume : function(_vol) {
    try {	
      logPlugin("micMixVolume = " + _vol);
      AVControl.fMicScale= (_vol * 2) / 100;
    } catch(e) { pluginErr("pluginController.setMicMixVolume",e); }
  },
    
  setMonitorVolume : function(_vol) {
    try {
      logPlugin("fMonitorVolume = " + (Math.round(_vol)/100));
      AVControl.fMonitorVolume = (Math.round(_vol)/100);
    } catch(e) {}		
  },
    
  setMonitorMute : function(_mute) {
    var isMute;
    try {
      if (_mute == 1) {
        isMute = 0;
      } else if (_mute == 0) {
        isMute = 1;
      } else {
        return;
      }				
      AVControl.bAudioInActive = parseInt(isMute);
    } catch(e) {}
  },
    
  setMicBoost : function(_arg){
    try {
      logPlugin("bBoost");
      AVControl.bBoost = _arg;
    } catch(e) {}
  },
    
  setMusicKeyChange : function(args) {
    try {
      args=parseInt(args);
      var semitone = Math.round((2*(args/100) -1)*12);
      AVControl.AudioFilterEnable(0, true);
      this.setAudioFilterParameterValue(0,0,args); // Param 0 is pitch shift. value = 0 to 100. 0 = min, 50 = off, 100 = max.
      if (semitone == 0) {
        AVControl.AudioFilterEnable(0, false);
      } else {
        AVControl.AudioFilterEnable(0, true);
        this.setAudioFilterParameterValue(0,0,args); // Param 0 is pitch shift. value = 0 to 100. 0 = min, 50 = off, 100 = max.
      }
    } catch(e) { pluginErr("pluginController.setMusicKeyChange",e); }
  },
    
  sendAvaliableMicrophonesBack : function() {
    try {
      logPlugin("lNumAudioInDevices");
      var num = AVControl.lNumAudioInDevices;
      var arr = "";
      for (var i=0; i < num; i++) {
        arr += ((arr.length != 0) ? "," : "" ) + AVControl.sAudioInDeviceName(i);
      }  			
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_MICROPHONE_TYPES,arr);
    } catch(e) { pluginErr("pluginController.sendAvaliableMicrophonesBack",e); }
  },
    
  setCaptureDevice : function(_index) {
    try {
      logPlugin("lAudioInDeviceIndex = " + _index);
      AVControl.lAudioInDeviceIndex = _index;
      this.initPlugin();
      try {
        pluginController.dispatchEvent_onMicVolume(Math.round(Math.max(Math.min(100, AVControl.fMonitorVolume),0)*100));
      } catch(e) {}
    } catch(e) { alert("setCaptureDevice : " + e); }
  },
	
  getCaptureDevice : function() {
    try{
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_SELECTED_DEVICE, AVControl.lAudioInDeviceIndex);
    } catch(e) {
      alert("getCaptureDevice : " + e);
    }
  },
    
  getMonitorPreference : function() {
    var bHWMonitorMutePref;
    try {
      bHWMonitorMutePref = AVControl.bHWMonitorMutePref;
    } catch(e) {
      bHWMonitorMutePref = 0;
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_PREFERENCE,bHWMonitorMutePref);
  },
    
  getAudioClipType : function() {
    var lAudioClipType;
    try {
      lAudioClipType = parseInt(AVControl.lAudioClipType);
    } catch(e) {
      lAudioClipType = 0;
    }
    //alert("lAudioClipType " + lAudioClipType);
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_CLIP_TYPE,lAudioClipType);
  },
    
  getNotifierValue : function() {
    //Send this message to the player when all variables have been loaded.
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_NOTIFIER_VALUE,"DONE");
  },
    
  getRestoreSettingsNotifierValue : function() {
    //Send this message to the player when all variables have been loaded.
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_RESTORE_NOTIFIER_VALUE,Math.random());
  },
    
  getMasterVolumeAvailable : function() {
    var fMasterVolumeAvailable;
    try {
      fMasterVolumeAvailable = AVControl.fApplicationVolume;
    } catch(e) {
      // -1 = ERROR/UNAVAILABLE
      fMasterVolumeAvailable = -1;				
    }
    //fMasterVolumeAvailable = -1;
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME_AVAILABLE,fMasterVolumeAvailable);
  },
    
  getMonitorMuteAvailable : function() {
    var bMonitorMuteAvailable;
    try {
      bMonitorMuteAvailable = AVControl.bMonitorMute;
    } catch(e) {
      // -1 = ERROR/UNAVAILABLE
      bMonitorMuteAvailable = -1;				
    }
    //bMonitorMuteAvailable = -1;				
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_MUTE_AVAILABLE, bMonitorMuteAvailable);
  },
    
  getMonitorVolumeAvailable : function() {
    var fMonitorVolumeAvailable;
    try {
      fMonitorVolumeAvailable = AVControl.fMonitorVolume;
    } catch(e) {
      // -1 = ERROR/UNAVAILABLE
      fMonitorVolumeAvailable = -1;				
    }
    //fMonitorVolumeAvailable = -1;		
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_VOLUME_AVAILABLE, fMonitorVolumeAvailable);
  },
    
  getRecordVolumeAvailable : function() {
    var fRecordVolumeAvailable;
    try {
      fRecordVolumeAvailable = AVControl.fRecordVolume;
    } catch(e) {
      // -1 = ERROR/UNAVAILABLE
      fRecordVolumeAvailable = -1;			
    }
    //alert('getRecordVolumeAvailable:'+fRecordVolumeAvailable);
    //fRecordVolumeAvailable = -1;			
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_RECORD_VOLUME_AVAILABLE,fRecordVolumeAvailable);
  },
    
  getMicBoostAvailable : function() {
    var bMicBoostAvailable;
    try {
      bMicBoostAvailable = AVControl.bBoost;
    } catch(e) {
      // -1 = ERROR/UNAVAILABLE
      bMicBoostAvailable = -1;			
    }
    //bMicBoostAvailable = -1;
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MIC_BOOST_AVAILABLE,bMicBoostAvailable);
  },
    
  getSoftwareRecordMute : function() {
    var bAudioInActive;	
    try {
      bAudioInActive = AVControl.bAudioInActive;
      if (bAudioInActive == 1) {
        bAudioInActive = 0;
      } else if (bAudioInActive == 0) {
        bAudioInActive = 1;
      } else {
        //IF THERE'S AN ERROR, THROW AN ERROR ID OF 2
        bAudioInActive = 2;
      }
    } catch(e) {
      bAudioInActive = 2;
    }		
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_MUTE,bAudioInActive);
  },
    
  getMicBoost : function() {
    var micBoost;
    try {
      logPlugin("bBoost");
      micBoost = AVControl.bBoost;
    } catch(e) {
      micBoost = 0;
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MIC_BOOST,micBoost);
  },
    
  getMasterVolume : function() {
    var fMasterVolume;
    try {
      fMasterVolume = AVControl.fApplicationVolume;
    } catch(e) {
      fMasterVolume = 0;								
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME,fMasterVolume * 100);
  },		
	
  getMonitorVolume : function() {
    var fMonitorVolume;
    try {
      fMonitorVolume = AVControl.fMonitorVolume;
      if(fMonitorVolume < 0)fMonitorVolume = 0;
    } catch(e) {
      fMonitorVolume = 0;
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_VOLUME,fMonitorVolume * 100);
  },
	
  getMusicScale : function() {
    var fMusicScale;
    try {
      fMusicScale = AVControl.fMusicScale;
    } catch(e) {
      fMusicScale = 0;				
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MUSIC_MIX_LEVEL,fMusicScale * 100);
  },
	
  getMicMixLevel : function() {
    var fMicScale;
    try {
      fMicScale = AVControl.fMicScale;
    } catch(e) {
      fMicScale = 0;
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MIC_MIX_LEVEL,fMicScale * 100 / 2);
  },
	
  getRecordVolume : function() {
    var fRecordVolume;
    try {
      fRecordVolume = AVControl.fRecordVolume;
      if(fRecordVolume < 0)fRecordVolume = 0;
    } catch(e) {
      fRecordVolume = 0;
    }
    //alert('getRecordVolume:'+fRecordVolume);
    //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_RECORD_VOLUME, fRecordVolume * 100); // This method won't work with current Flash code.
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MICROPHONE_VOLUME_SLIDER_VALUE,fRecordVolume * 100); // This method must be used.
  },
	
  getAudioInDeviceIndex : function() {
    var lAudioInDeviceIndex;
    try {
      lAudioInDeviceIndex = AVControl.lAudioInDeviceIndex;
    } catch(e) {
      lAudioInDeviceIndex = 0;				
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_IN_DEVICE_INDEX,lAudioInDeviceIndex);
  },
	
  getMasterVolumeMute : function() {
    var bMasterVolumeMute;
    try {
      bMasterVolumeMute = AVControl.bApplicationMute;
    } catch(e) {
      bMasterVolumeMute = 0;						
    }
    playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME_MUTE, bMasterVolumeMute);
  },		
            
  startDownload : function(_where,_what) {
    try {            
      if (_what == this.lastRequestedPlayback) return;
      logPlugin("StartStreamInAudio(" + _where + "," + _what + ")");
      AVControl.StartStreamInAudio(_where,_what);
      this.lastRequestedPlayback = _what;
    } catch(e) { alert("Song download failed."); }
  },		
	
	record : function() {
		try{		
	    logPlugin("StartCapture");
			AVControl.StartCapture(); 
			pluginController.dispatchEvent_onPluginStateChanged(this.PS_REC);
		} catch(e) {pluginErr("pluginController.record", e);}
	},
	
  stop : function(_disableDispatch) {
    try {
      if (_disableDispatch) {
        this.currentPluginState = this.PS_STOP;
      }
      this.bPlayActive = false;
      logPlugin("StopCapture");
      AVControl.StopCapture();
      logPlugin("StopPlayback");
      AVControl.StopPlayback();
      pluginController.dispatchEvent_onPluginStateChanged(this.PS_STOP);
         
      if (this.bResetCaptureDevicesOnStop) {
        this.bResetCaptureDevicesOnStop = false;
        this.initPlugin(); // Reset capture device(s).
      } // if
      
    } catch(e) {pluginErr("pluginController.stop",e); }
  },
  
  pause : function() {
    try {
		//ADD CODE HERE
		AVControl.PausePlayback(true);
		pluginController.dispatchEvent_onPluginStateChanged(this.PS_PAUSE);
    } catch(e) {}
  },
	
  play : function(_pos) {
    try {
      logPlugin("StartPlayback");

      try {
        logPlugin("lPlayPos = " + Math.round(_pos*1000));
        AVControl.lPlayPos = Math.round(_pos*1000);
		AVControl.PausePlayback(false);
      } catch(e) {}     
      
      if (!this.bPlayActive) {
        this.stop(true);
        this.bPlayActive = true; // <TODO> Appears to be duplicate state: see this.currentPluginState == this.PS_PLAY.
        AVControl.StartPlayback(_pos * 1000); // Pass the desired play position to the plugin
        pluginController.dispatchEvent_onPluginStateChanged(this.PS_PLAY); // Should be all that is needed.
      } else {
// <BEGIN HACK>
        this.currentPluginState = this.PS_STOP;
        pluginController.dispatchEvent_onPluginStateChanged(this.PS_STOP);
        pluginController.dispatchEvent_onPluginStateChanged(this.PS_PLAY);
// <END HACK>     
      } // if

    } catch(e) { pluginErr("pluginController.play",e); }
  },
	
  playStream : function(_pos) {
    try {
      this.stop(true);	    	
      logPlugin("StartPreview");
      AVControl.StartPreview();
      pluginController.dispatchEvent_onPluginStateChanged(this.PS_PLAY);
      try { 			    
        logPlugin("lPlayPos = " + Math.round(_pos*1000));
        AVControl.lPlayPos = Math.round(_pos*1000);
      } catch(e) {}
    } catch(e) {pluginErr("pluginController.playStream", e);}    	
  },
	
  cancelSave : function() {
    try {	
      logPlugin("CancelSave");
      AVControl.CancelSave();
    } catch(e) { pluginErr("pluginController.cancelSave",e); }
  },
	
  save : function(_contest,_trackid,_songName, _note, _key, _moodId, _moodNote, _chainId, _chainOrder, _newSongChainFlag) {
    try{
      onbeforeunload = "WARNING: Leaving the page now will stop the upload of your song!";
	  
	  var recordingInfo = "lgnCookBypass=1&tid=" + escape(_trackid) + "&dur=" + escape(AVControl.lRecordingDurationMS) + "&contest=" + escape(_contest) + "&browser=" + escape(navigator.userAgent);
	  //Mood - Status
	  if(_moodId != null && _moodId != 'null'){
		 recordingInfo += "&moodId=" + _moodId + "&moodNote=" + _moodNote.replace(/\+/g,"~");
	  }
	  //Song Chain
	  //****************************************
	  //alert("chain id: " + _chainId + "  chain order: " + _chainOrder + " chain flag: " + _newSongChainFlag);
	  
	  if(_chainId != null && _chainId != 'null'){
		  recordingInfo += "&chainId=" + _chainId;
	  }
	  if(_chainOrder != null && _chainOrder != 'null'){
		  recordingInfo += "&chainOrder=" + _chainOrder;
	  }
	  if(_newSongChainFlag == "true"){
	  	var bSongChainPopUp = $("SongChainFlag").innerHTML;
	  	if (bSongChainPopUp==1){
	  		// User started the chain from a popup
	  		recordingInfo += "&part0=" + encodeURIComponent($("frm_Creator").innerHTML);
	  		recordingInfo += "&partEmail0=" + encodeURIComponent($("frm_Creator_email").innerHTML);
	  		recordingInfo += "&part1=" + encodeURIComponent($("frm_part1").innerHTML);
	  		recordingInfo += "&partEmail1=" + encodeURIComponent($("frm_part1_email").innerHTML);
	  		recordingInfo += "&part2=" + encodeURIComponent($("frm_part2").innerHTML);
	  		recordingInfo += "&partEmail2=" + encodeURIComponent($("frm_part2_email").innerHTML);
	  		recordingInfo += "&part3=" + encodeURIComponent($("frm_part3").innerHTML);
	  		recordingInfo += "&partEmail3=" + encodeURIComponent($("frm_part3_email").innerHTML);
	  	}else{
	  		// User Saved for Song Chain from PlugIn (Need to display PopUp)
	  		$("MikksuPopUpAltMsg").innerHTML="";
	  		$("DoNotStartRecording").innerHTML="1";
	  		AVControl.style.visibility="hidden";
	  		
	  		// store information to call save function again..
		  		$("saveContents").innerHTML=_contest;
		  		$("saveTrackid").innerHTML=_trackid;
		  		$("saveSongname").innerHTML=_songName;
		  		$("saveNote").innerHTML=_note;
		  		$("saveKey").innerHTML=_key;
		  		$("saveMoodId").innerHTML=_moodId;
		  		$("saveMoodNote").innerHTML=_moodNote;
		  		$("saveChainId").innerHTML=_chainId;
		  		$("saveChainOrder").innerHTML=_chainOrder;
		  		$("saveNewSongChainFlag").innerHTML=_newSongChainFlag;
		  		
		  	//
	  		SongChainPopUp(1);
	  		return false; // exit function.. we don't want to upload (User Needs to fill out Song Chain Popup);
	  	}  
	  }
	  //*****************************************
	

	  //Set the recording info in the plugin
	  AVControl.sRecordingInfo = recordingInfo;
      try{		
        AVControl.sSongName  = Utf8.decode(unescape(_songName));
        AVControl.sSongNote  = _note;
        AVControl.sSongToken = _key;
      } catch(e) {
        alert("AVControl: New Song Parameter Error");
      } // try/catch
      AVControl.StartUploadRecording(webServerAddress.replace(/http\:\/\//,""),"/actions/passRecording.do");
      this.dispatchEvent_onUploadPercents(1); 
    } catch(e) { pluginErr("pluginController.save",e); }
  },
  
  //Song chain save routine
  /*
  saveForSongChain : function(_contest,_trackid,_songName, _note, _key, _moodId, _moodNote, _chainId) {
	//TO DO
	alert("saving song chain");
  },
  */
    
	getCameraCount : function(){
		var cameraCount;
		try{
			cameraCount = AVControl.lNumVideoDevices;
		}catch(e){
			cameraCount = 0;
		}
		//alert("camera count: " + cameraCount);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_CAMERA_COUNT, cameraCount);
	},

  getIsCaptureResSupported : function(width,height) {
    var bIsCaptureResSupported;
    try {
      bIsCaptureResSupported = AVControl.IsCaptureResSupported(width,height);
    } catch(e) {
      bIsCaptureResSupported = 0;
    } // try/catch
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_IS_CAPTURE_RES_SUPPORTED,
		                                            bIsCaptureResSupported);
  },  	
 
	getVideoInDeviceIndex : function(){
		var videoInDeviceIndex;
		try{
			videoInDeviceIndex = AVControl.lVideoDeviceIndex;
		}catch(e){
			videoInDeviceIndex = 0;
		}
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_SELECTED_VIDEO_DEVICE, videoInDeviceIndex);
	},
  
	unDockVideoWindow : function(_undock){
		try{
			logPlugin("docking: " + _undock);
			var captureMode = AVControl.lCaptureMode;
			if(captureMode == this.CAPTURE_VIDEO){
				if(_undock == "true"){
					AVControl.bDocked = true;
					AVControl.EnableVideoOnTop(23,23,320,240);
				}else{
					AVControl.bDocked = true;
				}
			}
		}catch(e){
			alert("docking/undocking problem");
		}
	},
	
	//SETS THE PLUGIN PROFILE TO LOW, NORMAL, OR HIGH DEFINITION VIDEO
	setMixProfile : function(profile){
		try{
		  this.PROFILE_CURRENT = profile;			
			if (profile == this.PROFILE_160_15) {
//			  alert("160x120@15");
			  AVControl.bUseVMR = false;
			  AVControl.SetVideoCaptureFrameRate(15);
				AVControl.SetVideoCaptureResolution(160,120);
				AVControl.SetAVCProfile(this.profile160_15);			
			} else if (profile == this.PROFILE_320_15) {
//			  alert("320x240@15");
			  AVControl.bUseVMR = false;
			  AVControl.SetVideoCaptureFrameRate(15);
				AVControl.SetVideoCaptureResolution(320,240);
				AVControl.SetAVCProfile(this.profile320_15);
			} else if (profile == this.PROFILE_320_30) {
//			  alert("320x240@30");			
			  AVControl.bUseVMR = true;
			  AVControl.SetVideoCaptureFrameRate(30);
				AVControl.SetVideoCaptureResolution(320,240);
				AVControl.SetAVCProfile(this.profile320_30);
			} else if (profile == this.PROFILE_640) {
//			  alert("640x480@30");			
			  AVControl.bUseVMR = true;
			  AVControl.SetVideoCaptureFrameRate(30);
				AVControl.SetVideoCaptureResolution(640,480);
				AVControl.SetAVCProfile(this.profile640);			
			} else if (profile == this.PROFILE_800) {
//			  alert("800x600@30");			
			  AVControl.bUseVMR = true;
			  AVControl.SetVideoCaptureFrameRate(30);
				AVControl.SetVideoCaptureResolution(800,600);
				AVControl.SetAVCProfile(this.profile800);
			} else if (profile == this.PROFILE_960) {
//			  alert("960x720@30");		
			  AVControl.bUseVMR = true;
			  AVControl.SetVideoCaptureFrameRate(30);
				AVControl.SetVideoCaptureResolution(960,720);
				AVControl.SetAVCProfile(this.profile960);
			} // if
			AVControl.Init();
		} catch(e) {
			alert("Error setting video profile: switching to 320x240@15Hz");
      this.PROFILE_CURRENT = this.PROFILE_320_15;
      try {
        AVControl.bUseVMR = false;
			  AVControl.SetVideoCaptureFrameRate(15);
        AVControl.SetVideoCaptureResolution(320,240);
        AVControl.SetAVCProfile(this.profile320_15);		     
        AVControl.Init();
      } catch(e) {   
  			alert("Error setting 320x240@15Hz video profile");
      } // try/catch
		} // try/catch
	},
   
	//ON DEVICE CHANGE FUNCTIONS
	//************************************************************
	getAudioInDeviceFromDeviceChange : function(){
		//GET AUDIO CAPTURE DEVICE ID
		var lAudioInDeviceIndex;
		try{
			lAudioInDeviceIndex = AVControl.lAudioInDeviceIndex;
		}catch(e){
			lAudioInDeviceIndex = 0;
		}
		logPlugin("Device Change - Audio In Device: " + lAudioInDeviceIndex);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.AUDIO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_DEVICE_CHANGE, lAudioInDeviceIndex);
	},
			
	getVideoInDeviceFromDeviceChange : function(){
		//GET VIDEO CAPTURE DEVICE ID
		var lVideoDeviceIndex;
		try{
			lVideoDeviceIndex = AVControl.lVideoDeviceIndex;
		}catch(e){
			lVideoDeviceIndex = 0;
		}
		logPlugin("Device Change - Video In Device: " + lVideoDeviceIndex);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.VIDEO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_DEVICE_CHANGE, lVideoDeviceIndex);
	},
			
	onCaptureDeviceUnplugged : function (){
		//LET FLASH KNOW THAT THE DEVICE LIST HAS BEEN CHANGED
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_AUDIO_VIDEO_DEVICE_CHANGED,Math.random());
	},
	
	setDockedVideoDimensions : function(w, h){
		try{
			AVControl.width = w;
			AVControl.height = h;
			AVControl.UpdateWindow();
		}catch(e){
			alert("video docking error");
		}
	},	
		
		
	sendAvailableCamerasBack : function(){
		try{
			var num = AVControl.lNumVideoDevices;
			var arr = "";
			for (var i=0; i < num; i++) {
				arr += ((arr.length != 0) ? "," : "" ) + AVControl.sVideoDeviceName(i);
			}
			playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_CAMERA_TYPES,arr);
		}catch(e){
				
		}
	},
		
	setVideoInDeviceIndex : function(_index){
		try{
			AVControl.lVideoDeviceIndex = _index;
			if(AVControl.lCaptureMode == 1){
				AVControl.Init();
			}
		}catch(e){}
	},
	//****************************************************************
	
	
	//ONMIXERCHANGE FUNCTIONS
	//****************************************************************
	getOnMixerChangeRecordVolumeSlider : function(){
		var fRecordVolume;
		try{
			fRecordVolume = AVControl.fRecordVolume;
		}catch(e){
			fRecordVolume = 0;
		}
		logPlugin("mixer - record volume: " + fRecordVolume);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MICROPHONE_VOLUME_SLIDER_VALUE, fRecordVolume * 100);
	},
			
	getOnMixerChangeMonitorVolumeSlider : function(){
		var fMonitorVolume;
		try{
			fMonitorVolume = AVControl.fMonitorVolume;
		}catch(e){
			fMonitorVolume = 0;
		}
		logPlugin("mixer - monitor volume: " + fMonitorVolume);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MONITOR_VOLUME_SLIDER_VALUE, fMonitorVolume * 100);
	},
			
	getOnMixerChangeMicBoostValue : function(){
		var bBoost;
		try{
			bBoost = AVControl.bBoost;
		}catch(e){
			bBoost = 0;
		}
		logPlugin("mixer - mic boost: " + bBoost);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MIC_BOOST_MUTE_VALUE, bBoost);
	},
			
	getOnMixerChangeMonitorMuteValue : function(){
		var bMonitorMute;
		try{
			bMonitorMute = AVControl.bMonitorMute;
		}catch(e){
			bMonitorMute = 0;
		}
		logPlugin("mixer - monitor mute: " + bMonitorMute);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.MONITOR_MUTE_VALUE, bMonitorMute);
	},
			
	getOnMixerChangeAudioInDeviceIndex : function(){
		var lAudioInDeviceIndex;
		try{
			lAudioInDeviceIndex = AVControl.lAudioInDeviceIndex;
		}catch(e){
			lAudioInDeviceIndex = 0;
		}
		logPlugin("mixer - audio index: " + lAudioInDeviceIndex);
		playerController.sendMessageToKaraokePlayer(playerControllerCmd.AUDIO_CAPTURE_DEVICE_ID_CHANGE_FROM_ON_MIXER_CHANGE, lAudioInDeviceIndex);
	}
	//****************************************************************
}

var loadSongController = {    
  withoutPlugin : function(_params,_btn) {
    try {                        
      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_IS_FSCOMMAND_INITIATED,1);
      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_INITIATE_PLAYER,1);

      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_STATE,playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_STATE_NO_PLUGIN);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME,100);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MUSIC_MIX_LEVEL,100);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MIC_MIX_LEVEL,100);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_RECORD_VOLUME,50);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_VOLUME,50);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_IN_DEVICE_INDEX,0);
      //BOOLEANS
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME_MUTE,0);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MIC_MUTE,0);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_MUTE,0);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MONITOR_PREFERENCE,0);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MIC_BOOST,0);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_AUDIO_CLIP_TYPE,0);

      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_NOTIFIER_VALUE,"DONE");

      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_JAVASCRIPT_LOAD_SONG,true); //FLAG - Lets flash know that we're selecting a song
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETERS_FROM_CLIENT,_params);
      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SELECTED_GREETINGCARD_FOR_INITIATION,_crd);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SELECTED_GREETINGCARD_FOR_INITIATION,"");
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SELECTED_BUTTON_FOR_INITIATION,_btn);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_INITIATE_NEW_SONG,_params);
      //alert('withoutPlugin');          
    } catch(e) { pluginErr("loadSongController.withoutPlugin",e); }
  },

  withPlugin : function(_params,_btn) {
    try {                        
      if (typeof AVControl.ClearHiddenAudioInputs != "undefined") {
        AVControl.ClearHiddenAudioInputs();
        var HiddenAudioInputs = new Array("*mix*","*wave*","*what*");
        for (var i=0; i < HiddenAudioInputs.length; i++){
          AVControl.HideAudioInput(HiddenAudioInputs[i]);
        }
        AVControl.InitDeviceLists();
      }

      // Loads the settings from the plugin
      AVControl.LoadSettings();
      pluginController.initPlugin();

      // Passes the settings from the plugin to the flash player
      pluginController.loadSoundSettingsFromPlugin();			
      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_MASTER_VOLUME, fMasterVolume * 100);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_GET_NOTIFIER_VALUE,"DONE");

      // ENABLE AUDIO EFFECTS
      AVControl.bAudioEffectsEnabled = true;

      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_VIDEO_DEVICE_COUNT,AVControl.lNumVideoDevices);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_VERSION,"4.0.0");
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PLUGIN_STATE, playerControllerCmd.MESSAGE_PARAMETER_PLUGIN_STATE_LOADED);

      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_IS_FSCOMMAND_INITIATED ,1);
      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_INITIATE_PLAYER ,1);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_JAVASCRIPT_LOAD_SONG, true); //FLAG - Lets flash know that we're selecting a song
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_PARAMETERS_FROM_CLIENT,_params);
      //playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SELECTED_GREETINGCARD_FOR_INITIATION,_crd);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SELECTED_GREETINGCARD_FOR_INITIATION,"");
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_SELECTED_BUTTON_FOR_INITIATION,_btn);
      playerController.sendMessageToKaraokePlayer(playerControllerCmd.MESSAGE_INITIATE_NEW_SONG,_params);
    } catch(e) { pluginErr("loadSongController.withPlugin",e); }
  }
}