var recErrorLocalization = {
	pl: {
		head: "<h3>Komponent nagrywania nie działa prawidłowo. </h3>",
		body: "<b>Jeżeli właśnie zainstalowałeś komponenty, zrestartuj przeglądarkę</b><br><br>"+				
				"Jeżeli problem się powtarza skontaktuj się z administratorem.<br>",
		title: "Nagrywanie/Problem"
	},
	nl: {
		title: "Het programma om geluid op te nemen ontbreekt op de pc",
		head: "Het programma om geluid op te nemen ontbreekt op de pc",
		body:	"<p>Het ActiveX-onderdeel (yrecording.cab) dat het programma nodig heeft om "+
				"geluid op te nemen en af te luisteren, is niet op de computer geïnstalleerd."+
				"Het bestand is te installeren door op de gele waarschuwingsbalk in de "+
				"browser te klikken. Klik vervolgens op de knop 'ActiveX besturingselement "+
				"installeren'.</p>"+
				"<p>Indien je geen rechten hebt om dit programma te installeren, raadpleeg "+
				"dan de eigenaar van de computer of de systeembeheerder.</p>"+
				"<p>Dit onderdeel is ontwikkeld door Young Digital Planet S.A. in opdracht "+
				"van Uitgeverij Malmberg.</p>"
	},
	_any_: {
		head: "<h3>Recording components do not work correctly. </h3>",
		body: "<b>If you just installed recording components, restart your browser.</b><br><br>"+
				"If the problem recurs, please contact your administrator.<br>",
		title: "Recording/Problem"
	}
}

document.recordingStarted = false;
document.recordingStarting = false;
document.recordingError = 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 exStatus(e) {
	var s = "Rec error: 0x"+uHex2String(e.number)+", message: "+e.description;
	jLog(s);
	return s;
}

function createRecServer() {
	window.setTimeout( "createRecServerImpl()", 40 );
}

function createRecServerImpl() {
	if ( document.recordingStarting!=true ) {
		document.recordingStarting = true;
	
		var recHolder = document.getElementById('recplaceholder');
		
		var base = location.href;
		var six = base.lastIndexOf( "/" );
		if ( six==-1 )
			base = "";
		else
			base = base.substring( 0, six+1 );

		var oHTML = 
			'<object id=recServer classid="clsid:82CF9738-0BDA-4AAF-AB08-5AC5875FF3BB" width="0" height="0" '+
				'codebase="'+base+'../localplayer/recording/yrecording.cab#version=1,5,2,4" '+
				'onreadystatechange="if (document.getElementById(\'recServer\').readyState==4) recordingCreated();">'+
			'</object>\n';
		
		recHolder.innerHTML = oHTML;
	}
}

/**
 * Pobiera z mapy zlokalizowany obiekt.
 */
function getLocalized( locMap ) {
	var lang = InternetExplorer ? window.clientInformation.userLanguage : navigator.language;
	lang = lang.toLowerCase();
	var l = locMap[lang];
	var hix;
	while( typeof(l)=="undefined" && (hix=lang.lastIndexOf("-"))!=-1 ) {
		lang = lang.substring( 0, hix );
		l = locMap[lang];
	}
	if ( typeof(l)=="undefined" )
		l = locMap._any_;
	return l;
}

function startRecSession() {
	var sessionID;

	try {
		//var rec = document.getElementById('recServer');
		sessionID = recServer.StartSession();		
	}
	catch( e ) {
		var undef;
		sessionID = undef;

		window.status = exStatus(e);
				
		if ( typeof(window.installOpened)=="undefined" ) {
			var win = window.open( "about:blank", "_blank", "width=500,height=300,toolbar=no" );
			
			var local = getLocalized(recErrorLocalization);
	
			win.document.writeln( local.head );
			win.document.writeln( "<hr>" );
			win.document.writeln( local.body );

			win.document.writeln( "<hr>" );
			win.document.writeln(
				"<font size='1' color=red>[Code: 0x"+uHex2String(e.number)+", message: "+e.message+"]</font>" );
			win.document.close();
			win.document.title = local.title;
			
			window.installOpened = true;
		}
		
		document.recordingError = true;
	}

	return sessionID;
}

function startRecording( sessionID, maxSize )
{
	var res = true;
	try {
		recServer.Record( sessionID, maxSize );
	}
	catch( e ) {
		window.status = exStatus(e);

		res = false;
	}

	return res;
}

function startPlaying( sessionID )
{
	var res = true;
	try {
		recServer.Play( sessionID );
	}
	catch( e ) {
		window.status = exStatus(e);

		res = false;
	}

	return res;
}

function startListening( sessionID )
{
	var res = true;
	try {
		recServer.Listen( sessionID );
	}
	catch( e ) {
		window.status = exStatus(e);

		res = false;
	}

	return res;
}

