/*
 * Author: Joachim Wittmann
 * Copyright (C) Joachim Wittmann, 2009
 */

/* check_formfields.js */

function change_style(cell, key) {
	var element = document.getElementById(cell);
	var td = element.getElementsByTagName("td");
	td[0].style.color = style[key][0];
	var formfield = element.getElementsByTagName("div");
	formfield[0].style.padding = style[key][1];
	formfield[0].style.border = style[key][2];
}

function setup_failure(cell, key) {
	if (!key) {
		return errorMsg[0];
	} else {
		var element = document.getElementById(cell);
		var td = element.getElementsByTagName("td");
		var label = td[0].getElementsByTagName("label")[0].firstChild.data;
		return errorMsg[key].replace(/{LABEL}/, label);
	}
}

function generate_failure(cell, formfield, key) {
	if (target == "popup") {
		if (!key) var key = 1;
		alert(setup_failure(cell, key));
		formfield.focus();
	} else {
		var text = setup_failure(cell, key);
		var element = document.getElementById("failure");
		var ul = element.getElementsByTagName("ul");
		var li = ul[0].getElementsByTagName("li");
		if (li[0].firstChild.data != text)
			li[0].replaceChild(document.createTextNode(text), li[0].firstChild);
		document.getElementById("failure").style.display = "block";
	}
	change_style(cell, 1);
	return false;
}

function isEmpty(string) {
	return ((string == null) || (string.length == 0))
}

function isWhitespace(string) {
	if (isEmpty(string))
		return true;
	var whitespace = " \t\n\r";
	for (var i = 0; i < string.length; i++) {
		var index = string.charAt(i);
		if (whitespace.indexOf(index) == -1)
			return false;
	}
	return true;
}

function check_whitespace(cell, formfield, initialValue) {
	if (isWhitespace(formfield.value) || formfield.value == initialValue)
		return generate_failure(cell, formfield);
	return true;
}

function check_email(cell, formfield, errorKey) {
	if (!isWhitespace(formfield.value)) {
		var name = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
		var dns = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
		var searchExp = "^"+name+"\@"+dns+"$";
		var searchExp = new RegExp(searchExp);
		var check = searchExp.test(formfield.value);
        if (!check)
			return generate_failure(cell, formfield, errorKey);
	}
	return true;
}

function isNum(num, seperator) {
	// seperator: "", ".", ",", ".-", ",-"
	var searchExp1 = null;
	var searchExp2 = null;
	var searchExp3 = null;
	var decimalPlace = null;
	if (seperator == "") {
		var searchExp1 = num.match(/[^0-9]/gi);
	} else if (seperator == ".") {
		var searchExp1 = num.match(/[^0-9\.]/gi);
		var searchExp2 = num.match(/\./g);
	} else if (seperator == ",") {
		var searchExp1 = num.match(/[^0-9\,]/gi);
		var searchExp2 = num.match(/,/g);
	} else if (seperator == ".-") {
		var searchExp1 = num.match(/[^0-9\.-]/gi);
		var searchExp2 = num.match(/\./g);
		var searchExp3 = num.match(/-/g);
		var decimalPlace = num.substring(num.indexOf("."));
	} else if (seperator == ",-") {
		var searchExp1 = num.match(/[^0-9\,-]/gi);
		var searchExp2 = num.match(/,/g);
		var searchExp3 = num.match(/-/g);
		var decimalPlace = num.substring(num.indexOf(","));
	}
	if (searchExp1 != null)
		return false;
	else if ((searchExp2 != null) && (searchExp2.length > 1))
		return false;
	else if ((searchExp3 != null) && (searchExp3.length > 1))
		return false;
	else if ((searchExp2 != null) && (decimalPlace.length > 3))
		return false;
	else
		return true;
}

function check_num(cell, formfield, seperator, errorKey) {
	if (!isWhitespace(formfield.value) && !isNum(formfield.value, seperator))
		return generate_failure(cell, formfield, errorKey);
	if (formfield.value.indexOf("-") > -1)
		formfield.value = formfield.value.replace(/-/, "00");
	return true;
}

