/**************************************************************
*
* Funktionen zum Hinzufügen und Löschen von "fileUpload" Zeilen
*
***************************************************************/
				 
/**************************
* PSEUDO KONSTANTEN (Werte nicht im Programm ändern)
**************************/
		  
/**
* Die Id Basis des upload-Elements.
* Muss mit der Id des Upload-Elements im HTML-Text über einstimmen,
* mit einer angehangenen '1' ( erste Upload-Element)
*/
var UPLOAD_FIELD_ID = "fileId";
		 
/**
* Die Namens Basis des upload-Elements.
* Muss mit dem Namen des Upload-Elements im HTML-Text über einstimmen,
* mit einer angehangenen '1' ( erste Upload-Element)
*/
var UPLOAD_FIELD_NAME = "file";

/**
* Die Id der upload-Zeile.
* Muss mit der Id des Upload-Zeile im HTML-Text über einstimmen,
* mit einer angehangenen '1' ( erste Upload-Element)
*/
var UPLOAD_ROW_ID = "fileRow";
	
/**
* Die Id Basis des Löschen-Buttons.
*/
var REMOVE_BUTTON_ID = "DelId";
	
/**
* Die Namens Basis des Löschen-Buttons.
*/
var REMOVE_BUTTON_NAME = "Del";

/**************************
* VARIABLEN
**************************/

/**
* Die Anzahl der upload-Zeilen
*/
var uploadRowCount = 1;
	
/**
* Die Zeile mit den Button zum hinzufügen der upload-Zeilen 
*/
var buttonRow = null;
	
/**
* Ein Flag, das anzeigt ob der Inhalt der upload-Felder überprüft werden soll.
* Wird für das Löschen von upload-Feldern benötigt
*/
var doFileCheck = true;

/**************************
* FUNKTIONEN
**************************/
		
/**
* Mit der Funktion wird eine Tabelleneile mit dem File-Upload-Element
* entfernt.
* Die Zeile ergibt sich aus dem Quell-Element des Ereignisses 'ev',
* das heisst aus dem entsprechenden "Löschen"-Button.
*
* @param ev das Ereigniss Objekt, funktioniert nur beim NS & Co
* für den MSIE (siehe in der Funktion)
*/
function removeUploadRow(ev) {
	/**
	* HTML-Element
	*/
	var element = null;
	doFileCheck = false;

	// Das Quell-Element des Ereignisses Objekt besorgen.
	// Also den Löschen-Button für die Zeile
	if (ev == null) {
		// MS-IE
		element = event.srcElement;
	} else {
		// Netscape & Co
		element = ev.target;
	}
		
	// Das Tabellen Zeile finden, die den Button enthält.
	// Also das "tr"-Element, das ein Elternelement des Buttns ist.
	while ((element != null) && (element.nodeName.toLowerCase() != "tr")) {
		element = element.parentNode;
	}
	// Wenn wir das Element gefunden haben, wird es entfernt.
	// Also vom Eltern-Element das Kind entfernen.
	// Danach die upload Zeilen in Ordnung bringen (korrekter Index).
	if ((element!= null) && (element.parentNode != null)) {
		element.parentNode.removeChild(element);
		updateUploadRows();
	}
	doFileCheck = true;
}

/**
* Mit der Funktion werden die Ids und Namen der Upload-Elemente
* korrigiert, falls dies nötig ist.
* Dies passiert zum Beispiel nach dem Löschen eines Upload-Elements.
* Ein Upload-Element besteht dabei aus der ganzen Tabellenzeile,
* die das File-Upload-Element enthält.
*/
function updateUploadRows() {
	// Ein HTML-Element
	var element = null;
		
	// Der Zähler für die existierenden upload-Zeilen
	var count  = 1;

	for (var i=1;i<=uploadRowCount;i++) {
		// Das 'tr' element mit der Id suchen
		element = document.getElementById("fileRow"+i);
				
		// wenn es gefunden wird, die Ids und Namen ändern
		if (element != null) {
			// Die id des 'tr' Elements ändern
			element.id = "fileRow" + count;
			// Das 'uploadElement' suchen
			element = document.getElementById("fileId"+i);
			// wenn es gefunden ist Namen und Id ändern
			if (element != null) {
				element.name = "file"+count;
				element.id = "fileId"+count;
			}
			// Das 'uploadElement' suchen
			element = document.getElementById("DelId"+i);
			// wenn es gefunden ist Namen und Id ändern
			if (element != null) {
				element.name = "Del"+count;
				element.id = "DelId"+count;
			}
			// erhöhen, weil eine Zeile gefunden wurde
			++count;
		}
	}
			
	// Die Anzahl der upload-Zeilen setzen
	uploadRowCount = count - 1;
}

