

document.recordingStarted = false;
document.recordingStarting = false;

document.DELAY_CREATION = new Object();

function uHex2String( num ) {
	var str = "";
	str = ((num>>28)&0xf).toString(16);
	str += ((num>>24)&0xf).toString(16);
	str += ((num>>20)&0xf).toString(16);
	str += ((num>>16)&0xf).toString(16);
	str += ((num>>12)&0xf).toString(16);
	str += ((num>>8)&0xf).toString(16);
	str += ((num>>4)&0xf).toString(16);
	str += (num&0xf).toString(16);

	return str;
}

function createRecServer() {
	if ( document.recordingStarting!=true ) {
		document.recordingStarting = true;
	
		var recHolder = document.getElementById('recplaceholder');

		var oHTML = 
			'<object id=recServer classid="clsid:82CF9738-0BDA-4AAF-AB08-5AC5875FF3BB" width="0" height="0" '+
				'codebase="/data/pages/flash/recording/yrecording.cab#version=1,5,1,2" '+
				'onreadystatechange="if (document.getElementById(\'recServer\').readyState==4) recordingCreated();">'+
			'</object>\n';
		
		recHolder.innerHTML = oHTML;
	}
}

function startRecSession() {
	var sessionID;

	try {
		//var rec = document.getElementById('recServer');
		sessionID = recServer.StartSession();		
	}
	catch( e ) {
		var undef;
		sessionID = undef;

		var stat = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		jLog( stat );
		window.status = stat;
				
		if ( typeof(window.installOpened)=="undefined" ) {
			var win = window.open( "about:blank", "_blank", "width=500,height=300,toolbar=no" );
						
			
	    	var language = typeof(InternetExplorer)!="undefined" ? window.clientInformation.userLanguage : navigator.language;
			if ( language.indexOf("pl")==0 ) {
				win.document.title = "Nagrywanie/Problem";
				win.document.open();
				win.document.writeln( "<h3>Komponent nagrywania nie działa prawidłowo. </h3>" );
				win.document.writeln( "<hr>" );
				win.document.writeln(
					"<b>Jeżeli właśnie zainstalowałeś komponenty, zrestartuj przeglądarkę</b><br><br>" );
				win.document.writeln(
					"<b>W przeciwnym wypadku powtórz instalację:<ul>" );
				win.document.writeln(
					"<li><a href='/data/pages/flash/recording/leorec.exe'>nagrywanie dźwięku</a>" );
				win.document.writeln(
					"<li><a href='/data/pages/flash/recording/flashrcg.exe'>rozpoznawanie mowy</a>" );
				win.document.writeln(
					"</ul>" );
				win.document.writeln( "Jeżeli problem się powtarza skontaktuj się z administratorem.<br>" );

				win.document.writeln( "<hr>" );
				win.document.writeln(
					"<font color=red>[Code: 0x"+uHex2String(e.number)+", message: "+e.message+"]</font>" );
			} else {
				win.document.title = "Recording/Problem";
				win.document.open();
				win.document.writeln( "<h3>Sound recording component doesn't work correctly. </h3>" );
				win.document.writeln( "<hr>" );
				win.document.writeln(
					"<b>If You just installed recording component restart Your browser.</b><br><br>" );
				win.document.writeln(
					"<b>In other situations, reinstall component:<ul>" );
				win.document.writeln(
					"<li><a href='/data/pages/flash/recording/leorec.exe'>sound recroding</a>" );
				win.document.writeln(
					"<li><a href='/data/pages/flash/recording/flashrcg.exe'>speech recognition</a>" );
				win.document.writeln(
					"</ul>" );
				win.document.writeln( "If problem repeats please contact Your administrator.<br>" );

				win.document.writeln( "<hr>" );
				win.document.writeln(
					"<font color=red>[Code: 0x"+uHex2String(e.number)+", message: "+e.message+"]</font>" );
			
			}
			
			win.document.close();
			
			window.installOpened = true;
		}
	}

	return sessionID;
}

