function highlightFormVar(formVar,bgColour) {
	if (!isblank(bgColour) && formVar.style) {
		formVar.style.backgroundColor = bgColour;
	}
}

function wordcount(inputString, maxLen) {
 var noofwords,wordarray;
 wordarray=inputString.match(/\b\w+\b/g);
 noofwords = 0;
 if (wordarray != null) noofwords=wordarray.length;
 return (noofwords <= maxLen);
}

function charcount(inputString, minLen, maxLen) {
	var ok = true;
	if (minLen > 0) {
		ok = ok && inputString.length >= minLen;
	}
	if (maxLen > 0) {
		ok = ok && inputString.length <= maxLen;
	}
	return ok;
}

function validatefiletype(filename, ext, mode) {
 //mode is either 'allow' or 'deny'
 var extArray = ext.replace(/\./ig, '').split(",");
 var ok = true;
 if (!isblank(filename)) {
 	ok = (mode == 'deny') ;
	 for (var i=0; i < extArray.length; i++) {
	  if (filename.toLowerCase().indexOf('.'+extArray[i].replace(/ /ig, '').toLowerCase()) > -1) {
	   ok = !ok;
	   break;
	  }  
	 }
	}
 	return ok;
}

function isblank(s){
	var ok = true;
	if (s==null) {
		return true;
	} else {
		s = s.replace(/ /ig, '')
		if (s.length > 0) {
			if (s=='NULL') {
				ok = true;
			} else {
				for(var i = 0; i < s.length; i++) {
					var c = s.charAt(i);
					ok = ok && ((c == '\n') || (c == '\r') || (c == '\t') || (s.charCodeAt(i) == 160));
				}
			}
			return ok;
		} else {
			return true;
		}
	}
}

function isDate(datestr) {
 var timearr = new Array;
 var year, month, day, hour, minutes, pattern = /^\d+$/;
 // strip off the time if there is one
 if ((datestr!='NULL') && (datestr!='')) {
  var datetimearr=datestr.split(' ');
  var datearr=datetimearr[0].split('/');
  if (datetimearr.length>1) {
   timearr = datetimearr[1].split(':');
  }
  if (datearr.length!=3) {
   datearr=datetimearr[0].split('-');
  }
  if (datearr.length!=3) {
   return false;
  } else {
   if (datearr[0].length == 4){
    year = datearr[0];
    day = datearr[2];  
   }/* else {
    year = datearr[2];
    day = datearr[0];
   }*/
   month = datearr[1];
//   alert('Year'+year)
//   alert('Month'+month)
//   alert('Day'+day)
   if (!pattern.test(year) || !pattern.test(month) || !pattern.test(day)) {
    return false;
   } else {
    month = month - 1;
   }  
   if (timearr.length>0) {
    hour = timearr[0];
    minutes = timearr[1];
    if (!pattern.test(hour) || !pattern.test(minutes)) {
     return false;
    } else {
     var dateobj=new Date(year,month,day,hour,minutes);
    }
   } else {
    var dateobj=new Date(year,month,day);
   } 
   if (isNaN(dateobj)) {
    dateok=false;
   } else {
    dateok=((dateobj.getDate()==day) && (dateobj.getMonth()==month) && ((dateobj.getYear()==year) || (dateobj.getFullYear()==year)))
    if (timearr.length>0) {
     dateok = dateok && (hour==dateobj.getHours()) && (minutes==dateobj.getMinutes())
    }
   }
   /*if (!dateok) {
    if (timearr.length>0) {
     var dateobj=new Date(datearr[0],datearr[1]-1,datearr[2],timearr[0],timearr[1]);
    } else {
     var dateobj=new Date(datearr[0],datearr[1]-1,datearr[2]);
    } 
    if (isNaN(dateobj)) {
     alert('second try : '+ dateobj);
     dateok=false;
    } else {
     dateok=((dateobj.getDate()==datearr[2]) && (dateobj.getMonth()==datearr[1]-1) && ((dateobj.getYear()==datearr[0]) || (dateobj.getFullYear()==datearr[0]))) 
     if (timearr.length>0) {
      dateok = dateok && (timearr[0]==dateobj.getHours()) && (timearr[1]==dateobj.getMinutes())
     }
    }
   }*/
   return dateok;
  }
 } else {
  return true;
 }  
}

function clearErrors() {
 errors = '';
 empty_fields = '';
}

function verify(){
 return verifyExt(' - The following required field(s) are empty:');
}

function verifyExt(emptyFieldsText){
 var regexp_pattern;
 clearErrors();
 for (var i = 0; i < validations.length; i++) {
  verifyField(validations[i][0],validations[i][1],validations[i][2],validations[i][3],validations[i][4],validations[i][5],validations[i][6],validations[i][7],validations[i][8]);
 }
 if (!empty_fields && !errors) {
  return true;
 } else { 
  dispMsg = msg;
	 if(empty_fields) dispMsg += emptyFieldsText	+ empty_fields + "\n";
	 dispMsg += errors;
  alert(dispMsg);
		return false;
 }
}