function pauseSound( sessionID )
{
	var res = true;
	try {
		recServer.Pause( sessionID );
	}
	catch( e ) {
		window.status = exStatus(e);

		res = false;
	}

	return res;
}

function playFromPos( sessionID, pos )
{
	var res = true;
	try {
		recServer.PlayFromPos( sessionID, pos );
	}
	catch( e ) {
		window.status = exStatus(e);

		res = false;
	}

	return res;
}

function setMicVolume( sessionID, vol )
{
	var res = true;
	try {
		recServer.setMicVolume( sessionID, vol );
	}
	catch( e ) {
		window.status = exStatus(e);

		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 = exStatus(e);

		res = false;
	}

	return res;
}

function recorderStop( sessionID )
{
	var res = true;
	try {
		recServer.Stop( sessionID );
	}
	catch( e ) {
		window.status = exStatus(e);

		res = false;
	}

	return res;
}

function closeSession( sessionID ) {
	if ( typeof(sessionID)=="undefined" )
		return false;
	
	var res = true;
	try {
		var t = window.session2target[sessionID];
		window.session2target[sessionID] = null;
		window.target2session[t] = null;
		recServer.CloseSession( sessionID );
	}
	catch( e ) {
		window.status = exStatus(e);

		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 = exStatus(e);

		if ( typeof(this.extWindow)=="undefined" ) {
			this.extWindow = true;
			var wn = window.open(	"../localplayer/recording/extension.html", 
											"_blank", "width=450,height=300,toolbar=no,status=yes" );

			if ( typeof(wn)!="object" ) {		
				var msg = document.getElementById("messages");
				msg.style.display = "block";
				var src = "../localplayer/recording/extension.html?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 = exStatus(e);

		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" );

	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 (document.recordingError) {
				//jLog("ignore due to error cmd recording."+command+" params "+params );
				res = false;
			} else if ( command=="startsession" ) {
				var sessionID = startRecSession();
				if ( sessionID>=0 )
					saveSession( params, sessionID );
				//else
				//	sessionStartFailed( params );

				jLog( "rec session: "+params+" - "+sessionID );
				if (!document.recordingError)
					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 );
			} else if ( command=="pause" ) {
				var targetName = params;
				var sessionID = window.target2session[targetName];

				pauseSound( sessionID );
			} else if ( command=="playfrompos" ) {
				var ix = params.indexOf( "," );
				var targetName = params.substring( 0, ix );
				var pos = parseInt( params.substring(ix+1), 10 );
				if ( !isFinite( pos ) )
					pos = 0;
				var sessionID = window.target2session[targetName];
				
				playFromPos( sessionID, pos );
			}
		}
	}
		
	return res;
}

function recServer_OnProgress(sessionID,prg) {
	var target = window.session2target[sessionID];
	if ( !target )
		return;
	
	page.SetVariable( target+".$$progress", ""+prg );
	page.TCallLabel( target, "progressNotify" );
}

function recServer_OnRecordStop( sessionID ) {
	jLog( "recstop: "+sessionID );
	var target = window.session2target[sessionID];
	if ( !target )
		return;
	
	page.TCallLabel( target, "recordStopNotify" );
}

function recServer_OnPlayStop( sessionID ) {
	var target = window.session2target[sessionID];
	if ( !target )
		return;
	
	try {
		page.TCallLabel( target, "playStopNotify" );
	}
	catch( e ) {
		window.status = exStatus(e)+
				" notification: "+target;
	}
}

function recServer_OnRecorderError( sessionID, eid ) {
	var target = window.session2target[sessionID];
	if ( !target )
		return;
	
	page.SetVariable( target+".$$error", ""+eid );
	page.TCallLabel( target, "recordErrorNotify" );
}

function recServer_OnLevel( sessionID, level ) {
	var target = window.session2target[sessionID];
	if ( !target )
		return;
		
	page.SetVariable( target+".$$level", ""+level );
	page.TCallLabel( target, "levelNotify" );
}

function recServer_OnPlayStart( sessionID ) {
	var target = window.session2target[sessionID];
	if ( !target )
		return;
	
	page.TCallLabel( target, "playStartNotify" );
}

function recServer_OnRecordStart( sessionID ) {
	jLog( "recstart: "+sessionID );
	var target = window.session2target[sessionID];
	if ( !target )
		return;
	
	page.TCallLabel( target, "recordStartNotify" );
}

function recServer_OnExtensionData( sessionID, shortName, type, data ) {
	var target = window.session2target[sessionID];
	if ( !target )
		return;
		
	page.SetVariable( target+".$$shortName", ""+shortName );
	page.SetVariable( target+".$$type", ""+type );
	page.SetVariable( target+".$$data", ""+data );
	
	page.TCallLabel( target, "extensionData" );
}