/*
function trim(str)
function mod10(value)
function checkTextField(field, errEmpty, errWrong, fn [, arg [, arg [, arg ...]]])
function checkCustom(value, re)
function checkInteger(value [, withSeparators])
function checkFloat(value [, withSeparators])
function checkTime(value)
function checkDate(value [, todayReference])
function checkName(value)
function checkPhoneNumber(value)
function checkCAP(value)
function checkMailAddress(value)
function checkCF(value)
function checkPiva(value)
function checkCreditCardNumber(value [, type])
function checkCreditCardExpireDate(value)
*/

function trim(str)
	{
	str = str.replace(/^\s+/g, '');
	str = str.replace(/\s+$/g, '');

	return str;
	}

function mod10(value)
	{
	var checksum = 0;
	for(var i = 1; i <= value.length; i++)
		{
		var dgt = value.length - i;
		if(i % 2)
			checksum += parseInt(value.charAt(dgt), 10);
		else
			{
			var v = parseInt(value.charAt(dgt), 10) * 2;
			checksum += Math.floor(v / 10) + (v % 10);
			}
		}

	return ((checksum % 10) == 0);
	}

function checkTextField(field, errEmpty, errWrong, fn)
	{
	if(!window.RegExp)
		return field.value;

	var args = 'trim(field.value)';
	for(var i = 4; i < arguments.length; i++)
		args += ', arguments[' + i + ']';

	var result = false;
	if(field.value == '')
		{
		if(errEmpty != '')
			alert(errEmpty);
		field.select();
		field.focus();
		return false;
		}
	else if((result = eval(fn + '(' + args + ')')) === false)
		{
		if(errWrong != '')
			alert(errWrong);
		field.select();
		field.focus();
		return false;
		}

	return result;
	}

function checkCustom(value, re)
	{
	if(!re.test(value))
		return false;

	return value;
	}

function checkInteger(value, withSeparators)
	{
	if(withSeparators)
		{
		if(/^[+-]?[0-9]{1,3}(\.[0-9]{3})*$/.test(value))
			{
			value = value.replace(/\./g, '');
			value = parseInt(value, 10);
			}
		else if(/^[+-]?[0-9]{1,3}( [0-9]{3})*$/.test(value))
			{
			value = value.replace(/ /g, '');
			value = parseInt(value, 10);
			}
		else if(/^[+-]?[0-9]{1,3}(,[0-9]{3})*$/.test(value))
			{
			value = value.replace(/,/g, '');
			value = parseInt(value, 10);
			}
		else if(/^[+-]?[0-9]+$/.test(value))
			value = parseInt(value, 10);
		else
			value = false;
		}
	else if(/^[+-]?[0-9]+$/.test(value))
		value = parseInt(value, 10);
	else
		value = false;

	return value;
	}

function checkFloat(value, withSeparators)
	{
	if(withSeparators)
		{
		if(/^[+-]?[0-9]{1,3}(\.[0-9]{3})*(,[0-9]+)?$/.test(value))
			{
			value = value.replace(/\./g, '');
			value = value.replace(/,/g, '.');
			value = parseFloat(value);
			}
		else if(/^[+-]?[0-9]{1,3}( [0-9]{3})*([,\.][0-9]+)?$/.test(value))
			{
			value = value.replace(/ /g, '');
			value = value.replace(/,/g, '.');
			value = parseFloat(value);
			}
		else if(/^[+-]?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?$/.test(value))
			{
			value = value.replace(/,/g, '');
			value = parseFloat(value);
			}
		else if(/^[+-]?[0-9]+([,\.][0-9]+)?$/.test(value))
			{
			value = value.replace(/,/g, '.');
			value = parseFloat(value);
			}
		else
			value = false;
		}
	else if(/^[+-]?[0-9]+([,\.][0-9]+)?$/.test(value))
		{
		value = value.replace(/,/g, '.');
		value = parseFloat(value);
		}
	else
		value = false;

	return value;
	}

