

/*

	das dynamische Skript, um srt/sub/ssa-Untertitel zeitlich zu versetzen



Prozeduren:
  - convertSrtTime2Sec
  - convertSrtSec2Time
  - convertSubTime2Sec
  - convertSubSec2Time
  - convertSsaTime2Sec
  - convertSsaSec2Time
? - isTimeCol (Zeitzeile)
  - calNewTime
? - preCheck
  - generateOutputGuiAtOnce ()
  - generateOutputGuiInParts ()
* - change2Srt
* - change2Sub
* - change2Ssa
* - st_onkey (enthält die Reaktion auf die Enter-Taste)
* - st_adjust (enthält )

/*---------------------------------------------------------------------------------------------------------------*/


// globale Variablen

	// der angegebene Dateityp
	var untertitelformat ="srt";
	// die 4 Zeitinputs in Sekunden
	var fruehe_einblendung_alte_zeit, fruehe_einblendung_neue_zeit, spaete_einblendung_alte_zeit, spaete_einblendung_neue_zeit;
	// srt-Zeitzeilen können mit einer Nummer beginnen
	var srt_nummer, srt_laufnummer, ssa_praefix, ssa_suffix;
	// der lineare Steigungsfaktor
	var zerrfaktor = 1;
	// Schleifenvariablen der einzelnen Zeitangaben
	var erste_zeit_in_sek, zweite_zeit_in_sek;
	// die Anzahl der Punkte im Fortschrittstext == Anzahl der Methodenaufrufe mit setTimeout, damit die DOM-Anweisungen auch angezeigt werden
	var anzahl_punkte = 39;
	// der st-Inhalt als Array
	var st_zeilen;
	// der versetzte st-Inhalt als String
	var st_zeilen_erg;
	// der Inhalt der letzten übersetzten st-Zeile (nötig, wenn ein Übersetzungsteil mit einer Zeitzeile beginnt)
	var letzte_zeile;
	// der aktuelle Timeout
	var last_timeout;
	// dazu den Zustand festhalten [normal, busy]
	var anzeige_modus = "normal";
	// boolscher Datentyp um auszugeben, dass keine Zeitzeile im angegebenen Format gefunden wurde
	var is_valid;
	// die Art des Zeilenumbruchs (Standard ist Windows)
	var linebreak = "\r\n";





function convertSec2Time (param_time_in_sec)
{
}



//wandelt eine srt-Zeitangabe in die entsprechende Anzahl Sekunden (benötigt für die 4 Zeitinputs und die versetzende srt-Schleife)
function convertSrtTime2Sec (param_string)
{
	//alle Whitespaces aus param-String entfernen (es scheint keinen x-Modifier in js zu geben)
	param_string = param_string.replace (/\s/g, "");
	 
	var suchmuster = /^(-?\d\d)\:(\d\d)\:(\d\d),(\d\d\d)$/;			 /* php js
																	    \A  ^
																	    \Z  $  */
	 
	// erg speichert die verschiedenen Suchergebnisse
	var erg = suchmuster.exec (param_string);
	if (erg == null)
		return "NaN";
	 
	// das Ergebnis generieren: führende Nullen bedeuten Zahlen im Oktalsystem, deshalb den radix-Parameter in parseInt verwenden
	if (param_string.charAt(0) == '-')
		return ( -1*(-3600*parseInt(erg[1],10) + 60*parseInt(erg[2],10) + parseInt(erg[3],10) + parseInt(erg[4],10)/1000) );
	else
		return ( 3600*parseInt(erg[1],10) + 60*parseInt(erg[2],10) + parseInt(erg[3],10) + parseInt(erg[4],10)/1000 );
}





