/************************************************************************

    File    :   validation.js
    Contents:   This file contains general purpose validation routines for us on
                HTML forms.
************************************************************************/


/************************************************************************

    Function    :   Validate
    Author      :   Andy Faulkner
    Date        :   19/11/1998
    Purpose     :   This routine validates fields on a form according to the validation
                    rules defined in the objValidate parameter.

    Parameters  :   frmMainForm     The form in which the fields to be validated reside.
                    objValidate     The object containing validation rules to be applied
                                    to the fields in frmMainForm.
************************************************************************/

function Validate (frmMainForm, objValidate , objSingle) {


    var forFocus = "";
    var strMessage="";
    var IsValid = true;
    var FailureList = "The following field(s) failed the validation check: \n\n";



if (objSingle) {
obj=objSingle;

    if (isBlank(frmMainForm[obj].value)){
        return false;}

if (objValidate[obj].type == 'text') {
            if (!TextValidate(frmMainForm[obj], objValidate[obj])) {
		IsValid = false;
		strMessage=objValidate[obj].valtext;
		window.status=strMessage;
                frmMainForm[obj].focus();		
							           }
				     }
else 
if (objValidate[obj].type == 'date') {
	    if (!DateValidate(frmMainForm[obj], objValidate[obj])) {
                IsValid = false;
		strMessage=objValidate[obj].valtext;
		window.status=strMessage;
		frmMainForm[obj].focus();
		window.status=strMessage;
							           }
				     }
else 
if (objValidate[obj].type == 'email') {
	    if (!MailValidate(frmMainForm[obj], objValidate[obj])) {
                IsValid = false;
		strMessage=objValidate[obj].valtext;
		window.status=strMessage;
		frmMainForm[obj].focus();
		window.status=strMessage;
							           }
				     }
else 
if (objValidate[obj].type == 'number') {
            if (!NumberValidate(frmMainForm[obj], objValidate[obj])) {
                IsValid = false;
		strMessage = frmMainForm[obj].value + ' is not valid\n' + objValidate[obj].valtext;
		frmMainForm[obj].value = '';
		alert(strMessage);
		frmMainForm[obj].focus();
							             }
				       }

}


else {

    for (var obj in objValidate) {
        if (objValidate[obj].type == 'text') {
             if (!TextValidate(frmMainForm[obj], objValidate[obj])) {
         	 IsValid = false;
                 FailureList += "    " + objValidate[obj].valtext + "\n";
		 if (forFocus=="") forFocus=frmMainForm[obj];
            }
        }
        else if (objValidate[obj].type == 'date') {         
	     if (!DateValidate(frmMainForm[obj], objValidate[obj])) {
                 IsValid = false;
                 FailureList += "    " + objValidate[obj].valtext + "\n";
		 if (forFocus=="") forFocus=frmMainForm[obj];
            }
        }

/* list object validates a list box to check that a value other than the first one is selected */
        else if (objValidate[obj].type == 'list') {
             if (!ListValidate(frmMainForm[obj], objValidate[obj])) {
                 IsValid = false;
                 FailureList += "    " + objValidate[obj].valtext + "\n";
		 if (forFocus=="") forFocus=frmMainForm[obj];
            	}
        }

        else if (objValidate[obj].type == 'email') {         
	     if (!MailValidate(frmMainForm[obj], objValidate[obj])) {
                 IsValid = false;
                 FailureList += "    " + objValidate[obj].valtext + "\n";
		 if (forFocus=="") forFocus=frmMainForm[obj];
            }
        }
        else if (objValidate[obj].type == 'number') {
             if (!NumberValidate(frmMainForm[obj], objValidate[obj])) {
                 IsValid = false;
                 FailureList += "    " + objValidate[obj].valtext + "\n";
		 if (forFocus=="") forFocus=frmMainForm[obj];
            }
        }
    }
}




    if (!IsValid){
	if (!objSingle) {
		alert(FailureList);
		forFocus.focus();
		forFocus="";
		return false;
			}
	else {
//		alert(strMessage);
		return false;}
		}
    else {
	if (!objSingle)
//		frmMainForm.submit();
		//alert('Validated OK - Form Submitted');
	return true;
	else

		window.status="";
		}



}

/************************************************************************
    Function    :   TextValidate
    Author      :   Andy Faulkner
    Date        :   19/11/1998
    Purpose     :   General purpose text validation routine.

    Parameters  :   objText     The text field to be validated.
************************************************************************/

function TextValidate(objText, objValidate) {
    if (isBlank(objText.value))
        return(objValidate.blank);

    if (typeof(objText.value) == 'string') {
        return true;
    }
    else
        return false;
}



/************************************************************************
    Function    :   NumberValidate
    Author      :   Andy Faulkner
    Date        :   19/11/1998
    Purpose     :   Validates number fields according to rules.
    
    Parameters  :   objDate     The number field to be validated.
                    objValidate The validation object to be applied to it.

************************************************************************/
function NumberValidate(objNumber, objValidate) {
    if (isBlank(objNumber.value))
        return(objValidate.blank);

    if (isNumberString(objNumber.value)) {
        return(objNumber.value >= objValidate.lower && objNumber.value <= objValidate.upper);
    }
    else {
        return(false);
    }
}


function ListValidate(objList, objValidate)
{
    if (objList.selectedIndex == 0)
        return(objValidate.blank);
    else
	return (true);
}


/************************************************************************
    Function    :   DateValidate
    Author      :   Andy Faulkner
    Date        :   19/11/1998
    Purpose     :   Validates date fields according to rules.
    
    Parameters  :   objDate     The date field to be validated.
                    objValidate The validation object to be applied to it.

************************************************************************/

function DateValidate(objDate, objValidate) {
    if (isBlank(objDate.value))
        return(objValidate.blank);

    if (typeof(objDate.value) == 'string') {

        var dt = Date.parse(CheckDate(objDate.value));
        if (dt != 0) {
            return(dt >= objValidate.lower && dt <= objValidate.upper);
        }
    }

    return(false);
}

function MailValidate(objMail, objValidate) {
	if(isBlank(objMail.value))
		return(objValidate.blank);
	if (typeof(objMail.value) == 'string') {
		if (objMail.value.search(/.+\@.+\..+/) != -1)
			return true;
		else 
			return false;
	}
	return (false);
}

/************************************************************************
    Function    :   CheckDate
    Author      :   Andy Faulkner
    Date        :   19/11/1998
    Purpose     :   Checks that a date is valid and then reformats
                    a date string in DD/MM/YYYY form to one in
                    MM/DD/YYYY.
    
    Parameters  :   objDate     The date field to be validated.
                    objValidate The validation object to be applied to it.

************************************************************************/

function CheckDate(strDate) {

    var datebits = parser(strDate, '/');
    if (datebits.length != 3)
        return (0);

    var day = datebits[1];
    var mon = datebits[2];
    var year = datebits[3];
    if (mon < 1 || mon > 12) 
        return(0);

    var maxday = 0;
    if (mon == 4 || mon == 6 || mon == 9 || mon == 11)
        maxday = 30;
    else if (mon == 2) {
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0) {
                    maxday = 29;
                }
                else
                    maxday = 28;
            }
            else
                maxday = 29;
        }
        else
            maxday = 28;
    }
    else
        maxday = 31;

    if (day < 1 || day > maxday)
        return(0);
        
    var strUSDate = mon + "/" + day + "/" + year;
    return(strUSDate);
}