/**
* Mit der Funktion wird eine neue upload-Zeile, vor der Zeile,
* die den Hinzufügen-Button enthält, eingefügt.
* Das heisst am Ende der Upload-Zeilen.
*/
function addUploadRow() {
	// der Name des neuen upload-Elements
	var nextElementName = "";
	// die letzte upload-Zeile
	var lastRow = null;
	// die neue upload-Zeile
	var nextRow = null;
	// das upload-Element
	var newElement = null;
	// die Spalte in der Tabellen Zeile
	var colCount = 1;
	// ein HTML-Element
	var currentElement = null;
	// Die Zeile zwischen der letzten upload-Zeile und der Button Zeile
	var separatorRow = null;
	
	var uploadElement = null;
		
	// Die Zeile mit dem Hinzufügen-Button finden
	if (buttonRow == null) {
		buttonRow = document.getElementById("buttonRow");
	}

	// die letzten Zeile bestimmen
	lastRow = document.getElementById("fileRow" + uploadRowCount);
	if (lastRow == null) {
		alert("UUUPS, EIN FEHLER!\nKonnte keine letzte Zeile mit einem upload-Feld finden.");
		return;
	}
		
	// Die Trennerzeile bestimmen
	separatorRow = document.getElementById("separatorRow");
		
	// Wir haben bald eine Zeile mehr
	++uploadRowCount;
			
	// Die neue Zeile erzeugen und die Id setzen.
	//
	// Tiefe Kopie funktioniert nicht bei 'Firefox'.
	// Dabei wird dann auch der Wert des upload-Feldes mit kopiert
	// und das wollen wir doch nicht.
	nextRow = lastRow.cloneNode(false);
	if (nextRow == null) {
		alert("UUUPS, EIN FEHLER!\nKonnte keine neue Zeile für ein upload-Feld erzeugen.");
		return;
	}
	nextRow.setAttribute("id","fileRow" + uploadRowCount);
			
	// Alle Kindknoten der alten Zeile abklappern und
	// in die neue Zeile kopieren.
	// Dabei brauchen die 'td' Knoten eine Sonderbehandlung.
	//
	// Auch, wenn offensichtlich keine anderen Elemente 
	// als die 'td'-Elemente in dem 'tr'-Element vorhanden sind, 
	// so sind doch noch weitere vorhanden.
	// Jedes 'td'-Element ist nämlich von Text-Knoten umgebeben
	// (die Zeilenumbrüche usw.).
	for (var i=0;i<lastRow.childNodes.length;i++) {
		// Der i-te Kindknoten in der Zeile
		currentElement = lastRow.childNodes[i];
			
		// Testen ob es sich um ein 'td' Element handelt
		if ((currentElement.nodeName != null) && (currentElement.nodeName.toLowerCase() == "td")) {
			switch (colCount) {
				// Das erste 'td' Element, das nichts besonderes enthält.
				// Es kann eine tiefe Kopie gemacht werden.
				case 1 : {
					nextRow.appendChild(currentElement.cloneNode(true));
					++colCount;
					break;
				}
				// Das zweite 'td' Element.
				// Es enthält das upload-Feld.
				// Es muss ein neues upload-Feld erzeugt werden,
				// das dann in eine flache Kopie des 'td'-Element eingfügt wird
				case 2 : {
					// upload-Element erzeugen
					newElement = document.createElement("input");
					newElement.setAttribute("type","file");
					newElement.setAttribute("name","attachment[]");
					newElement.setAttribute("id","fileId"+uploadRowCount);
					newElement.setAttribute("class","jobs_bewerbung_upload");
					// MS-IE wollte das so
					newElement.className = "jobs_bewerbung_upload";
					// Ereeignissbehandlung für die Datei Änderungen
					if (window.event == null) {
						// Für FireFox & Co
						newElement.setAttribute("onchange","checkFileFormat('fileId"+uploadRowCount+"')");
					} else {
						// Für den MS-IE
						newElement.onchange = checkFileFormat;
					}
					uploadElement = newElement;
					// flache Kopie des 'td' Elements erzeugen
					currentElement = currentElement.cloneNode(false);
					// upload-Feld einfügen
					currentElement.appendChild(newElement);
					// 'td' Feld einfügen
					nextRow.appendChild(currentElement);
					++colCount;
					break;
				}
				// Das dritte 'td' Element.
				// Es enthält den 'Löschen' Button
				// Es muss ein neuer Button erzeugt werden,
				// der dann in eine flache Kopie des 'td'-Element eingfügt wird
				case 3 : {
					// neuen Button erzeugen und initialisieren
					newElement = document.createElement("input");
					newElement.setAttribute("type","button");
					newElement.setAttribute("value","X");
					newElement.setAttribute("name","Del"+uploadRowCount);
					newElement.setAttribute("id","DelId"+uploadRowCount);
					newElement.setAttribute("onclick","removeUploadRow();");
					// Der MS-IE besteht darauf die Funktion so zu bekommen
					newElement.onclick = removeUploadRow;
					
					// flache Kopie des 'td' Elements erzeugen
					currentElement = currentElement.cloneNode(false);
					// Button einfügen
					currentElement.appendChild(newElement);
					// 'td' Feld einfügen
					nextRow.appendChild(currentElement);
					++colCount;
					break;
				}
			}
		} else {
			// von anderen Knoten einfach eine tiefe Kopie in das 'tr'-Element einfügen
			nextRow.appendChild(currentElement.cloneNode(true));
		}
	}
			
	// Das neue 'tr'-Element einfügen, dabei die Abstands Zeile überspringen
	lastRow.parentNode.insertBefore(nextRow,buttonRow);
	// uploadElement.click();
}

