function trimText(text)
{
	var regexp = /^\s*(.*?)\s*$/;
	var strings = text.value.match(regexp);
	if (strings!=null)
		text.value = strings[1];
	return;
}

function toUpper(text)
{
	text.value = text.value.toUpperCase();
	return;
}

function checkDate(date,msg)
{
	trimText(date);
    var monthlen = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    var regexp = /^(\d{1,2})\/(\d{1,2})\/(\d{2})$/;
	var datesplit = date.value.match(regexp);
    if (datesplit==null || parseInt(datesplit[2])>12 ||
	    parseInt(datesplit[1])>monthlen[parseInt(datesplit[2])-1]+(parseInt(datesplit[3])%4==0))
    {
        alert((msg==null ? "Invalid date" : msg) + ": '" + date.value + "'");
		date.focus();
        return 1;
    }
    return 0;
}
function checkDateOpt(date,msg)
{
	trimText(date);
	return date.value.length>0 ? checkDate(date,msg) : 0;
}
function checkTime(time,msg)
{
	trimText(time);
	var str = time.value;
	str = str.replace(/a\./, "a");
	str = str.replace(/p\./, "p");
	str = str.replace(/m\./, "m");
	str = str.replace(/\./, ":");

    var regexp = /^[01]?\d(:\d{2})?\s*(am|pm)$/;
	if (str.match(regexp)==null)
	{
        alert((msg==null ? "Invalid time" : msg) + ": '" + time.value + "'");
		time.focus();
		return 1;
	}
	time.value = str; //write back to form field
    return 0;
}
function checkTimeOpt(time,msg)
{
	trimText(time);
	return time.value.length>0 ? checkTime(time,msg) : 0;
}

function checkCountryPostcode(country,postcode,msg)
{
	var val = country.options[country.selectedIndex].value;
	if (val=='GBR')
		return checkPostcode(postcode,msg);

	trimText(postcode);
	toUpper(postcode);
	return checkRequired(postcode,msg);
}

function checkPostcode(postcode,msg)
{
	trimText(postcode);
	toUpper(postcode);

    var value = postcode.value;
	var regex = /^[A-Z]{1,2}\d{1,2}[A-Z]? \d[A-Z]{2}$/;
	if (value.match(regex) == null)
	{
        msg = (msg==null ? "Invalid postcode" : msg) + ": '" + postcode.value + "'";
		var len = value.length;
		if (len < 6) msg = msg + "\n(too short)";
		else if (len > 8) msg = msg + "\n(too long)";
		else if (!value.substr(len-4,1).match(/ /))
			msg = msg + "\n(missing space before last 3 characters)";
		else if (!value.match(/^[A-Z]{1,2}/))
			msg = msg + "\n(first 1 or 2 characters should be letters A-Z)";
		else if (!value.match(/^[A-Z]{1,2}\d{1,2}/))
			msg = msg + "\n(should be 1 or 2 digits 0-9 after first 1 or 2 letters)";
		else if (!value.match(/^[A-Z]{1,2}\d{1,2}[A-Z]? /))
			msg = msg + "\n(only letter A-Z allowed between 2 digits and space)";
		else if (!value.substr(len-3,1).match(/\d/))
			msg = msg + "\n(character after space should be number 0-9)";
		else if (!value.substr(len-2).match(/[A-Z]{2}/))
			msg = msg + "\n(last 2 characters should be letters A-Z)";
		
		alert (msg);
		postcode.focus();
		return 1;
	}
	
    return 0;
}

function checkEmail(email,msg)
{
	trimText(email);
    var regex = /^([\w-_\.]*)@([\w-\.]*\.[A-Za-z]{2,4})$/;
	if (email.value.match(regex) == null)
	{
        alert((msg==null ? "Invalid email" : msg) + ": '" + email.value + "'");
		email.focus();
		return 1;
	}
	
    return 0;
}
function checkEmailOpt(email,msg)
{
	trimText(email);
	return email.value.length>0 ? checkEmail(email,msg) : 0;
}

function checkFloat(f,msg)
{
	trimText(f);
    var regex = /^(\d+(\.\d*)?)$/;
	if (f.value.match(regex) == null)
	{
        alert((msg==null ? "Invalid number" : msg) + ": '" + f.value + "'");
		f.focus();
		return 1;
	}
	
    return 0;
}

