// This set of function are general includes for validation
// They are designed in pairs the validation and the event function
// the event function will call the validation with the event src

function display_name(item) {
	var strDisplay = item.getAttribute("DisplayName");
	if (strDisplay==null || strDisplay=="")
		strDisplay="Field";
	return strDisplay;
}

function default_value(item) {
	// The code below is commented to avoid default value of the item to be restored if erroneous. 
	var strDefault = "";  //item.defaultValue;
	if (strDefault==null || strDefault=="")
		strDefault="";
	return strDefault;
}

function trim_string() {
	var ichar, icount;
	var strValue = this;
	ichar = strValue.length - 1;
	icount = -1;
	while (strValue.charAt(ichar)==' ' && ichar > icount)
		--ichar;
	if (ichar!=(strValue.length-1))
		strValue = strValue.slice(0,ichar+1);
	ichar = 0;
	icount = strValue.length - 1;
	while (strValue.charAt(ichar)==' ' && ichar < icount)
		++ichar;
	if (ichar!=0)
		strValue = strValue.slice(ichar,strValue.length);
	return strValue;
}

function date_toSimpleForm() {
	var toSimpleForm = new String;
	toSimpleForm = this.toLocaleString();
	toSimpleForm = toSimpleForm.substring(0,toSimpleForm.indexOf(' '));
	return toSimpleForm;
}


function es_non_blank() {
	var item = event.srcElement;
	event.returnValue = vs_non_blank(item);
}
function vs_non_blank(item) {
//	var strErrorMsg = display_name(item) + " must have a non-blank value";
	item.value=item.value.Trim();
	if (item.value.length==0) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg);
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}


function es_valid_number() {
	var item = event.srcElement;
	event.returnValue = vs_valid_number(item);
}

function vs_valid_number(item) {
	return check_valid_number(item, false);
}

function es_valid_decimalnumber() {
	var item = event.srcElement;
	event.returnValue = vs_valid_decimalnumber(item);
}

function vs_valid_decimalnumber(item) {
	return check_valid_number(item, true);
}

function check_valid_number(item, bDecimal) {
//	var strErrorMsg = display_name(item) + " must be a valid numeric";
	var strDefault = default_value(item);
	if (strDefault.length==0) {
		//strDefault="0"; ? This line is commented as if the field is blank then 0 is assigned to that field which is logically wrong.
	}
	item.value=item.value.Trim();
	if (item.value.length==0)
		item.value=strDefault;
	if (bDecimal)
		var num = ".0123456789";
	else
		var num = "0123456789";
	
	for (var intLoop = 0; intLoop < item.value.length; intLoop++) {
		if (num.indexOf(item.value.charAt(intLoop)) == -1) {
			item.focus();
			item.className = "Error";
//			alert(strErrorMsg);
			return false;
		}
	}
	if (item.value.indexOf(".")!=item.value.lastIndexOf(".")) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg);
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}

function es_valid_hours() {
	var item = event.srcElement;
	event.returnValue = vs_valid_hours(item);
}
function vs_valid_hours(item) {
//	var strErrorMsg = display_name(item);
	if (!vs_valid_decimalnumber(item))
	{
		item.className = "Error";
		return false;
	}
	var itemValue = new Number(item.value);
	if ((itemValue < 0 || itemValue > 80)) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg + " must have a value from 0 to 80 hours");
		return false;
	}
	itemValue *= 4;
	if ((itemValue)!=Math.ceil(itemValue)) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg + " must be a valid quartely increment");
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}


function es_valid_date() {
	var item = event.srcElement;
	event.returnValue = vs_valid_date(item);
}

function vs_valid_date(item) {
	var month,day,year,varDate;
	varDate = item.value;
	var DateSeparator = ReturnMeSeparator(varDate);

	day = varDate.substr(0,varDate.indexOf(DateSeparator))
	month = varDate.substring(varDate.indexOf(DateSeparator) + 1,varDate.lastIndexOf(DateSeparator))
	if (isNaN(Number(month))) {
		month = MonthNumber(month);
		if (month == '00') {
			item.focus();
			item.className = "Error";
			return false;
		}
	}
	year = varDate.substr(varDate.lastIndexOf(DateSeparator)  + 1 ,varDate.length)
	if (year.length <= 2) {
		if (parseInt(year) > 25)
			year = 1900 + parseInt(year);
		else
			year = 2000 + parseInt(year);
	}
	if ((day <= 31 && day > 0) && (month < 13 && month > 0) && (year < 2025 && year >= 1900))
	{
		if (!CheckDate(month,day,year))
		{
			item.focus();
			item.className = "Error";
			return false;
		}
	}
	else
	{
		item.focus();
		item.className = "Error";
		return false;
	}
	item.className = "TextBoxMandatory";
	item.value = LeadZero(Number(day))+ "/"+ LeadZero(Number(month))  + "/" + year.toString();
	return true;
/*
//	var strErrorMsg = display_name(item);
	if (isNaN(Date.parse(item.value))) {
		item.focus();
		item.className = "Error";
		//alert(strErrorMsg + " must be a valid Date");
		return false;
	}
	var dtItem = new Date(Date.parse(item.value));
	//item.value = dtItem.toSimpleForm(); */
}

