/*

	RiteTech LLC
	inc/inc_js.cfm
	Created: 6/21/2008
	SMB 
*/

// trim function
function trim(s) {
	// Remove leading spaces and carriage returns
	while ((s.substring(0,1) == ' ') || (s.substring(0,1) == '\n') || (s.substring(0,1) == '\r')){ 
		s = s.substring(1,s.length);
	}
	// Remove trailing spaces and carriage returns
	while ((s.substring(s.length-1,s.length) == ' ') || (s.substring(s.length-1,s.length) == '\n') || (s.substring(s.length-1,s.length) == '\r')){                         
		s = s.substring(0,s.length-1); 
	}
	return s;
}

// function to create validation rule
function validationRule(ruleType, fieldName, alertText, custom) {
	this.ruleType = ruleType;
	this.fieldName = fieldName;
	this.alertText = alertText;
	this.custom = custom;
}

// function to add an error
function doError(fieldName, fieldLabel, arrError, alertText) {
	arrError[arrError.length] = new errorMessage(fieldName, alertText);
	$(fieldLabel).addClass("error");
}

// function to see if a text field has value
jQuery.fn.valueText = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");
	var thisVal = trim(thisField.value);
	// Error
	if (thisVal == "") {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
		return false;
	} else {
		return true;
	}
}	

// function to see if a text area field has value
jQuery.fn.valueTextArea = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");
	var thisVal = trim(thisField.value);
	// Error
	if (thisVal.length == 0) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
		return false;
	} else {
		return true;
	}
}	




// function to see if a text field has a valid email
jQuery.fn.validEmail = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");
	var thisVal = trim(thisField.value);
	rePattern = /^([\w\d\-\.\']+)@{1}(([\w\d\-])+\.)+(([a-zA-Z\d]{2,4})?)$/;
	// Error
	if (thisVal != "" && !rePattern.test(thisVal)) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
		return false;
	} else {
		return true;
	}
}


// function to see if a text field has a value which is a valid email
jQuery.fn.valueEmail = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");
	if ($(thisField).valueText(fieldName, arrError, alertText, 0) == false || $(thisField).validEmail(fieldName, arrError, alertText, 0) == false) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
		return false;
	} else {
		return true;	
	}
}	


// function to see if a radio/checkbox field has been selected
jQuery.fn.valueRadio = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementsByName(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");
	var len = thisField.length;
	var oneChecked = false;
	for (q=0; q < len; q++) {
		if (thisField[q].checked == true) {
			oneChecked = true;
			break;
		}
	}	
	if (oneChecked == false) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
		return false;
	} else {
		return true;
	}
}
	

// function to see if a select field has been selected
jQuery.fn.valueSelect = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");	
	if (thisField.selectedIndex == 0) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
	} else {
		return true;
	}
}

// function to see if a text field has a valid date
jQuery.fn.valueDate = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");	
	var thisVal = thisField.value;	
	var rePattern = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
	
	// Not valid?
	if (thisVal != "" && !rePattern.test(thisVal)) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
		return false;
	// Matches, further testing needed
	} else {
		var thisPass = true;
		while (thisPass == true) {
			// Break up
			var dateArray = thisVal.split("/");
			if (dateArray[0].substr(0,1) == 0) {
				dateArray[0] = dateArray[0].substr(1,1);
			}
			var thisMonth = parseInt(dateArray[0]); 
			var thisDay = parseInt(dateArray[1]);
			var thisYear = parseInt(dateArray[2]);
			
			// Too far in the past
			if (thisYear < 1900) {
				thisPass = false;
				break;
			}
			
			// Create month array
			var dayArray = new Array();
			dayArray[0] = 0;
			dayArray[1] = 31;
			dayArray[2] = 28;
			dayArray[3] = 31;
			dayArray[4] = 30;
			dayArray[5] = 31;
			dayArray[6] = 30;
			dayArray[7] = 31;
			dayArray[8] = 31;
			dayArray[9] = 30;
			dayArray[10] = 31;
			dayArray[11] = 30;
			dayArray[12] = 31;
			
			// Month is not feb and day matches
			if (thisMonth != 2 && dayArray[thisMonth] < thisDay) {
				thisPass = false;
				break;
			}
			
			// February and leap years
			if (thisMonth == 2) {
				if (thisDay <= 28 || (thisYear % 4 == 0 && (thisYear % 100 != 0 || thisYear % 400 == 0))) {
					thisPass = true;
					break;
				} else {
					thisPass = false;
					break;
				}
			}
			break;
		}
		if (thisField.value == "" || thisPass == false) {
			if (addError == 1) {
				doError(fieldName, thisLabel, arrError, alertText);
			}
			return false;
		} else {
			return true;
		}
	}
}