// wandelt eine srt-Zeitangabe [Sekunden] gerundet in die entsprechende Zeit [(-)xx:xx:xx,xxx (x bel. Ziffer)]
function convertSrtSec2Time (param_time_in_sec)
{
	var erg = '';
	if (param_time_in_sec < 0)
	{
		erg = erg + '-';
		param_time_in_sec = -1*param_time_in_sec;
	}

	var std = parseInt (param_time_in_sec/3600);
	if (std < 10)
		erg = erg + '0';
	erg = erg + std + ':';
	var min = param_time_in_sec - std*3600; //min kleiner als 3600
	
	min = parseInt (min/60);
	if (min < 10)
		erg = erg + '0';
	erg = erg + min + ':';
	var sec = param_time_in_sec - std*3600 - min*60;
	
	sec = parseInt (sec);
	if (sec < 10)
		erg = erg + '0';
	erg = erg + sec + ',';
	var msec = parseInt (param_time_in_sec*1000 - (parseInt (param_time_in_sec))*1000);
	if (msec < 100)
		erg = erg + '0';
	if (msec < 10)
		erg = erg + '0';
	erg = erg + msec;
	
	return erg;
}

// (-)xx:xx:xx.xx
function convertSubTime2Sec (param_string)
{
	// auf srt bringen: Punkt durch Komma ersetzen und eine 0 anfügen
	param_string = param_string.replace ('.', ',');
	param_string = param_string + "0";
	return (convertSrtTime2Sec (param_string));
}

// (-)xx:xx:xx.xx
function convertSubSec2Time (param_time_in_sec)
{
	var erg = convertSrtSec2Time (param_time_in_sec);
	// erg auf sub bringen: Komma durch Punkt ersetzen und letzte Stelle löschen (runden kann kompliziert werden, für 1/100 Sekunde nicht nötig)
	erg = erg.replace (',', '.');
	erg = erg.substring (0, erg.length-1);
	return erg;
}


// (-)x:xx:xx.xx
function convertSsaTime2Sec (param_string)
{
	// von ssa auf sub bringen: an erster oder zweiter Stelle eine 0 einfügen
	if (param_string.charAt (0) == '-')
		param_string = '-0' + param_string.substring (1, param_string.length);
	else
		param_string = '0' + param_string;
	// dann als sub konvertieren
	return (convertSubTime2Sec (param_string));
}


// (-)x:xx:xx.xx
function convertSsaSec2Time (param_time_in_sec)
{
	// vom sub-Format auf ssa bringen
	var erg = convertSubSec2Time (param_time_in_sec);
	// die Zehner-Stundenzahl löschen
	if (erg.charAt (0) == '-')
		erg = "-" + erg.substring (2, erg.length);
	else
		erg = erg.substring (1, erg.length);
	return erg;
}


// prüft unter einer Schleife, ob eine Zeitenzeile vorliegt (setzt dann das Dateiformat
					// und die beiden globalen Zeitvariablen in Sekunden); boolscher RGW
function isTimeCol (param_string)
{
	// auf alle Dateitypen der Reihe nach prüfen
	if (untertitelformat == "srt")
	{
		var erg = /^\s*(\d+\s+)?(-?\d\d\:\d\d\:\d\d,\d\d\d)\s*-->\s*(-?\d\d\:\d\d\:\d\d,\d\d\d)\s*$/;  //--> so geht's
		erg = erg.exec (param_string);
		
		if (erg == null)
			return false;

		srt_nummer = erg[1];
		if (erg[1] == null)
			srt_nummer = "";
		erste_zeit_in_sek = convertSrtTime2Sec (erg[2]);
		zweite_zeit_in_sek = convertSrtTime2Sec (erg[3]);
		return true;
	}


	if (untertitelformat == "sub")
	{
		// 00:01:00.10,00:02:00.20
		var erg = /^(-?\d\d\:\d\d\:\d\d\.\d\d),(-?\d\d\:\d\d\:\d\d\.\d\d)\s*$/;
		erg = erg.exec (param_string);
		
		if (erg == null)
			return false;

		erste_zeit_in_sek = convertSubTime2Sec (erg[1]);
		zweite_zeit_in_sek = convertSubTime2Sec (erg[2]);
		return true;
	}


	if (untertitelformat == "ssa")
	{
		// Marked=0,0:02:32.85,0:02:34.33,.*
		var erg = /^(.*)?(-?\d\:\d\d\:\d\d\.\d\d),(-?\d\:\d\d\:\d\d\.\d\d)(.*)$/;
		erg = erg.exec (param_string);
		
		if (erg == null)
			return false;

		ssa_praefix = erg[1];
		erste_zeit_in_sek = convertSsaTime2Sec (erg[2]);
		zweite_zeit_in_sek = convertSsaTime2Sec (erg[3]);
		ssa_suffix = erg[4];
		return true;
	}
	
	return false;
}