function validateContents(value,fieldLabel,pattern,errorMsg,validationFunc,validationFuncParams){
 var localErrors = '';
 if (!isblank(pattern)){ // A regular expression has been defined
  if (!isblank(value)) {
   regexp_pattern = new RegExp(pattern);
   if (!regexp_pattern.test(value)) localErrors += "\n - " + fieldLabel + " " + errorMsg;
   regexp_pattern = '';
  } 
 }
 if (!isblank(validationFunc)) {
  functionParams = '\''+value.replace(/\r\n/ig, '\\r\\n').replace(/\\/ig,'\\\\').replace(/'/ig, '\\\'')+'\'';
  if (!isblank(validationFuncParams)) functionParams += ','+validationFuncParams;
  if (!eval(validationFunc+'('+functionParams+')')) {
   localErrors += "\n - " + fieldLabel + " " + errorMsg;
  }
  functionParams = '';
 }
 return localErrors;
}


function verifyField(fieldName,fieldLabel,pattern,compulsory,errorMsg,fieldSet,validationFunc,validationFuncParams,requireConfField) {
 var localErrors = '';
 var localEmptyFields = '';
 var quickErrStr = '';
 var e = eval(formName+'.'+fieldName);
 var localOK
 if (e) {
	 highlightFormVar(e,form_validationDefaultColor);
	 if (compulsory){ //If it's required
	 	switch (e.type) {
			case "text": case "textarea": case "password": case "hidden": case "file":
				if (isblank(e.value)) {
					highlightFormVar(e,form_validationHighlightColor);
					localEmptyFields += "\n        " + fieldLabel;
				} else {
					//alert('validating : '+fieldName);
					quickErrStr = validateContents(e.value,fieldLabel,pattern,errorMsg,validationFunc,validationFuncParams);
					if (!isblank(quickErrStr)) {
						highlightFormVar(e,form_validationHighlightColor);
					}
					localErrors += quickErrStr;
				}
				break;
			case "select-one":
					if (e.selectedIndex == 0) {
						highlightFormVar(e,form_validationHighlightColor);
						localErrors += "\n - Please select an option from " + fieldLabel
					}
				break;
			case "select-multiple":
				localOK = false;
				for (var i = 0; i < e.options.length; i++) {
					localOK = localOK || e.options[i].selected;
				}
				if (!localOK) {
					highlightFormVar(e,form_validationHighlightColor);
					localErrors += "\n - Please select an option from " + fieldLabel
				}
				break;
			case "radio":
				if (!e.checked) {
					highlightFormVar(e,form_validationHighlightColor);
					localErrors += "\n - Please select " + fieldLabel
				}
				break;
			case "checkbox":
				if (!e.checked) {
					highlightFormVar(e,form_validationHighlightColor);
					localErrors += "\n - Please select " + fieldLabel
				}
				break;
			default:
				if (e.length) {
					switch (e[0].type) {
						case "radio": case "checkbox":
							localOK = false;
							for (var i = 0; i < e.length; i++) {
								localOK = localOK || e[i].checked;
							}
							if (!localOK) {
								for (var i = 0; i < e.length; i++) {
									highlightFormVar(e[i],form_validationHighlightColor);
								}
								localErrors += "\n - Please select an option from " + fieldLabel
							}	else {
								for (var i = 0; i < e.length; i++) {
									highlightFormVar(e[i],form_validationDefaultColor);
								}
							}
						
					}
				}
		}
	 } else {
	  //if (!isblank(e.value)) {
	  quickErrStr = validateContents(e.value,fieldLabel,pattern,errorMsg,validationFunc,validationFuncParams);
	  if (!isblank(quickErrStr)) {
	   highlightFormVar(e,form_validationHighlightColor);
	  }
	  localErrors += quickErrStr;
	  //}
	 }
	 if (!isblank(requireConfField)) {
	  for (var j = 0; j < validations.length; j++) {
	   if ((validations[j][0]==requireConfField) && (eval(formName+'.'+validations[j][0]+'.value')!=e.value)){
	   	localErrors += "\n - "+fieldLabel+" "+errorMsg+" "+validations[j][1];
		 	highlightFormVar(e,form_validationHighlightColor);
	   }
	  }
	 }
	 errors += localErrors;
	 empty_fields += localEmptyFields;
	 localOK = (localErrors=='') && (localEmptyFields=='');
	} else {
		alert('ERROR: Un-able to complete validation, there is no field on the form with name of: '+fieldName);
		localOK = false;
	}
 return localOK;
}

function soVerifyField(fieldName,fieldLabel,pattern,compulsory,errorMsg,fieldSet,validationFunc,validationFuncParams,requireConfField) {
 errors='';
 empty_fields='';
 if (verifyField(fieldName,fieldLabel,pattern,compulsory,errorMsg,fieldSet,validationFunc,validationFuncParams,requireConfField)) {
  return true;
 } else { 
  dispMsg = 'Sorry! your request cannot be completed for the following reasons :\n';
	 if(empty_fields) dispMsg += " - The following required field(s) are empty:"	+ empty_fields + "\n";
	 dispMsg += errors;
  alert(dispMsg);
		return false;
 }
}