// function to see if a text field has a valid integer
jQuery.fn.validInt = function(fieldName, arrError, alertText, addError) {
	var thisField = document.getElementById(fieldName);
	var thisLabel = document.getElementById(fieldName + "_Label");
	thisLabel.className = "";
	$(thisLabel).removeClass("error");	
	var thisVal = trim(thisField.value);
	rePattern = /(^-?\d\d*$)/;
	if (thisVal != "" && !rePattern.test(thisVal)) {
		if (addError == 1) {
			doError(fieldName, thisLabel, arrError, alertText);
		}
	} else {
		return true;
	}
}

// function to see if a text field has a valid number
function validNum2(fieldName) {
	var thisFieldID = document.getElementById(fieldName);
	var thisVal = trim(thisFieldID.value);
	if (isNaN(thisVal)) {
		return false;
	} else {
		return true;
	}
}

// function to see if a file has a .csv extension
function fileCSV2(fieldName) {
	var thisFieldID = document.getElementById(fieldName);
	var docName = thisFieldID.value;
	var extArray = docName.split(".");
	var extNameTx = extArray[extArray.length - 1];
	if (extNameTx.toLowerCase( ) != "csv") {
		return false;
	} else {
		return true;
	}
}

// function to see if a file has a valid extension
function fileValid2(fieldName, extList) {
	var thisFieldID = document.getElementById(fieldName);
	var docName = thisFieldID.value;
	var extArray = docName.split(".");
	var extNameTx = extArray[extArray.length - 1];
	var thisPass = false;
	// Loop over the valid extensions to test
	var validArray = extList.split(",");
	for (t=0; t<validArray.length; t++) {
		if (extNameTx.toLowerCase( ) == validArray[t].toLowerCase ( )) {
			thisPass = true;
			break;
		}
	}
	return thisPass;
}

// function to see if a text field has a valid date
function validDate2(fieldName) {
	var thisFieldID = document.getElementById(fieldName);
	var thisVal = thisFieldID.value;	
	var rePattern = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
	
	// Not valid?
	if (thisVal != "" && !rePattern.test(thisVal)) {
		return false;
	// Matches, further testing needed
	} else {
		var thisPass = true;
		while (thisPass == true) {
			// Break up
			var dateArray = thisVal.split("/");
			var thisMonth = parseInt(dateArray[0]); 
			var thisDay = parseInt(dateArray[1]);
			var thisYear = parseInt(dateArray[2]);
			
			// Too far in the past
			if (thisYear < 1900) {
				thisPass = false;
				break;
			}
			
			// Create month array
			var dayArray = new Array();
			dayArray[0] = 0;
			dayArray[1] = 31;
			dayArray[2] = 28;
			dayArray[3] = 31;
			dayArray[4] = 30;
			dayArray[5] = 31;
			dayArray[6] = 30;
			dayArray[7] = 31;
			dayArray[8] = 31;
			dayArray[9] = 30;
			dayArray[10] = 31;
			dayArray[11] = 30;
			dayArray[12] = 31;
			
			// Month is not feb and day matches
			if (thisMonth != 2 && dayArray[thisMonth] < thisDay) {
				thisPass = false;
				break;
			}
			
			// February and leap years
			if (thisMonth == 2) {
				if (thisDay <= 28 || (thisYear % 4 == 0 && (thisYear % 100 != 0 || thisYear % 400 == 0))) {
					thisPass = true;
					break;
				} else {
					thisPass = false;
					break;
				}
			}
			break;
		}
		return thisPass;
	}
}

// Compares two dates
function dateCompare2(fieldName, compareDate, compareType) {
	var thisFieldID = document.getElementById(fieldName);
	var thisVal = thisFieldID.value;	
	var thisPass = true;
	while (thisPass == true) {
		// valid date?
		if (validDate(fieldName) == false) {
			thisPass = false;
			break;
		}
		// Break up
		var dateArray = thisVal.split("/");
		var thisMonth = parseInt(dateArray[0]) - 1; 
		var thisDay = parseInt(dateArray[1]);
		var thisYear = parseInt(dateArray[2]);
		var date1 = new Date(thisYear, thisMonth, thisDay);
		date1.setHours(0, 0, 0);
		var dateArray = compareDate.split("/");
		var thisMonth = parseInt(dateArray[0]-1); 
		var thisDay = parseInt(dateArray[1]);
		var thisYear = parseInt(dateArray[2]);
		var date2 = new Date(thisYear, thisMonth, thisDay);
		date2.setHours(0, 0, 0);
		//alert(date1.toDateString() + " " + date2.toDateString());
		//alert(date1 < date2);
		// test the compare type
		if (compareType == "gte" && date1 < date2) {
			thisPass = false;
			break;
		}
		
		break;
	}
	return thisPass;
}

// Constructor function for error message
function errorMessage(fieldName, errorText) {
	this.fieldName = fieldName;
	this.errorText = errorText;	
}

