//Description: Validation specific functions.

// data type for validation array
function validationItem(fieldName, niceName, mandatory, dataType, compareFieldName, compareNiceName)
{
	this.fieldName = fieldName
	this.niceName = niceName
	this.mandatory = mandatory
	this.dataType = dataType
	this.compareFieldName = compareFieldName
	this.compareNiceName = compareNiceName
}

//mod sgrunel 20050901
function bIsDate(mm,dd,yyyy) {
   var d = new Date(mm + ' ' + dd + ', ' + yyyy);
      
   if(d.getMonth() + 1 == iGetMonth(mm) && d.getDate() == dd && d.getFullYear() == yyyy)
   {
	 return true;
   }
   else
   {
		return false;
   }
}

// given a number string, determines if is numeric (assumes empty string ok)
function bIsNumeric(value)
{
	var digits='1234567890'
	
	for (var i=0; i<value.length; i++)
	{
		if (digits.indexOf(value.charAt(i))==-1) { return false }
	}
	
	return true
}

// given a string, determines if is an email (assumes empty string ok)
function bIsEmail(checkThisEmail)
{
	var myEMailIsValid = true;
	var myAtSymbolAt = checkThisEmail.indexOf('@');
	var myLastDotAt = checkThisEmail.lastIndexOf('.');
	var mySpaceAt = checkThisEmail.indexOf(' ');
	var myLength = checkThisEmail.length;

	// if empty string then is ok
	if (checkThisEmail=='')
		return myEMailIsValid
		
	// at least one @ must be present and not before position 2
	// @yellow.com : NOT valid
	// x@yellow.com : VALID

	if (myAtSymbolAt < 1 ) 
	{myEMailIsValid = false}


	// at least one . (dot) afer the @ is required
	// x@yellow : NOT valid
	// x.y@yellow : NOT valid
	// x@yellow.org : VALID

	if (myLastDotAt < myAtSymbolAt) 
	{myEMailIsValid = false}

	// at least two characters [com, uk, fr, ...] must occur after the last . (dot)
	// x.y@yellow. : NOT valid
	// x.y@yellow.a : NOT valid
	// x.y@yellow.ca : VALID

	if (myLength - myLastDotAt <= 2) 
	{myEMailIsValid = false}


	// no empty space " " is permitted (one may trim the email)
	// x.y@yell ow.com : NOT valid

	if (mySpaceAt != -1) 
	{myEMailIsValid = false}


	return myEMailIsValid
}

// given a number string, determines if is phone number (assumes empty string ok)
function bIsPhone(value)
{
	var allowedChars='1234567890()+ ' //note allows space
	
	for (var i=0; i<value.length; i++)
	{
		if (allowedChars.indexOf(value.charAt(i))==-1) { return false }
	}
	
	return true
}

/*
	validates all fields passed here in the validation array
	assumes data type of "validationItem"
	will alert the user if there are any problems
	
	returns:
		true - all ok
		false - something failed validation
*/
function iGetMonth(sMonth)
{
	if (sMonth=='Jan') return 1
	else if (sMonth=='Feb') return 2
	else if (sMonth=='Mar') return 3
	else if (sMonth=='Apr') return 4
	else if (sMonth=='May') return 5
	else if (sMonth=='Jun') return 6
	else if (sMonth=='Jul') return 7
	else if (sMonth=='Aug') return 8
	else if (sMonth=='Sep') return 9
	else if (sMonth=='Oct') return 10
	else if (sMonth=='Nov') return 11
	else if (sMonth=='Dec') return 12
}