function validateImage(dummy,fieldName,compulsory,minWidth,minHeight,maxWidth,maxHeight) {
 var undefined;
 var currentControl = eval(formName+'.'+fieldName+'Current_');
 var newControl = eval(formName+'.'+fieldName+'Document__');
 var deleteControl = eval(formName+'.'+fieldName+'Document_ASPFileDelete_');
 var imageOk=true;
 if (compulsory) {
  imageOk=(imageOk && ((newControl.value!='') || (currentControl.value!='')) && ((deleteControl==undefined) || (!deleteControl.checked)))
 }
 if (newControl.value!='') {
  var imageObj = new Image();
  imageObj.src=newControl.value+'?randomno='+Math.random();
  imageOk = (imageOk && ((minWidth=='') || (imageObj.width>=minWidth)));
  imageOk = (imageOk && ((maxWidth=='') || (imageObj.width<=maxWidth)));
  imageOk = (imageOk && ((minHeight=='') || (imageObj.height>=minHeight)));
  imageOk = (imageOk && ((maxHeight=='') || (imageObj.height<=maxHeight)));
  imageOk = imageOk && validatefiletype(newControl.value, 'jpg,gif,png,jpeg')
 }
 return imageOk;
} 

function compareFields(inputString, matchFieldName) {
	var ok, matchFormVar;
	matchFormVar = eval(formName+'.'+matchFieldName)
	ok = (inputString == matchFormVar.value);
	if (!ok) {
		highlightFormVar(matchFormVar,form_validationHighlightColor);
	} else {
		highlightFormVar(matchFormVar,form_validationDefaultColor);
	}
	return ok;
}

function highlightDropdownDate(fieldName, useTime, colour) {
	var formVar;
	if (useTime) {
		highlightDropdownTime(fieldName, colour);
	}
	fieldName = getDropdownDateFieldname(fieldName, 'date',eval(formName));
	highlightFormVar(eval(formName+'.'+fieldName+'_year_'),colour);
	highlightFormVar(eval(formName+'.'+fieldName+'_month_'),colour);
	highlightFormVar(eval(formName+'.'+fieldName+'_day_'),colour);
}

function highlightDropdownTime(fieldName, colour) {
	var formVar;
	fieldName = getDropdownDateFieldname(fieldName, 'time',eval(formName));
	highlightFormVar(eval(formName+'.'+fieldName+'_hour_'),colour);
	highlightFormVar(eval(formName+'.'+fieldName+'_min_'),colour);
	if (eval(formName+'.'+fieldName+'_sec_')) {
		highlightFormVar(eval(formName+'.'+fieldName+'_sec_'),colour);
	}
}

function validateDropDownDate(dummy, fieldName, useTime, compulsory) {
	var dateStr, ok;
	dateStr = consolidateDateDropdown(fieldName, eval(formName), useTime);
	ok = !isblank(dateStr) || !compulsory; 
	if (ok && !isblank(dateStr)) {
		ok = isDate(dateStr);
	} 
	if (!ok) {
		highlightDropdownDate(fieldName,useTime,form_validationHighlightColor);
	} else {
		highlightDropdownDate(fieldName,useTime,form_validationDefaultColor);
	}
	return ok;
}

function compareDates(dummy, lowDateField, highDateField, mode, useTime) {
	var lowFieldVal, highFieldVal, ok = true, highlightcolour;
	if (mode == "dropdown") {
		lowFieldVal = consolidateDateDropdown(lowDateField, eval(formName), useTime)
		highFieldVal = consolidateDateDropdown(highDateField, eval(formName), useTime);
	} else {
		lowFieldVal = eval(formName+'.'+lowDateField+'_.value');
		highFieldVal = eval(formName+'.'+highDateField+'_.value');
	}
	if (useTime && mode != 'dropdown') {
		lowFieldVal += ' ' + consolidateTimeDropdown(lowDateField, eval(formName));
		highFieldVal += ' ' + consolidateTimeDropdown(highDateField, eval(formName));
	}
	if (isDate(lowFieldVal) && isDate(highFieldVal)) {
		ok = (lowFieldVal < highFieldVal);
	}
	if (!ok) {
		highlightcolour = form_validationHighlightColor;
	} else {
		highlightcolour = form_validationDefaultColor;
	}
	switch (mode) {
		case "dropdown":
			highlightDropdownDate(lowDateField,false,highlightcolour);
			highlightDropdownDate(highDateField,false,highlightcolour);
			break;
		case "picker":
			highlightFormVar(eval(formName+'.'+lowDateField+'_'),highlightcolour);
			highlightFormVar(eval(formName+'.'+highDateField+'_'),highlightcolour);
			break;
		case "text":
			highlightFormVar(eval(formName+'.'+lowDateField),highlightcolour);
			highlightFormVar(eval(formName+'.'+highDateField),highlightcolour);
			break;
	}
	if (useTime) {
		highlightDropdownTime(lowDateField,highlightcolour);
		highlightDropdownTime(highDateField,highlightcolour);
	}
	return ok;	
}