/**************************************************************
*
* VALIDIERUNGS FUNKTIONEN
*
**************************************************************/

// whitespace characters
var whitespace = " \t\n\r";
	
// Datei-Endungen die für einen Upload akzeptiert werden
var VALID_FILE_EXTENSIONS = new Array();
VALID_FILE_EXTENSIONS[0] = "zip";
VALID_FILE_EXTENSIONS[1] = "rtf";
VALID_FILE_EXTENSIONS[2] = "txt";
VALID_FILE_EXTENSIONS[3] = "doc";
VALID_FILE_EXTENSIONS[4] = "pdf";

// Check whether string s is empty.
function isEmpty(s) { 
	return ((s == null) || (s.length == 0)); 
}

function isWhitespace(s) {
	var i;
		
	// Is s empty?
	if (isEmpty(s)) {
		return true;
	}
		
	// Search through string's characters one by one
	// until we find a non-whitespace character.
	// When we do, return false; if we don't, return true.
	for (i = 0; i < s.length; i++) {
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (whitespace.indexOf(c) == -1) {
			return false;
		}
	}
	// All characters are whitespace.
	return true;
}

function isZipcode(val, message) {
	var strInput = new String(val.value);
		
	if ((isWhitespace(strInput) || strInput.length != 5)){
		alert(message);
		return false;
	}
		
	return true;
}

function ForceEntry(val, message) {
	if (val == null) {
		alert(message);
		return false;
	}
	
	var strInput = new String(val.value);
	
	if (isWhitespace(strInput)) {
		alert(message);
		return false;
	} else {
		return true;
	}
}
	