// errechnet die neue Zeit proportional zu den angegebenen zwei Zeitpunkten
function calNewTime (param_time_in_sec)
{
	return (fruehe_einblendung_neue_zeit + (param_time_in_sec - fruehe_einblendung_alte_zeit)*zerrfaktor);
}






// prüft die Benutzereingaben und gibt ggf. eine spezifische Fehlermeldung aus
function preCheck ()
{
	if (untertitelformat == 'srt')
	{
		fruehe_einblendung_alte_zeit = convertSrtTime2Sec (document.forms[0].elements[0].value);
		fruehe_einblendung_neue_zeit = convertSrtTime2Sec (document.forms[0].elements[1].value);
		spaete_einblendung_alte_zeit = convertSrtTime2Sec (document.forms[0].elements[2].value);
		spaete_einblendung_neue_zeit = convertSrtTime2Sec (document.forms[0].elements[3].value);
		pattern_alert = "the time pattern has to be in the format (-)xx:xx:xx,xxx where x's are digits.";
	}
	if (untertitelformat == 'sub')
	{
		fruehe_einblendung_alte_zeit = convertSubTime2Sec (document.forms[0].elements[0].value);
		fruehe_einblendung_neue_zeit = convertSubTime2Sec (document.forms[0].elements[1].value);
		spaete_einblendung_alte_zeit = convertSubTime2Sec (document.forms[0].elements[2].value);
		spaete_einblendung_neue_zeit = convertSubTime2Sec (document.forms[0].elements[3].value);
		pattern_alert = "the time pattern has to be in the format (-)xx:xx:xx.xx where x's are digits.";
	}
	if (untertitelformat == 'ssa')
	{
		fruehe_einblendung_alte_zeit = convertSsaTime2Sec (document.forms[0].elements[0].value);
		fruehe_einblendung_neue_zeit = convertSsaTime2Sec (document.forms[0].elements[1].value);
		spaete_einblendung_alte_zeit = convertSsaTime2Sec (document.forms[0].elements[2].value);
		spaete_einblendung_neue_zeit = convertSsaTime2Sec (document.forms[0].elements[3].value);
		pattern_alert = "the time pattern has to be in the format (-)x:xx:xx.xx where x's are digits.";
	}
	
	if (isNaN (fruehe_einblendung_alte_zeit))
	{
		alert (pattern_alert);
		document.forms[0].elements[0].focus();
		document.forms[0].elements[0].select();
		return false;
	}
	if (isNaN (fruehe_einblendung_neue_zeit))
	{
		alert (pattern_alert);
		document.forms[0].elements[1].focus();
		document.forms[0].elements[1].select();
		return false;
	}
	if (isNaN (spaete_einblendung_alte_zeit))
	{
		alert (pattern_alert);
		document.forms[0].elements[2].focus();
		document.forms[0].elements[2].select();
		return false;
	}
	if (isNaN (spaete_einblendung_neue_zeit))
	{
		alert (pattern_alert);
		document.forms[0].elements[3].focus();
		document.forms[0].elements[3].select();
		return false;
	}
	if (document.forms[0].elements[5].value == "")
	{
		alert ("the script doesn't make sense without a " + untertitelformat + "-content");
		document.forms[0].elements[5].focus();
		document.forms[0].elements[5].select();
		return false;
	}
	
	if ((spaete_einblendung_alte_zeit - fruehe_einblendung_alte_zeit) == 0)
	{
		alert ("please use two different appearances of your " + untertitelformat + " data");
		document.forms[0].elements[2].focus();
		document.forms[0].elements[2].select();
		return false;
	}
	if ((spaete_einblendung_neue_zeit - fruehe_einblendung_neue_zeit) == 0)
	{
		alert ("please use two different appearances in the adjusted version");
		document.forms[0].elements[3].focus();
		document.forms[0].elements[3].select();
		return false;
	}
	// den Nummerierungs-Offset prüfen
	if (untertitelformat == 'srt')
	{
		srt_laufnummer = document.forms[0].elements[4].value;
		if (parseInt(srt_laufnummer) != srt_laufnummer)
		{
			alert ("please use a valid number as offset");
			document.forms[0].elements[4].focus();
			document.forms[0].elements[4].select();
			return false;
		}
	}
	zerrfaktor = (spaete_einblendung_neue_zeit - fruehe_einblendung_neue_zeit)/(spaete_einblendung_alte_zeit - fruehe_einblendung_alte_zeit);

	return true;
}






