// validateform.js : v1.6 14/05/2008
var requiredFlag = '<em>*</em>';
var errorMessage = "Please enter a value";
var errorMessage2 = "Please select an option";
var useLabelNames = true;
var errorCount = 0;
var depval = null;
var dateReformat = "DD/MM/YYYY";	// THE FORMAT THAT VALIDATED DATES SHOULD BE REFORMATTED AS
var depFld = null;
var depVal = null;

jQuery(document).ready(function() {
	// jQuery("form input.date-dmy").val('dd/mm/yyyy');
	// jQuery("form input.date-picker").datepicker({dateFormat: "dd/mm/yy", minDate: 0,showOn: 'both', buttonImage: 'images/calendar.png', buttonImageOnly: true, buttonText: 'choose date'}); 
	jQuery("form .date-dmy").focus(function() {
		if (this.value == 'dd/mm/yyyy') this.value = '';
	});
	
	//submit handler
	jQuery("form").submit(function() {
			jQuery('#submit-message').remove();
			jQuery(':input.required').trigger('blur');
			// jQuery(':input.dep-required').trigger('blur');
			var errors = jQuery('.form-invalid', this).length;
			if (errors){
				// show summary message
				jQuery('#submitbutton', this).addClass('noedit');
				jQuery('<span id="submit-message"></span>')
						.text('Please correct errors above before submitting form')
						.addClass('errormsg')
						.insertAfter(jQuery('#submitbutton', this));					
				return false;
			}
		return true;
	});

	// flag corres labels for required form fields
	jQuery('form :input').filter('.required').prev('label').addClass('required').append(requiredFlag);
	// validation event handler
	jQuery('form :input').blur(function() {
		jQuery(this).next('span.form-invalid').remove();// remove any pre-existing messages
		if (jQuery(this).is('.required')) {
			var label = "";
			if ( ((this.type == "checkbox" || this.type == "radio") && ! this.checked) ||
				this.value == "") {
				var fld = jQuery(this);
				jQuery(this).addClass('errorfld').removeClass('validfld');

				if (useLabelNames) { // shall we use the label names as part of error message ??
					label = ' for '+jQuery(this).prev('label').text();
					label = label.substr(0, label.indexOf(" *"));
				};
				if (this.type == "checkbox" || this.type == "radio" || this.type.substr(0,6) == "select") {
					var msg = errorMessage2;
				}
				else {
					var msg = errorMessage;
				}
				jQuery('<span></span>')
					.text(msg+label)
					.addClass('form-invalid')
					.insertAfter(this);
				return;
			}else{
				jQuery(this).removeClass('errorfld').addClass('validfld');
			}					
		} // end required check
		
		// check for invalid email addresses
		if ( jQuery(this).is('.email') && this.value != "" ) {
			if (!/.+@.+\.[a-zA-Z]{2,4}$/.test(this.value)) {	// properly formed email addr
				var fld = jQuery(this);
				jQuery(this).addClass('errorfld').removeClass('validfld');
				jQuery('<span></span>')
					.text('Invalid email address')
					.addClass('form-invalid')
					.insertAfter(this);
			}else{
				jQuery(this).removeClass('errorfld').addClass('validfld');
			}
		} // end email check
		
		// check for currency fields
		if ( jQuery(this).is('.currency') && this.value != "" ) {
			if (!/^[0-9]+\.?[0-9]{0,2}$/.test(this.value)) {	// looks like currency ?
				var fld = jQuery(this);
				jQuery(this).addClass('errorfld').removeClass('validfld');
				jQuery('<span></span>')
					.text('This is an invalid amount')
					.addClass('form-invalid')
					.insertAfter(this);
			}else{
				jQuery(this).removeClass('errorfld').addClass('validfld');
			}
		} // end currency check
		
		// check for date fields
		if ( jQuery(this).is('.date-dmy') && this.value != "" ) {
			if (isDateValid(this, dateReformat) == false) {
				var fld = jQuery(this);
				jQuery(this).addClass('errorfld').removeClass('validfld');
				jQuery('<span></span>')
					.text('This is an invalid date')
					.addClass('form-invalid')
					.insertAfter(this);
			}else{
				jQuery(this).removeClass('errorfld').addClass('validfld');
			}
		} // end date check
		
		// check for number fields
		if ( jQuery(this).is('.number') && this.value != "" ) {
			if (!/^[0-9]+$/.test(this.value)) {	// looks like a number ?
				var fld = jQuery(this);
				jQuery(this).addClass('errorfld').removeClass('validfld');
				jQuery('<span></span>')
					.text('This is an invalid number')
					.addClass('form-invalid')
					.insertAfter(this);
			}else{
				jQuery(this).removeClass('errorfld').addClass('validfld');
			}
		} // end currency check
	});

	
	// change handler for any fields with dependants
	jQuery('form .dependson-wrapper').hide();
	
	jQuery('form :input.hasdeps').change(function() {
			
		// determine dependent field value to trigger actions on dependant fields
		depVal = this.value;
	
		// determine what fields depend on this field and walk thru each
		// for instance if this field has id of 'workaddr', then we will hunt out all associated dep fields which have
		// a classname of 'dep-workaddr' attached to them
		var dependOnClass = '.dep-'+this.id;

		depflds = jQuery('form :input.dependson').filter(dependOnClass).each(function(index){
			var e = jQuery(this);
				
			// get the trigger value ex special attribute of this input field
			triggerVal = e.attr('depval');
		
			if (triggerVal != "undefined" && depVal == triggerVal) {	// our dependant field value matchs - show it
				if ( e.hasClass('requiredd') ) {			// change from prov required to required
					e.removeClass('requiredd').addClass('required');
				}
				// show parent wrapper
				e.parent().show('slow');
				// jQuery('input.dep-required', this).removeClass('requiredd').addClass('required');
				// jQuery(this).show('slow');
			}
			else {								// hide it
				if (e.hasClass('required') ) {				// change from required to provisionally required
					e.removeClass('required').addClass('requiredd');
				}
				e.parent().hide('slow');
				// jQuery('input.required', this).removeClass('required').addClass('dep-required');
	
			}

		});



	});
});