// function to validate the form
jQuery.fn.checkForm = function(x, validate, thisForm) {
	var ErrorArray = new Array();
	var Passed = true;
	while (Passed == true) {
		// loop over validation
		for (i=0; i<validate.length; i++) {
			var thisField = document.getElementById(validate[i].fieldName);
			var thisLabel = document.getElementById(validate[i].fieldName + "_Label");
			thisLabel.className = "";
			// text field required
			if (validate[i].ruleType == "textReq") {
				if ($(thisField).valueText(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// email value
			if (validate[i].ruleType == "emailValue") {
				if ($(thisField).validEmail(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			// required email value
			if (validate[i].ruleType == "emailReq") {
				if ($(thisField).valueEmail(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// radio required
			if (validate[i].ruleType == "radioReq") {
				if ($(thisField).valueRadio(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// date value
			if (validate[i].ruleType == "dateValid") {
				if ($(thisField).valueText(validate[i].fieldName, ErrorArray, validate[i].alertText, 0) == true && $(thisField).valueDate(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// date required
			if (validate[i].ruleType == "dateValue") {				
				if ($(thisField).valueText(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				} else if ($(thisField).valueDate(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// select required
			if (validate[i].ruleType == "selectReq") {
				if ($(thisField).valueSelect(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// integer value
			if (validate[i].ruleType == "intValue") {
				if ($(thisField).valueText(validate[i].fieldName, ErrorArray, validate[i].alertText, 0) == true && $(thisField).validInt(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			
			// integer required
			if (validate[i].ruleType == "intReq") {			
				if ($(thisField).valueText(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				} else if ($(thisField).validInt(validate[i].fieldName, ErrorArray, validate[i].alertText, 1) == false) {
					Passed = false;
				}
			}
			// numeric value
			if (validate[i].ruleType == "numValue") {
				if (validNum(validate[i].fieldName) == false) {
					Passed = false;
					ErrorArray[ErrorArray.length] = new errorMessage(validate[i].fieldName, validate[i].alertText);
				}
			}
			// text area length
			if (validate[i].ruleType == "textAreaMax") {
				var thisField = document.getElementById(validate[i].fieldName);
				var thisLen = thisField.value.length;
				if (thisLen > validate[i].custom) {
					Passed = false;
					ErrorArray[ErrorArray.length] = new errorMessage(validate[i].fieldName, validate[i].alertText);
				}
			}
			
			// text fields matching
			if (validate[i].ruleType == "textMatch") {
				var thisFieldA = document.getElementById(validate[i].fieldName + "1")
				var thisFieldB = document.getElementById(validate[i].fieldName + "2")
				var thisValA = trim(thisFieldA.value);
				var thisValB = trim(thisFieldB.value);
				if (thisValA != thisValB) {
					thisFieldA.focus();
					Passed = false;
					ErrorArray[ErrorArray.length] = new errorMessage(validate[i].fieldName, validate[i].alertText);
				}
			}
			// File: CSV
			if (validate[i].ruleType == "fileCSV") {
				if (fileCSV(validate[i].fieldName) == false) {
					Passed = false;
					ErrorArray[ErrorArray.length] = new errorMessage(validate[i].fieldName, validate[i].alertText);
				}
			}
			// File: Valid Ext
			if (validate[i].ruleType == "fileValid") {
				if (valueText(validate[i].fieldName) == true && fileValid(validate[i].fieldName, validate[i].custom) == false) {
					Passed = false;
					ErrorArray[ErrorArray.length] = new errorMessage(validate[i].fieldName, validate[i].alertText);
				}
			}
			// Captcha
			if (validate[i].ruleType == "captcha") {
				var thisSum = parseInt(validate[i].custom[0]) + parseInt(validate[i].custom[1]);
				var thisField = document.getElementById(validate[i].fieldName);
				var fieldValue = thisField.value;
				if (thisSum != fieldValue) {
					Passed = false;
					ErrorArray[ErrorArray.length] = new errorMessage(validate[i].fieldName, validate[i].alertText);
				}
			}
			// custom
			if (validate[i].ruleType == "custom") {
				//alert("custom");
				//var len = thisField.length;
				//var thisVal = trim(thisField.value);
				//var oneChecked = false;
				//for (i=0; i < len; i++) {
				//	if (thisField[i].checked == true) {
				//		oneChecked = true;
				//		break;
				//	}
				//}
				//if (oneChecked == false) {
				//	alert(validate[i].alertText);
				//	Passed = false;
				//	break;
				//	break;
				//}
			}
		}	
		break;
	}
	// Return the array
	return ErrorArray;
}

// function to display error messages
jQuery.fn.formSuccessFail = function(thisForm, errorArray, errorDiv) {
	if (errorArray.length == 0) {thisForm.submit();
	} else {
		var errorContent = "<p>The form contains the following errors:</p><ul>";
		for (i=0; i<errorArray.length; i++) {
			errorContent = errorContent + "<li>" + errorArray[i].errorText + "</li>";
		}
		errorContent = errorContent + "</ul>";
		$(errorDiv).html(errorContent);
		$(errorDiv).show();
		$('#showError').focus();

	} 
}