// fügt den HTML-Output in einem Schritt strukturell zusammen; schleift unter korrekten Bedingungen durch den st-Inhalt und versetzt die Zeitpositionen
function generateOutputGuiAtOnce ()
{
	// der Output-Container
	var output_textarea = document.getElementById ("stErgebnis");
	
	// der String für den versetzten st-Inhalt
	var erg = "";
	
	// um die Laufnummer im srt-Format ohne größere Umstände anzupassen
	// mit einer prov. letzten Zeile arbeiten, die laufzeitversetzt ins Erg. geschr. wird
	// enthält im Verlauf stets den Zeilenumbruch
	var letzte_zeile = "";

	// Schleife über das Array, um die Zeitangaben zu versetzen
		var zeileninhalt;
	for (i = 0; i < st_zeilen.length; i++)
	{
 		// liegt keine Zeitzeile vor, dann die Zeile unverändert in den Container hängen
		if (!isTimeCol (st_zeilen[i]))	//in isTimeCol werden die beiden ..zeit_in_sek gesetzt
		{
			erg = erg + letzte_zeile;
			letzte_zeile = st_zeilen[i] + linebreak;
		}
		// eine Zeitzeile verändert in den Container hängen
		else
		{
			if (untertitelformat == 'srt')
			{
				// möglicherweise das alternative Format einer srt-Zeitzeile berichtigen
				// srt_nummer wird in isTimeCol gesetzt
				if (srt_nummer != '')
				{
					erg = erg + letzte_zeile;
					letzte_zeile = srt_laufnummer + linebreak;
					srt_laufnummer++;
				}
				// die Nummerierung am Vorgänger-Element anpassen
				else
				{
					// sofern korrekterweise eine Nummer im letzten Textknoten steht, die Nummer anpassen
					if (letzte_zeile != "")
					{
						letzte_zeile = srt_laufnummer + linebreak;
						srt_laufnummer++;
					}
					
				}
				zeileninhalt = convertSrtSec2Time (calNewTime (erste_zeit_in_sek)) + 	" --> " + convertSrtSec2Time (calNewTime (zweite_zeit_in_sek));
			}
			
			if (untertitelformat == 'sub')
				zeileninhalt = convertSubSec2Time (calNewTime (erste_zeit_in_sek)) + 	"," + convertSubSec2Time (calNewTime (zweite_zeit_in_sek));
			
			if (untertitelformat == 'ssa')
				zeileninhalt = ssa_praefix + convertSsaSec2Time (calNewTime (erste_zeit_in_sek)) + "," + convertSsaSec2Time (calNewTime (zweite_zeit_in_sek)) + ssa_suffix;
			
			erg = erg + letzte_zeile;
			letzte_zeile = zeileninhalt + linebreak;
			is_valid = true;
		}
	}
	erg = erg + letzte_zeile;
	output_textarea.value = erg;
}