function es_item_selected() {
	var item = event.srcElement;
	event.returnValue = vs_item_selected(item);
}
function vs_item_selected(item) {
//	var strErrorMsg = display_name(item) + " must be a valid selection";
	if (item.selectedIndex==0) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg);
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}

function es_valid_zip() {
	var item = event.srcElement;
	event.returnValue = vs_valid_zip(item);
}
function vs_valid_zip(item) {
//	var strErrorMsg = display_name(item) + " must be of the form 99999-9999";
	item.value=item.value.Trim();
	if (!(/^\d{5}$/.test(item.value) || /^\d{5}-\d{4}$/.test(item.value))) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg);
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}

function es_valid_ssnbr() {
	var item = event.srcElement;
	event.returnValue = vs_valid_ssnbr(item);
}
function vs_valid_ssnbr(item) {
//	var strErrorMsg = display_name(item) + " must be of the form 999-99-9999";
	item.value=item.value.Trim();
	if (!(/^\d{3}-\d{2}-\d{4}$/.test(item.value))) {
		item.focus();
		item.className = "Error";
//		alert(strErrorMsg);
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}

function es_valid_email() {
	var item = event.srcElement;
	event.returnValue = vs_valid_email(item);
}
function vs_valid_email(item) {
//	var strErrorMsg = display_name(item) + " is not a valid Email";
	if (item.value == "") return true; 
	// The above line checks for Blank Email address. If so then returns true as validating a blank email 
	//address returns an error
	item.value=item.value.Trim();
	if (!(/^[\w\_\.]+@[a-z\.]+$/.test(item.value))) {
		item.focus();
		return false;
	}
	item.className = "TextBoxMandatory";
	return true;
}

// build the validation object
function validation_setup() {
	this.eventNonBlank = es_non_blank;
	this.nonBlank = vs_non_blank;
	this.eventValidNumber = es_valid_number;
	this.validNumber = vs_valid_number;
	this.eventValidDecimalNumber = es_valid_decimalnumber;
	this.validDecimalNumber = vs_valid_decimalnumber;
	this.eventValidHours = es_valid_hours;
	this.validHours = vs_valid_hours;
	this.eventValidDate = es_valid_date;
	this.validDate = vs_valid_date;
	this.eventItemSelected = es_item_selected;
	this.itemSelected = vs_item_selected;
	this.eventValidZip = es_valid_zip;
	this.validZip = vs_valid_zip;
	this.eventValidSSNbr = es_valid_ssnbr;
	this.validSSNbr = vs_valid_ssnbr;
	this.eventValidEmail = es_valid_email;
	this.validEmail = vs_valid_email;
	return this;
}

// Extend the string object to include a trim function
String.prototype.Trim = trim_string;
// Extend the date object to include a simple form string conversion
Date.prototype.toSimpleForm = date_toSimpleForm;

// Construct the validation object
var validation = new Object;
validation = validation_setup();


// This set of function are for processing the key press event
// Used to restrict input on numerics and pure textual fields

function kp_integer() {
	if ((event.keyCode < 48 || event.keyCode > 57))
		event.returnValue = false;
}
function kp_numeric() {
	if ((event.keyCode != 46) && (event.keyCode < 48 || event.keyCode > 57))
		event.returnValue = false;
	if (event.keyCode == 46) {
		if (event.srcElement.value.indexOf(".") > -1)
			event.returnValue = false;
	}
}


function kp_character() {
	if ((event.keyCode < 65 || event.keyCode > 90) && (event.keyCode < 97 || event.keyCode > 122))
		event.returnValue = false;
}
function kp_convert_upper() {
	if ((event.keyCode >= 97 && event.keyCode <= 122))
		event.keyCode -= 32;
}
function kp_convert_lower() {
	if ((event.keyCode >= 65 && event.keyCode <= 90))
		event.keyCode += 32;
}


function kp_setup() {
	this.Integer = kp_integer;
	this.Numeric = kp_numeric;
	this.Character = kp_character;
	this.ConvertUpper = kp_convert_upper;
	this.ConvertLower = kp_convert_lower;
	return this;
}

var keyPressInput = new Object;
keyPressInput = kp_setup();

// the functions below are for validation of Date
function CheckLeapYr(m_year)
{
m_yr = parseInt(m_year);
//1. Divide by 4 and if the REMAINDER is 0 then it is a leap year 
m_leap = m_yr%4;
//2. Divide by 100 and if the REMAINDER is 0 then it is NOT a leap year unless, 3. 
m_leap1=m_yr%100;
//Divide by 400 and if the REMAINDER is 0 then it is a leap year.
m_leap2=m_yr%400;
if (m_leap==0 && (m_leap1 !=0 || m_leap2==0))
	{
		return true;
	}
else
	{
	return false;
	}
}

function CheckDate(c_month,c_day,c_year)
{
	c_leap_yr = CheckLeapYr(c_year);
	if (c_month==2)
	{
		if (c_leap_yr)
		{
			if (c_day > 29)
			{
//				alert("February cannot have more than 29 days in a leap year"+"\n"+"Try changing the day or the month");
				return false;
			}
		}
		else
		{
			if (c_day > 28)
			{
//				alert("February cannot have more than 28 days if not a leap year"+"\n"+"try changing the day, the month or the year");
				return false;
			}
		}
	}
	if ((c_month==9 || c_month==4 || c_month==6 || c_month==11) && c_day>30)
	{
//		alert("Day cannot be greater than 30 for month selected");
		return false;
	}
////// added by neel (to check whether date is in current Financial Year) //////

		var todayDate = new Date();
		var presentYear = todayDate.getYear();
		var presentMonth = todayDate.getMonth() + 1;
		
		if(presentMonth <= 3) // if Present Month is between 1 to 3
		{
			if(c_year < presentYear && c_month < 4)
			{
				return false;
				//alert("Date entered should be in current Financial Year " + (presentYear - 1) + "-" + presentYear);
			}
		}
		else				// if Present Month is between 4 to 12
		{
			if(c_year < presentYear)
			{
				return false;
				//alert("Date entered should be in current Financial Year " + presentYear + "-" + (presentYear + 1));
			}
			else
			{
				if(c_month < 4 && c_year == presentYear)
				{
					return false;
					//alert("Date entered should be in current Financial Year " + presentYear + "-" + (presentYear + 1));	
				}
			}
		}
//////////////////////////// added by neel /////////////////////////////////	
	return true;
}

function LeadZero(nNum) {
    return (parseInt(nNum)<10 ? "0" : "" ) + parseInt(nNum).toString();
}

function ReturnMeSeparator(DateString) {
	DateString += '';
	if (DateString.indexOf("/") != -1)
	{
		if (DateString.indexOf("-") == -1)
			return '/';
		else
			return '';
	}
	if (DateString.indexOf("-") != -1)
	{
			if (DateString.indexOf("/") == -1)
					return "-";
		else
			return '';
	}
	if (DateString.indexOf(".") != -1)
	{
			if (DateString.indexOf("/") == -1)
					return ".";
		else
			return '';
	}
	return '';
}

function MonthNumber(parmMonthName) {
	parmMonthName = parmMonthName.toLowerCase();
	switch (parmMonthName) {
		case 'jan' :
			return '01';
		case 'feb' :
			return '02';
		case 'mar' :
			return '03';
		case 'apr' :
			return '04';
		case 'may' :
			return '05';
		case 'jun' :
			return '06';
		case 'jul' :
			return '07';
		case 'aug' :
			return '08';
		case 'sep' :
			return '09';
		case 'oct' :
			return '10';
		case 'nov' :
			return '11';
		case 'dec' :
			return '12';
		default  :
			return '00';
	}
}

function validateString(passedObject,passedString){
if (passedObject.value=='')
	{
		alert(passedString)
		passedObject.focus();
		mStatus = 1;
		return false;
	}
return true;
}

function IsValidEmail(parmEmailID) {
	if (parmEmailID == "") 
		return false;
	var intIndex = parmEmailID.indexOf("@",0);
	if (intIndex == -1)
		return false;
		
	var intIndex1 = parmEmailID.indexOf("@",intIndex+1);
	if (intIndex1 != -1)
		return false;
		
	var intIndex1 = parmEmailID.indexOf(".",intIndex+1);
	if (intIndex1 == -1)
		return false;
		
	var intIndex1 = parmEmailID.indexOf(" ",0);
	if (intIndex1 != -1)
		return false;
		
	return true;
}