function isDateValid(objName, reformat) {
// var strDatestyle = "US"; //United States date style
var strDatestyle = "EU";  //European date style
var strDate;
var strDateArray;
var strDay;
var strMonth;
var strYear;
var intday;
var intMonth;
var intYear;
var booFound = false;
var datefield = objName;
var strSeparatorArray = new Array("-"," ","/",".");
var intElementNr;
var err = 0;

strDate = datefield.value;

if (strDate.length < 1) {
return false;
}
// 55
for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
	if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
		strDateArray = strDate.split(strSeparatorArray[intElementNr]);
		if (strDateArray.length != 3) {
			err = 1;
			return false;
		}
		else {
			strDay = strDateArray[0];
			strMonth = strDateArray[1];
			strYear = strDateArray[2];
		}
		booFound = true;
	   }
}
if (booFound == false) {
    if (strDate.length == 8){
        strDay = strDate.substr(0, 2);
        strMonth = strDate.substr(2, 2);
        strYear = strDate.substr(4);
       }
       else {
	       return false;
       }
    }

if (strYear.length == 2) 
    {
    intYear = parseInt(strYear);
    if (intYear >= 20)
        {
        strYear = '19' + strYear;
        }
    else
        {
        strYear = '20' + strYear;
        }
    }

// US style
if (strDatestyle == "US") {
strTemp = strDay;
strDay = strMonth;
strMonth = strTemp;
}
intday = parseInt(strDay, 10);
if (isNaN(intday)) {
err = 2;
return false;
}
intMonth = parseInt(strMonth, 10);
if (isNaN(intMonth)) {
for (i = 0;i<12;i++) {
if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
intMonth = i+1;
strMonth = strMonthArray[i];
i = 12;
   }
}
if (isNaN(intMonth)) {
err = 3;
return false;
   }
}
intYear = parseInt(strYear, 10);
if (isNaN(intYear)) {
err = 4;
return false;
}
if (intMonth>12 || intMonth<1) {
err = 5;
return false;
}
if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
err = 6;
return false;
}
if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
err = 7;
return false;
}
if (intMonth == 2) {
if (intday < 1) {
err = 8;
return false;
}
if (LeapYear(intYear) == true) {
if (intday > 29) {
err = 9;
return false;
}
}
else {
if (intday > 28) {
err = 10;
return false;
}
}
}
var strDay = new String(intday);
var strMonth = new String(intMonth);
strDay = (strDay.length == 1) ? "0" + strDay : strDay;
strMonth = (strMonth.length == 1) ? "0" + intMonth : strMonth;
if (reformat == "DD MMM YYYY") {
    datefield.value = strDay + " " + strMonthArray[intMonth-1] + " " + strYear;
}
else {
if (reformat == "DD/MM/YYYY") {
    datefield.value = strDay + "/" + strMonth + "/" + strYear;
}
else {
if (reformat == "DD/MM/YY") {
    datefield.value = strDay + "/" + strMonth + "/" + strYear;
}
}
}
return true;
}

function LeapYear(intYear) {
if (intYear % 100 == 0) {
if (intYear % 400 == 0) { return true; }
}
else {
if ((intYear % 4) == 0) { return true; }
}
return false;
}
var strMonthArray = new Array(12);
strMonthArray[0] = "Jan";
strMonthArray[1] = "Feb";
strMonthArray[2] = "Mar";
strMonthArray[3] = "Apr";
strMonthArray[4] = "May";
strMonthArray[5] = "Jun";
strMonthArray[6] = "Jul";
strMonthArray[7] = "Aug";
strMonthArray[8] = "Sep";
strMonthArray[9] = "Oct";
strMonthArray[10] = "Nov";
strMonthArray[11] = "Dec";