function checkTime(value)
	{
	var re = /^([0-9]{1,2})[: \.]([0-9]{1,2})$/;

	var items = re.exec(value);
	if(!items)
		return false;

	var hh = parseInt(items[1], 10);
	var mm = parseInt(items[2], 10);

	if(hh < 0 || hh > 23)
		return false;
	if(mm < 1 || mm > 59)	
		return false;

	return items[1] + ':' + items[2];
	}

function checkDate(value, todayReference)
	{
	if (typeof todayReference == 'undefined') todayReference = '';

	var re = /^([0-9]{1,2})[ -\\\/\.]([0-9]{1,2})[ -\\\/\.]([0-9]{4})$/;

	var items = re.exec(value);
	if(!items)
		return false;

	var dd = parseInt(items[1], 10);
	var mm = parseInt(items[2], 10);
	var yy = parseInt(items[3], 10);

	if(mm < 1 || mm > 12)
		return false;
	var ddmax = 31;
	if(mm == 4 || mm == 6 || mm == 9 || mm == 11)
		ddmax = 30;
	if(mm == 2)
		{
		ddmax = 28;
		if(!(yy % 4) && (!(yy % 100) == !(yy % 400)))
			ddmax++;
		}
	if(dd < 1 || dd > ddmax)
		return false;

	if(/[lg][te]/.test(todayReference))
		{
		var today = new Date();
		var ty = today.getFullYear();
		var tm = today.getMonth() + 1;
		var td = today.getDate();
		var op1 = (todayReference.charAt(0) == 'g')? '<': '>';
		var op2 = (todayReference.charAt(1) == 'e')? '': '=';
		if(eval('yy ' + op1 + ' ty'))
			return false;
		else if((yy == ty) && eval('mm ' + op1 + ' tm'))
			return false;
		else if((yy == ty) && (mm == tm) && eval('dd ' + op1 + op2 + ' td'))
			return false;
		}

	return items[1] + '/' + items[2] + '/' + items[3];
	}