// fügt den HTML-Output in mehreren Schritten strukturell zusammen; schleift unter korrekten Bedingungen durch den st-Inhalt und versetzt die Zeitpositionen
function generateOutputGuiInParts (param_step)
{
	// der Output-Container und der Fortschrittstext
	var output_textarea = document.getElementById ("stErgebnis");
	var stFortschrittstext = document.getElementById ("stFortschrittstext");
	
	// der String für den versetzten st-Inhalt steht global in st_zeilen_erg - Anfangswert ist ""; genauso der letzte Zeileninhalt
	
	// Schleife über das Array, um die Zeitangaben zu versetzen
		var zeileninhalt;
	for (i = parseInt (param_step*st_zeilen.length/anzahl_punkte); i < parseInt ((param_step+1)*st_zeilen.length/anzahl_punkte); i++)
	{
 		// liegt keine Zeitzeile vor, dann die Zeile unverändert in den Container hängen
		if (!isTimeCol (st_zeilen[i]))	//in isTimeCol werden die beiden ..zeit_in_sek gesetzt
		{
			st_zeilen_erg = st_zeilen_erg + letzte_zeile;
			letzte_zeile = st_zeilen[i] + linebreak;
		}
		// eine Zeitzeile verändert in den Container hängen
		else
		{
			if (untertitelformat == 'srt')
			{
				// möglicherweise das alternative Format einer srt-Zeitzeile berichtigen
				// srt_nummer wird in isTimeCol gesetzt
				if (srt_nummer != '')
				{
					st_zeilen_erg = st_zeilen_erg + letzte_zeile;
					letzte_zeile = srt_laufnummer + linebreak;
					srt_laufnummer++;
				}
				// die Nummerierung am Vorgänger-Element anpassen
				else
				{
					// sofern korrekterweise eine Nummer im letzten Textknoten steht, die Nummer anpassen
					if (letzte_zeile != "")
					{
						letzte_zeile = srt_laufnummer + linebreak;
						srt_laufnummer++;
					}
					
				}
				zeileninhalt = convertSrtSec2Time (calNewTime (erste_zeit_in_sek)) + 	" --> " + convertSrtSec2Time (calNewTime (zweite_zeit_in_sek));
			}
			
			if (untertitelformat == 'sub')
				zeileninhalt = convertSubSec2Time (calNewTime (erste_zeit_in_sek)) + 	"," + convertSubSec2Time (calNewTime (zweite_zeit_in_sek));
			
			if (untertitelformat == 'ssa')
				zeileninhalt = ssa_praefix + convertSsaSec2Time (calNewTime (erste_zeit_in_sek)) + "," + convertSsaSec2Time (calNewTime (zweite_zeit_in_sek)) + ssa_suffix;
			
			st_zeilen_erg = st_zeilen_erg + letzte_zeile;
			letzte_zeile = zeileninhalt + linebreak;
			is_valid = true;
		}
	}
	 
		
	// den Fortschrittstext um einen Punkt ergänzen
	var ftext = "working";
	for (a = 0; a <= param_step; a++)
		ftext = ftext + ".";
	for (a = param_step+1; a < anzahl_punkte; a++)
		ftext = ftext + " ";
	stFortschrittstext.firstChild.nodeValue = ftext;
	 
	// wenn der Prozess abgeschlossen ist, dann das Ergebnis anzeigen
	if (param_step == anzahl_punkte - 1)
	{
		// die allerletzte Zeile übertragen
		st_zeilen_erg = st_zeilen_erg + letzte_zeile;
		output_textarea.value = st_zeilen_erg;
		outputCreated();
	}
	else
		// den nächsten Abschnitt des st-Inhalts in einer ausreichenden Zeit versetzen, damit das DOM sich aktualisieren kann
		// ohne setTimeout wird der Fortschrittstext nicht aktualisiert
		last_timeout = setTimeout ("generateOutputGuiInParts (" + (param_step+1) + ")", 0);
}




// enthält die abschließenden Routinen nach der Generierung des Outputs
function outputCreated ()
{
	// die Abkürzungen auf DOM-Elemente
	var output_textarea = document.getElementById ("stErgebnis");
	var stFortschrittstext = document.getElementById ("stFortschrittstext");
	var stInhaltsbeschriftung = document.getElementById ("stInhaltsbeschriftung");
	
	// den adjust-Button mit 'back' beschriften
	document.getElementById ("swSubmitschalter").firstChild.nodeValue = "back";
	 
	// wieder auf die Entertaste reagieren (weg von 'busy')
	anzeige_modus = "normal";
	 
	// über den Fall benachrichtigen, wenn keine Zeitzeile versetzt wurde
	// dann braucht auch kein Ergebnis angezeigt zu werden
	if (!is_valid)
	{
		setTimeout ("st_adjust()", 400);
		alert ("no " + untertitelformat + " records were found in your data.");
		return;
	}

	// das Ausgabefenster und den Alternativschalter hervorziehen
	output_textarea.style.visibility = "visible";
	stInhaltsbeschriftung.firstChild.nodeValue = "adjusted " + stInhaltsbeschriftung.firstChild.nodeValue;
	 
	// die Ausgabe markieren
	output_textarea.select();
	 
	// den Benutzer über den Erfolg benachrichtigen
	stFortschrittstext.firstChild.nodeValue = "Done. Now copy & paste the text in a " + untertitelformat + "-file.";
	//											now copy and paste the selected text in a (new) srt file
}


