

//Die nachstehende Funktion ist für die Eingabe der Zahlen mit der Maus da. Zudem überprüft sie, ob die Eingabe nicht länger als 11 Zeichen groß ist.
//Die "lösch" Funktion stehen deshalb vor der hauptfunktion, damit sie auch dann benutzt werden können, wenn die Eingabe genau 11 Zeichen hat. 
//Damit dann auch nach dem löschen die Eingabe möglich ist, wird die Länge neu berechnet!


function Eingabe(f){

	laenge = document.formular.eingabe.value.length;

	if ( f == 12){
		document.formular.eingabe.value = "";
	} 
	if ( f == 13){
		document.formular.eingabe.value = document.formular.eingabe.value.substring(0, laenge-1);
	}  
	
	laenge = document.formular.eingabe.value.length;

	if (laenge < 11){
		if ( f < 10){
			document.formular.eingabe.value = document.formular.eingabe.value + f + "";
		}
		if ( f == 11){
			document.formular.eingabe.value = document.formular.eingabe.value +":";
		}
	}else{
		alert("Your digits are more than 11!");
	}
}


//In dieser Funktion wird die Eingabe so weit wie möglich geprüft und notfalls abgebrochen! ansonsten wird die gewählte berechnung aufgerufen!


function Vorlauf(g){

//1.Schritt: Definition der benötigten Variablen
	
	fps = document.formular.fps.options[document.formular.fps.selectedIndex].value;
	calc= document.formular.eingabe.value;
	laenge= calc.length;
	variable = "";
	ergebnis = "";
	maximaleframes = "";
	abbruch = 0;
	aufhoeren = 0;
	
//Schritt 2: der eingegebene string wrid überprüft 
	
	for (var i = 0; i < laenge; i = i + 1){
		zeichen = calc.charAt(i);
        if (zeichen >= 0){
            variable = variable + zeichen +"";
        } else if (zeichen != ":"){
			abbruch = 1;
			break;
		}
	}
	calc = variable;
	laenge= calc.length;
	
//Schritt 3: der string wird in die richtigen sekmente geteilt

	while (laenge < 8){
		calc = "0" + calc;
		laenge ++;
	}
	
	fram1= calc.substring(laenge-2,laenge);
	sek1= calc.substring(laenge-4, laenge-2);
	min1=calc.substring(laenge-6,laenge-4);
	stu1=calc.substring(laenge-8,laenge-6);
	
//Schritt 4: die maximale anzahl der frames wird für die abbruchbedingung definiert!

	if (fps == 23.98) maximaleframes= 2071525;					
	if (fps == 24)    maximaleframes= 2073599;
	if (fps == 25)    maximaleframes= 2159999;
	if (fps == 29.97) maximaleframes= 2589407;					
	if (fps == 30)    maximaleframes= 2591999;
	if (fps == 50)    maximaleframes= 4319999;
	if (fps == 60)    maximaleframes= 5183999;
	
//Schritt 5: hauptteil: abbruchbedingungen werden definiert und wenn nötig wird schon jetzt abgebrochen, ansonsten die gewählte rechnung aufgerufen!

	if ((calc < 1) || (fps == 0) || (abbruch == 1)){
		if (fps == 0) aufhoeren = 1;
		if ((calc < 1) || (abbruch == 1)) aufhoeren = 2;
		switch(aufhoeren) {
			case 1:
 				alert("Please choose the Frames/s!");
				break;
 			case 2:
 				alert("Please check your Source!");
 				break;
 			default:
 				alert("Do you really know, what you are doing");
 				break;
 		}
	}else{
		if (g==2){
			if (calc > maximaleframes){
				if (calc > maximaleframes) alert("Your Source is too large!");
			}else{
				FrameToTime(calc);
			}
		}
		if (g==1){
			if ((fram1 > (Math.ceil(fps-1))) || (sek1 > 59) || (min1 > 59) || (stu1 > 23) || (laenge > 8)){
				if (fram1 > (fps-1)) aufhoeren = 1;
				if (sek1 > 59) aufhoeren = 2;
				if (min1 > 59) aufhoeren = 3;
				if (stu1 > 23) aufhoeren = 4;
				if (laenge > 8) aufhoeren = 5;
				switch(aufhoeren) {
					case 1:
 						alert("Please check your Source! The frames are more then the frames per seconds.");
						break;
 					case 2:
 						alert("Please check your Source! The seconds are more then 59.");
 						break;
 					case 3:
 						alert("Please check your Source! The minutes are more then 59.");
 						break;
 					case 4:
 						alert("Please check your Source! The hours are more then 23.");
 						break;
 					case 5:
 						alert("Please check your Source! Timecode exist out of 8 numbers!");
 						break;
 					default:
 						alert("Do you really know, what you are doing?");
 						break;
				}

			}else{
				TimeToFrame(calc);
			}
		}
	}

}


//Berechnung vom timecode auf grundlage der angegebenen frames und fps