function ValidateData() {
	var CanSubmit = false;
	var regionCount = 0;
	var element = null;
	var language = current_file_language;
		
	if (language.length == 0) {
		language = de;
	}

	// Check to make sure that the full name field is not empty.
	CanSubmit = ForceEntry(document.forms[0].Vorname,(language == "en") ? "Please provide your firstname." : "Bitte geben Sie Ihren Vornamen an.");
	if (CanSubmit) {
		CanSubmit = ForceEntry(document.forms[0].Nachname,(language == "en") ? "Please provide your family name." : "Bitte geben Sie Ihren Nachnamen an.");
	}
	if (CanSubmit) {
		CanSubmit = isZipcode(document.forms[0].PLZ,(language == "en") ? "Please provide your zip-code." : "Bitte geben Sie Ihre PLZ im Format ##### an.");
	}
	if (CanSubmit) {
		CanSubmit = ForceEntry(document.forms[0].Geburtstag,(language == "en") ? "Please provide your date of birth." : "Bitte geben Sie Ihr Geburtsdatum an.");
	}
	if (CanSubmit) {
		CanSubmit = ForceEntry(document.forms[0].eMail,(language == "en") ? "Please provide your eMail." : "Bitte geben Sie Ihre eMail an.");
	}
	if (CanSubmit) {
		CanSubmit = ForceEntry(document.forms[0].file1,(language == "en") ? "Please provide your application files." : "Bitte übermitteln Sie uns Ihre Bewerbungsunterlagen");
	}
	
	if (language != "de") {
		if (CanSubmit) {
			CanSubmit = ForceEntry(document.forms[0].Ort,"Please provide your city.");
		}
		if (CanSubmit) {
			CanSubmit = ForceEntry(document.forms[0].Land,"Please provide your country.");
		}
		if (CanSubmit) {
			CanSubmit = ForceEntry(document.forms[0].Staatsangehoerigkeit,"Please provide your nationality.");
		}
	}
	
	// Alle Einträge in PickList selektieren
	if (document.forms[0].PickList != null) { 
		for (i=0; i<document.forms[0].PickList.length; i++) {
			document.forms[0].PickList.options[i].selected = true;
			++regionCount;
		}
	}
		
	// Keine bösen Dateien zulassen
	if (CanSubmit) {
		CanSubmit = checkFiles();
	}
	
	// Anzahl der bevorzugten Regionen merken
	element = document.getElementById("regionCountId")
	if (element != null) {
		element.value = regionCount;
	}
	element = document.getElementById("fileCountId")
	if (element != null) {
		element.value = uploadRowCount;
	}

	if (CanSubmit) {
		form_onsubmit(document.forms[0].uploadId.value);
	}
	
	return CanSubmit;
}
	
function checkDate(oField) { 
	var cDate = oField.value.replace( /[\W\D\s]/gi, ''); // delete all characters different from numbers
	
	if (cDate.length == 0) {
		return;
	}
	
	if( cDate.length == 8 ) { 
		var cDay = cDate.substring(0,2); // month extraction 
		var cMonth = cDate.substring(2,4); // day extraction 
		var cYear = cDate.substring(4); // year extraction 
		if (cDay.match(/^([0-2]?\d|3[01])$/) && cMonth.match(/^(0?\d|1[0-2])$/) && cYear.match(/^[1-9]\d\d\d$/)) { 
			oField.value = cDay+'.'+cMonth+'.'+cYear; // you can change the separator as you want! 
		} else {
			if (language == "de") {
				alert( 'Bitte ein gültiges Datum eingeben' ); // problems in pattern matching of some `piece' of date... 
			} else {
				alert('Please enter a valid date');
			}
			oField.focus();
		} 
	} else {
		if (language == "de") {
			alert( 'Bitte im Format tt.mm.jjjj eingeben!' ); // Date lenght is not 8 (without separator)
		} else {
			alert( 'Please enter in format dd.mm.yyyy !' ); // Date lenght is not 8 (without separator)
		}
	}
}
	
function checkPLZ(oField) {
	if (language != "de") {
		return;
	}
	var cDate = oField.value.replace( /[\W\D\s]/gi, ''); // delete all characters different from numbers 
		if ((cDate.length > 0) && (cDate.length != 5)) { 
			alert( 'Bitte im Format ##### eingeben!' ); // PLZ ist nicht fünfstellig
			oField.focus();
		}
	}
	