// Hilfsroutine für change2Srt, change2Sub, change2Ssa: liefert formatunabhängig die Sekunden der übergebenen Zeit zurück
function getSeconds (param_zeit)
{
	var sec;
	sec = convertSrtTime2Sec (param_zeit);
	if (!isNaN (sec))
		return sec;
	sec = convertSubTime2Sec (param_zeit);
	if (!isNaN (sec))
		return sec;
	sec = convertSsaTime2Sec (param_zeit);
	if (!isNaN (sec))
		return sec;
	
	return 0;
}



/*---------------------------------------------------------------------------------------------------------------*/
/*                                                     public                                                    */


// stellt auf srt-Input um
function change2Srt (param_event)
{
	// die verwendeten Variablen
	var alter_elementknoten;
	var neuer_elementknoten = document.getElementById ('srt');
	var stStartnummer = 2;
	var zeit_i, sec_i;
	
	// die 4 Zeiten von sub oder ssa auf srt bringen
	// keine irgendwo gültige Eingabe wird zurückgesetzt
	for (var i = 0; i < 4; i++)
	{
		zeit_i = document.forms[0].elements[i];
		sec_i = getSeconds (zeit_i.value);
		zeit_i.value = convertSrtSec2Time (sec_i);
	}
//alert (parseInt ("0" + convertSrtTime2Sec (zeit_i.value), 10) + " - " + parseInt ("0" + convertSubTime2Sec (zeit_i.value), 10) + " - " + parseInt ("0" + convertSsaTime2Sec (zeit_i.value), 10));

	if (untertitelformat == 'srt')
		return;
	
	// die Anzeige anpassen, Unterstrich und Cursor wechseln, Startnummerinput einblenden
	if (untertitelformat == 'sub')
		alter_elementknoten = document.getElementById ('sub');
	else // ssa
		alter_elementknoten = document.getElementById ('ssa');
	// die Anzeige anpassen, Unterstrich und Cursor wechseln, Startnummer-Input einblenden
	alter_elementknoten.style.borderBottomWidth = "0px";
	neuer_elementknoten.style.borderBottomWidth = "1px";
/*	// ie5.5 bricht das Skript bei der Cursor-Zuweisung ab, aber läßt den Cursor nicht als undefined erkennen
	if (alter_elementknoten.style.cursor != "undefined")
	{
		alter_elementknoten.style.cursor = "pointer";
		neuer_elementknoten.style.cursor = "default";
	}
*/
	document.getElementById ('stInhaltsbeschriftung').firstChild.nodeValue = "srt file content";
	document.getElementById ('stStartnummer').style.display = "block";
	
	untertitelformat = 'srt';
}