function checkInteger(int,msg)
{
	trimText(int);
    var regex = /^(\d+)$/;
	if (int.value.match(regex) == null)
	{
        alert((msg==null ? "Invalid number" : msg) + ": '" + int.value + "'");
		int.focus();
		return 1;
	}
	
    return 0;
}
function checkIntegerOpt(int,msg)
{
	trimText(int);
	return int.value.length>0 ? checkInteger(int,msg) : 0;
}
function checkInt0(int,msg)
{
	trimText(int);
	if (int.value.length==0) int.value='0';
	return checkInteger(int,msg);
}

function checkRequired(text,msg)
{
	trimText(text);
	if (text.value.length==0)
	{
        alert(msg==null ? "Missing required field" : msg);
		text.focus();
		return 1;
	}
    return 0;
}

function checkSelect(select,msg)
{
	for (var i=0; i<select.options.length; i++)
	{
		if (select.options[i].selected)
		{
			var val = select.options[i].value;
			if (val=='')
			{
				alert(msg==null ? "Please make a selection" : msg);
				return 1;
			}
			else
				return 0;
		}
	}
	alert(msg==null ? "Please make a selection" : msg);
	return 1;
}

function checkSame(pwd1,pwd2,msg)
{
	if (pwd1.value != pwd2.value)
	{
        alert(msg==null ? "Entry is not the same in both boxes!" : msg);
		pwd1.focus();
		return 1;
	}
    return 0;
}

function checkPassword(pwd1,pwd2)
{
	if (pwd1.value.length < 6)
	{
        alert("Passwords must be at least 6 characters");
		pwd1.focus();
		return 1;
	}
	if (pwd1.value != pwd2.value)
	{
        alert("Password is not the same in both boxes!");
		pwd1.focus();
		return 1;
	}
    return 0;
}

function checkCreditcard(cc)
{
	ccnum = cc.value;
	while ((p=ccnum.indexOf(' '))>=0) ccnum = ccnum.substring(0,p)+ccnum.substring(p+1);
	while ((p=ccnum.indexOf('-'))>=0) ccnum = ccnum.substring(0,p)+ccnum.substring(p+1);
	//ccnum = ccnum.replace(/\s/,'').replace(/-/,'');  // doesn't do replaceAll()
	
	if (!ccnum.match(/^\d{13,19}$/))
	{
        alert("Credit card number is not valid: " + ccnum);
		cc.focus();
		return 1;
	}
	ccprefix = parseInt(ccnum.substring(0,6)); 
	// American Express: 340000-349999, 370000-379999
	if (ccnum.match(/^3[47]/))
	{
        alert("American Express Credit card numbers cannot be accepted: " + ccnum);
		cc.focus();
		return 1;
	}
	// Diners: 300001-305999, 360000-369999, 380000-389999
	if ((ccprefix>=300001 && ccprefix<=305999) ||
		ccnum.match(/^3[68]/))
	{
        alert("Diners Credit card numbers cannot be accepted: " + ccnum);
		cc.focus();
		return 1;
	}
	// Electron: 484406-484455, 491730-491759, 491880-491880
	if ((ccprefix>=484406 && ccprefix<=484455) ||
		ccnum.match(/^49173[0-5]/) ||
		ccnum.match(/^491880/))
	{
        alert("Electron Credit card numbers cannot be accepted: " + ccnum);
		cc.focus();
		return 1;
	}
	// JCB: 352800-358999
	if (ccprefix>=352800 && ccprefix<=358999)
	{
        alert("JCB card numbers cannot be accepted: " + ccnum);
		cc.focus();
		return 1;
	}
	// Other card types outside range 300000-699999
	if (ccnum.match(/^[0-27-9]/))
	{
        alert("Card number is not a credit card: " + ccnum);
		cc.focus();
		return 1;
	}
	
	// Luhn10 check
	sum = 0;
	// Odd digits from right
	for (i=ccnum.length-1; i>=0; i-=2)
	{
		digit = parseInt(ccnum.substr(i,1));
		sum += digit;
	}
	// Even digits from right
	for (i=ccnum.length-2; i>=0; i-=2)
	{
		digit = parseInt(ccnum.substr(i,1));
		sum += (digit<5) ? digit*2 : (digit-5)*2+1;
	}
	if (sum%10 != 0)
	{
        alert("Credit card number is incorrect");
		cc.focus();
		return 1;
	}

    //alert("Credit card number OK: " + ccnum);
    return 0;
}

function thumbName(name,size)
{
    i = name.lastIndexOf('/');
    j = name.lastIndexOf('.');

    if (i<0 || j<0) return "images/Library/thumbs/thumbnail.jpg";

    return name.substring(0,i) + "/thumbs" +
           name.substring(i,j) + '_' + size + name.substring(j);

    //return name;
}

