
/*
 * Client-side validation routines
*/

function validateEmail(fldSource, fldName) {
	var bOK = true;
	var msg = "The format of the email address in the " + fldName + " field is invalid.\nPlease specify an address in a valid format, such as: myName@myDomain.com";

	var arr1 = fldSource.split("@");
	if (arr1.length != 2) bOK = bOK && false;
	else if (arr1[0].length == 0) bOK = bOK && false;
	else if (arr1[1].length == 0) bOK = bOK && false;
	if (bOK == false) { alert(msg); return (false); }

	var arr2 = arr1[1].split(".");
	if (arr2.length == 1) bOK = bOK && false;
	if (arr2[arr2.length-1].length == 0) bOK = bOK && false;
	if (bOK == false) { alert(msg); return (false); }

	return (true);

}

function validateText(fldSource, fldName, minLength, maxLength) {

    if (fldSource == null) {
        alert("Please enter a value in the \"" + fldName + "\" field.");
        return (false);
    }

    if ((minLength > 0) && (fldSource == "")) {
        alert("Please enter a value in the \"" + fldName + "\" field.");
        return (false);
    }

    if (fldSource.length < minLength) {
        alert("The value in the \"" + fldName + "\" field must be at least " + minLength + " character(s).");
        return (false);
    }

	if (maxLength != null) {
		if (fldSource.length > maxLength) {
			alert("The value in the \"" + fldName + "\" field must be not be greater than " + maxLength + " character(s).");
			return (false);
		}
	}
	
    return (true);

}


function validateNumber(fldSource, fldName) {

	var bValid = false;
    if ( fldSource != "" ) {
		bValid = true;
		var len = fldSource.length;
		for ( var i = 0; i < fldSource.length; i++ ) {
			if ( isNaN( Number(fldSource.charAt(i)) ) ) {
				bValid = false;
				break;
			}
		}
    }

    if ( !bValid && (fldName != "") )
		alert("The value in the \"" + fldName + "\" field must be a valid number.");
    return bValid;
}

function validateChars( inString, validChars ) {
	var bValid = false;
	var lenI = inString.length;
	var lenV = validChars.length;
	for ( var i = 0; i < lenI; i++ ) {
		bValid = false;
		var s = inString.charAt(i).toUpperCase();
		for ( var j = 0; j < lenV; j++ ) {
			if ( s == validChars.charAt(j) ) {
				bValid = true;
				break;
			}
		}
		if ( !bValid) {
			break;
		}
	}
	return bValid;
}

function validateAlphabetic(fldSource, fldName) {
// I expect there's a JScript function to do this....
	var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var bValid = validateChars( fldSource, alphabet );
    if ( !bValid && (fldName != "") )
		alert("The value in the \"" + fldName + "\" field must contain alphabetic characters only.");
    return bValid;

}

function validateSurname(fldSource, fldName) {

	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-\'";
	var bValid = validateChars( fldSource, validChars );
    if ( !bValid && (fldName != "") )
		alert("The value in the \"" + fldName + "\" field may contain only alphabetic characters plus apostrophe and hyphen.");
    return bValid;
}

function validateForename(fldSource, fldName) {

	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
	var bValid = validateChars( fldSource, validChars );
    if ( !bValid && (fldName != "") )
		alert("The value in the \"" + fldName + "\" field may contain only alphabetic characters plus spaces.");
    return bValid;
}

// Single Character Only!!
function validateAlphanumeric( inChar ) {
	if ( validateNumber( inChar, "" ) )
		return true;
	return validateAlphabetic( inChar, "" );
}

function validateYear( yearStr, fldName ) {
	if ( validateNumber( yearStr, fldName ) == false )
		return false;
	if ( Number( yearStr ) < 1900 ) {
		alert("The value in the \"" + fldName + "\" field must be a valid year (post-1900).");
		return (false);
	}
	return true;
}

