// owner: Rob

function ErrorMsg(nIndex)
{
	var s = aLang[nIndex];
	for (var i=1; i<arguments.length; i++)
		s = s.replace(new RegExp("%" + i, "g"), arguments[i]);
	return s;
}

function SetMsg(idMsgContainer, sMsg)
{
	var objMsg = document.getElementById(idMsgContainer);
	objMsg.innerHTML = sMsg;
}

function ResetMsgContainers()
{
	for (var i=0; i<arguments.length; i++)
	{
		var objMsg = document.getElementById(arguments[i]);
		if (objMsg)
			objMsg.innerHTML = "&nbsp;";
	}
}

function CheckNotEmpty(ctrl, idMsgContainer, sSubj, sUnalteredDefault)
{
	if (ctrl.value.length && (ctrl.value != sUnalteredDefault))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	setTimeout("SetMsg('" + idMsgContainer + "', '" + ErrorMsg("missing1", sSubj) + "')", 100);
	return false;
}

function IsChecked(ctrl, idMsgContainer, sSubj, idCell)
{
	var cell = idCell ? document.getElementById(idCell) : null;
	if (ctrl.checked)
	{
		if (cell)
			cell.className = "";
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	if (cell)
		cell.className = "bg_error";
	SetMsg(idMsgContainer, ErrorMsg("missing2", sSubj));
	return false;
}

function CheckNotEmptyRadio(ctrl, idMsgContainer, sSubj, idCell) { CheckNotEmptyRadio2(3, ctrl, idMsgContainer, sSubj, idCell); }

function CheckNotEmptyRadio2(nMsg, ctrl, idMsgContainer, sSubj, idCell)
{
	var cell = idCell ? document.getElementById(idCell) : null;
	for (var i=0; i<ctrl.length; i++)
	{
		if (ctrl[i].checked)
		{
			if (cell)
				cell.className = "";
			SetMsg(idMsgContainer, "&nbsp;");
			return true;
		}
	}

	if (cell)
		cell.className = "bg_error";
	setTimeout("SetMsg('" + idMsgContainer + "', '" + ErrorMsg("missing" + nMsg, sSubj) + "')", 100);
	return false;
}

function CheckNotEmptySelect(ctrl, idMsgContainer, sSubj, sUnalteredDefault)
{
	if ((ctrl.selectedIndex != -1) && (ctrl.options[ctrl.selectedIndex].value != sUnalteredDefault))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	setTimeout("SetMsg('" + idMsgContainer + "', '" + ErrorMsg("missing4", sSubj) + "')", 100);
	return false;
}

function CheckByRegExp(ctrl, idMsgContainer, regexp, sMsg)
{
	if (!ctrl.value.length || regexp.test(ctrl.value))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	SetMsg(idMsgContainer, sMsg);
	return false;
}

function CheckMinLength(ctrl, idMsgContainer, nMinLen, sSubj)
{
	if (!ctrl.value.length || (ctrl.value.length >= nMinLen))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	SetMsg(idMsgContainer, ErrorMsg("minlength1", sSubj, nMinLen));
	return false;
}

function Input_LimitIntegers(ctrl)
{
	ctrl.value = Math.round(ctrl.value.replace(/[^0-9,]/g, "").replace(/,/g, "."));
}

function CheckLimitedText(ctrl, idMsgContainer, sLimitTo, sSubj)
{
	var aMatches = ctrl.value.match(new RegExp("[^" + sLimitTo + "]", "g"));
	if (aMatches && (aMatches.length > 0))
	{
		SetMsg(idMsgContainer, ErrorMsg("limittext1", sSubj, aMatches.join("', '")));
		return false;
	}

	SetMsg(idMsgContainer, "&nbsp;");
	return true;
}

function CheckIntMinMax(ctrl, idMsgContainer, nMin, nMax, sSubj)
{
	if (!ctrl.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	if (ctrl.value.search(/[^\d-]/) != -1)
		SetMsg(idMsgContainer, ErrorMsg("num1", sSubj));
	else if (ctrl.value < nMin)
		SetMsg(idMsgContainer, ErrorMsg("num4", sSubj, nMin));
	else if (ctrl.value > nMax)
		SetMsg(idMsgContainer, ErrorMsg("num5", sSubj, nMax));
	else
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	return false;
}

function CheckMoneyMinMax(ctrl, idMsgContainer, nMin, nMax, sSubj)
{
	ctrl.value = ctrl.value.replace(/[,\.][\s=-]*$/, ".00");
	ctrl.value = ctrl.value.replace(/([,\.]\d{2})[^,\.]+$/, "$1");

	return CheckFloatMinMax(ctrl, idMsgContainer, nMin, nMax, sSubj);
}

function CheckFloatMinMax(ctrl, idMsgContainer, nMin, nMax, sSubj)
{
	if (!ctrl.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	var fTmp = ctrl.value.replace(/,/, ".") * 1.0;

	if (ctrl.value.search(/[^\d,\.-]/) != -1)
		SetMsg(idMsgContainer, ErrorMsg("num2", sSubj));
	else if (ctrl.value.search(/[,\.][^,\.]*[,\.]/) != -1)
		SetMsg(idMsgContainer, ErrorMsg("num3", sSubj));
	else if (fTmp < nMin)
		SetMsg(idMsgContainer, ErrorMsg("num4", sSubj, nMin));
	else if (fTmp > nMax)
		SetMsg(idMsgContainer, ErrorMsg("num5", sSubj, nMax));
	else
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	return false;
}

function CheckEmail(ctrl, idMsgContainer)
{
	if (!ctrl.value.length ||
		(ctrl.value.search(/^[\da-z~!#$%&_-]([.]?[\da-z~!#$%&_-])*@[\da-z~!#$%&_-]([.]?[\da-z~!#$%&_-])*$/i) != -1))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	SetMsg(idMsgContainer, ErrorMsg("email1", ctrl.value));
	return false;
}

function CheckPostcode(ctrl, idMsgContainer, sCountryField)
{
	if (!ctrl.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	ctrl.value = ctrl.value.toUpperCase();

	var idCountry = 0;
	var sCountryName = false;
	if (sCountryField && ctrl.form && ctrl.form[sCountryField])
	{
		var nIndex = ctrl.form[sCountryField].selectedIndex;
		idCountry = ctrl.form[sCountryField].options[nIndex].value * 1;
		sCountryName = ctrl.form[sCountryField].options[nIndex].text;
	}

	switch (idCountry)
	{
	case 0:	// Nederland
		if (ctrl.value.search(/^[1-9][0-9]{3}[ ]?[A-Z]{2}$/) != -1)
			break;
		if (ctrl.value.search(/^[0-9]{4}[ ]?[A-Z]{2}$/) != -1)
		{
			SetMsg(idMsgContainer, ErrorMsg("postcode12", ctrl.value));
			return false;
		}
		SetMsg(idMsgContainer, ErrorMsg("postcode1", ctrl.value));
		return false;
	case 1:	// België
	case 8:	// Denemarken
	case 9:	// Noorwegen
	case 10:	// Oostenrijk
	case 11:	// Portugal
	case 12:	// Zwitserland
		if (ctrl.value.search(/^[0-9]{4}$/) != -1)
			break;
		SetMsg(idMsgContainer, ErrorMsg("postcode2", ctrl.value, 4, sCountryName ? sCountryName : aLang["ditland"]));
		return false;
	case 3:	// Deutschland
	case 4:	// Frankrijk
	case 5:	// Finland
	case 6:	// Italië
	case 7:	// Spanje
		if (ctrl.value.search(/^[0-9]{5}$/) != -1)
			break;
		SetMsg(idMsgContainer, ErrorMsg("postcode2", ctrl.value, 5, sCountryName ? sCountryName : aLang["ditland"]));
		return false;
	case 2:	// United Kingdom
		if (ctrl.value.search(/^(([A-Z]{3})|((([A-Z]{2})|[A-Z])(([0-9]{2})|([0-9][A-Z])|[0-9])))[ ][0-9][A-Z]{2}$/) != -1)
			break;
		SetMsg(idMsgContainer, ErrorMsg("postcode3", ctrl.value));
		return false;
	case 13:	// Zweden
		if (ctrl.value.search(/^[0-9]{3}[ ][0-9]{2}$/) != -1)
			break;
		SetMsg(idMsgContainer, ErrorMsg("postcode4", ctrl.value));
		return false;
	default:
		SetMsg(idMsgContainer, "&nbsp;");
		return true;	// no validation for countries we don't know
	}

	SetMsg(idMsgContainer, "&nbsp;");
	return true;	// passed validation
}

function CheckSplitPostcode(ctrlCijfers, ctrlLetters, idMsgContainer)
{
	if (!ctrlCijfers.value.length || !ctrlLetters.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	ctrlLetters.value = ctrlLetters.value.toUpperCase();

	if ((ctrlCijfers.value.search(/^[1-9][0-9]{3}$/) != -1) && (ctrlLetters.value.search(/^[A-Z]{2}$/) != -1))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;	// passed validation
	}
	SetMsg(idMsgContainer, ErrorMsg("postcode1", ctrlCijfers.value + " " + ctrlLetters.value));
	return false;
}

function CheckSplitPostcodeDigits(ctrlCijfers, idMsgContainer)
{
	if (!ctrlCijfers.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	if (ctrlCijfers.value.search(/^[1-9][0-9]{3}$/) != -1)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;	// passed validation
	}
	SetMsg(idMsgContainer, ErrorMsg("postcode12", ctrlCijfers.value));
	return false;
}

function CheckPhoneNrIntl(ctrl, idMsgContainer, sCountryField, sPostcodeField, sPlaatsField)
{
	var idCountry = 0;
	if (sCountryField && ctrl.form && ctrl.form[sCountryField])
	{
		var nIndex = ctrl.form[sCountryField].selectedIndex;
		idCountry = ctrl.form[sCountryField].options[nIndex].value * 1;
	}

	if (!idCountry)
		return CheckPhoneNr(ctrl, idMsgContainer, (sPostcodeField || sPlaatsField), sPostcodeField, sPlaatsField)

	if (!ctrl.value.length || (ctrl.value.search(/[^0-9- \+\)\(]/) == -1))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	SetMsg(idMsgContainer, ErrorMsg("tel6", ctrl.value));
	return false;
}

function CheckPhoneNr(ctrl, idMsgContainer, bBeautify)
{
	if (!ctrl.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	if (bBeautify)
		BeautifyPhoneNr(ctrl);

	if ((ctrl.value.search(/^\+/) != -1) || (ctrl.value.search(/^00[1-9\s\)]/) != -1))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;	// buitenlands nr (we kunnen niet alle bestaande formaten checken)
	}

	if (ctrl.value.search(/^0(6-[1-9][0-9]{2}|[1-9][0-9]-[1-9][0-9]|[1-9][0-9]{2}-[1-9]|88-[0-9]{2})[0-9]{5}$/) != -1)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;	// geldig nederlands nr: 0(6-ddd|dd-dd|ddd-d)ddddd
		// (06-dddddddd, eerste d na streepje ongelijk 0)
		// (0dd-ddddddd, eerste d na 0 en na streepje ongelijk 0)
		// (0ddd-dddddd, eerste d na 0 en na streepje ongelijk 0)
	}

	var nCount = 0;
	for (var i=0; i<ctrl.value.length; i++)
	{
		var c = ctrl.value.charAt(i);
		if (c.search(/[0-9]/) != -1)
			++nCount;
	}

	if (ctrl.value.search(/[^0-9- \+]/) != -1)
		SetMsg(idMsgContainer, ErrorMsg("tel1", ctrl.value));
	else if ((ctrl.value.charAt(0) != "0") && (ctrl.value.substring(0, 2) != "(0"))
	{
		if (nCount <= 7)
			SetMsg(idMsgContainer, ErrorMsg("tel2", ctrl.value));
		else
			SetMsg(idMsgContainer, ErrorMsg("tel3", ctrl.value));
	}
	else if (nCount != 10)
		SetMsg(idMsgContainer, ErrorMsg("tel4", ctrl.value, nCount));
	else
		SetMsg(idMsgContainer, ErrorMsg("tel5", ctrl.value));
	return false;
}

function CheckTimeFormat(ctrl, idMsgContainer, bWithSeconds)
{
	if (!ctrl.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	if (ctrl.value.search(/[^:\d]/) != -1)
		SetMsg(idMsgContainer, ErrorMsg("time1", ctrl.value));
	else if (!bWithSeconds && (ctrl.value.search(/^\d\d(:\d\d)$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("time2", ctrl.value));
	else if (bWithSeconds && (ctrl.value.search(/^\d\d:\d\d:\d\d$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("time3", ctrl.value));
	else if (!bWithSeconds && (ctrl.value.search(/^((([01]\d|2[0-3]):[0-5]\d)|(24:00))$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("time4", ctrl.value));
	else if (bWithSeconds && (ctrl.value.search(/^((([01]\d|2[0-3]):[0-5]\d:[0-5]\d)|(24:00:00))$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("time4", ctrl.value));
	else
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	return false;
}

function CheckPastDateFormat(ctrl, idMsgContainer, sSubj)
{
	if (CheckDateFormat(ctrl, idMsgContainer))
	{
		if (!ctrl.value.length)
			return true;

		var dateNow = new Date();
		var a = ctrl.value.split("-");

		if (a[2].length == 2)
		{
			a[2] = a[2] * 1 + 2000;
			var dateValue = new Date(a[2], a[1] - 1, a[0]);
			if (dateValue.getTime() > dateNow.getTime())
				a[2] -= 100;
			ctrl.value = a[0];
			for (var i=1; i<a.length; i++)
				ctrl.value += "-" + a[i];
		}
		else
		{
			var dateValue = new Date(a[2], a[1] - 1, a[0]);
			if (dateValue.getTime() > dateNow.getTime())
			{
				SetMsg(idMsgContainer, ErrorMsg("date4", ctrl.value, sSubj));
				return false;
			}
		}

		return true;
	}

	return false;
}

function CheckDateFormat(ctrl, idMsgContainer, bYearObliged, bMakeFullYear)
{
	if (!ctrl.value.length || (ctrl.value == aLang["date_example"]))
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	if ((arguments.length == 2) || bMakeFullYear)
		bYearObliged = true;

	if (ctrl.value.search(/[^-\d]/) != -1)
		SetMsg(idMsgContainer, ErrorMsg("date1", ctrl.value));
	else if (bYearObliged && (ctrl.value.search(/^\d{1,2}-\d{1,2}-(\d{4}|\d\d)$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("date2", ctrl.value));
	else if (!bYearObliged && (ctrl.value.search(/^\d{1,2}-\d{1,2}(-(\d{4}|\d\d))?$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("date2", ctrl.value));
	else if (bYearObliged && (ctrl.value.search(/^([12]\d|3[01]|0?[1-9])-(1[0-2]|0?[1-9])-(20\d\d|19\d\d|\d\d)$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("date3", ctrl.value));
	else if (!bYearObliged && (ctrl.value.search(/^([12]\d|3[01]|0?[1-9])-(1[0-2]|0?[1-9])(-(20\d\d|19\d\d|\d\d))?$/) == -1))
		SetMsg(idMsgContainer, ErrorMsg("date3", ctrl.value));
	else
	{
		if (bMakeFullYear)
		{
			var a = ctrl.value.split("-");
			if (a[2].search(/^\d\d$/) == 0)
			{
				var dateNow = new Date();
				a[2] = a[2] * 1 + 2000;
				if (a[2] > (dateNow.getFullYear() + 50))
					a[2] -= 100;
				ctrl.value = a[0];
				for (var i=1; i<a.length; i++)
					ctrl.value += "-" + a[i];
			}
		}
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	return false;
}

function ReverseDate(sDate)
{
	var aTmp = sDate.split("-");
	return aTmp[2] + "-" + aTmp[1] + "-" + aTmp[0];
}

function CheckSplitDateNotEmpty(form, sName, idMsgContainer, sSubj, nField)
{
	var aPostFixes = ["_d", "_m", "_y"];
	for (var i=0; i<nField; i++)
	{
		var ctrl = form[sName + aPostFixes[i]];
		if (!CheckNotEmpty(ctrl, idMsgContainer, sSubj))
			return false;
	}
	return true;
}

function CheckDateValues(form, sName, idMsgContainer, bYearObliged, bMakeFullYear)
{
	var aPostFixes = ["_d", "_m", "_y"];
	var aMin = [1, 1, 0];
	var aMax = [31, 12, 9999];

	var bYearObliged = ((arguments.length == 3) || bMakeFullYear) ? true : false;
	var nCount = bYearObliged ? 3 : 2;

	for (var i=0; i<nCount; i++)
	{
		var ctrl = form[sName + aPostFixes[i]];
		if (ctrl.value.length)
		{
			if (ctrl.value.search(/[^\d-]/) != -1)
			{
				SetMsg(idMsgContainer, ErrorMsg("num1", aLang["date" + aPostFixes[i]]));
				return false;
			}
			if (ctrl.value < aMin[i])
			{
				SetMsg(idMsgContainer, ErrorMsg("date5", aLang["date" + aPostFixes[i]], aMin[i]));
				return false;
			}
			if (ctrl.value > aMax[i])
			{
				SetMsg(idMsgContainer, ErrorMsg("date6", aLang["date" + aPostFixes[i]], aMax[i]));
				return false;
			}
		}
	}
	if (bMakeFullYear)
	{
		if (ctrl.value.search(/^\d\d$/) == 0)
		{
			var dateNow = new Date();
			ctrl.value = ctrl.value * 1 + 2000;
			if (ctrl.value > (dateNow.getFullYear() + 20))
				ctrl.value -= 100;
		}
	}
	else if ((ctrl.maxLength == 2) && (ctrl.value.length == 1))
		ctrl.value = "0" + ctrl.value;

	var nDay = form[sName + aPostFixes[0]].value * 1;
	if ((nDay > 28) && form[sName + aPostFixes[1]].value.length && form[sName + aPostFixes[2]].value.length)
	{
		var date = new Date(form[sName + aPostFixes[2]].value, form[sName + aPostFixes[1]].value, 1, 12);	// first day next month
		date.setTime(date.getTime() - 86400000);	// back to last day this month
		var nMax = date.getDate();
		if (nDay > nMax)
		{
			SetMsg(idMsgContainer, ErrorMsg("date7", aLang["date" + aPostFixes[0]], nMax));
			return false;
		}
	}

	SetMsg(idMsgContainer, "&nbsp;");
	return true;
}

function EnableOther(ctrl, key, sName, idMsgContainer)
{
	var form = ctrl.form;
	form[sName].disabled = (ctrl.value != key);
	if (ctrl.value == key)
	{
		form[sName].focus();
		form[sName].select();
	}
	else
		document.getElementById(idMsgContainer).innerHTML = "&nbsp;";
}

function GetDigitPos(sTelNr)
{
	switch (sTelNr.charAt(1))
	{
	case "1":
		switch (sTelNr.charAt(2))
		{
		case "0":
		case "3":
		case "5":
			return 3;
		}
		return 4;
	case "2":
		switch (sTelNr.charAt(2))
		{
		case "0":
		case "3":
		case "4":
		case "6":
			return 3;
		}
		return 4;
	case "3":
		switch (sTelNr.charAt(2))
		{
		case "0":
		case "3":
		case "5":
		case "6":
		case "8":
			return 3;
		}
		return 4;
	case "4":
		switch (sTelNr.charAt(2))
		{
		case "0":
		case "3":
		case "5":
		case "6":
			return 3;
		}
		return 4;
	case "5":
		switch (sTelNr.charAt(2))
		{
		case "0":
		case "3":
		case "5":
		case "8":
			return 3;
		}
		return 4;
	case "6":
		return 2;
	case "7":
		return 3;
	case "8":
		switch (sTelNr.charAt(2))
		{
		case "8":
			return 3;
		}
		return 4;
	default:
		return 4;
	}
}

function BeautifyPhoneNr(ctrl)
{
	if (!ctrl.value.length)
		return;

	ctrl.value = ctrl.value.replace(/^(\+|00)31[\s\(0\)]*/, "0");
	if ((ctrl.value.search(/^(\+|00)/) != -1))
		return;		// don't touch foreign numbers

	var sTmp = ctrl.value.replace(/[^\d]/g, "");
	if (sTmp.indexOf("-") == -1)
	{
		if (sTmp.charAt(0) == "0")
		{
			var nPos = GetDigitPos(sTmp);
			sTmp = sTmp.slice(0, nPos) + "-" + sTmp.slice(nPos);
		}
	}

	if ((sTmp != ctrl.value) && (sTmp.length == 11) && (sTmp.indexOf("-") != -1) && (sTmp.charAt(0) == "0"))
		ctrl.value = sTmp;
}

function CheckAccountNr(ctrl, idMsgContainer)	// dutch!
{
	if (!ctrl.value.length)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	// Legal character testing
	var regexp = /[^0-9]/;
	if (regexp.test(ctrl.value))
	{
		SetMsg(idMsgContainer, ErrorMsg("bank4", ctrl.value));
		return false;
	}

	// So we're dealing with a string containing only numbers

	// Length validity testing
	if ((ctrl.value.length < 3) || (ctrl.value.length == 8) || (ctrl.value.length > 9))
	{
		SetMsg(idMsgContainer, ErrorMsg("bank1", ctrl.value));
		return false;
	}

	// Zero-only testing
	regexp = /[1-9]/;
	if (!regexp.test(ctrl.value))
	{
		SetMsg(idMsgContainer, ErrorMsg("bank2", ctrl.value));
		return false;
	}

	// In case of a "giro" account, we're done
	if (ctrl.value.length <= 7)
	{
		SetMsg(idMsgContainer, "&nbsp;");
		return true;
	}

	return CheckAccountPattern(ctrl, idMsgContainer);
 }

function CheckAccountPattern(ctrl, idMsgContainer)
{
	if ((ctrl.value != "000000000") && (ctrl.value != "123456789"))	// default pattern testing
	{
		var nSum = 0;
		var i = 0;
		if ((ctrl.value.charAt(0) == "0") && (ctrl.value.length > 9))
			++i;
		for ( ; i<ctrl.value.length; i++)
			nSum += (ctrl.value.length - i) * parseInt(ctrl.value.charAt(i));
		nSum /= 11;
		if (nSum == parseInt(nSum))
		{
			SetMsg(idMsgContainer, "&nbsp;");
			return true;
		}
	}

	SetMsg(idMsgContainer, ErrorMsg("bank3", ctrl.value));
	return false;
}