// stellt auf sub-Input um
function change2Sub (param_event)
{
	// die verwendeten Variablen
	var alter_elementknoten;
	var neuer_elementknoten = document.getElementById ('sub');
	var zeit_i, sec_i;
	
	// die 4 Zeiten von srt oder ssa auf sub bringen
	// keine irgendwo gültige Eingabe wird zurückgesetzt
	for (var i = 0; i < 4; i++)
	{
		zeit_i = document.forms[0].elements[i];
		sec_i = getSeconds (zeit_i.value);
		zeit_i.value = convertSubSec2Time (sec_i);
	}

	if (untertitelformat == 'sub')
		return;
	
	// die Anzeige anpassen, Unterstrich und Cursor wechseln, Startnummerinput ausblenden
	if (untertitelformat == 'srt')
		alter_elementknoten = document.getElementById ('srt');
	else // ssa
		alter_elementknoten = document.getElementById ('ssa');
	// die Anzeige anpassen, Unterstrich und Cursor wechseln
	alter_elementknoten.style.borderBottomWidth = "0px";
	neuer_elementknoten.style.borderBottomWidth = "1px";
/*	// ie 5.5 erkennt cursor nicht...
	alert (alter_elementknoten.style.cursor);
//	if (alter_elementknoten.style.cursor != "undefined")
	{
		alter_elementknoten.style.cursor = "pointer";
		neuer_elementknoten.style.cursor = "default";
	}
*/
	document.getElementById ('stInhaltsbeschriftung').firstChild.nodeValue = "sub file content";
	document.getElementById ('stStartnummer').style.display = "none";
	
	untertitelformat = 'sub';
}




// stellt auf ssa-Input um
function change2Ssa (param_event)
{
	// die verwendeten Variablen
	var alter_elementknoten;
	var neuer_elementknoten = document.getElementById ('ssa');
	var zeit_i, sec_i;
	
	// die 4 Zeiten von srt oder sub auf ssa bringen
	// keine irgendwo gültige Eingabe wird zurückgesetzt
	for (var i = 0; i < 4; i++)
	{
		zeit_i = document.forms[0].elements[i];
		sec_i = getSeconds (zeit_i.value);
		zeit_i.value = convertSsaSec2Time (sec_i);
	}

	if (untertitelformat == 'ssa')
		return;
	
	// die Anzeige anpassen, Unterstrich und Cursor wechseln, Startnummerinput ausblenden
	if (untertitelformat == 'srt')
		alter_elementknoten = document.getElementById ('srt');
	else // sub
		alter_elementknoten = document.getElementById ('sub');
	// die Anzeige anpassen, Unterstrich und Cursor wechseln
	alter_elementknoten.style.borderBottomWidth = "0px";
	neuer_elementknoten.style.borderBottomWidth = "1px";
/*	// ie 5.5 erkennt cursor nicht...
	if (alter_elementknoten.style.cursor != 0)
	{
		alter_elementknoten.style.cursor = "pointer";
		neuer_elementknoten.style.cursor = "default";
	}
*/
	document.getElementById ('stInhaltsbeschriftung').firstChild.nodeValue = "ssa file content";
	document.getElementById ('stStartnummer').style.display = "none";
	
	untertitelformat = 'ssa';
}





// leitet die adjust-Funktion per Entertaste ein (startet im ie5.5 nur bei der Entertaste)
function st_onkey (param_event)
{
	// wenn das Kommentarfenster geöffnet ist, dann soll nicht auf Enter o.ä. reagiert werden
	if ((document.getElementById ("ordKommentarFormular")) && (document.getElementById ("ordKommentarFormular").style.display == "block"))
		return;
	
	var taste;
	if (window.event)	// ie
		taste = window.event.keyCode;
	else
		taste = param_event.which;
	 
	// wurde Enter gedrückt?
	if ( ((taste == 13) || (taste == 10)) && (anzeige_modus == "normal")/*eigentlich das Textarea ausschließen, aber egal*/ )
		st_adjust();
	 
//	// in der Ergebnisanzeige auch per Backspace zurück zur Eingabe
//	if ( (document.getElementById ("swSubmitschalter").firstChild.nodeValue == "back") && (taste == 8) )
//		st_adjust();
//	--> zu viele Seiteneffekte (löscht ein Zeichen oder sogar eine ganze Markierung der vorherigen Eingabe)
	 
}