function checkName(value)
	{
	return checkCustom(value, /^[ A-Za-z'\u00c0-\u017f\u01cd-\u01ff\u0187\u0192\u01a0\u01a1\u01af\u01b0\u0259\-]+$/);
	}

function checkPhoneNumber(value)
	{
	return checkCustom(value, /^\+?[0-9 \/\.\-]+$/);
	}

function checkCAP(value)
	{
	return checkCustom(value, /^[0-9]{5}$/);
	}

function checkMailAddress(value)
	{
	return checkCustom(value.toLowerCase(), /^[a-z0-9_\-\.]+\@([a-z0-9\-]+\.{1})+(com|net|org|edu|int|mil|gov|name|pro|biz|info|museum|aero|coop|asia|cat|jobs|mobi|tel|travel|[a-z]{2}){1}$/);
	}

function checkCF(value)
	{
	if(/^[0-9]{11}$/.test(value))
		{
		if(!mod10(value))
			return false;

		return value;
		}

	var values = {
		'0': [ 0,  1], '1': [ 1,  0], '2': [ 2,  5], '3': [ 3,  7], '4': [ 4,  9], '5': [ 5, 13], 
		'6': [ 6, 15], '7': [ 7, 17], '8': [ 8, 19], '9': [ 9, 21], 'A': [ 0,  1], 'B': [ 1,  0], 
		'C': [ 2,  5], 'D': [ 3,  7], 'E': [ 4,  9], 'F': [ 5, 13], 'G': [ 6, 15], 'H': [ 7, 17],
		'I': [ 8, 19], 'J': [ 9, 21], 'K': [10,  2], 'L': [11,  4], 'M': [12, 18], 'N': [13, 20], 
		'O': [14, 11], 'P': [15,  3], 'Q': [16,  6], 'R': [17,  8], 'S': [18, 12], 'T': [19, 14], 
		'U': [20, 16], 'V': [21, 10], 'W': [22, 22], 'X': [23, 25], 'Y': [24, 24], 'Z': [25, 23]
	};

	var cfCheckName = function(s)
		{
		var step = 0;
		for(var i = 0; i < s.length; i++)
			{
			if((step == 2) && (s.charAt(i) != 'X'))
				return false;
			else if((step == 1) && !/[AEIOUX]/.test(s.charAt(i)))
				return false;
			if((step == 0) && /[AEIOU]/.test(s.charAt(i)))
				step = 1;
			else if((step == 1) && (s.charAt(i) == 'X'))
				step = 2;
			}

		return true;
		}

	if(value.length != 16)
		return false;
	value = value.toUpperCase();
	var re = /^([A-Z]{3})([A-Z]{3})([0-9LMNPQRSTUV]{2})([A-EHLMPRST])([0-9LMNPQRSTUV]{2})[A-Z][0-9LMNPQRSTUV]{3}[A-Z]$/;
	var items = re.exec(value);
	if(!items)
		return false;

	if(!cfCheckName(items[1]))
		return false;
	if(!cfCheckName(items[2]))
		return false;

	var dd = items[5].replace(/([LMNPQRSTUV])/ig, function(s, dgt) { return 'LMNPQRSTUV'.indexOf(dgt); });
	dd = parseInt(dd, 10);

	var yy = items[3].replace(/([LMNPQRSTUV])/ig, function(s, dgt) { return 'LMNPQRSTUV'.indexOf(dgt); });
	yy = parseInt(yy, 10);

	if(dd > 40)
		dd -= 40;
	if(dd < 1)
		return false;
	var ddmax = 31;
	if((items[4] == 'D') || (items[4] == 'H') || (items[4] == 'P') || (items[4] == 'S'))
		ddmax = 30;
	else if(items[4] == 'B')
		{
		if(yy % 4)
			ddmax = 28;
		else
			ddmax = 29;
		}
	if(dd > ddmax)
		return false;

	var checksum = 0;
	for(i = 0; i < value.length - 1; i++)
		checksum += values[value.charAt(i)][(i + 1) % 2];

	if("ABCDEFGHIJKLMNOPQRSTUVWXYZ".charAt(checksum % 26) != value.charAt(value.length - 1))
		return false;

	return value;
	}

function checkPiva(value)
	{
	var re = /^[0-9]{11}$/
	if(!re.test(value))
		return false;

	if(!mod10(value))
		return false;

	return value;
	}

function checkCreditCardNumber(value, type)
	{
	if (typeof type == 'undefined') type = '';

	value = value.replace(/[ _\-\.]/g, '');
	type = type.toUpperCase().replace(/[_'\s\-\.]/g, '');
	switch(type)
		{
		case 'VISA':
			var re = /^4([0-9]{12}|[0-9]{15})$/; break;
		case 'MASTERCARD':
			var re = /^5[1-5][0-9]{14}$/; break;
		case 'AMEX':
		case 'AMERICANEXPRESS':
			var re = /^3[47][0-9]{13}$/; break;
		case 'NOVUS':
		case 'DISCOVER':
			var re = /^6011[0-9]{12}$/; break;
		case 'DINERSCLUB':
//			var re = /^3(0[1-5]|[68][0-9])[0-9]{11}$/; break;
			var re = /^3(0[1-5]|6[0-9]|8[0-8])[0-9]{11}$/; break;
		case 'CARTEBLANCHE':
			var re = /^389[0-9]{11}$/; break;
		case 'ENROUTE':
			var re = /^2(014|149)[0-9]{11}$/; break;
		case 'JCB':
			var re = /^(3[0-9]{15}|(2131|1800)[0-9]{11})$/; break;
		case 'AUSTRALIANBANKCARD':
			var re = /^5610[0-9]{12}$/; break;
		case '':
			var re = /^[0-9]{13,16}$/; break;
		default:
			return false;
		}

	if(!re.test(value))
		return false;

	if(!mod10(value))
		return false;

	return value;
	}

function checkCreditCardExpireDate(value)
	{
	var today = new Date();
	var y = today.getFullYear() % 100;
	var m = today.getMonth() + 1;

	var re = /^([0-9]{2})[ \-\/]([0-9]{2})$/;

	var items = re.exec(value);
	if(!items)
		return false;

	var mm = parseInt(items[1], 10);
	var yy = parseInt(items[2], 10);

	if(mm < 1 || mm > 12)
		return false;

	if(yy < y)
		return false;
	else if((yy == y) && (mm < m))
		return false;

	return items[1] + '/' + items[2];
	}