function bValidate(aValidationArray)
{
	var i
	var elem
	var sMsg = ''
	
	if (aValidationArray)
	{
		for (i=0; i<aValidationArray.length; i++)
		{
			elem = document.getElementById(aValidationArray[i].fieldName)
			if (elem)
			{
				//mandatory check
				if ((aValidationArray[i].mandatory == 1) && (elem.value == ''))
				{
					sMsg += aValidationArray[i].niceName + ': empty mandatory field\r\n'
				}
				//is the data numeric?
				if (aValidationArray[i].dataType == 'num')
				{
					//if not a numeric, then error! (assumes empty string ok)
					if (!bIsNumeric(elem.value))
					{
						sMsg += aValidationArray[i].niceName + ': requires numeric value\r\n'
					}
				}
				//is the data an email address?
				if (aValidationArray[i].dataType == 'email')
				{
					//if not a numeric, then error! (assumes empty string ok)
					if (!bIsEmail(elem.value))
					{
						sMsg += aValidationArray[i].niceName + ': requires valid email address\r\n'
					}
				}
				//is the data a phone number?
				if (aValidationArray[i].dataType == 'phone')
				{
					//if not a numeric, then error! (assumes empty string ok)
					if (!bIsPhone(elem.value))
					{
						sMsg += aValidationArray[i].niceName + ': requires valid phone number\r\n'
					}
				}
				if (aValidationArray[i].dataType == 'password')
				{
					if (elem.value!='')
					{
						var compare_elem = document.getElementById(aValidationArray[i].compareFieldName)
						if (compare_elem)
						{
							if (compare_elem.value != elem.value)
								sMsg += aValidationArray[i].compareNiceName + ' does not match ' + aValidationArray[i].niceName + '\r\n'
						}
						else
						{
							sMsg += aValidationArray[i].compareNiceName + ': does not exist\r\n'
						}
					}
				}
			}
			else if (aValidationArray[i].dataType=='date')
			{
				var elemd = document.getElementById('cidtd~_' + aValidationArray[i].fieldName)
				var elemm = document.getElementById('cidtm~_' + aValidationArray[i].fieldName)
				var elemy = document.getElementById('cidty~_' + aValidationArray[i].fieldName)
				if (elemd && elemm && elemy)
				{
					if ((aValidationArray[i].mandatory == 1) && (elemd.value == ''))
						sMsg += aValidationArray[i].niceName + ': requires valid day\r\n'
					if ((aValidationArray[i].mandatory == 1) && (elemm.value == ''))
						sMsg += aValidationArray[i].niceName + ': requires valid month\r\n'
					if ((aValidationArray[i].mandatory == 1) && (elemy.value == ''))
						sMsg += aValidationArray[i].niceName + ': requires valid year\r\n'
						
					// sgrunel  20050901 - add in check for valid date
					if(bIsDate(elemm.value, elemd.value, elemy.value) == false)
					{
						sMsg += aValidationArray[i].niceName + ': Invalid date\r\n'
					}
					// csmod todds 20050530 - add in check for date range validation
					if (sMsg=='' && typeof(aValidationArray[i].compareFieldName) !='undefined') // if not already an error
					{
						var compare_elemd = document.getElementById('cidtd~_' + aValidationArray[i].compareFieldName)
						var compare_elemm = document.getElementById('cidtm~_' + aValidationArray[i].compareFieldName)
						var compare_elemy = document.getElementById('cidty~_' + aValidationArray[i].compareFieldName)
						if (compare_elemd && compare_elemm && compare_elemy)
						{
							if ((aValidationArray[i].mandatory == 1) && (compare_elemd.value == ''))
								sMsg += aValidationArray[i].compareNiceName + ': requires valid day\r\n'
							if ((aValidationArray[i].mandatory == 1) && (compare_elemm.value == ''))
								sMsg += aValidationArray[i].compareNiceName + ': requires valid month\r\n'
							if ((aValidationArray[i].mandatory == 1) && (compare_elemy.value == ''))
								sMsg += aValidationArray[i].compareNiceName + ': requires valid year\r\n'
								
							// sgrunel  20050901 - add in check for valid date
							if(bIsDate(compare_elemm.value, compare_elemd.value, compare_elemy.value) == false)
							{
								sMsg += aValidationArray[i].compareNiceName + ': Invalid date\r\n'
							}
							
							if (sMsg=='') // still valid, now check the relationship between them
							{
							
								// change the months into integers
								var iMonth = iGetMonth(elemm.value)
								var iCompareMonth = iGetMonth(compare_elemm.value)
								
								if (parseInt(compare_elemy.value,10) < parseInt(elemy.value,10)) // compare years
									sMsg += '"' + aValidationArray[i].compareNiceName + '" cannot be less than "' + aValidationArray[i].niceName + '"\r\n'
								else if (parseInt(compare_elemy.value,10) == parseInt(elemy.value,10))
									 {
										if (parseInt(iCompareMonth,10) < parseInt(iMonth,10)) // compare months
											sMsg += '"' + aValidationArray[i].compareNiceName + '" cannot be less than "' + aValidationArray[i].niceName + '"\r\n'
										else if (parseInt(iCompareMonth,10) == parseInt(iMonth,10))
											 {
												if (parseInt(compare_elemd.value,10) < parseInt(elemd.value,10)) // compare days
													sMsg += '"' + aValidationArray[i].compareNiceName + '" cannot be less than "' + aValidationArray[i].niceName + '"\r\n'
											 }
									}
							}	
						}
						else
						{
							// could not find element
							sMsg += aValidationArray[i].compareNiceName + ': cannot be found\r\n'
						}
					}
				}
				else
				{
					// could not find element
					sMsg += aValidationArray[i].niceName + ': cannot be found\r\n'
				}
			}			
			else
			{
				// could not find element
				sMsg += aValidationArray[i].niceName + ': cannot be found\r\n'
			}
		}
		
		// if we have a message, something went wrong
		if (sMsg != '')
		{
			// alert the error and return false
			sMsg = 'Validation Errors:\r\n\r\n' + sMsg
			alert(sMsg)
			return false
		}
	}
	
	return true
}

/*
	handling for textarea - adapted from http://javascript.internet.com/forms/limit-textarea.html

	example
	<textarea name="myText" id="myText" onKeyDown="textCounter(this.form.myText,255,this.form.remLen);" onKeyUp="textCounter(this.form.myText,255,this.form.remLen);"></textarea>
	<input readonly type="hidden" id="remLen" name="remLen" size="3" maxlength="3" value="255">

	countfield is optional, pass null if not needed
*/
function textCounter(field, maxLimit, countField)
{
	if (field.value.length > maxLimit) // if too long...trim it!
	{
	field.value = field.value.substring(0, maxLimit);
	}
	// otherwise, update 'characters left' counter
	else 
	{
		if (countField)
		{
			countField.value = maxLimit - field.value.length;
		}
	}
}