function checkFileFormat(fileFieldId) {
	var dateiEndung = "";
	var fileField = null;
	var txt = "";
	var rowNode = null;
		
	if (doFileCheck == false) {
		return true;
	}
		
	if (fileFieldId == null) {
		fileField = getEventSource(null);
	} else {
		fileField = document.getElementById(fileFieldId);
	}
		
	if (fileField == null) {
		alert("Uuups, Fehler! Ich konnte das Dateifeld nicht finden.");
		return;
	}
		
	if ((fileField.value == null) || (fileField.value.length == 0)) {
		return true;
	}
	
	dateiEndung = fileField.value.substr(fileField.value.length-3, 3);
		
	for (var i=VALID_FILE_EXTENSIONS.length-1;i>=0;i--) {
		if (dateiEndung == VALID_FILE_EXTENSIONS[i]) {
			return true;
		}
	}
		
	txt = "Wir akzeptieren nur Dateien in den Formaten "
	for (var i=VALID_FILE_EXTENSIONS.length-3;i>=0;i--) {
		txt = txt + VALID_FILE_EXTENSIONS[i] + ", ";
	}
	txt = txt + VALID_FILE_EXTENSIONS[VALID_FILE_EXTENSIONS.length-2] + " und ";
	txt = txt + VALID_FILE_EXTENSIONS[VALID_FILE_EXTENSIONS.length-1] + ".";
	alert(txt);
	fileField.focus();
		
	if (fileField.id != "fileId1") {
		rowNode = fileField.parentNode.parentNode;
		rowNode.parentNode.removeChild(rowNode);
		updateUploadRows();
	}
	return false;
}
	
function getEventSource(ev) {
	if (ev == null) {
		// MS-IE
		if (((typeof event) == "undefined") || (event == null)) {
			return null;
		}
		return event.srcElement;
	} else {
		// Netscape & Co
		return ev.target;
	}
}

/**************************************************************
*
* UPLOAD FUNKTIONEN
*
**************************************************************/

 var uploadProgress;

function getCenteredX(w1,w2) {
	return (w1 - w2)/2
}
	
function getCenteredY(h1,h2) {
	return (h1 - h2)/2
}

function form_onsubmit(UploadID) {
	var ProgressURL = 'progressCompuJob.asp?UploadID=' + UploadID +'&fileCount='+uploadRowCount;
	var width = 350;
	var height = 200;
	var x = getCenteredX(screen.width,width);
	var y = getCenteredY(screen.height,height);
	
	uploadProgress = window.open(ProgressURL,'_blank','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,width='+width+',height='+height+',status=no,depend=yes,left='+x+',top='+y)
	uploadProgress.focus
		
	return true;
}

function window_onunload() {
	// if progress doesn't exist, return
	// if progress doesn't expose closed method
	if ((uploadProgress == null) || (uploadProgress.closed)){
		return;
	}
	
	// close progress window
	uploadProgress.close();
}
	
function checkFiles() {
	var uplodField = null;
	
	for (var i=1;i<=uploadRowCount;i++) {
		uploadField = document.getElementById(UPLOAD_FIELD_ID+i);
		if (uploadField != null) {
			if (! checkFile(uploadField.value)) {
				alert("Die Datei\n'" + uploadField.value + "'\nwird nicht akzeptiert.");
				return false;
			}
		} else {
			alert("Uuups");
			return false;
		}
	}
	
	return true;
}
	
function checkFile(fileName) {
	var endung = "";

	if ((fileName == null) || (fileName.length == 0)) {
		return true;
	}
		
	endung = fileName.substr(fileName.length-3,3);
	for (var i=VALID_FILE_EXTENSIONS.length-1;i>=0;i--) {
		if (endung == VALID_FILE_EXTENSIONS[i]) {
			return true;
		}
	}
	return false;
}
	
// assign event handler to unload event
window.onunload = window_onunload;