// leitet je nach Modus [adjust, back] den entsprechenden Prozess ein
function st_adjust ()
{

	// Modus [adjust, back] über die Beschriftung des Submitschalters bestimmen
	var modus = document.getElementById ("swSubmitschalter").firstChild.nodeValue;

	// DOM-Elemente abkürzen (Ausgabe-Box, ihre Beschriftung, der Fortschrittstext)
	var output_textarea = document.getElementById ("stErgebnis");
	var stInhaltsbeschriftung = document.getElementById ("stInhaltsbeschriftung");
	var stFortschrittstext = document.getElementById ("stFortschrittstext");

	// im back-Modus:
	if (modus == "back")
	{
		// den Fortschrittstext ausblenden
		stFortschrittstext.style.visibility = "hidden";
	 
		// das Ausgabefenster nach hinten schieben
		output_textarea.style.visibility = "hidden";
	 
		// den back-Button mit 'adjust' beschriften --> impliziert Moduswechsel
		document.getElementById ("swSubmitschalter").firstChild.nodeValue = "adjust";
		
		// die Untertitelauswahl wieder einblenden
		document.getElementById ("stFormatauswahl").style.visibility = "visible";
		
		// von 'adjusted xxx file content' wieder zurück auf 'xxx file content'
		stInhaltsbeschriftung.firstChild.nodeValue = untertitelformat + " file content";
		
		// das Textarea markieren
		document.forms[0].elements[5].select();
	 
		// den Fokus wieder zurücksetzen auf das Benutzerfeld (1.Tabschlag -> 1.Input)
		document.getElementById ("swBenutzerfeld").focus();
		
		return;
	}

	// im adjust-Modus:
	if ( preCheck() )
	{
		// in einer Sek. den Fortschrittstext hochfahren
//		setTimeout ()
		// den Output starten; währenddessen die Punkte nachtragen; zuletzt - done; Ergebniscontainer + Alternativschalter anzeigen
		// -> die Anzeige muss dann in generateOutputGui starten, sonst wird die zeitliche Synchronisation schwierig
		// in einer Sek. den Text ausblenden; minimal verweilen
		// in einer Sek. die Bedienanweisung hochfahren


		// während der Berechnung nicht mehr auf Enter reagieren (wird in outputCreated zurückgesetzt)
		anzeige_modus = "busy";
		
		// zu Anfang sind die Untertiteldaten ungültig
		is_valid = false;
		
		// die Untertitelauswahl ausblenden (braucht es für den kommenden back-Modus nicht)
		document.getElementById ("stFormatauswahl").style.visibility = "hidden";
		
		// den Fortschrittstext initialisieren
		stFortschrittstext.firstChild.nodeValue = "working                                   ";
		stFortschrittstext.style.visibility = "visible";

		/*
		leider funktioniert ändereDOM --> generateOutputGui --> ändereDOM nicht, die erste Änderung wird erst
		nach der Generierung ausgeführt. Scheinbar gibt es keine wait-Funktion in js, deshalb muss mit setTimeout
		gearbeitet werden. Das bedeutet, die Berechnung des versetzten st-Inhalts in anzahl_punkte Teile zu
		zerlegen, sie über setTimeout aufzurufen und die Schleifenvariable global zu verankern. Was ein Krampf!
		*/
		
		// nun also die st_zeilen global verankern, um auf deren Länge zugreifen zu können
		// da split mit einem regulären Ausdruck nicht einwandfrei funktioniert zunächst alle \r\n nach \n bringen, danach alle \r nach \n
		st_zeilen = (document.forms[0].elements[5].value);
		st_zeilen = st_zeilen.replace (/\r\n/g, "\n");
		st_zeilen = st_zeilen.replace (/\n\r/g, "\n");
		st_zeilen = st_zeilen.replace (/\r/g, "\n");
		st_zeilen = st_zeilen.split("\n"); //ehem. (/(\r\n|\n|\r)/);
		
		// wenn weniger als anzahl_punkte Zeilen zu versetzen sind, dann lohnt sich die Fortschrittsanzeige nicht
		if (st_zeilen.length < anzahl_punkte)
		{
			generateOutputGuiAtOnce ();
			outputCreated ();
		}
		else
		{
			// st_zeilen_erg und letzten Zeileninhalt zurücksetzen
			st_zeilen_erg = "";
			letzte_zeile = "";
			// das Ausgabefenster generieren (durch den st-Inhalt schleifen und die Zeitangaben versetzen)
			last_timeout = setTimeout ("generateOutputGuiInParts (0)", 100);
		}
	}
}