function isDate(dateString, dateForm, seperator) {
	// dateForm: "DD-MM-YYYY", "MM-DD-YYYY", "YYYY-MM-DD", ...
	// seperator: ".", "-", "/", ...
	var splitForm = dateForm.split("-");
	var searchExp = "^";
	for (var i = 0; i < splitForm.length; i++) {
		if (splitForm[i] == "YYYY")
			searchExp = searchExp + "(\\d\\d\\d\\d)";
		else
			searchExp = searchExp + "(\\d\\d)";
		if (i != splitForm.length-1)
			searchExp = searchExp + "\\" + seperator;
	}
	searchExp = new RegExp(searchExp + "$");
	if (dateString.search(searchExp) == -1)
		return false;
	var searchResult = searchExp.exec(dateString);
	var date = new Array();
	for (var i = 0; i < splitForm.length; i++) {
		if (splitForm[i] == "YY" || splitForm[i] == "YYYY")
			date[0] = searchResult[i+1];
		if (splitForm[i] == "MM")
			date[1] = parseInt(searchResult[i+1],10)-1;
		if (splitForm[i] == "DD")
			date[2] = parseInt(searchResult[i+1],10);
	}
	var alterDate = new Date();
	if (!date[2]) date[2] = alterDate.getDate();
	if (!date[1]) date[1] = alterDate.getMonth()+1;
	if (!date[0]) date[0] = alterDate.getFullYear(); else if (date[0].length == 2) date[0] = "20"+ date[2];
	var controlDate = new Date(date[0], date[1], date[2]);
	if (controlDate.getFullYear() == date[0] && controlDate.getMonth() == date[1] && controlDate.getDate() == date[2])
		return true;
	else
		return false;
}

function check_date(cell, formfield, dateForm, seperator, errorKey) {
	if (!isWhitespace(formfield.value) && !isDate(formfield.value, dateForm, seperator))
		return generate_failure(cell, formfield, errorKey);
	return true;
}

function isName(formfield) {
	var noble = new Array("d", "da", "de", "der", "la", "of", "van", "von");
	var input = formfield.value.split(/\b/);
	var output = "";
	for (var i = 0; i < input.length; i++) {
		output += input[i].substr(0,1).toUpperCase()+input[i].substring(1);
	}
	for (var i = 0; i < noble.length; i++) {
		var searchExp = new RegExp("\\b"+noble[i]+"\\b","gi");
		output = output.replace(searchExp, noble[i]);
	}
	return output;
}

function check_form(sender) {
	var form = document.forms[sender.name];
	var status = 0;
	for (var i = 0; i < content.length; i++) {
		change_style(content[i][1], 0);
	}
	for (var i = 0; i < content.length; i++) {
		if (content[i][0] == "req" || content[i][0] == "name") {
			// [1] = cell, [2] = formfield, [3] = initialValue
			if (!check_whitespace(content[i][1], form.elements[content[i][2]], content[i][3]))
				if (target != "popup") status++; else return false;
			else if (content[i][0] == "name")
				form.elements[content[i][2]].value = isName(form.elements[content[i][2]]);
		}
	}
	if (status != 0) return false;
	for (var i = 0; i < content.length; i++) {
		switch (content[i][0]) {
			case ("email"):
				// [1] = cell, [2] = formfield, [3] = errorKey
				if (!check_email(content[i][1], form.elements[content[i][2]], content[i][3]))
					return false;
				break;
			case ("num"):
				// [1] = cell, [2] = formfield, [3] = seperator, [4] = errorKey
				if (!check_num(content[i][1], form.elements[content[i][2]], [content[i][3]], content[i][4]))
					return false;
				break;
			case ("date"):
				// [1] = cell, [2] = formfield (dateString), [3] = dateForm, [4] = seperator, [5] = errorKey
				if (!check_date(content[i][1], form.elements[content[i][2]], content[i][3], content[i][4], content[i][5]))
					return false;
				break;
		}
	}
	return true;
}