function TimeToFrame(calc){
	fram1= calc.substring(laenge-2,laenge);
	sek1= calc.substring(laenge-4, laenge-2);
	min1=calc.substring(laenge-6,laenge-4);
	stu1=calc.substring(laenge-8,laenge-6);
	
	document.formular.eingabe.value = stu1 + ":" + min1 + ":" + sek1 + ":" + fram1 + "";

    stu1  *= 1;     //  |
    min1  *= 1;     //  |
    sek1  *= 1;     //   > wird mit 1 multipliziert, da es ansonsten als string angesehen wird
    fram1 *= 1;     //  |
	
	//if ((fps == 23.98) || (fps == 29.97)){
	if (fps == 29.97){
        // Verfahren: Es werden die Frames ausgerechnet, die in dieser Zeit bei 30fps vergangen wären.
        // Anschließend ziehen wir für jede volle Minute zwei Frames ab, ausgenommen die Minuten, die sich durch
        // zehn teilen lassen. Beispiel: Timecode ist 01:22:13:05. Wir errechnen 147.995 Frames. 1h und 22min
        // sind jedoch 82 volle Minuten. Davon sind jedoch 8 Minuten durch zehn teilbar. 82 minus 8 sind 74.
        // Wir ziehen also 74*2 Frames ab, zwei deshalb, weil wir pro Minute zwei Frames
        // abziehen. 74*2 = 148, das ist unser "Abfall".
        // 147.995 - 148 = 147.847 Frames
        
        if( fram1 == 0 || fram1 == 1 ) { // Filtere nicht existente Timecodes
            if( sek1 == 0 ) {
                if( min1 % 10 != 0 ) {
                    document.formular.ergebnis.value = "";
                    alert("This timecode does not exist with 29.97 fps (dropped)!");
                    return;
                }
            }
        }
       
        volle_min = stu1*60+min1;
        ergebnis = volle_min*60+sek1;
        ergebnis = ergebnis*30+fram1; // 30 == Math.ceil(fps)
        teilbar = Math.floor(volle_min/10);
        abfall = (volle_min - teilbar)*2;

        ergebnis -= abfall;
/* Es folgt der Quelltext der "alten" Berechnung, in Gebrauch bis 12/2010
        fps = Math.ceil(fps);
		fram1= 1*fram1														//wird mit 1 multipliziert, da ansonsten fram1 als string angesehen wird
		sek1= fps*sek1;
		min1=60*fps*min1;
		stu1=3600*fps*stu1;

		ergebnis= fram1 + sek1 + min1 + stu1;

		abfall = ergebnis/1000;
		if ((Math.ceil(abfall) - Math.floor(abfall)) == 0){
			abfall  = Math.floor(abfall) - 1 - Math.floor((ergebnis/1000000)/2);	
		}else{
			abfall = Math.floor(abfall) - Math.floor(ergebnis/1000000);
		}
		ergebnis= ergebnis	 - abfall;
*/
    }else{
        if( fps == 23.98 ) {
            fps = 24;
        }
		sek1= fps*sek1;
		min1=60*fps*min1;
		stu1=3600*fps*stu1;
		ergebnis= fram1 + sek1 + min1 + stu1;
	}
	
	document.formular.ergebnis.value = ergebnis;
}

//Berechnung von den frames auf grundlage des angegebenen timecodes und der fps


function FrameToTime(calc){
    calc *= 1;     // wird mit 1 multipliziert, da es ansonsten als string angesehen wird
	
	document.formular.eingabe.value = variable;									// soll nur die eingabe vom User berichtigen. 
    if (fps == 29.97){
        stu = Math.floor( calc / 108000 ); // 108000 = 30*60*60
        calc -= stu*108000;
        
        min = Math.floor( calc / 1800 ); // 1800 = 30*60
        calc -= min*1800;
        
        sek = Math.floor( calc / 30 );
        calc -= sek*30;

        fram = Math.floor( calc );
        
        // Korrektur wegen 29.97
        volle_min = stu*60+min;
        volle_min_nicht_teilbar = volle_min - Math.floor( volle_min / 10 );
        bonus = volle_min_nicht_teilbar*2;
        for( var i=0; i<bonus; i++ ) {
            fram++;
            if( fram > 29 ) {
                fram = 0;
                sek++;
                if( sek > 59 ) {
                    sek = 0;
                    min++;
                    if( min % 10 != 0 ) {
                        bonus += 2; // Wenn die neue Minutenanzahl nicht durch 10 teilbar ist, wird der Bonus entsprechend erhöht.
                    }
                    if( min > 59 ) {
                        min = 0;
                        stu++;
                    }
                }
            }
        }
        
    
/*		abfall = Math.floor(calc / 1000);
		calc = 1*calc + abfall;													//wird mit 1 multipliziert, da ansonsten fram1 als string angesehen wird
		fps = Math.ceil(fps);		
		fram = calc % fps;	
		if (fram<10) fram = "0" + fram
	
		zwischenergebnis= (calc - fram)/fps;	

		sek = zwischenergebnis % 60;
		if (sek < 10) sek = "0" + sek;
		
		zwischenergebnis= (zwischenergebnis-sek) / 60
		
		min = zwischenergebnis % 60;
		if (min < 10) min = "0" + min;
		
		zwischenergebnis= zwischenergebnis - min;
		
		stu =zwischenergebnis / 60;
		if (stu < 10) stu = "0" + stu;
*/
	}else{
        if( fps == 23.98 ) {
            fps = 24;
        }
        
		fram = calc % fps;	
		if (fram<10) fram = "0" + fram
	
		zwischenergebnis= (calc - fram)/fps;	

		sek = zwischenergebnis % 60;
		if (sek < 10) sek = "0" + sek;
		
		zwischenergebnis= (zwischenergebnis-sek) / 60
		
		min = zwischenergebnis % 60;
		if (min < 10) min = "0" + min;
		
		zwischenergebnis= zwischenergebnis - min;
		
		stu =zwischenergebnis / 60;
		if (stu < 10) stu = "0" + stu;
	}
		
	ergebnis= stu +":"+ min +":"+ sek +":"+ fram;
	document.formular.ergebnis.value =ergebnis;						// Ausgabe des Ergebnis
}