function startRecording( sessionID, maxSize )
{
	var res = true;
	try {
		recServer.Record( sessionID, maxSize );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function startPlaying( sessionID )
{
	var res = true;
	try {
		recServer.Play( sessionID );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function startListening( sessionID )
{
	var res = true;
	try {
		recServer.Listen( sessionID );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function setMicVolume( sessionID, vol )
{
	var res = true;
	try {
		recServer.setMicVolume( sessionID, vol );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function getMicVolume( sessionID )
{
	var res = true;
	try {
		var val = recServer.getMicVolume( sessionID );
		
		var target = window.session2target[sessionID];
		
		page.SetVariable( target+".$$micVolume", ""+val );
		page.TCallLabel( target, "micVolumeNotify" );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function recorderStop( sessionID )
{
	var res = true;
	try {
		recServer.Stop( sessionID );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function closeSession( sessionID ) {
	var res = true;
	try {
		recServer.CloseSession( sessionID );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function saveSession( targetName, sessionID )
{		
	window.target2session[targetName] = sessionID;
	window.session2target[sessionID] = targetName;
}

function addExtension( sessionID, guid, shortname )
{
	var res = true;
	try {
		recServer.AddExtension( sessionID, guid, shortname );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		var wn = window.open(	"/data/pages/flash/recording/extension.jsp?platform=win&browser=ie&guid="+guid+"&err="+uHex2String(e.number), 
										"_blank", "width=450,height=300,toolbar=no,status=yes" );
		
		if ( typeof(wn)!="object" ) {		
			var msg = document.getElementById("messages");
			msg.style.display = "block";
			var src = "/data/pages/flash/recording/extension.jsp?platform=win&browser=ie&guid="+guid+"&err="+uHex2String(e.number);
			msg.innerHTML += "<iframe width='100%' height='300' src='"+src+"' />";
		}
		
		res = false;
	}

	return res;
}

function callExtension( sessionID, shortname, type, data )
{	
	var res = true;
	try {
		recServer.CallExtension( sessionID, shortname, type, data );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description;

		res = false;
	}

	return res;
}

function recordingCreated() {
	window.setTimeout( "recordingCreatedClose()", 40 );
}

function recordingCreatedClose() {
	recServer.attachEvent( "onrecordstart", recServer_OnRecordStart );
	recServer.attachEvent( "onprogress", window.recServer_OnProgress );
	recServer.attachEvent( "onrecordstop", recServer_OnRecordStop );
	recServer.attachEvent( "onplaystop", recServer_OnPlayStop );
	recServer.attachEvent( "onrecordererror", recServer_OnRecorderError );
	recServer.attachEvent( "onlevel", recServer_OnLevel );
	recServer.attachEvent( "onplaystart", recServer_OnPlayStart );
	recServer.attachEvent( "onextensiondata", recServer_OnExtensionData );
	
	jLog( "recordingCreatedClose" );
	clearInterval( document.recordingCreatedItv );

	document.recordingStarted = true;
	document.recordingStarting = false;
	jLog( "sending pending operations" );
	
	for( var i=0; i<document.recCommands.length; ++i ) {
		var cmd = document.recCommands[i];
		fs_handleRecording( cmd.cmd, cmd.pars );
	}
}

function fs_handleRecording( command, params ) {
	if ( typeof(window.target2session)=="undefined" ) 
		window.target2session = new Object();
	if ( typeof(window.session2target)=="undefined" ) 
		window.session2target = new Object();
	
	var res = false;
	
	if ( command.indexOf( "recording." )==0 ) {
		res = true;
		
		if ( document.recordingStarted!=true ) {
			if ( typeof(document.recCommands)=="undefined" )
				document.recCommands = new Array();
			document.recCommands.push( { cmd: command, pars: params } );
			
			createRecServer();
		}
		else {		
			command = command.substring( command.indexOf(".")+1 );
			if ( command=="startsession" ) {
				var sessionID = startRecSession();
				if ( sessionID>=0 )
					saveSession( params, sessionID );
				//else
				//	sessionStartFailed( params );

				jLog( "rec session: "+params+" - "+sessionID );
				window.status = "recording ok"
			}
			else if ( command=="record" ) {
				var ix = params.indexOf( "," );
				var targetName = params.substring( 0, ix );
				var maxSize = parseInt( params.substring(ix+1), 10 );
				if ( !isFinite( maxSize ) )
					maxSize = 1000000;
				var sessionID = window.target2session[targetName];

				startRecording( sessionID, maxSize );			
			}
			else if ( command=="stop" ) {
				var targetName = params;
				var sessionID = window.target2session[targetName];

				recorderStop( sessionID );			
			}
			else if ( command=="play" ) {
				var targetName = params;
				var sessionID = window.target2session[targetName];

				startPlaying( sessionID );			
			}
			else if ( command=="listen" ) {
				var targetName = params;
				var sessionID = window.target2session[targetName];

				startListening( sessionID );			
			}
			else if ( command=="setmicvolume" ) {
				var ix = params.indexOf( "," );
				var targetName = params.substring( 0, ix );
				var vol = parseInt( params.substring(ix+1), 10 );
				if ( !isFinite( vol ) )
					maxSize = 100;
				var sessionID = window.target2session[targetName];

				setMicVolume( sessionID, vol );
			}
			else if ( command=="getmicvolume" ) {
				var targetName = params;
				var sessionID = window.target2session[targetName];

				getMicVolume( sessionID );
			}
			else if ( command=="closesession" ) {
				var targetName = params;
				var sessionID = window.target2session[targetName];

				closeSession( sessionID );			
			}
			else if ( command=="addextension" ) {
				var ix = params.indexOf( "," );
				var targetName = params.substring( 0, ix );
				params = params.substring(ix+1);
				ix = params.indexOf( "," );
				var guid = params.substring( 0, ix );
				var shortName = params.substring(ix+1);

				var sessionID = window.target2session[targetName];

				addExtension( sessionID, guid, shortName );
			}
			else if ( command=="callextension" ) {
				var ix = params.indexOf( "," );
				var targetName = params.substring( 0, ix );
				params = params.substring(ix+1);
				ix = params.indexOf( "," );
				var shortName = params.substring( 0, ix );
				params = params.substring(ix+1);
				ix = params.indexOf( "," );
				var type = params.substring( 0, ix );
				var data = params.substring(ix+1);

				var sessionID = window.target2session[targetName];

				callExtension( sessionID, shortName, type, data );
			}
		}
	}
		
	return res;
}

function recServer_OnProgress(sessionID,prg) {
	var target = window.session2target[sessionID];
	
	page.SetVariable( target+".$$progress", ""+prg );
	try {
		page.TCallLabel( target, "progressNotify" );
	}
	catch( e ) {
		var msg = "recServer_OnProgress error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description+" -> "+sessionID;
		jLog( msg );
	}
}

function recServer_OnRecordStop( sessionID ) {
	jLog( "recstop: "+sessionID );
	var target = window.session2target[sessionID];
	
	page.TCallLabel( target, "recordStopNotify" );
}

function recServer_OnPlayStop( sessionID ) {
	var target = window.session2target[sessionID];
	
	try {
		page.TCallLabel( target, "playStopNotify" );
	}
	catch( e ) {
		window.status = "Error: 0x"+
				uHex2String(e.number)+
				", message: "+
				e.description+
				"notification: "+target;
	}
}

function recServer_OnRecorderError( sessionID, eid ) {
	var target = window.session2target[sessionID];
	
	page.SetVariable( target+".$$error", ""+eid );
	page.TCallLabel( target, "recordErrorNotify" );
}

function recServer_OnLevel( sessionID, level ) {
	var target = window.session2target[sessionID];
		
	page.SetVariable( target+".$$level", ""+level );
	page.TCallLabel( target, "levelNotify" );
}

function recServer_OnPlayStart( sessionID ) {
	var target = window.session2target[sessionID];
	
	page.TCallLabel( target, "playStartNotify" );
}

function recServer_OnRecordStart( sessionID ) {
	jLog( "recstart: "+sessionID );
	var target = window.session2target[sessionID];
	
	page.TCallLabel( target, "recordStartNotify" );
}

function recServer_OnExtensionData( sessionID, shortName, type, data ) {
	var target = window.session2target[sessionID];
		
	page.SetVariable( target+".$$shortName", ""+shortName );
	page.SetVariable( target+".$$type", ""+type );
	page.SetVariable( target+".$$data", ""+data );
	
	page.TCallLabel( target, "extensionData" );
}