function validateDate(dateStr, fldName) {
    //Script obtained from "The JavaScript Source!! http://javascript.internet.com"
    //Original:  Sandeep V. Tamhankar (stamhankar@hotmail.com) -->
    // Checks for the following valid date formats:
    // DD/MM/YY   DD/MM/YYYY   DD-MM-YY   DD-MM-YYYY
    // Also separates date into month, day, and year variables

    //var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

    // To require a 4 digit year entry, use this line instead:
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

    var matchArray = dateStr.match(datePat); // is the format ok?
    if (matchArray == null) {
        alert("The \"" + fldName + "\" field must be in format \"dd/mm/yyyy\".")
        return false;
    }

    day = matchArray[1]; // parse date into variables
    month = matchArray[3];
    year = matchArray[4];
    if (month < 1 || month > 12) { // check month range
        alert("\"" + fldName + "\" - Month must be between 1 and 12.");
        return false;
    }
    if (day < 1 || day > 31) {
        alert("\"" + fldName + "\" - Day must be between 1 and 31.");
        return false;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("\"" + fldName + "\" - Month " + month + " doesn't have 31 days!")
        return false
    }
    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day==29 && !isleap)) {
            alert("\"" + fldName + "\" - February " + year + " doesn't have " + day + " days!");
            return false;
        }
    }

    return true;  // date is valid
}

function validateTime(timeStr, fldName) {
    var timePat = /^(\d{2})(\:)(\d{2})$/;

    var matchArray = timeStr.match(timePat); // is the format ok?
    if (matchArray == null) {
        alert("The \"" + fldName + "\" field must be in format \"hh:mm\".")
        return false;
    }
    
    var hh = matchArray[1]; // parse date into variables
    var mm = matchArray[3];
    if (hh < 0 || hh > 23) { // check hour range
        alert("\"" + fldName + "\" - Hour must be between 0 and 23.");
        return false;
    }
    if (mm < 0 || mm > 59) {
        alert("\"" + fldName + "\" - Minute must be between 0 and 59.");
        return false;
    }

    return true;  // date is valid
}

function validatePostcode( postcodeStr ) {

	var strPC = postcodeStr.toUpperCase();

	// split postcode into Incode and Outcode
	var strArray = strPC.split( " " );

	if ( strArray.length != 2 )
		return 1;

	var strIn = strArray[1];
	var strOut = strArray[0];

	// validate Incode
	if ( strIn.length != 3 )
		return 2;

	if ( !validateNumber(strIn.charAt(0), "") )
		return 3;

	if ( !validateAlphabetic(strIn.charAt(1), "") )
		return 4;

	if ( !validateAlphabetic(strIn.charAt(2), "") )
		return 5;

	var badChars = "CIKMOV";

	if ( badChars.search( strIn.charAt(1) ) != -1 )
		return 6;

	if ( badChars.search( strIn.charAt(2) ) != -1 )
		return 7;

	// validate Outcode
	var len = strOut.length;
	if ( (len < 2) || (len > 4) )
		return 8;

	if ( !validateAlphabetic(strOut.charAt(0), "") )
		return 9;

	switch ( len ) {
		case 2:
		if ( !validateNumber(strOut.charAt(1), "") )
			return 10;
			break;
		case 3:
			if ( validateNumber(strOut.charAt(1), "") ) {
				if ( !validateAlphanumeric(strOut.charAt(2)) )
					return 11;
			}
			else if ( validateAlphabetic(strOut.charAt(1), "") ) {
				if ( !validateNumber(strOut.charAt(2), "") )
					return 12;
			}
			else
				return 13;
			break;
		case 4:
			if ( !validateAlphabetic(strOut.charAt(1), "") )
				return 14;
			if ( !validateNumber(strOut.charAt(2), "") )
				return 15;
			if ( !validateAlphanumeric(strOut.charAt(3)) )
				return 16;
			break;
		default:
			return 17;
			break;
	}
	return 0;

}
