////////////////////////////////////////////////////////////////////////////////////////////
// form_validation_functions_<version>.js
//
// Contains the major functions used by the form_validation_xx.js script.
// Each modification needs to be commented in the history below.
// Each modification requires this file be saved as a new version (incremental filename), and should be referenced in the 
// includes/html/javascripts.asp include file.
////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////
// Modification History:
// Version	Date		Initials	Comments
// v1.00	05/05/2009	SBH			Initial release.
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function setFieldValue(thisFormName) {
	var setStr;
	var thisElementType;
	var thisElementGroupSize;
	var objThisElement;
	var thisElementValue;               

	setStr = "document." + thisFormName + "." + thisFieldName;
	//alert("element string = " + setStr);

	objThisElement = eval(setStr);
	thisElementGroupSize = objThisElement.length;
	thisElementType = objThisElement.type;

	//alert("element type = " + thisElementType);
	//alert("element group size = " + thisElementGroupSize);
	
	if (!thisElementType && thisElementGroupSize > 1) {
		for (var i=0; i<thisElementGroupSize; i++) {
			if (objThisElement[i].checked == true) {
				thisElementValue = objThisElement[i].value;
				break;
			}
			else {
				thisElementValue = "";
			}
		}
	}
	else {
		if (thisElementType == "checkbox" || thisElementType == "radio") {
			if (objThisElement.checked == true) {
				thisElementValue = objThisElement.value;
			}
			else {
				thisElementValue = "";
			}
		}
		else {
			thisElementValue = objThisElement.value;
		}
	
	}
	
	if (thisElementValue != "") {
		thisFieldValue = thisElementValue;
	}
	else {
		thisFieldValue = "";
	}
	//alert("set field value = " + thisFieldValue);
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function updateFieldValue(thisFormName) {
	var updateStr;
	updateStr = "document." + thisFormName + "." + thisFieldName + ".value = '" + thisFieldValue + "'";
	eval(updateStr);
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function validateCheckbox(paramFormName, paramFieldName, paramRule) {
	var bResult = false;
	var strCheckbox, objCheckbox;
	var iNumberOfOptions = 0;
	var iNumberOfOptionsSelected = 0;
	var iNumberOfElements;
	strCheckbox = "document." + paramFormName + "." + paramFieldName;
	iNumberOfElements = eval("document." + paramFormName + ".elements.length");
	for (var elementLoop = 0; elementLoop < iNumberOfElements; elementLoop++) {
		objElement = eval("document." + paramFormName + ".elements[" + elementLoop + "]");
		
		if (objElement.name == paramFieldName) {
			iNumberOfOptions ++;
			if (objElement.checked) {
				iNumberOfOptionsSelected++;
			}
		}
	}
	
	//alert("iNumberOfOptions = " + iNumberOfOptions);
	//alert("iNumberOfOptionsSelected = " + iNumberOfOptionsSelected);

	switch (paramRule) {
	case "1+":
		if (iNumberOfOptionsSelected > 0) {
			bResult = true;
		}
	break;
	}
	return bResult;
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function y2k(number) { 
	return (number < 1000) ? number + 1900 : number; 
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function fnYearInRange(paramYear) {
	var iYear = paramYear * 1;	//force a conversion to integer datatype.
	var iLowerLimit, iUpperLimit;
	iLowerLimit = 1900;
	iUpperLimit = 2100;
	if (iYear < iLowerLimit || iYear > iUpperLimit) {
		return false;
	}
	else {
		return true;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function isDate (day,month,year) {
	// checks if date passed is valid
	// will accept dates in following format:
	// isDate(dd,mm,ccyy), or
	// isDate(dd,mm) - which defaults to the current year, or
	// isDate(dd) - which defaults to the current month and year.
	// Note, if passed the month must be between 1 and 12, and the
	// year in ccyy format.
	
	//alert("day: " + day + ", month: " + month + ", year: " + year);
    var today = new Date();
    year = ((!year) ? y2k(today.getYear()):year);
    month = ((!month) ? today.getMonth():month-1);

    if (!day) return false
	if (!fnYearInRange(year)) return false
    var test = new Date(year,month,day);
    if ( (y2k(test.getYear()) == year) &&
         (month == test.getMonth()) &&
         (day == test.getDate()) )
        return true;
    else
        return false
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function isValidDate (wholedate, bBlankOK) {
	// checks if date passed is valid
	// a single date is passed in, with a boolean value
	// which is set to true (can be blank) or 
	// false (must be populated with a date), 
	// which is then validated.
	// Date is split by / divider
	
	if (bBlankOK && wholedate == "") {
		return true;
	}
	else {
		var dateParts = wholedate.split("/");
		//alert(dateParts.length);
	
		if (dateParts.length < 3){
			return false;	
		}
		if (dateParts[0].length < 1 || dateParts[0].length > 2) {
			return false;
		}
		if (dateParts[1].length < 1 || dateParts[1].length > 2) {
			return false;
		}
		if (dateParts[2].length < 4 || dateParts[2].length > 4) {
			return false;
		}	
	
		if (!fnYearInRange(dateParts[2])) return false
	
		var isDateResult = isDate(dateParts[0],dateParts[1],dateParts[2]);
		//alert(dateParts[0] + "/" + dateParts[1] + "/" + dateParts[2] + " - isDateResult=" + isDateResult);
		if (isDateResult == true) {
			return true;
		}
		else
		{
			return false;
		}
		//alert(isDateResult);
	}
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function isValidPhoneNumber(thisPhoneNumber) {
	var phoneNumberOK;
	var iPhoneLength;
	iPhoneLength = thisPhoneNumber.length;
	phoneNumberOK = false;
	//modify to phone pattern
	//validate this element expression
	var phoneRegExp = /^\d{3,}\s?\d{3,}\s?\d{0,}$/;
	if (phoneRegExp.test(thisPhoneNumber)) {
		phoneNumberOK = true;
	}
	if (iPhoneLength > 13) {
		phoneNumberOK = false;
	}
	return phoneNumberOK;
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function isValidMobileNumber(thisMobileNumber) {
	var mobileNumberOK;
	var strValue, iLength;
	mobileNumberOK = false;
	//modify to phone pattern
	//validate this element expression
	strValue = thisMobileNumber.substr(0,2);
	iLength = thisMobileNumber.length;
	if (strValue=="07" && iLength<=13) {
		mobileNumberOK = true;
	}
	return mobileNumberOK;
}
////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////
function isValidEmail(thisEmailAddress) {
	var emailAddressOK;
	var strValue;
	emailAddressOK = false;
	//modify to phone pattern
	//validate this element expression
	strValue = thisEmailAddress.search("@");
	if (strValue!=-1) {
		emailAddressOK = true;
	}		
	return emailAddressOK;
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function hasNumerics(paramString) {
	var iStringLength = paramString.length;
	var strThisCharacter;
	var bNumericFound = false;

	for (var i=0; i < iStringLength; i++) {
		strThisCharacter = paramString.substr(i,1);
		if (!isNaN(strThisCharacter)) {
			bNumericFound = true;
			break;
		}
	}
	return bNumericFound;
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function dateTense(paramDate) {
	var strReturnValue = null;
	var dToday;
	var year, month, day;
	var dInterimDate, dCompareDate;

	//establish today's date:
	dToday = new Date();

	//truncate hours mins etc:
	year = dToday.getYear();
	month = dToday.getMonth();
	day = dToday.getDate();
	dToday = new Date(year,month,day);
	//alert("dToday=" + dToday);
	
	//establish parameter in equivalent datatype:
	//0123456789
	//01/01/2007
	year = paramDate.substr(6,4);
	month = paramDate.substr(3,2) - 1;
	day = paramDate.substr(0,2);
	dCompareDate = new Date(year,month,day);
	//alert("dCompareDate=" + dCompareDate);

	//compare:
	var iCompareResult = dCompareDate - dToday;
	if (iCompareResult == 0) {
		strReturnValue = "present";
	}
	else {
		if (iCompareResult > 0) {
			strReturnValue = "future";
		}
		else {
			strReturnValue = "past";
		}
	}
	return strReturnValue;
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
//Highlight the Field in Question to show which field needs correcting:
function highlightField(paramFormName,paramFieldName,paramMode) {
	var fStr, objFstr;
	fStr = "document." + paramFormName + "." + paramFieldName;
	objFstr = eval(fStr);
	//alert("paramFormName,paramFieldName,paramMode=" + paramFormName + "," + paramFieldName + "," + paramMode);
	//alert(objFstr.name);	
	//alert(objFstr.className);	
	if (paramMode == "highlight") {
		objFstr.className = "errorField";	
	}
	else
	{
		objFstr.className = "formtext";	
	}
}
////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////
function convertStringToDate(paramDateLabel, paramDateAsString) {
	//alert(paramDateAsString);
	var dConvertedDate;
	var strDD, strMM, strYYYY;
	var arrDateParts;
	var iConversionError = 0;

	//break the string into DD, MM, YYYY components - stop processing if not in required format:
	if (paramDateAsString.indexOf("/") < 0) {
		iConversionError = 1;
	}

	arrDateParts = paramDateAsString.split("/");
	if (arrDateParts.length != 3) {
		iConversionError = 2;
	}

	if (iConversionError > 0) {
		alert("Unable to convert " + paramDateLabel + " to a date, please use the format 'dd/mm/yyyy'. (Error code " + iConversionError + ")");
		return false;
	}

	//rebuild as date and pass back:
	//alert("0(dd)=" + arrDateParts[0] + ", 1(mm)=" + arrDateParts[1] + ", 2(yyyy)=" + arrDateParts[2]);
	dConvertedDate = new Date(arrDateParts[2],  (1*arrDateParts[1])-1, arrDateParts[0]); 
	//alert("converted to: " + dConvertedDate);
	
	//return false;	//debug only:
	return dConvertedDate;
}
////////////////////////////////////////////////////////////////////////////////////////////


